f26fb91dabb5c87237a87f9f9d1ec2a39519f84f
[bpdyndnsd] / src / logger.cpp
1 /** @file
2  * @brief Logger class implementation. This class implements the Logging facility.
3  *
4  *
5  *
6  * @copyright Intra2net AG
7  * @license GPLv2
8 */
9
10
11 #include "logger.hpp"
12 #include "version_info.h"
13
14 #include <iostream>
15 #include <syslog.h>
16 #include <sstream>
17
18 #include <boost/foreach.hpp>
19
20 namespace po = boost::program_options;
21
22 typedef boost::shared_ptr<boost::program_options::options_description> Options_descriptionPtr;
23
24 using namespace std;
25
26 /**
27  * Default Constructor
28  */
29 Logger::Logger()
30     : Loglevel(0)
31     , Syslog(false)
32     , ExternalWarningLevel(0)
33     , ExternalLogOnlyOnce(false)
34 {
35     set_log_facility(Loglevel,Syslog,ExternalWarningLog,ExternalWarningLevel,ExternalLogOnlyOnce);
36 }
37
38
39 /**
40  * Default Destructor
41  */
42 Logger::~Logger()
43 {
44 }
45
46
47 /**
48  * Decides if a external log message can be send.
49  * @param msg The message to log.
50  */
51 bool Logger::is_allowed_to_send( const string& msg ) const
52 {
53     if ( (ExternalLogOnlyOnce) && (ExternalSendMessages.find(msg) != ExternalSendMessages.end()) )
54         return false;
55     return true;
56 }
57
58
59 /**
60  * Clears the external send messages set.
61  */
62 void Logger::clear_external_send_messages()
63 {
64     ExternalSendMessages.clear();
65 }
66
67
68 /**
69  * Decides if Logging through syslog if enabled or through std.
70  * @param msg The message to log.
71  */
72 void Logger::log_notice(const string& msg) const
73 {
74     if ( Syslog )
75         syslog(LOG_NOTICE,msg.c_str());
76     else
77         cout << msg << endl;;
78 }
79
80
81 /**
82 * Escape shell arguments.
83 * @param input The input to escape.
84 * @return The escaped string ready to use for the shell.
85 */
86 string Logger::escape_shellarg(const string &input)
87 {
88     string output = "'";
89     string::const_iterator it, it_end = input.end();
90     for (it = input.begin(); it != it_end; it++)
91     {
92         if ( (*it) == '\'')
93             output += "'\\'";
94
95         output += *it;
96     }
97
98     output += "'";
99     return output;
100 }
101
102
103 /**
104  * Decides if Logging through syslog if enabled or through std.
105  * @param msg The message to log.
106  */
107 void Logger::log_warning(const string& msg, int level)
108 {
109     if ( Syslog )
110         syslog(LOG_WARNING,msg.c_str());
111     else
112         cout << msg << endl;
113
114     if ( (level <= ExternalWarningLevel) && (!ExternalWarningLog.empty()) && (is_allowed_to_send(msg)) )
115     {
116         string message = msg;
117         // Remove endline from msg.
118         if (!message.empty() && message[message.length()-1] == '\n')
119             message.erase(message.length()-1);  /*lint !e534 */
120
121         message = escape_shellarg(message);
122
123         string external = ExternalWarningLog;
124         external.append(" ");
125         external.append(message);
126         if ( system(external.c_str()) != 0 )
127             print_error_external_logging(external);
128         else
129             ExternalSendMessages.insert(msg);   /*lint !e534 */
130     }
131 }
132
133
134 /**
135  * Decides if Logging through syslog if enabled or through std.
136  * @param msg The message to log.
137  */
138 void Logger::log_error(const string& msg) const
139 {
140     if ( Syslog )
141         syslog(LOG_ERR,msg.c_str());
142     else
143         cerr << msg << endl;
144 }
145
146
147 /**
148  * Setter for member Loglevel.
149  * @param _loglevel Value to set Loglevel to.
150  */
151 void Logger::set_external_log_only_once( const bool _external_log_only_once )
152 {
153     ExternalLogOnlyOnce = _external_log_only_once;
154 }
155
156
157 /**
158  * Setter for member Loglevel.
159  * @param _loglevel Value to set Loglevel to.
160  */
161 void Logger::set_loglevel(const int _loglevel)
162 {
163     Loglevel = _loglevel;
164 }
165
166
167 /**
168  * Getter for member Loglevel.
169  * @return Loglevel.
170  */
171 int Logger::get_loglevel() const
172 {
173     return Loglevel;
174 }
175
176
177 /**
178  * Setter for member Syslog.
179  * @param _syslog Wether to log through syslog or not.
180  */
181 void Logger::set_syslog(const bool _syslog)
182 {
183     Syslog = _syslog;
184 }
185
186
187 /**
188  * Getter for member Syslog.
189  * @return True if logging through syslog is enabled, false otherwise.
190  */
191 bool Logger::get_syslog() const
192 {
193     return Syslog;
194 }
195
196
197 /**
198  * Initialize the logging facility.
199  */
200 void Logger::set_log_facility(const int _loglevel, const bool _syslog, const string& _external_error_log, const int _external_error_level, const bool _external_log_only_once )
201 {
202     Loglevel = _loglevel;
203     Syslog = _syslog;
204     ExternalWarningLog = _external_error_log;
205     ExternalWarningLevel = _external_error_level;
206     ExternalLogOnlyOnce = _external_log_only_once;
207
208     if ( Syslog )
209         openlog("bpdyndnsd",LOG_PID,LOG_DAEMON);
210 }
211
212
213 /**
214  * Prints out the usage to the command line.
215  */
216 void Logger::print_usage(const Options_descriptionPtr opt_desc) const
217 {
218     int level = 0;
219     if ( level <= Loglevel )
220     {
221         ostringstream msg;
222         msg << "Usage: bpdyndnsd [Command line options]" << "\n" << endl;
223         msg << *opt_desc << endl;
224         log_notice(msg.str());
225     }
226 }
227
228
229 /**
230  * Prints out the programm name and the given version string on stdout.
231  * @param version Version string.
232  */
233 void Logger::print_version() const
234 {
235     int level = 0;
236     if ( level <= Loglevel )
237     {
238         ostringstream msg;
239         msg << "Bullet proof dynamic dns daemon.\nbpdyndnsd " << MAJOR_VERSION << "." << MINOR_VERSION << endl;
240         log_notice(msg.str());
241     }
242 }
243
244
245 /**
246  * Prints out the successful parsing of the command line options.
247  */
248 void Logger::print_cmd_parsed() const
249 {
250     int level = 1;
251     if ( level <= Loglevel )
252     {
253         log_notice("Command line options successfully parsed.");
254     }
255 }
256
257
258 void Logger::print_conf_files_parsed() const
259 {
260     int level = 1;
261     if ( level <= Loglevel )
262     {
263         log_notice("Config files successfully parsed.");
264     }
265 }
266
267
268 /**
269  * Prints out the successful parsing of the config files.
270  * @param config_path The specified config path.
271  */
272 void Logger::print_conf_loaded(const string& config_path) const
273 {
274     int level = 1;
275     if ( level <= Loglevel )
276     {
277         ostringstream msg;
278         msg << "Config files successfully loaded in: " << config_path << endl;
279         log_notice(msg.str());
280     }
281 }
282
283
284 /**
285  * Prints out the unsuccessful parsing of the config files.
286  * @param config_path The specified config path.
287  */
288 void Logger::print_conf_not_loaded(const string& config_path) const
289 {
290     int level = 0;
291     if ( level <= Loglevel )
292     {
293         ostringstream msg;
294         msg << "Config files couldn't be loaded in: " << config_path << endl;
295         log_error(msg.str());
296     }
297 }
298
299
300 /**
301  * Prints out the unsuccessful parsing of the config files.
302  */
303 void Logger::print_conf_reload_failed_exit() const
304 {
305     int level = 0;
306     if ( level <= Loglevel )
307         log_error("Config files couldn't be reloaded. Exiting.");
308 }
309
310
311 /**
312  * A file could not be opened for reading.
313  * @param filename The filename.
314  */
315 void Logger::print_error_opening_r(const string& filename) const
316 {
317     int level = 0;
318     if ( level <= Loglevel )
319     {
320         ostringstream msg;
321         msg << "Error opening file for reading: " << filename << endl;
322         log_error(msg.str());
323     }
324 }
325
326
327 /**
328  * A file could not be opened for writing.
329  * @param filename The filename.
330  */
331 void Logger::print_error_opening_rw(const string& filename) const
332 {
333     int level = 0;
334     if ( level <= Loglevel )
335     {
336         ostringstream msg;
337         msg << "Error opening file for writing: " << filename << endl;
338         log_error(msg.str());
339     }
340 }
341
342
343 /**
344  * Desctructor of specified class was called.
345  * @param _class Name of the class.
346  */
347 void Logger::print_destructor_call(const string& _class) const
348 {
349     int level = 1;
350     if ( level <= Loglevel )
351     {
352         ostringstream msg;
353         msg << "Destructor call: " << _class << endl;
354         log_notice(msg.str());
355     }
356 }
357
358
359 /**
360  * Constructor of specified class was called.
361  * @param _class Name of the class.
362  */
363 void Logger::print_constructor_call(const string& _class) const
364 {
365     int level = 1;
366     if ( level <= Loglevel )
367     {
368         ostringstream msg;
369         msg << "Constructor call: " << _class << endl;
370         log_notice(msg.str());
371     }
372 }
373
374
375 /**
376  * Update method for specified service was called.
377  * @param service The service for which the update is running.
378  */
379 void Logger::print_update_service(const string& service) const
380 {
381     int level = 0;
382     if ( level <= Loglevel )
383     {
384         ostringstream msg;
385         msg << "Running update for service: " << service << endl;
386         log_notice(msg.str());
387     }
388 }
389
390 /**
391  * Service is blocked for update because of too many errors
392  * @param service The service for which the update is running.
393  * @param remaining_seconds Remaining seconds this service is blocked
394  */
395 void Logger::print_update_service_is_blocked(const std::string& service, int remaining_seconds) const
396 {
397     int level = 1;
398     if ( level <= Loglevel )
399     {
400         ostringstream msg;
401         msg << "Service " << service << " is blocked for " << remaining_seconds << " seconds because of too many errors" << endl;
402         log_notice(msg.str());
403     }
404 }
405
406
407 /**
408  * Service will be blocked because of update errors
409  * @param service The service for which the update is running.
410  * @param block_seconds Number of seconds this service is blocked
411  */
412 void Logger::print_block_service(const std::string& service, int block_seconds) const
413 {
414     int level = 0;
415     if ( level <= Loglevel )
416     {
417         ostringstream msg;
418         msg << "Service " << service << " will be blocked for " << block_seconds << " seconds because of too many errors" << endl;
419         log_notice(msg.str());
420     }
421 }
422
423
424 /**
425  * An unknown option on the command line was detected.
426  * @param unknown_option The unknown option.
427  */
428 void Logger::print_unknown_cmd_option(const string& unknown_option) const
429 {
430     int level = 0;
431     if ( level <= Loglevel )
432     {
433         ostringstream msg;
434         msg << "Unknown option on command line detected: " << unknown_option << endl;
435         log_error(msg.str());
436     }
437 }
438
439
440 /**
441  * An unknown protocol was specified.
442  * @param protocol The unknown protocol.
443  */
444 void Logger::print_unknown_protocol(const string& protocol) const
445 {
446     int level = 0;
447     if ( level <= Loglevel )
448     {
449         ostringstream msg;
450         msg << "Unknown protocol defined: " << protocol << endl;
451         log_error(msg.str());
452     }
453 }
454
455
456 /**
457  * Loading a service config file.
458  * @param filename The service config file.
459  */
460 void Logger::print_load_service_conf(const string& filename) const
461 {
462     int level = 1;
463     if ( level <= Loglevel )
464     {
465         ostringstream msg;
466         msg << "Loading service config file: " << filename << endl;
467         log_notice(msg.str());
468     }
469 }
470
471
472 /**
473  * Loading the main config file.
474  * @param filename The main config file.
475  */
476 void Logger::print_load_main_conf(const string& filename) const
477 {
478     int level = 1;
479     if ( level <= Loglevel )
480     {
481         ostringstream msg;
482         msg << "Loading main config file: " << filename << endl;
483         log_notice(msg.str());
484     }
485 }
486
487
488 /**
489  * There is an unknown option in a service config file.
490  * @param unknown_option The unknown option.
491  */
492 void Logger::print_unknown_service_conf_option(const string& service_conf_file, const string& unknown_option) const
493 {
494     int level = 0;
495     if ( level <= Loglevel )
496     {
497         ostringstream msg;
498         msg << "Unknown option in service config file detected: " << service_conf_file << " Unknown option: " << unknown_option << endl;
499         log_error(msg.str());
500     }
501 }
502
503
504 /**
505  * There is an unknown option in the main config file.
506  * @param unknown_option The unknown option.
507  */
508 void Logger::print_unknown_main_conf_option(const string& unknown_option) const
509 {
510     int level = 0;
511     if ( level <= Loglevel )
512     {
513         ostringstream msg;
514         msg << "Unknown option in main config file detected: " << unknown_option << endl;
515         log_error(msg.str());
516     }
517 }
518
519
520 /**
521  * The defined config path doesn't exist or is not a directory.
522  * @param config_path The defined config path.
523  */
524 void Logger::print_error_config_path(const string& config_path) const
525 {
526     int level = 0;
527     if ( level <= Loglevel )
528     {
529         ostringstream msg;
530         msg << "Config path doesn't exists or is not a diretory: " << config_path << endl;
531         log_error(msg.str());
532     }
533 }
534
535
536 /**
537  * There is a missing command line option to initialize a service object.
538  */
539 void Logger::print_missing_cmd_service_option() const
540 {
541     int level = 0;
542     if ( level <= Loglevel )
543     {
544         log_error("Missing option to initialize service. Protocol, host, login and password must be specified.");
545     }
546 }
547
548
549 /**
550  * Missing option in service config file.
551  * @param service_conf_file Service config file
552  */
553 void Logger::print_missing_service_conf_option(const string& service_conf_file) const
554 {
555     int level = 0;
556     if ( level <= Loglevel )
557     {
558         ostringstream msg;
559         msg << "Missing option in service config file " << service_conf_file << " to initialize service. Protocol, host, login and password must be specified." << endl;
560         log_error(msg.str());
561     }
562 }
563
564
565 /**
566  * Process running as daemon.
567  * @param pid The pid of the daemon.
568  */
569 void Logger::print_runnig_as_daemon(const int pid) const
570 {
571     int level = 1;
572     if ( level <= Loglevel )
573     {
574         ostringstream msg;
575         msg << "Running as daemon: " << pid << endl;
576         log_notice(msg.str());
577     }
578 }
579
580
581 /**
582  * Prints out the daemon mode.
583  * @param daemon_mode The daemon mode.
584  */
585 void Logger::print_daemon_mode(const bool daemon_mode) const
586 {
587     int level = 1;
588     if ( level <= Loglevel )
589     {
590         string mode = "disabled";
591         if (daemon_mode == true)
592             mode = "enabled";
593         ostringstream msg;
594         msg << "Daemon mode is " << mode << "." << endl;
595         log_notice(msg.str());
596     }
597 }
598
599
600 /**
601  * There was an error while trying to fork.
602  */
603 void Logger::print_error_fork() const
604 {
605     int level = 0;
606     if ( level <= Loglevel )
607     {
608         log_error("Error while trying to fork.");
609     }
610 }
611
612
613 /**
614  * A pid in the pidfile was found.
615  * @param pid The pid found in the pidfile.
616  */
617 void Logger::print_pid_found(const int pid) const
618 {
619     int level = 1;
620     if ( level <= Loglevel )
621     {
622         ostringstream msg;
623         msg << "Pidfile found: " << pid << ". Checking if process is still runnig..." << endl;
624         log_notice(msg.str());
625     }
626 }
627
628
629 /**
630  * Another process is already running.
631  * @param pid The pid of the other process.
632  */
633 void Logger::print_process_already_running(const int pid) const
634 {
635     int level = 0;
636     if ( level <= Loglevel )
637     {
638         ostringstream msg;
639         msg << "Another bpdyndnsd process with PID " << pid << " is already running!" << endl;
640         log_error(msg.str());
641     }
642 }
643
644
645 /**
646  * SIGTERM caught.
647  */
648 void Logger::print_caught_sigterm() const
649 {
650     int level = 0;
651     if ( level <= Loglevel )
652     {
653         log_notice("Caught SIGTERM. Exiting...");
654     }
655 }
656
657
658 /**
659  * SIGUSR1 caught.
660  */
661 void Logger::print_caught_siguser1() const
662 {
663     int level = 0;
664     if ( level <= Loglevel )
665     {
666         log_notice("Caught SIGUSR1. Switching to offline mode...");
667     }
668 }
669
670
671 /**
672  * SIGHUP caught.
673  */
674 void Logger::print_caught_sighup() const
675 {
676     int level = 0;
677     if ( level <= Loglevel )
678     {
679         log_notice("Caught SIGHUP. Reloading config...");
680     }
681 }
682
683
684 /**
685  * SIGUSR2 caught.
686  */
687 void Logger::print_caught_siguser2() const
688 {
689     int level = 0;
690     if ( level <= Loglevel )
691     {
692         log_notice("Caught SIGUSR2. Switching to online mode...");
693     }
694 }
695
696
697 /**
698  * SIGRTMIN caught.
699  */
700 void Logger::print_caught_sigrtmin() const
701 {
702     int level = 0;
703     if ( level <= Loglevel )
704     {
705         log_notice("Caught SIGRTMIN. Switching to online mode with webcheck enabled...");
706     }
707 }
708
709
710 /**
711  * SIGRTMAX caught.
712  */
713 void Logger::print_caught_sigrtmax(int new_loglevel) const
714 {
715     int level = 0;
716     if ( level <= Loglevel )
717     {
718         ostringstream msg;
719         msg << "Caught SIGRTMAX. Increasing log level to " << new_loglevel << endl;
720         log_error(msg.str());
721     }
722 }
723
724
725 /**
726  * Error while setting signal handler.
727  */
728 void Logger::print_error_setting_signal(const string& signal) const
729 {
730     int level = 0;
731     if ( level <= Loglevel )
732     {
733         ostringstream msg;
734         msg << "Error while setting signal handler for: " << signal << endl;
735         log_error(msg.str());
736     }
737 }
738
739
740 /**
741  * Error while setting signal handler.
742  */
743 void Logger::print_init_log_facility() const
744 {
745     int level = 1;
746     if ( level <= Loglevel )
747     {
748         ostringstream msg;
749         msg << "Initialized logging facility." << " Loglevel: " << Loglevel << " Syslog: " << Syslog << " ExternalLogOnlyOnce: " << ExternalLogOnlyOnce << endl;
750         log_notice(msg.str());
751     }
752 }
753
754
755 /**
756  * Be verbose. Currently we are in offline mode.
757  */
758 void Logger::print_offline_mode() const
759 {
760     int level = 1;
761     if ( level <= Loglevel )
762     {
763         log_notice("Offline mode...");
764     }
765 }
766
767
768 /**
769  * Dialup mode: Print how long we plan to delay the next network traffic
770  * @param sleep_until Timestamp until we plan to keep quiet
771  */
772 void Logger::print_sleep_dialup_mode(time_t sleep_until) const
773 {
774     int level = 1;
775     if ( level <= Loglevel )
776     {
777         ostringstream msg;
778         msg << "Skipped update in dialup mode (" << sleep_until-time(NULL) << " more seconds)" << endl;
779         log_error(msg.str());
780     }
781 }
782
783 /**
784  * Objects successfully serialized.
785  */
786 void Logger::print_serialized_objects_success() const
787 {
788     int level = 1;
789     if ( level <= Loglevel )
790     {
791         log_notice("Serialized objects successfully.");
792     }
793 }
794
795
796 /**
797  * Objects successfully de-serialized.
798  */
799 void Logger::print_deserialized_objects_success() const
800 {
801     int level = 1;
802     if ( level <= Loglevel )
803     {
804         log_notice("De-serialized objects successfully.");
805     }
806 }
807
808
809 /**
810  * Prints out the content of a service object.
811  * @param message Message to be added on output first.
812  * @param protocol Service's protocol.
813  * @param hostname Service's hostname.
814  * @param login Service's login.
815  * @param password Service's password.
816  * @param actual_ip Service's actual_ip.
817  * @param lastupdated Service's lastupdated.
818  */
819 void Logger::print_service_object(const string& message, const string& protocol, const string& hostname, const string& login, const string& password, const int update_interval, const int max_updates_within_interval, const int dns_cache_ttl , const string& actual_ip, list<time_t> lastupdated) const
820 {
821     int level = 1;
822     if ( level <= Loglevel )
823     {
824         ostringstream msg;
825         msg << message << endl;
826         msg << "\t" << "Protocol:         " << protocol << endl;
827         msg << "\t" << "Hostname:         " << hostname << endl;
828         msg << "\t" << "Login:            " << login << endl;
829         msg << "\t" << "Password:         " << password << endl;
830         msg << "\t" << "Update Interval:  " << update_interval << endl;
831         msg << "\t" << "Max Updates:      " << max_updates_within_interval << endl;
832         msg << "\t" << "DNS Cache TTL:    " << dns_cache_ttl << endl;
833         msg << "\t" << "Actual_IP:        " << actual_ip << endl;
834         BOOST_FOREACH( time_t update_time, lastupdated)
835         {
836             msg << "\t" << "Lastupdated:      " << update_time << endl;
837         }
838         log_notice(msg.str());
839     }
840 }
841
842
843 /**
844  * Caught exception while serialize.
845  * @param exception Exception message.
846  */
847 void Logger::print_exception_serialize(const string& errMsg) const
848 {
849     int level = 0;
850     if ( level <= Loglevel )
851     {
852         ostringstream msg;
853         msg << "Error while trying to serialize Serviceholder object: " << errMsg << endl;
854         log_error(msg.str());
855     }
856 }
857
858
859 /**
860  * Caught exception while de-serialize.
861  * @param exception Exception message.
862  */
863 void Logger::print_exception_deserialize(const string& errMsg) const
864 {
865     int level = 0;
866     if ( level <= Loglevel )
867     {
868         ostringstream msg;
869         msg << "Error while trying to de-serialize Serviceholder object: " << errMsg << endl;
870         log_error(msg.str());
871     }
872 }
873
874
875 /**
876  * Child couldn't be killed by parent.
877  * @param pid Pid of the child.
878  */
879 void Logger::print_error_kill_child(const int pid) const
880 {
881     int level = 0;
882     if ( level <= Loglevel )
883     {
884         ostringstream msg;
885         msg << "Could not kill child process with PID: " << pid << endl;
886         log_error(msg.str());
887     }
888 }
889
890
891 /**
892  * Child was killed by parent because of error.
893  * @param pid The pid (child) killed.
894  */
895 void Logger::print_child_killed(const int pid) const
896 {
897     int level = 1;
898     if ( level <= Loglevel )
899     {
900         ostringstream msg;
901         msg << "Killed child process with PID: " << pid << endl;
902         log_notice(msg.str());
903     }
904 }
905
906
907 /**
908  * There is no object file.
909  * @param object_file The object file.
910  */
911 void Logger::print_no_object_file(const string& object_file)
912 {
913     int level = 1;
914     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
915     {
916         ostringstream msg;
917         msg << "There is no object file: " << object_file << ". Continue without recovering state from old services!" << endl;
918         log_warning(msg.str(),level);
919     }
920 }
921
922
923 /**
924  * Prints out the given hostname
925  * @param hostname Hostname as string.
926  */
927 void Logger::print_hostname(const string& hostname) const
928 {
929     int level = 1;
930     if ( level <= Loglevel )
931     {
932         ostringstream msg;
933         msg << "Detected following hostname of localhost: " << hostname << endl;
934         log_notice(msg.str());
935     }
936 }
937
938
939 /**
940  * Prints out the detected own ipv4 address
941  * @param ip_addr String representation of the detected ip.
942  */
943 void Logger::print_own_ipv4(const string& ip_addr_v4, const string& hostname) const
944 {
945     int level = 1;
946     if ( level <= Loglevel )
947     {
948         ostringstream msg;
949         msg << "Detected following IPv4-Address of host: " << hostname << " : " << ip_addr_v4 << endl;
950         log_notice(msg.str());
951     }
952 }
953
954
955 /**
956  * Prints out the detected own ipv5 address
957  * @param ip_addr String representation of the detected ip.
958  */
959 void Logger::print_own_ipv6(const string& ip_addr_v6, const string& hostname) const
960 {
961     int level = 1;
962     if ( level <= Loglevel )
963     {
964         ostringstream msg;
965         msg << "Detected following IPv6-Address of host: " << hostname << " : " << ip_addr_v6 << endl;
966         log_notice(msg.str());
967     }
968 }
969
970
971 /**
972  * Exception while trying to resolve hostname to ip.
973  * @param exception The exception caught.
974  * @param hostname The hostname.
975  */
976 void Logger::print_error_hostname_to_ip(const string& errMsg, const string& hostname) const
977 {
978     int level = 0;
979     if ( level <= Loglevel )
980     {
981         ostringstream msg;
982         msg << "Could not resolve the hostname: " << hostname << " to an IP-Address: " << errMsg << endl;
983         log_error(msg.str());
984     }
985 }
986
987
988 /**
989  * The update of the given service was successful.
990  * @param service The service.
991  */
992 void Logger::print_update_service_successful(const string& service) const
993 {
994     int level = 0;
995     if ( level <= Loglevel )
996     {
997         ostringstream msg;
998         msg << "Updated service successful: " << service << endl;
999         log_notice(msg.str());
1000     }
1001 }
1002
1003
1004 /**
1005  * No ip could be determined through webcheck
1006  */
1007 void Logger::print_webcheck_no_ip()
1008 {
1009     int level = 0;
1010     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1011     {
1012         log_warning("IP-Address of this host could not be determined through any configured webcheck url.",level);
1013     }
1014 }
1015
1016
1017 /**
1018  * Connection problem while trying to get ip through webcheck url
1019  * @param curl_err_buff Curl error message
1020  * @param url the url
1021  */
1022 void Logger::print_webcheck_url_connection_problem(const char * curl_err_buff, const string& url)
1023 {
1024     int level = 1;
1025     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1026     {
1027         ostringstream msg;
1028         msg << "There was a problem while trying to connect to following URL: " << url << " CURL error: " << curl_err_buff << endl;
1029         log_warning(msg.str(),level);
1030     }
1031 }
1032
1033
1034 /**
1035  * Prints out curl error.
1036  * @param curl_err_buff Curl error message.
1037  * @param url URL
1038  */
1039 void Logger::print_webcheck_error(const char * curl_err_buff, const string& url) const
1040 {
1041     int level = 0;
1042     if ( level <= Loglevel )
1043     {
1044         ostringstream msg;
1045         msg << "There was an error while trying to connect to following URL: " << url << " CURL error: " << curl_err_buff << endl;
1046         log_error(msg.str());
1047     }
1048 }
1049
1050
1051 /**
1052  * Prints out the received data through curl.
1053  * @param curl_data Data string
1054  */
1055 void Logger::print_received_curl_data(const string& curl_data) const
1056 {
1057     int level = 1;
1058     if ( level <= Loglevel )
1059     {
1060         ostringstream msg;
1061         msg << "Received CURL data: " << curl_data << endl;
1062         log_notice(msg.str());
1063     }
1064 }
1065
1066
1067 /**
1068  * IP was foudn through regex
1069  * @param ip The IP found.
1070  */
1071 void Logger::print_regex_found_ip(const string& ip) const
1072 {
1073     int level = 1;
1074     if ( level <= Loglevel )
1075     {
1076         ostringstream msg;
1077         msg << "Found IP-Address via regex: " << ip << endl;
1078         log_notice(msg.str());
1079     }
1080 }
1081
1082
1083 /**
1084  * No IP was found through regex.
1085  * @param data The data string which should contain a valid IP.s
1086  */
1087 void Logger::print_regex_ip_not_found(const string& data)
1088 {
1089     int level = 1;
1090     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1091     {
1092         ostringstream msg;
1093         msg << "Could not extract an IP-Address via regex from following data:\n" << data << endl;
1094         log_warning(msg.str(),level);
1095     }
1096 }
1097
1098
1099 /**
1100  * Detected multiple occurrences of the same option.
1101  * @param message Error message.
1102  */
1103 void Logger::print_multiple_cmd_option(const string& message) const
1104 {
1105     int level = 0;
1106     if ( level <= Loglevel )
1107     {
1108         ostringstream msg;
1109         msg << "The same option is only allowed once: " << message << endl;
1110         log_error(msg.str());
1111     }
1112 }
1113
1114
1115 /**
1116  * An update would exceed the update interval. Prints out a warning message.
1117  * @param current_time Current time.
1118  * @param old_time Time of update #MaxUpdatesWithinInterval ago.
1119  * @param MaxUpdatesWithinInterval Number of allowed updates in one update interval.
1120  * @param service The service which exceeds update interval.
1121  */
1122 void Logger::print_update_not_allowed(const time_t current_time, const time_t old_time, const int MaxUpdatesWithinInterval, const string& service)
1123 {
1124     int level = 1;
1125     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1126     {
1127         ostringstream msg;
1128         msg << "Update not allowed for service: " << service << ". Too many updates within max update interval. Current time: " << current_time << ". Update time before " << MaxUpdatesWithinInterval << " updates: " << old_time << endl;
1129         log_warning(msg.str(),level);
1130     }
1131 }
1132
1133
1134 /**
1135  * Failure while running update for service.
1136  * @param service Services' name.
1137  */
1138 void Logger::print_update_service_failure(const string& service)
1139 {
1140     int level = 0;
1141     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1142     {
1143         ostringstream msg;
1144         msg << "Could not update service: " << service << endl;
1145         log_warning(msg.str(),level);
1146     }
1147 }
1148
1149 /**
1150  * Start message
1151  */
1152 void Logger::print_started() const
1153 {
1154     int level = 0;
1155     if ( level <= Loglevel )
1156     {
1157         log_notice("Started");
1158     }
1159 }
1160
1161
1162 /**
1163  * Starting shutdown
1164  */
1165 void Logger::print_starting_shutdown() const
1166 {
1167     int level = 0;
1168     if ( level <= Loglevel )
1169     {
1170         log_notice("Shutting down ...");
1171     }
1172 }
1173
1174
1175 /**
1176  * Shutdown complete
1177  */
1178 void Logger::print_shutdown_succeeded() const
1179 {
1180     int level = 0;
1181     if ( level <= Loglevel )
1182     {
1183         log_notice("Shutting down complete ...");
1184     }
1185 }
1186
1187
1188 /**
1189  * Shutdown parent succeeded
1190  */
1191 void Logger::print_shutdown_parent_succeeded() const
1192 {
1193     int level = 0;
1194     if ( level <= Loglevel )
1195     {
1196         log_notice("Shutting down parent process completed ...");
1197     }
1198 }
1199
1200
1201 /**
1202  * Starting shutdown parent
1203  */
1204 void Logger::print_starting_shutdown_parent() const
1205 {
1206     int level = 0;
1207     if ( level <= Loglevel )
1208     {
1209         log_notice("Shutting down parent process ...");
1210     }
1211 }
1212
1213
1214 /**
1215  * DNS cache record timeout
1216  * @param hostname Hostname
1217  * @param lastupdated Lastupdated
1218  * @param dns_cache_ttl DNS cache TTL
1219  * @param current_time Current time
1220  */
1221 void Logger::print_recheck_dns_entry(const string& hostname, const int lastupdated, const int dns_cache_ttl, const int current_time) const
1222 {
1223     int level = 1;
1224     if ( level <= Loglevel )
1225     {
1226         ostringstream msg;
1227         msg << "DNS cache record for host <" << hostname << "> expired or host will be updated for the first time: Lastupdated: " << lastupdated << " DNS cache ttl: " << dns_cache_ttl << " Current time: " << current_time << " Checking current DNS cache status." << endl;
1228         log_notice(msg.str());
1229     }
1230 }
1231
1232
1233 /**
1234  * Missing proxy option on command line.
1235  */
1236 void Logger::print_missing_cmd_proxy_option() const
1237 {
1238     int level = 0;
1239     if ( level <= Loglevel )
1240     {
1241         log_error("Missing option to initialize proxy. http_proxy and http_proxy_port must be specified.");
1242     }
1243 }
1244
1245
1246 /**
1247  * Multiple option in service config file.
1248  * @param service_conf_file Service config file
1249  * @param message Multiple option text
1250  */
1251 void Logger::print_multiple_service_conf_option(const string& service_conf_file, const string& message) const
1252 {
1253     int level = 0;
1254     if ( level <= Loglevel )
1255     {
1256         ostringstream msg;
1257         msg << "Multiple occurrences of the same option in service config file detected: " << service_conf_file << " " << message << endl;
1258         log_error(msg.str());
1259     }
1260 }
1261
1262
1263 /**
1264  * Multiple option in main config file.
1265  * @param service_conf_file Service config file
1266  * @param message Multiple option text
1267  */
1268 void Logger::print_multiple_main_conf_option(const string& main_conf_file, const string& message) const
1269 {
1270     int level = 0;
1271     if ( level <= Loglevel )
1272     {
1273         ostringstream msg;
1274         msg << "Multiple occurrences of the same option in main config file detected: " << main_conf_file << " " << message << endl;
1275         log_error(msg.str());
1276     }
1277 }
1278
1279
1280 /**
1281  * Missing proxy option in main config file.
1282  * @param main_conf_filename The concerning config file.
1283  */
1284 void Logger::print_missing_conf_proxy_option(const string& main_conf_filename) const
1285 {
1286     int level = 0;
1287     if ( level <= Loglevel )
1288     {
1289         ostringstream msg;
1290         msg << "Missing option to initialize proxy in main config file: " << main_conf_filename << " http_proxy and http_proxy_port must be specified." << endl;
1291         log_error(msg.str());
1292     }
1293 }
1294
1295
1296 /**
1297  * There is no domain part in the given hostname
1298  * @param hostname The hostname with no domain part in it.
1299  */
1300 void Logger::print_no_domain_part(const string& hostname) const
1301 {
1302     int level = 0;
1303     if ( level <= Loglevel )
1304     {
1305         ostringstream msg;
1306         msg << "There is no domain part in the given hostname: " << hostname << endl;
1307         log_notice(msg.str());
1308     }
1309 }
1310
1311
1312 /**
1313  * Service is not initialized properly.
1314  * @param service The service.
1315  */
1316 void Logger::print_httphelper_not_initialized() const
1317 {
1318     int level = 0;
1319     if ( level <= Loglevel )
1320     {
1321         log_error("HTTP-Helper is not initialized properly.");
1322     }
1323 }
1324
1325
1326 /**
1327  * A curl error occured.
1328  * @param msg The error message
1329  * @param curl_err_code The resulting curl error code
1330  */
1331 void Logger::print_curl_error_init(const std::string& err_msg, const CURLcode curl_err_code) const
1332 {
1333     string curl_err = "";
1334
1335     if ( curl_err_code == CURLE_FAILED_INIT )
1336         curl_err = "CURLE_FAILED_INIT";
1337     else
1338         curl_err = "UNKNOWN";
1339
1340     int level = 0;
1341     if ( (level <= Loglevel) )
1342     {
1343         ostringstream msg;
1344         msg << "Curl error: " << err_msg << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
1345         log_error(msg.str());
1346     }
1347 }
1348
1349
1350 /**
1351  * A curl error occured.
1352  * @param url The url requested by the curl operation
1353  * @param curl_err_code The resulting curl error code
1354  */
1355 void Logger::print_curl_error(const string& url, const CURLcode curl_err_code) const
1356 {
1357     string curl_err = "";
1358
1359     if ( curl_err_code == CURLE_URL_MALFORMAT )
1360         curl_err = "CURLE_URL_MALFORMAT";
1361     else if ( curl_err_code == CURLE_COULDNT_RESOLVE_HOST )
1362         curl_err = "CURLE_COULDNT_RESOLVE_HOST";
1363     else if ( curl_err_code == CURLE_COULDNT_CONNECT )
1364         curl_err = "CURLE_COULDNT_CONNECT";
1365     else
1366         curl_err = "UNKNOWN";
1367
1368     int level = 0;
1369     if ( (level <= Loglevel) )
1370     {
1371         ostringstream msg;
1372         msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
1373         log_error(msg.str());
1374     }
1375 }
1376
1377
1378 /**
1379  * A curl error occured.
1380  * @param url The url requested by the curl operation
1381  * @param curl_err_code The resulting curl error code
1382  * @param curl_err_buff The curl error buffer
1383  */
1384 void Logger::print_curl_error(const string& url, const CURLcode curl_err_code, const char * curl_err_buff) const
1385 {
1386     string curl_err = "";
1387
1388     if ( curl_err_code == CURLE_URL_MALFORMAT )
1389         curl_err = "CURLE_URL_MALFORMAT";
1390     else if ( curl_err_code == CURLE_COULDNT_RESOLVE_HOST )
1391         curl_err = "CURLE_COULDNT_RESOLVE_HOST";
1392     else if ( curl_err_code == CURLE_COULDNT_CONNECT )
1393         curl_err = "CURLE_COULDNT_CONNECT";
1394     else
1395         curl_err = "UNKNOWN";
1396
1397     int level = 0;
1398     if ( (level <= Loglevel) )
1399     {
1400         ostringstream msg;
1401         msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << " " << curl_err_buff << endl; /*lint !e641 */
1402         log_error(msg.str());
1403     }
1404 }
1405
1406
1407 /**
1408  * Prints out the data received by curl operation
1409  * @param CurlWritedataBuff
1410  */
1411 void Logger::print_curl_data(const string& curl_writedata_buff) const
1412 {
1413     int level = 1;
1414     if ( level <= Loglevel )
1415     {
1416         ostringstream msg;
1417         msg << "Data received by curl: " << curl_writedata_buff << endl;
1418         log_notice(msg.str());
1419     }
1420 }
1421
1422
1423 /**
1424  * Not authorized to perform requested update operation
1425  * @param service The requested service.
1426  * @param username Username
1427  * @param password Password
1428  */
1429 void Logger::print_service_not_authorized(const string& service, const string& username, const string& password) const
1430 {
1431     int level = 0;
1432     if ( level <= Loglevel )
1433     {
1434         ostringstream msg;
1435         msg << "Not authorized to perform update operation on service: " << service << " Please check username and password: " << username << ":" << password << endl;
1436         log_notice(msg.str());
1437     }
1438 }
1439
1440
1441 /**
1442  * Prints out the http status code
1443  * @param url Url
1444  * @param output HTTP status code
1445  */
1446 void Logger::print_http_status_code(const string& url, const long http_code) const
1447 {
1448     int level = 1;
1449     if ( level <= Loglevel )
1450     {
1451         ostringstream msg;
1452         msg << "Requested URL: " << url << " Received HTTP status code: " << http_code << endl;
1453         log_notice(msg.str());
1454     }
1455 }
1456
1457
1458 /**
1459  * Generic failure while trying to update service
1460  * @param url The requested URL
1461  * @param curl_data The received curl_data from the server
1462  */
1463 void Logger::print_update_failure(const string& url, const string& curl_data) const
1464 {
1465     int level = 0;
1466     if ( (level <= Loglevel) )
1467     {
1468         ostringstream msg;
1469         msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << curl_data << endl;
1470         log_error(msg.str());
1471     }
1472 }
1473
1474
1475 /**
1476  * Generic failure while trying to update service
1477  * @param url The requested URL
1478  * @param http_status_code The received http status code
1479  */
1480 void Logger::print_update_failure(const string& url, const long http_status_code) const
1481 {
1482     int level = 0;
1483     if ( level <= Loglevel )
1484     {
1485         ostringstream msg;
1486         msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << http_status_code << endl;
1487         log_error(msg.str());
1488     }
1489 }
1490
1491 /**
1492  * Hostname is invalid, contains no or only one domain part.
1493  * @param hostname The full qualified host name.
1494  */
1495 void Logger::print_invalid_hostname(const string& hostname)
1496 {
1497     int level = 0;
1498     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1499     {
1500         ostringstream msg;
1501         msg << "The configured hostname: " << hostname << " is invalid. Please add the corresponding domain part." << endl;
1502         log_warning(msg.str(),level);
1503     }
1504 }
1505
1506
1507 /**
1508  * An IP in a private range was detected
1509  * @param ip The private IP
1510  */
1511 void Logger::print_ip_is_local(const string& ip)
1512 {
1513     int level = 1;
1514     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1515     {
1516         ostringstream msg;
1517         msg << "The detected IP is within a private IP range: " << ip << endl;
1518         log_warning(msg.str(),level);
1519     }
1520 }
1521
1522
1523 /**
1524  * Regex is matching in string
1525  * @param regex The regex pattern
1526  * @param matching_string The string
1527  */
1528 void Logger::print_regex_match(const string& regex, const string& matching_string) const
1529 {
1530     int level = 1;
1531     if ( level <= Loglevel )
1532     {
1533         ostringstream msg;
1534         msg << "Regex: " << regex << " is matching in: " << matching_string << endl;
1535         log_notice(msg.str());
1536     }
1537 }
1538
1539
1540 /**
1541  * Regex is not matching
1542  * @param regex Regex
1543  * @param not_matching_string String
1544  */
1545 void Logger::print_no_regex_match(const string& regex, const string& not_matching_string)
1546 {
1547     int level = 1;
1548     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1549     {
1550         ostringstream msg;
1551         msg << "Regex: " << regex << " is not matching in: " << not_matching_string << endl;
1552         log_warning(msg.str(),level);
1553     }
1554 }
1555
1556
1557 /**
1558  * Could not parse gnudip initial reply.
1559  * @param curl_data The data received from gnudip server which should contain salt, time and sign.
1560  */
1561 void Logger::print_could_not_parse_received_data(const string& curl_data) const
1562 {
1563     int level = 0;
1564     if ( (level <= Loglevel) )
1565     {
1566         ostringstream msg;
1567         msg << "Could not parse salt, time and sign from initial gnudip server reply: " << curl_data << endl;
1568         log_error(msg.str());
1569     }
1570 }
1571
1572
1573 /**
1574  * Gnudip salt, time and sign could not be got from map
1575  */
1576 void Logger::print_could_not_get_initial_gnudip_data() const
1577 {
1578     int level = 0;
1579     if ( (level <= Loglevel) )
1580     {
1581         log_error("Could not get salt, time and sign from map.");
1582     }
1583 }
1584
1585
1586
1587 /**
1588  * Gnudip protocol requires explicit declaration of a servername.
1589  */
1590 void Logger::print_gnudip_requires_servername()
1591 {
1592     int level = 0;
1593     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1594     {
1595         log_warning("Gnudip requires explicit definition of servername via config!",level);
1596     }
1597 }
1598
1599
1600 /**
1601  * An exception occured while computing the md5 sum.
1602  * @param what The exception occured.
1603  */
1604 void Logger::print_exception_md5_sum(const string& what) const
1605 {
1606     int level = 0;
1607     if ( level <= Loglevel )
1608     {
1609         ostringstream msg;
1610         msg << "An exception occured while computing a md5 sum: " << what << endl;
1611         log_error(msg.str());
1612     }
1613 }
1614
1615
1616 /**
1617  * A network exception occured.
1618  * @param what The exception occured.
1619  */
1620 void Logger::print_network_error(const string& what) const
1621 {
1622     int level = 0;
1623     if ( level <= Loglevel )
1624     {
1625         ostringstream msg;
1626         msg << "A network exception occured: " << what << endl;
1627         log_error(msg.str());
1628     }
1629 }
1630
1631
1632 /**
1633  * An undefined protocol error occured.
1634  * @param protocol The protocol
1635  * @param error The error
1636  */
1637 void Logger::print_undefined_protocol_error(const string& protocol, const string& error) const
1638 {
1639     int level = 0;
1640     if ( level <= Loglevel )
1641     {
1642         ostringstream msg;
1643         msg << "An undefined protocol error occured. Protocol: " << protocol << " Error: " << error << endl;
1644         log_error(msg.str());
1645     }
1646 }
1647
1648 /**
1649  * Error while trying to log through external program.
1650  * @param external_prog The external program called.
1651  */
1652 void Logger::print_error_external_logging(const string& external_prog) const
1653 {
1654     int level = 0;
1655     if ( level <= Loglevel )
1656     {
1657         ostringstream msg;
1658         msg << "Error while trying to log through external program: " << external_prog << endl;
1659         log_notice(msg.str());
1660     }
1661 }
1662
1663
1664 /**
1665  * Error while parsing config file.
1666  * @param error Error occured.
1667  * @param config_file Config file.
1668  */
1669 void Logger::print_error_parsing_config_file(const string& filename, const string& error) const
1670 {
1671     int level = 0;
1672     if ( level <= Loglevel )
1673     {
1674         ostringstream msg;
1675         msg << "Error while parsing config file: " << filename << " Error: " << error << endl;
1676         log_notice(msg.str());
1677     }
1678 }
1679
1680
1681 /**
1682  * Error while parsing cmd option
1683  * @param error Error
1684  */
1685 void Logger::print_error_parsing_cmd(const string& error) const
1686 {
1687     int level = 0;
1688     if ( level <= Loglevel )
1689     {
1690         ostringstream msg;
1691         msg << "Error while parsing cmd options: " << error << endl;
1692         log_error(msg.str());
1693     }
1694 }
1695
1696
1697 /**
1698  * The webcheck interval was exceeded, so webcheck not allowed.
1699  * @param last_webcheck Time of last webcheck.
1700  * @param webcheck_interval Webcheck interval time in seconds.
1701  * @param current_time Current system time.
1702  */
1703 void Logger::print_webcheck_exceed_interval( const time_t last_webcheck, const int webcheck_interval, const time_t current_time ) const
1704 {
1705     int level = 1;
1706     if ( level <= Loglevel )
1707     {
1708         ostringstream msg;
1709         msg << "Skipped webcheck in idle period (" << (last_webcheck+webcheck_interval)-current_time << " more seconds";
1710         msg << ", last_webcheck: " << last_webcheck << ", webcheck_interval(sec): " << webcheck_interval << ")" << endl;
1711         log_notice(msg.str());
1712     }
1713 }
1714
1715
1716 /**
1717  * Checking if hosts needs update.
1718  * @param hostname Hostname
1719  * @param current_time Current time
1720  * @param lastupdated Last updated
1721  */
1722 void Logger::print_check_service_update(const string& hostname, const time_t current_time, const time_t lastupdated) const
1723 {
1724     int level = 1;
1725     if ( level <= Loglevel )
1726     {
1727         ostringstream msg;
1728         msg << "Checking if host: " << hostname << " needs update. Current time: " << current_time << " Last updated: " << lastupdated << endl;
1729         log_notice(msg.str());
1730     }
1731 }
1732
1733
1734 /**
1735  * Cached DNS entry
1736  * @param hostname Hostname
1737  * @param ip_dns_recheck DNS recheck IP
1738  * @param ip_last_update IP set in last update
1739  * @param ip_host Hosts' IP
1740  */
1741 void Logger::print_cached_dns_entry(const string& hostname, const string& ip_dns_recheck, const string& ip_last_update, const string& ip_host) const
1742 {
1743     int level = 1;
1744     if ( level <= Loglevel )
1745     {
1746         ostringstream msg;
1747         msg << "Cached DNS record for host <" << hostname << "> : " << ip_dns_recheck << " Last updated IP: " << ip_last_update << " Hosts IP: " << ip_host << endl;
1748         log_notice(msg.str());
1749     }
1750 }
1751
1752
1753 /**
1754  * Updating service
1755  * @param hostname Hostname
1756  * @param ip_dns_recheck Cached DNS entry
1757  * @param ip_last_update IP set in last update
1758  * @param ip_host Hosts IP
1759  * @param lastupdated Lastupdated
1760  */
1761 void Logger::print_update_service(const string& hostname, const string& ip_dns_recheck, const string& ip_last_update, const string& ip_host, const time_t lastupdated) const{
1762     int level = 1;
1763     if ( level <= Loglevel )
1764     {
1765         ostringstream msg;
1766         msg << "Updating service. Hostname: " << hostname << " DNS-Record: " << ip_dns_recheck << " IP set in last update: " << ip_last_update << " Lastupdated: " << lastupdated << " Hosts IP: " << ip_host << endl;
1767         log_notice(msg.str());
1768     }
1769 }
1770
1771
1772 /**
1773  * TTL expired
1774  * @param hostname Hostname
1775  * @param ip_dns_recheck Cached DNS entry
1776  * @param ip_last_update IP set in last update
1777  * @param ip_host Hosts IP
1778  * @param lastupdated Last updated
1779  * @param dns_cache_ttl DNS cache ttl
1780  * @param current_time Current time
1781  */
1782 void Logger::print_update_service_ttl_expired(const string& hostname, const string& ip_dns_recheck, const string& ip_last_update, const string& ip_host, const time_t lastupdated, const int dns_cache_ttl, const time_t current_time) const
1783 {
1784     int level = 1;
1785     if ( level <= Loglevel )
1786     {
1787         ostringstream msg;
1788         msg << "TTL for service expired and still pointing to old IP. Hostname: " << hostname << " DNS-Record: " << ip_dns_recheck << " IP set in last update: " << ip_last_update << " Lastupdated: " << lastupdated << "DNS Cache TTL: " << dns_cache_ttl << " Current Time: " << current_time << " Hosts IP: " << ip_host << endl;
1789         log_notice(msg.str());
1790     }
1791 }
1792
1793
1794 /**
1795  * TTL expired
1796  * @param override_log_level Override log level with zero if true
1797  * @param hostname Hostname
1798  * @param ip_dns_recheck Cached DNS entry
1799  * @param ip_last_update IP set in last update
1800  * @param ip_host Hosts IP
1801  * @param lastupdated Last updated
1802  * @param dns_cache_ttl DNS cache ttl
1803  * @param current_time Current time
1804  */
1805 void Logger::print_update_service_ttl_not_expired(bool override_log_level, const string& hostname, const string& ip_dns_recheck, const string& ip_last_update, const string& ip_host, const time_t lastupdated, const int dns_cache_ttl, const time_t current_time) const
1806 {
1807     int level = 1;
1808
1809     if (override_log_level)
1810         level = 0;
1811
1812     if ( level <= Loglevel )
1813     {
1814         ostringstream msg;
1815         msg << "Waiting for DNS cache TTL to expire. Hostname: " << hostname << " DNS-Record: " << ip_dns_recheck << " IP set in last update: " << ip_last_update << " Lastupdated: " << lastupdated << "DNS Cache TTL: " << dns_cache_ttl << " Current Time: " << current_time << " Hosts IP: " << ip_host << endl;
1816         log_notice(msg.str());
1817     }
1818 }
1819
1820
1821 /**
1822  * No update needed
1823  * @param override_log_level Override log level with zero if true
1824  * @param hostname Hostname
1825  * @param ip_dns_recheck Cached DNS entry
1826  * @param ip_last_update IP set in last update
1827  * @param ip_host Hosts IP
1828  * @param lastupdated Last updated
1829  */
1830 void Logger::print_no_update_needed(bool override_log_level, const string& hostname, const string& ip_dns_recheck, const string& ip_last_update, const string& ip_host, const time_t lastupdated) const
1831 {
1832     int level = 1;
1833
1834     if (override_log_level)
1835         level = 0;
1836
1837     if ( level <= Loglevel )
1838     {
1839         ostringstream msg;
1840         msg << "No update needed for host: " << hostname << " Cached DNS record: " << ip_dns_recheck << " IP set in last update: " << ip_last_update << " Hosts IP: " << ip_host << " Last updated: " << lastupdated << endl;
1841         log_notice(msg.str());
1842     }
1843 }
1844
1845
1846 /**
1847  * Error while trying to get local wan interface IP address through getifaddrs.
1848  * @param error The system call which raised the error.
1849  * @param error The error set by getifaddrs.
1850  */
1851 void Logger::print_error_getting_local_wan_ip(const std::string& system_call, const std::string& error) const
1852 {
1853     int level = 0;
1854     if ( level <= Loglevel )
1855     {
1856         ostringstream msg;
1857         msg << "Error while trying to get local wan interface IP address through '" << system_call << "': " << error << endl;
1858         log_error(msg.str());
1859     }
1860 }
1861
1862
1863 /**
1864  * Could not get IP address of local wan interface.
1865  * @param override_log_level Override log level with zero if true
1866  */
1867 void Logger::print_no_wan_ip(bool override_log_level) const
1868 {
1869     int level = 1;
1870
1871     if (override_log_level)
1872         level = 0;
1873
1874     if ( level <= Loglevel )
1875     {
1876         ostringstream msg;
1877         msg << "Could not get IP address of local wan interface. Will retry later." << endl;
1878         log_error(msg.str());
1879     }
1880 }
1881
1882 /**
1883  * Print extenral WAN IP
1884  * @param override_log_level Override log level with zero if true
1885  * @param ip External WAN IP
1886  */
1887 void Logger::print_external_wan_ip(bool override_log_level, const std::string &ip) const
1888 {
1889     int level = 1;
1890
1891     if (override_log_level)
1892         level = 0;
1893
1894     if ( level <= Loglevel )
1895     {
1896         ostringstream msg;
1897         msg << "Determined WAN interface IP: " << ip << endl;
1898         log_error(msg.str());
1899     }
1900 }
1901
1902 /**
1903  * Could not resolve current IP for DNS name
1904  * @param override_log_level Override log level with zero if true
1905  */
1906 void Logger::print_dns_lookup_failed(bool override_log_level, const std::string &hostname) const
1907 {
1908     int level = 1;
1909
1910     if (override_log_level)
1911         level = 0;
1912
1913     if ( level <= Loglevel )
1914     {
1915         ostringstream msg;
1916         msg << "Could not resolve IP address for host " << hostname << ". Will retry later." << endl;
1917         log_error(msg.str());
1918     }
1919 }
1920
1921
1922 /**
1923  * Invalid service config was detected.
1924  */
1925 void Logger::print_invalid_service_config() const
1926 {
1927     int level = 0;
1928     if ( level <= Loglevel )
1929     {
1930         log_error("Ignoring invalid service. Please check.\n");
1931     }
1932 }
1933
1934
1935 /**
1936  * Print simple message.
1937  */
1938 void Logger::print_msg( const string& msg ) const
1939 {
1940     int level = 0;
1941     if ( level <= Loglevel )
1942     {
1943         log_error(msg);
1944     }
1945 }