5ec6f355d27190d92a8fac30c88fca81c9ff2150
[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 override_log_level Override log level with zero if true
1118  * @param current_time Current time.
1119  * @param old_time Time of update #MaxUpdatesWithinInterval ago.
1120  * @param MaxUpdatesWithinInterval Number of allowed updates in one update interval.
1121  * @param service The service which exceeds update interval.
1122  */
1123 void Logger::print_update_not_allowed(bool override_log_level, const time_t current_time, const time_t old_time, const int MaxUpdatesWithinInterval, const string& service)
1124 {
1125     int level = 1;
1126
1127     if (override_log_level)
1128         level = 0;
1129
1130     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1131     {
1132         ostringstream msg;
1133         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;
1134         log_warning(msg.str(),level);
1135     }
1136 }
1137
1138
1139 /**
1140  * Failure while running update for service.
1141  * @param service Services' name.
1142  */
1143 void Logger::print_update_service_failure(const string& service)
1144 {
1145     int level = 0;
1146     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1147     {
1148         ostringstream msg;
1149         msg << "Could not update service: " << service << endl;
1150         log_warning(msg.str(),level);
1151     }
1152 }
1153
1154 /**
1155  * Start message
1156  */
1157 void Logger::print_started() const
1158 {
1159     int level = 0;
1160     if ( level <= Loglevel )
1161     {
1162         log_notice("Started");
1163     }
1164 }
1165
1166
1167 /**
1168  * Starting shutdown
1169  */
1170 void Logger::print_starting_shutdown() const
1171 {
1172     int level = 0;
1173     if ( level <= Loglevel )
1174     {
1175         log_notice("Shutting down ...");
1176     }
1177 }
1178
1179
1180 /**
1181  * Shutdown complete
1182  */
1183 void Logger::print_shutdown_succeeded() const
1184 {
1185     int level = 0;
1186     if ( level <= Loglevel )
1187     {
1188         log_notice("Shutting down complete ...");
1189     }
1190 }
1191
1192
1193 /**
1194  * Shutdown parent succeeded
1195  */
1196 void Logger::print_shutdown_parent_succeeded() const
1197 {
1198     int level = 0;
1199     if ( level <= Loglevel )
1200     {
1201         log_notice("Shutting down parent process completed ...");
1202     }
1203 }
1204
1205
1206 /**
1207  * Starting shutdown parent
1208  */
1209 void Logger::print_starting_shutdown_parent() const
1210 {
1211     int level = 0;
1212     if ( level <= Loglevel )
1213     {
1214         log_notice("Shutting down parent process ...");
1215     }
1216 }
1217
1218
1219 /**
1220  * DNS cache record timeout
1221  * @param hostname Hostname
1222  * @param lastupdated Lastupdated
1223  * @param dns_cache_ttl DNS cache TTL
1224  * @param current_time Current time
1225  */
1226 void Logger::print_recheck_dns_entry(const string& hostname, const int lastupdated, const int dns_cache_ttl, const int current_time) const
1227 {
1228     int level = 1;
1229     if ( level <= Loglevel )
1230     {
1231         ostringstream msg;
1232         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;
1233         log_notice(msg.str());
1234     }
1235 }
1236
1237
1238 /**
1239  * Missing proxy option on command line.
1240  */
1241 void Logger::print_missing_cmd_proxy_option() const
1242 {
1243     int level = 0;
1244     if ( level <= Loglevel )
1245     {
1246         log_error("Missing option to initialize proxy. http_proxy and http_proxy_port must be specified.");
1247     }
1248 }
1249
1250
1251 /**
1252  * Multiple option in service config file.
1253  * @param service_conf_file Service config file
1254  * @param message Multiple option text
1255  */
1256 void Logger::print_multiple_service_conf_option(const string& service_conf_file, const string& message) const
1257 {
1258     int level = 0;
1259     if ( level <= Loglevel )
1260     {
1261         ostringstream msg;
1262         msg << "Multiple occurrences of the same option in service config file detected: " << service_conf_file << " " << message << endl;
1263         log_error(msg.str());
1264     }
1265 }
1266
1267
1268 /**
1269  * Multiple option in main config file.
1270  * @param service_conf_file Service config file
1271  * @param message Multiple option text
1272  */
1273 void Logger::print_multiple_main_conf_option(const string& main_conf_file, const string& message) const
1274 {
1275     int level = 0;
1276     if ( level <= Loglevel )
1277     {
1278         ostringstream msg;
1279         msg << "Multiple occurrences of the same option in main config file detected: " << main_conf_file << " " << message << endl;
1280         log_error(msg.str());
1281     }
1282 }
1283
1284
1285 /**
1286  * Missing proxy option in main config file.
1287  * @param main_conf_filename The concerning config file.
1288  */
1289 void Logger::print_missing_conf_proxy_option(const string& main_conf_filename) const
1290 {
1291     int level = 0;
1292     if ( level <= Loglevel )
1293     {
1294         ostringstream msg;
1295         msg << "Missing option to initialize proxy in main config file: " << main_conf_filename << " http_proxy and http_proxy_port must be specified." << endl;
1296         log_error(msg.str());
1297     }
1298 }
1299
1300
1301 /**
1302  * There is no domain part in the given hostname
1303  * @param hostname The hostname with no domain part in it.
1304  */
1305 void Logger::print_no_domain_part(const string& hostname) const
1306 {
1307     int level = 0;
1308     if ( level <= Loglevel )
1309     {
1310         ostringstream msg;
1311         msg << "There is no domain part in the given hostname: " << hostname << endl;
1312         log_notice(msg.str());
1313     }
1314 }
1315
1316
1317 /**
1318  * Service is not initialized properly.
1319  * @param service The service.
1320  */
1321 void Logger::print_httphelper_not_initialized() const
1322 {
1323     int level = 0;
1324     if ( level <= Loglevel )
1325     {
1326         log_error("HTTP-Helper is not initialized properly.");
1327     }
1328 }
1329
1330
1331 /**
1332  * A curl error occured.
1333  * @param msg The error message
1334  * @param curl_err_code The resulting curl error code
1335  */
1336 void Logger::print_curl_error_init(const std::string& err_msg, const CURLcode curl_err_code) const
1337 {
1338     string curl_err = "";
1339
1340     if ( curl_err_code == CURLE_FAILED_INIT )
1341         curl_err = "CURLE_FAILED_INIT";
1342     else
1343         curl_err = "UNKNOWN";
1344
1345     int level = 0;
1346     if ( (level <= Loglevel) )
1347     {
1348         ostringstream msg;
1349         msg << "Curl error: " << err_msg << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
1350         log_error(msg.str());
1351     }
1352 }
1353
1354
1355 /**
1356  * A curl error occured.
1357  * @param url The url requested by the curl operation
1358  * @param curl_err_code The resulting curl error code
1359  */
1360 void Logger::print_curl_error(const string& url, const CURLcode curl_err_code) const
1361 {
1362     string curl_err = "";
1363
1364     if ( curl_err_code == CURLE_URL_MALFORMAT )
1365         curl_err = "CURLE_URL_MALFORMAT";
1366     else if ( curl_err_code == CURLE_COULDNT_RESOLVE_HOST )
1367         curl_err = "CURLE_COULDNT_RESOLVE_HOST";
1368     else if ( curl_err_code == CURLE_COULDNT_CONNECT )
1369         curl_err = "CURLE_COULDNT_CONNECT";
1370     else
1371         curl_err = "UNKNOWN";
1372
1373     int level = 0;
1374     if ( (level <= Loglevel) )
1375     {
1376         ostringstream msg;
1377         msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
1378         log_error(msg.str());
1379     }
1380 }
1381
1382
1383 /**
1384  * A curl error occured.
1385  * @param url The url requested by the curl operation
1386  * @param curl_err_code The resulting curl error code
1387  * @param curl_err_buff The curl error buffer
1388  */
1389 void Logger::print_curl_error(const string& url, const CURLcode curl_err_code, const char * curl_err_buff) const
1390 {
1391     string curl_err = "";
1392
1393     if ( curl_err_code == CURLE_URL_MALFORMAT )
1394         curl_err = "CURLE_URL_MALFORMAT";
1395     else if ( curl_err_code == CURLE_COULDNT_RESOLVE_HOST )
1396         curl_err = "CURLE_COULDNT_RESOLVE_HOST";
1397     else if ( curl_err_code == CURLE_COULDNT_CONNECT )
1398         curl_err = "CURLE_COULDNT_CONNECT";
1399     else
1400         curl_err = "UNKNOWN";
1401
1402     int level = 0;
1403     if ( (level <= Loglevel) )
1404     {
1405         ostringstream msg;
1406         msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << " " << curl_err_buff << endl; /*lint !e641 */
1407         log_error(msg.str());
1408     }
1409 }
1410
1411
1412 /**
1413  * Prints out the data received by curl operation
1414  * @param CurlWritedataBuff
1415  */
1416 void Logger::print_curl_data(const string& curl_writedata_buff) const
1417 {
1418     int level = 1;
1419     if ( level <= Loglevel )
1420     {
1421         ostringstream msg;
1422         msg << "Data received by curl: " << curl_writedata_buff << endl;
1423         log_notice(msg.str());
1424     }
1425 }
1426
1427
1428 /**
1429  * Not authorized to perform requested update operation
1430  * @param service The requested service.
1431  * @param username Username
1432  * @param password Password
1433  */
1434 void Logger::print_service_not_authorized(const string& service, const string& username, const string& password) const
1435 {
1436     int level = 0;
1437     if ( level <= Loglevel )
1438     {
1439         ostringstream msg;
1440         msg << "Not authorized to perform update operation on service: " << service << " Please check username and password: " << username << ":" << password << endl;
1441         log_notice(msg.str());
1442     }
1443 }
1444
1445
1446 /**
1447  * Prints out the http status code
1448  * @param url Url
1449  * @param output HTTP status code
1450  */
1451 void Logger::print_http_status_code(const string& url, const long http_code) const
1452 {
1453     int level = 1;
1454     if ( level <= Loglevel )
1455     {
1456         ostringstream msg;
1457         msg << "Requested URL: " << url << " Received HTTP status code: " << http_code << endl;
1458         log_notice(msg.str());
1459     }
1460 }
1461
1462
1463 /**
1464  * Generic failure while trying to update service
1465  * @param url The requested URL
1466  * @param curl_data The received curl_data from the server
1467  */
1468 void Logger::print_update_failure(const string& url, const string& curl_data) const
1469 {
1470     int level = 0;
1471     if ( (level <= Loglevel) )
1472     {
1473         ostringstream msg;
1474         msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << curl_data << endl;
1475         log_error(msg.str());
1476     }
1477 }
1478
1479
1480 /**
1481  * Generic failure while trying to update service
1482  * @param url The requested URL
1483  * @param http_status_code The received http status code
1484  */
1485 void Logger::print_update_failure(const string& url, const long http_status_code) const
1486 {
1487     int level = 0;
1488     if ( level <= Loglevel )
1489     {
1490         ostringstream msg;
1491         msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << http_status_code << endl;
1492         log_error(msg.str());
1493     }
1494 }
1495
1496 /**
1497  * Hostname is invalid, contains no or only one domain part.
1498  * @param hostname The full qualified host name.
1499  */
1500 void Logger::print_invalid_hostname(const string& hostname)
1501 {
1502     int level = 0;
1503     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1504     {
1505         ostringstream msg;
1506         msg << "The configured hostname: " << hostname << " is invalid. Please add the corresponding domain part." << endl;
1507         log_warning(msg.str(),level);
1508     }
1509 }
1510
1511
1512 /**
1513  * An IP in a private range was detected
1514  * @param ip The private IP
1515  */
1516 void Logger::print_ip_is_local(const string& ip)
1517 {
1518     int level = 1;
1519     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1520     {
1521         ostringstream msg;
1522         msg << "The detected IP is within a private IP range: " << ip << endl;
1523         log_warning(msg.str(),level);
1524     }
1525 }
1526
1527
1528 /**
1529  * Regex is matching in string
1530  * @param regex The regex pattern
1531  * @param matching_string The string
1532  */
1533 void Logger::print_regex_match(const string& regex, const string& matching_string) const
1534 {
1535     int level = 1;
1536     if ( level <= Loglevel )
1537     {
1538         ostringstream msg;
1539         msg << "Regex: " << regex << " is matching in: " << matching_string << endl;
1540         log_notice(msg.str());
1541     }
1542 }
1543
1544
1545 /**
1546  * Regex is not matching
1547  * @param regex Regex
1548  * @param not_matching_string String
1549  */
1550 void Logger::print_no_regex_match(const string& regex, const string& not_matching_string)
1551 {
1552     int level = 1;
1553     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1554     {
1555         ostringstream msg;
1556         msg << "Regex: " << regex << " is not matching in: " << not_matching_string << endl;
1557         log_warning(msg.str(),level);
1558     }
1559 }
1560
1561
1562 /**
1563  * Could not parse gnudip initial reply.
1564  * @param curl_data The data received from gnudip server which should contain salt, time and sign.
1565  */
1566 void Logger::print_could_not_parse_received_data(const string& curl_data) const
1567 {
1568     int level = 0;
1569     if ( (level <= Loglevel) )
1570     {
1571         ostringstream msg;
1572         msg << "Could not parse salt, time and sign from initial gnudip server reply: " << curl_data << endl;
1573         log_error(msg.str());
1574     }
1575 }
1576
1577
1578 /**
1579  * Gnudip salt, time and sign could not be got from map
1580  */
1581 void Logger::print_could_not_get_initial_gnudip_data() const
1582 {
1583     int level = 0;
1584     if ( (level <= Loglevel) )
1585     {
1586         log_error("Could not get salt, time and sign from map.");
1587     }
1588 }
1589
1590
1591
1592 /**
1593  * Gnudip protocol requires explicit declaration of a servername.
1594  */
1595 void Logger::print_gnudip_requires_servername()
1596 {
1597     int level = 0;
1598     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1599     {
1600         log_warning("Gnudip requires explicit definition of servername via config!",level);
1601     }
1602 }
1603
1604
1605 /**
1606  * An exception occured while computing the md5 sum.
1607  * @param what The exception occured.
1608  */
1609 void Logger::print_exception_md5_sum(const string& what) const
1610 {
1611     int level = 0;
1612     if ( level <= Loglevel )
1613     {
1614         ostringstream msg;
1615         msg << "An exception occured while computing a md5 sum: " << what << endl;
1616         log_error(msg.str());
1617     }
1618 }
1619
1620
1621 /**
1622  * A network exception occured.
1623  * @param what The exception occured.
1624  */
1625 void Logger::print_network_error(const string& what) const
1626 {
1627     int level = 0;
1628     if ( level <= Loglevel )
1629     {
1630         ostringstream msg;
1631         msg << "A network exception occured: " << what << endl;
1632         log_error(msg.str());
1633     }
1634 }
1635
1636
1637 /**
1638  * An undefined protocol error occured.
1639  * @param protocol The protocol
1640  * @param error The error
1641  */
1642 void Logger::print_undefined_protocol_error(const string& protocol, const string& error) const
1643 {
1644     int level = 0;
1645     if ( level <= Loglevel )
1646     {
1647         ostringstream msg;
1648         msg << "An undefined protocol error occured. Protocol: " << protocol << " Error: " << error << endl;
1649         log_error(msg.str());
1650     }
1651 }
1652
1653 /**
1654  * Error while trying to log through external program.
1655  * @param external_prog The external program called.
1656  */
1657 void Logger::print_error_external_logging(const string& external_prog) const
1658 {
1659     int level = 0;
1660     if ( level <= Loglevel )
1661     {
1662         ostringstream msg;
1663         msg << "Error while trying to log through external program: " << external_prog << endl;
1664         log_notice(msg.str());
1665     }
1666 }
1667
1668
1669 /**
1670  * Error while parsing config file.
1671  * @param error Error occured.
1672  * @param config_file Config file.
1673  */
1674 void Logger::print_error_parsing_config_file(const string& filename, const string& error) const
1675 {
1676     int level = 0;
1677     if ( level <= Loglevel )
1678     {
1679         ostringstream msg;
1680         msg << "Error while parsing config file: " << filename << " Error: " << error << endl;
1681         log_notice(msg.str());
1682     }
1683 }
1684
1685
1686 /**
1687  * Error while parsing cmd option
1688  * @param error Error
1689  */
1690 void Logger::print_error_parsing_cmd(const string& error) const
1691 {
1692     int level = 0;
1693     if ( level <= Loglevel )
1694     {
1695         ostringstream msg;
1696         msg << "Error while parsing cmd options: " << error << endl;
1697         log_error(msg.str());
1698     }
1699 }
1700
1701
1702 /**
1703  * The webcheck interval was exceeded, so webcheck not allowed.
1704  * @param last_webcheck Time of last webcheck.
1705  * @param webcheck_interval Webcheck interval time in seconds.
1706  * @param current_time Current system time.
1707  */
1708 void Logger::print_webcheck_exceed_interval( const time_t last_webcheck, const int webcheck_interval, const time_t current_time ) const
1709 {
1710     int level = 1;
1711     if ( level <= Loglevel )
1712     {
1713         ostringstream msg;
1714         msg << "Skipped webcheck in idle period (" << (last_webcheck+webcheck_interval)-current_time << " more seconds";
1715         msg << ", last_webcheck: " << last_webcheck << ", webcheck_interval(sec): " << webcheck_interval << ")" << endl;
1716         log_notice(msg.str());
1717     }
1718 }
1719
1720
1721 /**
1722  * Checking if hosts needs update.
1723  * @param hostname Hostname
1724  * @param current_time Current time
1725  * @param lastupdated Last updated
1726  */
1727 void Logger::print_check_service_update(const string& hostname, const time_t current_time, const time_t lastupdated) const
1728 {
1729     int level = 1;
1730     if ( level <= Loglevel )
1731     {
1732         ostringstream msg;
1733         msg << "Checking if host: " << hostname << " needs update. Current time: " << current_time << " Last updated: " << lastupdated << endl;
1734         log_notice(msg.str());
1735     }
1736 }
1737
1738
1739 /**
1740  * Cached DNS entry
1741  * @param hostname Hostname
1742  * @param ip_dns_recheck DNS recheck IP
1743  * @param ip_last_update IP set in last update
1744  * @param ip_host Hosts' IP
1745  */
1746 void Logger::print_cached_dns_entry(const string& hostname, const string& ip_dns_recheck, const string& ip_last_update, const string& ip_host) const
1747 {
1748     int level = 1;
1749     if ( level <= Loglevel )
1750     {
1751         ostringstream msg;
1752         msg << "Cached DNS record for host <" << hostname << "> : " << ip_dns_recheck << " Last updated IP: " << ip_last_update << " Hosts IP: " << ip_host << endl;
1753         log_notice(msg.str());
1754     }
1755 }
1756
1757
1758 /**
1759  * Updating service
1760  * @param hostname Hostname
1761  * @param ip_dns_recheck Cached DNS entry
1762  * @param ip_last_update IP set in last update
1763  * @param ip_host Hosts IP
1764  * @param lastupdated Lastupdated
1765  */
1766 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{
1767     int level = 1;
1768     if ( level <= Loglevel )
1769     {
1770         ostringstream msg;
1771         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;
1772         log_notice(msg.str());
1773     }
1774 }
1775
1776
1777 /**
1778  * TTL expired
1779  * @param hostname Hostname
1780  * @param ip_dns_recheck Cached DNS entry
1781  * @param ip_last_update IP set in last update
1782  * @param ip_host Hosts IP
1783  * @param lastupdated Last updated
1784  * @param dns_cache_ttl DNS cache ttl
1785  * @param current_time Current time
1786  */
1787 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
1788 {
1789     int level = 1;
1790     if ( level <= Loglevel )
1791     {
1792         ostringstream msg;
1793         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;
1794         log_notice(msg.str());
1795     }
1796 }
1797
1798
1799 /**
1800  * TTL expired
1801  * @param override_log_level Override log level with zero if true
1802  * @param hostname Hostname
1803  * @param ip_dns_recheck Cached DNS entry
1804  * @param ip_last_update IP set in last update
1805  * @param ip_host Hosts IP
1806  * @param lastupdated Last updated
1807  * @param dns_cache_ttl DNS cache ttl
1808  * @param current_time Current time
1809  */
1810 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
1811 {
1812     int level = 1;
1813
1814     if (override_log_level)
1815         level = 0;
1816
1817     if ( level <= Loglevel )
1818     {
1819         ostringstream msg;
1820         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;
1821         log_notice(msg.str());
1822     }
1823 }
1824
1825
1826 /**
1827  * No update needed
1828  * @param override_log_level Override log level with zero if true
1829  * @param hostname Hostname
1830  * @param ip_dns_recheck Cached DNS entry
1831  * @param ip_last_update IP set in last update
1832  * @param ip_host Hosts IP
1833  * @param lastupdated Last updated
1834  */
1835 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
1836 {
1837     int level = 1;
1838
1839     if (override_log_level)
1840         level = 0;
1841
1842     if ( level <= Loglevel )
1843     {
1844         ostringstream msg;
1845         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;
1846         log_notice(msg.str());
1847     }
1848 }
1849
1850
1851 /**
1852  * Error while trying to get local wan interface IP address through getifaddrs.
1853  * @param error The system call which raised the error.
1854  * @param error The error set by getifaddrs.
1855  */
1856 void Logger::print_error_getting_local_wan_ip(const std::string& system_call, const std::string& error) const
1857 {
1858     int level = 0;
1859     if ( level <= Loglevel )
1860     {
1861         ostringstream msg;
1862         msg << "Error while trying to get local wan interface IP address through '" << system_call << "': " << error << endl;
1863         log_error(msg.str());
1864     }
1865 }
1866
1867
1868 /**
1869  * Could not get IP address of local wan interface.
1870  * @param override_log_level Override log level with zero if true
1871  */
1872 void Logger::print_no_wan_ip(bool override_log_level) const
1873 {
1874     int level = 1;
1875
1876     if (override_log_level)
1877         level = 0;
1878
1879     if ( level <= Loglevel )
1880     {
1881         ostringstream msg;
1882         msg << "Could not get IP address of local wan interface. Will retry later." << endl;
1883         log_error(msg.str());
1884     }
1885 }
1886
1887 /**
1888  * Print extenral WAN IP
1889  * @param override_log_level Override log level with zero if true
1890  * @param ip External WAN IP
1891  */
1892 void Logger::print_external_wan_ip(bool override_log_level, const std::string &ip) const
1893 {
1894     int level = 1;
1895
1896     if (override_log_level)
1897         level = 0;
1898
1899     if ( level <= Loglevel )
1900     {
1901         ostringstream msg;
1902         msg << "Determined WAN interface IP: " << ip << endl;
1903         log_error(msg.str());
1904     }
1905 }
1906
1907 /**
1908  * Could not resolve current IP for DNS name
1909  * @param override_log_level Override log level with zero if true
1910  */
1911 void Logger::print_dns_lookup_failed(bool override_log_level, const std::string &hostname) const
1912 {
1913     int level = 1;
1914
1915     if (override_log_level)
1916         level = 0;
1917
1918     if ( level <= Loglevel )
1919     {
1920         ostringstream msg;
1921         msg << "Could not resolve IP address for host " << hostname << ". Will retry later." << endl;
1922         log_error(msg.str());
1923     }
1924 }
1925
1926
1927 /**
1928  * Invalid service config was detected.
1929  */
1930 void Logger::print_invalid_service_config() const
1931 {
1932     int level = 0;
1933     if ( level <= Loglevel )
1934     {
1935         log_error("Ignoring invalid service. Please check.\n");
1936     }
1937 }
1938
1939
1940 /**
1941  * Print simple message.
1942  */
1943 void Logger::print_msg( const string& msg ) const
1944 {
1945     int level = 0;
1946     if ( level <= Loglevel )
1947     {
1948         log_error(msg);
1949     }
1950 }