dc344b4f2306b417fb5cefd3a85bd195369a4cc0
[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 max_equal_updates_in_succession, const int dns_cache_ttl , const string& actual_ip, std::map<time_t,std::string> 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" << "Max equal Updates:" << max_equal_updates_in_succession << endl;
833         msg << "\t" << "DNS Cache TTL:    " << dns_cache_ttl << endl;
834         msg << "\t" << "Actual_IP:        " << actual_ip << endl;
835         for ( std::map<time_t,std::string>::reverse_iterator r_iter = lastupdated.rbegin(); r_iter != lastupdated.rend(); r_iter++ )
836         {
837             msg << "\t" << "Lastupdated:      " << r_iter->first << " -> " << r_iter->second << endl;
838         }
839         log_notice(msg.str());
840     }
841 }
842
843
844 /**
845  * Caught exception while serialize.
846  * @param exception Exception message.
847  */
848 void Logger::print_exception_serialize(const string& errMsg) const
849 {
850     int level = 0;
851     if ( level <= Loglevel )
852     {
853         ostringstream msg;
854         msg << "Error while trying to serialize Serviceholder object: " << errMsg << endl;
855         log_error(msg.str());
856     }
857 }
858
859
860 /**
861  * Caught exception while de-serialize.
862  * @param exception Exception message.
863  */
864 void Logger::print_exception_deserialize(const string& errMsg) const
865 {
866     int level = 0;
867     if ( level <= Loglevel )
868     {
869         ostringstream msg;
870         msg << "Error while trying to de-serialize Serviceholder object: " << errMsg << endl;
871         log_error(msg.str());
872     }
873 }
874
875
876 /**
877  * Child couldn't be killed by parent.
878  * @param pid Pid of the child.
879  */
880 void Logger::print_error_kill_child(const int pid) const
881 {
882     int level = 0;
883     if ( level <= Loglevel )
884     {
885         ostringstream msg;
886         msg << "Could not kill child process with PID: " << pid << endl;
887         log_error(msg.str());
888     }
889 }
890
891
892 /**
893  * Child was killed by parent because of error.
894  * @param pid The pid (child) killed.
895  */
896 void Logger::print_child_killed(const int pid) const
897 {
898     int level = 1;
899     if ( level <= Loglevel )
900     {
901         ostringstream msg;
902         msg << "Killed child process with PID: " << pid << endl;
903         log_notice(msg.str());
904     }
905 }
906
907
908 /**
909  * There is no object file.
910  * @param object_file The object file.
911  */
912 void Logger::print_no_object_file(const string& object_file)
913 {
914     int level = 1;
915     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
916     {
917         ostringstream msg;
918         msg << "There is no object file: " << object_file << ". Continue without recovering state from old services!" << endl;
919         log_warning(msg.str(),level);
920     }
921 }
922
923
924 /**
925  * Prints out the given hostname
926  * @param hostname Hostname as string.
927  */
928 void Logger::print_hostname(const string& hostname) const
929 {
930     int level = 1;
931     if ( level <= Loglevel )
932     {
933         ostringstream msg;
934         msg << "Detected following hostname of localhost: " << hostname << endl;
935         log_notice(msg.str());
936     }
937 }
938
939
940 /**
941  * Prints out the detected own ipv4 address
942  * @param ip_addr String representation of the detected ip.
943  */
944 void Logger::print_own_ipv4(const string& ip_addr_v4, const string& hostname) const
945 {
946     int level = 1;
947     if ( level <= Loglevel )
948     {
949         ostringstream msg;
950         msg << "Detected following IPv4-Address of host: " << hostname << " : " << ip_addr_v4 << endl;
951         log_notice(msg.str());
952     }
953 }
954
955
956 /**
957  * Prints out the detected own ipv5 address
958  * @param ip_addr String representation of the detected ip.
959  */
960 void Logger::print_own_ipv6(const string& ip_addr_v6, const string& hostname) const
961 {
962     int level = 1;
963     if ( level <= Loglevel )
964     {
965         ostringstream msg;
966         msg << "Detected following IPv6-Address of host: " << hostname << " : " << ip_addr_v6 << endl;
967         log_notice(msg.str());
968     }
969 }
970
971
972 /**
973  * Exception while trying to resolve hostname to ip.
974  * @param exception The exception caught.
975  * @param hostname The hostname.
976  */
977 void Logger::print_error_hostname_to_ip(const string& errMsg, const string& hostname) const
978 {
979     int level = 0;
980     if ( level <= Loglevel )
981     {
982         ostringstream msg;
983         msg << "Could not resolve the hostname: " << hostname << " to an IP-Address: " << errMsg << endl;
984         log_error(msg.str());
985     }
986 }
987
988
989 /**
990  * The update of the given service was successful.
991  * @param service The service.
992  */
993 void Logger::print_update_service_successful(const string& service) const
994 {
995     int level = 0;
996     if ( level <= Loglevel )
997     {
998         ostringstream msg;
999         msg << "Updated service successful: " << service << endl;
1000         log_notice(msg.str());
1001     }
1002 }
1003
1004
1005 /**
1006  * No ip could be determined through webcheck
1007  */
1008 void Logger::print_webcheck_no_ip()
1009 {
1010     int level = 0;
1011     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1012     {
1013         log_warning("IP-Address of this host could not be determined through any configured webcheck url.",level);
1014     }
1015 }
1016
1017
1018 /**
1019  * Connection problem while trying to get ip through webcheck url
1020  * @param curl_err_buff Curl error message
1021  * @param url the url
1022  */
1023 void Logger::print_webcheck_url_connection_problem(const char * curl_err_buff, const string& url)
1024 {
1025     int level = 1;
1026     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1027     {
1028         ostringstream msg;
1029         msg << "There was a problem while trying to connect to following URL: " << url << " CURL error: " << curl_err_buff << endl;
1030         log_warning(msg.str(),level);
1031     }
1032 }
1033
1034
1035 /**
1036  * Prints out curl error.
1037  * @param curl_err_buff Curl error message.
1038  * @param url URL
1039  */
1040 void Logger::print_webcheck_error(const char * curl_err_buff, const string& url) const
1041 {
1042     int level = 0;
1043     if ( level <= Loglevel )
1044     {
1045         ostringstream msg;
1046         msg << "There was an error while trying to connect to following URL: " << url << " CURL error: " << curl_err_buff << endl;
1047         log_error(msg.str());
1048     }
1049 }
1050
1051
1052 /**
1053  * Prints out the received data through curl.
1054  * @param curl_data Data string
1055  */
1056 void Logger::print_received_curl_data(const string& curl_data) const
1057 {
1058     int level = 1;
1059     if ( level <= Loglevel )
1060     {
1061         ostringstream msg;
1062         msg << "Received CURL data: " << curl_data << endl;
1063         log_notice(msg.str());
1064     }
1065 }
1066
1067
1068 /**
1069  * IP was foudn through regex
1070  * @param ip The IP found.
1071  */
1072 void Logger::print_regex_found_ip(const string& ip) const
1073 {
1074     int level = 1;
1075     if ( level <= Loglevel )
1076     {
1077         ostringstream msg;
1078         msg << "Found IP-Address via regex: " << ip << endl;
1079         log_notice(msg.str());
1080     }
1081 }
1082
1083
1084 /**
1085  * No IP was found through regex.
1086  * @param data The data string which should contain a valid IP.s
1087  */
1088 void Logger::print_regex_ip_not_found(const string& data)
1089 {
1090     int level = 1;
1091     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1092     {
1093         ostringstream msg;
1094         msg << "Could not extract an IP-Address via regex from following data:\n" << data << endl;
1095         log_warning(msg.str(),level);
1096     }
1097 }
1098
1099
1100 /**
1101  * Detected multiple occurrences of the same option.
1102  * @param message Error message.
1103  */
1104 void Logger::print_multiple_cmd_option(const string& message) const
1105 {
1106     int level = 0;
1107     if ( level <= Loglevel )
1108     {
1109         ostringstream msg;
1110         msg << "The same option is only allowed once: " << message << endl;
1111         log_error(msg.str());
1112     }
1113 }
1114
1115
1116 /**
1117  * An update would exceed the update interval. Prints out a warning message.
1118  * @param override_log_level Override log level with zero if true
1119  * @param current_time Current time.
1120  * @param old_time Time of update #MaxUpdatesWithinInterval ago.
1121  * @param MaxUpdatesWithinInterval Number of allowed updates in one update interval.
1122  * @param service The service which exceeds update interval.
1123  */
1124 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)
1125 {
1126     int level = 1;
1127
1128     if (override_log_level)
1129         level = 0;
1130
1131     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1132     {
1133         ostringstream msg;
1134         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;
1135         log_warning(msg.str(),level);
1136     }
1137 }
1138
1139
1140 /**
1141  * Failure while running update for service.
1142  * @param service Services' name.
1143  */
1144 void Logger::print_update_service_failure(const string& service)
1145 {
1146     int level = 0;
1147     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1148     {
1149         ostringstream msg;
1150         msg << "Could not update service: " << service << endl;
1151         log_warning(msg.str(),level);
1152     }
1153 }
1154
1155 /**
1156  * Start message
1157  */
1158 void Logger::print_started() const
1159 {
1160     int level = 0;
1161     if ( level <= Loglevel )
1162     {
1163         log_notice("Started");
1164     }
1165 }
1166
1167
1168 /**
1169  * Starting shutdown
1170  */
1171 void Logger::print_starting_shutdown() const
1172 {
1173     int level = 0;
1174     if ( level <= Loglevel )
1175     {
1176         log_notice("Shutting down ...");
1177     }
1178 }
1179
1180
1181 /**
1182  * Shutdown complete
1183  */
1184 void Logger::print_shutdown_succeeded() const
1185 {
1186     int level = 0;
1187     if ( level <= Loglevel )
1188     {
1189         log_notice("Shutting down complete ...");
1190     }
1191 }
1192
1193
1194 /**
1195  * Shutdown parent succeeded
1196  */
1197 void Logger::print_shutdown_parent_succeeded() const
1198 {
1199     int level = 0;
1200     if ( level <= Loglevel )
1201     {
1202         log_notice("Shutting down parent process completed ...");
1203     }
1204 }
1205
1206
1207 /**
1208  * Starting shutdown parent
1209  */
1210 void Logger::print_starting_shutdown_parent() const
1211 {
1212     int level = 0;
1213     if ( level <= Loglevel )
1214     {
1215         log_notice("Shutting down parent process ...");
1216     }
1217 }
1218
1219
1220 /**
1221  * DNS cache record timeout
1222  * @param hostname Hostname
1223  * @param lastupdated Lastupdated
1224  * @param dns_cache_ttl DNS cache TTL
1225  * @param current_time Current time
1226  */
1227 void Logger::print_recheck_dns_entry(const string& hostname, const int lastupdated, const int dns_cache_ttl, const int current_time) const
1228 {
1229     int level = 1;
1230     if ( level <= Loglevel )
1231     {
1232         ostringstream msg;
1233         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;
1234         log_notice(msg.str());
1235     }
1236 }
1237
1238
1239 /**
1240  * Missing proxy option on command line.
1241  */
1242 void Logger::print_missing_cmd_proxy_option() const
1243 {
1244     int level = 0;
1245     if ( level <= Loglevel )
1246     {
1247         log_error("Missing option to initialize proxy. http_proxy and http_proxy_port must be specified.");
1248     }
1249 }
1250
1251
1252 /**
1253  * Multiple option in service config file.
1254  * @param service_conf_file Service config file
1255  * @param message Multiple option text
1256  */
1257 void Logger::print_multiple_service_conf_option(const string& service_conf_file, const string& message) const
1258 {
1259     int level = 0;
1260     if ( level <= Loglevel )
1261     {
1262         ostringstream msg;
1263         msg << "Multiple occurrences of the same option in service config file detected: " << service_conf_file << " " << message << endl;
1264         log_error(msg.str());
1265     }
1266 }
1267
1268
1269 /**
1270  * Multiple option in main config file.
1271  * @param service_conf_file Service config file
1272  * @param message Multiple option text
1273  */
1274 void Logger::print_multiple_main_conf_option(const string& main_conf_file, const string& message) const
1275 {
1276     int level = 0;
1277     if ( level <= Loglevel )
1278     {
1279         ostringstream msg;
1280         msg << "Multiple occurrences of the same option in main config file detected: " << main_conf_file << " " << message << endl;
1281         log_error(msg.str());
1282     }
1283 }
1284
1285
1286 /**
1287  * Missing proxy option in main config file.
1288  * @param main_conf_filename The concerning config file.
1289  */
1290 void Logger::print_missing_conf_proxy_option(const string& main_conf_filename) const
1291 {
1292     int level = 0;
1293     if ( level <= Loglevel )
1294     {
1295         ostringstream msg;
1296         msg << "Missing option to initialize proxy in main config file: " << main_conf_filename << " http_proxy and http_proxy_port must be specified." << endl;
1297         log_error(msg.str());
1298     }
1299 }
1300
1301
1302 /**
1303  * There is no domain part in the given hostname
1304  * @param hostname The hostname with no domain part in it.
1305  */
1306 void Logger::print_no_domain_part(const string& hostname) const
1307 {
1308     int level = 0;
1309     if ( level <= Loglevel )
1310     {
1311         ostringstream msg;
1312         msg << "There is no domain part in the given hostname: " << hostname << endl;
1313         log_notice(msg.str());
1314     }
1315 }
1316
1317
1318 /**
1319  * Service is not initialized properly.
1320  * @param service The service.
1321  */
1322 void Logger::print_httphelper_not_initialized() const
1323 {
1324     int level = 0;
1325     if ( level <= Loglevel )
1326     {
1327         log_error("HTTP-Helper is not initialized properly.");
1328     }
1329 }
1330
1331
1332 /**
1333  * A curl error occured.
1334  * @param msg The error message
1335  * @param curl_err_code The resulting curl error code
1336  */
1337 void Logger::print_curl_error_init(const std::string& err_msg, const CURLcode curl_err_code) const
1338 {
1339     string curl_err = "";
1340
1341     if ( curl_err_code == CURLE_FAILED_INIT )
1342         curl_err = "CURLE_FAILED_INIT";
1343     else
1344         curl_err = "UNKNOWN";
1345
1346     int level = 0;
1347     if ( (level <= Loglevel) )
1348     {
1349         ostringstream msg;
1350         msg << "Curl error: " << err_msg << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
1351         log_error(msg.str());
1352     }
1353 }
1354
1355
1356 /**
1357  * A curl error occured.
1358  * @param url The url requested by the curl operation
1359  * @param curl_err_code The resulting curl error code
1360  */
1361 void Logger::print_curl_error(const string& url, const CURLcode curl_err_code) const
1362 {
1363     string curl_err = "";
1364
1365     if ( curl_err_code == CURLE_URL_MALFORMAT )
1366         curl_err = "CURLE_URL_MALFORMAT";
1367     else if ( curl_err_code == CURLE_COULDNT_RESOLVE_HOST )
1368         curl_err = "CURLE_COULDNT_RESOLVE_HOST";
1369     else if ( curl_err_code == CURLE_COULDNT_CONNECT )
1370         curl_err = "CURLE_COULDNT_CONNECT";
1371     else
1372         curl_err = "UNKNOWN";
1373
1374     int level = 0;
1375     if ( (level <= Loglevel) )
1376     {
1377         ostringstream msg;
1378         msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
1379         log_error(msg.str());
1380     }
1381 }
1382
1383
1384 /**
1385  * A curl error occured.
1386  * @param url The url requested by the curl operation
1387  * @param curl_err_code The resulting curl error code
1388  * @param curl_err_buff The curl error buffer
1389  */
1390 void Logger::print_curl_error(const string& url, const CURLcode curl_err_code, const char * curl_err_buff) const
1391 {
1392     string curl_err = "";
1393
1394     if ( curl_err_code == CURLE_URL_MALFORMAT )
1395         curl_err = "CURLE_URL_MALFORMAT";
1396     else if ( curl_err_code == CURLE_COULDNT_RESOLVE_HOST )
1397         curl_err = "CURLE_COULDNT_RESOLVE_HOST";
1398     else if ( curl_err_code == CURLE_COULDNT_CONNECT )
1399         curl_err = "CURLE_COULDNT_CONNECT";
1400     else
1401         curl_err = "UNKNOWN";
1402
1403     int level = 0;
1404     if ( (level <= Loglevel) )
1405     {
1406         ostringstream msg;
1407         msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << " " << curl_err_buff << endl; /*lint !e641 */
1408         log_error(msg.str());
1409     }
1410 }
1411
1412
1413 /**
1414  * Prints out the data received by curl operation
1415  * @param CurlWritedataBuff
1416  */
1417 void Logger::print_curl_data(const string& curl_writedata_buff) const
1418 {
1419     int level = 1;
1420     if ( level <= Loglevel )
1421     {
1422         ostringstream msg;
1423         msg << "Data received by curl: " << curl_writedata_buff << endl;
1424         log_notice(msg.str());
1425     }
1426 }
1427
1428
1429 /**
1430  * Not authorized to perform requested update operation
1431  * @param service The requested service.
1432  * @param username Username
1433  * @param password Password
1434  */
1435 void Logger::print_service_not_authorized(const string& service, const string& username, const string& password) const
1436 {
1437     int level = 0;
1438     if ( level <= Loglevel )
1439     {
1440         ostringstream msg;
1441         msg << "Not authorized to perform update operation on service: " << service << " Please check username and password: " << username << ":" << password << endl;
1442         log_notice(msg.str());
1443     }
1444 }
1445
1446
1447 /**
1448  * Prints out the http status code
1449  * @param url Url
1450  * @param output HTTP status code
1451  */
1452 void Logger::print_http_status_code(const string& url, const long http_code) const
1453 {
1454     int level = 1;
1455     if ( level <= Loglevel )
1456     {
1457         ostringstream msg;
1458         msg << "Requested URL: " << url << " Received HTTP status code: " << http_code << endl;
1459         log_notice(msg.str());
1460     }
1461 }
1462
1463
1464 /**
1465  * Generic failure while trying to update service
1466  * @param url The requested URL
1467  * @param curl_data The received curl_data from the server
1468  */
1469 void Logger::print_update_failure(const string& url, const string& curl_data) const
1470 {
1471     int level = 0;
1472     if ( (level <= Loglevel) )
1473     {
1474         ostringstream msg;
1475         msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << curl_data << endl;
1476         log_error(msg.str());
1477     }
1478 }
1479
1480
1481 /**
1482  * Generic failure while trying to update service
1483  * @param url The requested URL
1484  * @param http_status_code The received http status code
1485  */
1486 void Logger::print_update_failure(const string& url, const long http_status_code) const
1487 {
1488     int level = 0;
1489     if ( level <= Loglevel )
1490     {
1491         ostringstream msg;
1492         msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << http_status_code << endl;
1493         log_error(msg.str());
1494     }
1495 }
1496
1497 /**
1498  * Hostname is invalid, contains no or only one domain part.
1499  * @param hostname The full qualified host name.
1500  */
1501 void Logger::print_invalid_hostname(const string& hostname)
1502 {
1503     int level = 0;
1504     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1505     {
1506         ostringstream msg;
1507         msg << "The configured hostname: " << hostname << " is invalid. Please add the corresponding domain part." << endl;
1508         log_warning(msg.str(),level);
1509     }
1510 }
1511
1512
1513 /**
1514  * An IP in a private range was detected
1515  * @param ip The private IP
1516  */
1517 void Logger::print_ip_is_local(const string& ip)
1518 {
1519     int level = 1;
1520     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1521     {
1522         ostringstream msg;
1523         msg << "The detected IP is within a private IP range: " << ip << endl;
1524         log_warning(msg.str(),level);
1525     }
1526 }
1527
1528
1529 /**
1530  * Regex is matching in string
1531  * @param regex The regex pattern
1532  * @param matching_string The string
1533  */
1534 void Logger::print_regex_match(const string& regex, const string& matching_string) const
1535 {
1536     int level = 1;
1537     if ( level <= Loglevel )
1538     {
1539         ostringstream msg;
1540         msg << "Regex: " << regex << " is matching in: " << matching_string << endl;
1541         log_notice(msg.str());
1542     }
1543 }
1544
1545
1546 /**
1547  * Regex is not matching
1548  * @param regex Regex
1549  * @param not_matching_string String
1550  */
1551 void Logger::print_no_regex_match(const string& regex, const string& not_matching_string)
1552 {
1553     int level = 1;
1554     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1555     {
1556         ostringstream msg;
1557         msg << "Regex: " << regex << " is not matching in: " << not_matching_string << endl;
1558         log_warning(msg.str(),level);
1559     }
1560 }
1561
1562
1563 /**
1564  * Could not parse gnudip initial reply.
1565  * @param curl_data The data received from gnudip server which should contain salt, time and sign.
1566  */
1567 void Logger::print_could_not_parse_received_data(const string& curl_data) const
1568 {
1569     int level = 0;
1570     if ( (level <= Loglevel) )
1571     {
1572         ostringstream msg;
1573         msg << "Could not parse salt, time and sign from initial gnudip server reply: " << curl_data << endl;
1574         log_error(msg.str());
1575     }
1576 }
1577
1578
1579 /**
1580  * Gnudip salt, time and sign could not be got from map
1581  */
1582 void Logger::print_could_not_get_initial_gnudip_data() const
1583 {
1584     int level = 0;
1585     if ( (level <= Loglevel) )
1586     {
1587         log_error("Could not get salt, time and sign from map.");
1588     }
1589 }
1590
1591
1592
1593 /**
1594  * Gnudip protocol requires explicit declaration of a servername.
1595  */
1596 void Logger::print_gnudip_requires_servername()
1597 {
1598     int level = 0;
1599     if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
1600     {
1601         log_warning("Gnudip requires explicit definition of servername via config!",level);
1602     }
1603 }
1604
1605
1606 /**
1607  * An exception occured while computing the md5 sum.
1608  * @param what The exception occured.
1609  */
1610 void Logger::print_exception_md5_sum(const string& what) const
1611 {
1612     int level = 0;
1613     if ( level <= Loglevel )
1614     {
1615         ostringstream msg;
1616         msg << "An exception occured while computing a md5 sum: " << what << endl;
1617         log_error(msg.str());
1618     }
1619 }
1620
1621
1622 /**
1623  * A network exception occured.
1624  * @param what The exception occured.
1625  */
1626 void Logger::print_network_error(const string& what) const
1627 {
1628     int level = 0;
1629     if ( level <= Loglevel )
1630     {
1631         ostringstream msg;
1632         msg << "A network exception occured: " << what << endl;
1633         log_error(msg.str());
1634     }
1635 }
1636
1637
1638 /**
1639  * An undefined protocol error occured.
1640  * @param protocol The protocol
1641  * @param error The error
1642  */
1643 void Logger::print_undefined_protocol_error(const string& protocol, const string& error) const
1644 {
1645     int level = 0;
1646     if ( level <= Loglevel )
1647     {
1648         ostringstream msg;
1649         msg << "An undefined protocol error occured. Protocol: " << protocol << " Error: " << error << endl;
1650         log_error(msg.str());
1651     }
1652 }
1653
1654 /**
1655  * Error while trying to log through external program.
1656  * @param external_prog The external program called.
1657  */
1658 void Logger::print_error_external_logging(const string& external_prog) const
1659 {
1660     int level = 0;
1661     if ( level <= Loglevel )
1662     {
1663         ostringstream msg;
1664         msg << "Error while trying to log through external program: " << external_prog << endl;
1665         log_notice(msg.str());
1666     }
1667 }
1668
1669
1670 /**
1671  * Error while parsing config file.
1672  * @param error Error occured.
1673  * @param config_file Config file.
1674  */
1675 void Logger::print_error_parsing_config_file(const string& filename, const string& error) const
1676 {
1677     int level = 0;
1678     if ( level <= Loglevel )
1679     {
1680         ostringstream msg;
1681         msg << "Error while parsing config file: " << filename << " Error: " << error << endl;
1682         log_notice(msg.str());
1683     }
1684 }
1685
1686
1687 /**
1688  * Error while parsing cmd option
1689  * @param error Error
1690  */
1691 void Logger::print_error_parsing_cmd(const string& error) const
1692 {
1693     int level = 0;
1694     if ( level <= Loglevel )
1695     {
1696         ostringstream msg;
1697         msg << "Error while parsing cmd options: " << error << endl;
1698         log_error(msg.str());
1699     }
1700 }
1701
1702
1703 /**
1704  * The webcheck interval was exceeded, so webcheck not allowed.
1705  * @param last_webcheck Time of last webcheck.
1706  * @param webcheck_interval Webcheck interval time in seconds.
1707  * @param current_time Current system time.
1708  */
1709 void Logger::print_webcheck_exceed_interval( const time_t last_webcheck, const int webcheck_interval, const time_t current_time ) const
1710 {
1711     int level = 1;
1712     if ( level <= Loglevel )
1713     {
1714         ostringstream msg;
1715         msg << "Skipped webcheck in idle period (" << (last_webcheck+webcheck_interval)-current_time << " more seconds";
1716         msg << ", last_webcheck: " << last_webcheck << ", webcheck_interval(sec): " << webcheck_interval << ")" << endl;
1717         log_notice(msg.str());
1718     }
1719 }
1720
1721
1722 /**
1723  * Checking if hosts needs update.
1724  * @param hostname Hostname
1725  * @param current_time Current time
1726  * @param lastupdated Last updated
1727  */
1728 void Logger::print_check_service_update(const string& hostname, const time_t current_time, const time_t lastupdated) const
1729 {
1730     int level = 1;
1731     if ( level <= Loglevel )
1732     {
1733         ostringstream msg;
1734         msg << "Checking if host: " << hostname << " needs update. Current time: " << current_time << " Last updated: " << lastupdated << endl;
1735         log_notice(msg.str());
1736     }
1737 }
1738
1739
1740 /**
1741  * Cached DNS entry
1742  * @param hostname Hostname
1743  * @param ip_dns_recheck DNS recheck IP
1744  * @param ip_last_update IP set in last update
1745  * @param ip_host Hosts' IP
1746  */
1747 void Logger::print_cached_dns_entry(const string& hostname, const string& ip_dns_recheck, const string& ip_last_update, const string& ip_host) const
1748 {
1749     int level = 1;
1750     if ( level <= Loglevel )
1751     {
1752         ostringstream msg;
1753         msg << "Cached DNS record for host <" << hostname << "> : " << ip_dns_recheck << " Last updated IP: " << ip_last_update << " Hosts IP: " << ip_host << endl;
1754         log_notice(msg.str());
1755     }
1756 }
1757
1758
1759 /**
1760  * Updating service
1761  * @param hostname Hostname
1762  * @param ip_dns_recheck Cached DNS entry
1763  * @param ip_last_update IP set in last update
1764  * @param ip_host Hosts IP
1765  * @param lastupdated Lastupdated
1766  */
1767 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{
1768     int level = 1;
1769     if ( level <= Loglevel )
1770     {
1771         ostringstream msg;
1772         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;
1773         log_notice(msg.str());
1774     }
1775 }
1776
1777
1778 /**
1779  * TTL expired
1780  * @param hostname Hostname
1781  * @param ip_dns_recheck Cached DNS entry
1782  * @param ip_last_update IP set in last update
1783  * @param ip_host Hosts IP
1784  * @param lastupdated Last updated
1785  * @param dns_cache_ttl DNS cache ttl
1786  * @param current_time Current time
1787  */
1788 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
1789 {
1790     int level = 1;
1791     if ( level <= Loglevel )
1792     {
1793         ostringstream msg;
1794         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;
1795         log_notice(msg.str());
1796     }
1797 }
1798
1799
1800 /**
1801  * TTL expired
1802  * @param override_log_level Override log level with zero if true
1803  * @param hostname Hostname
1804  * @param ip_dns_recheck Cached DNS entry
1805  * @param ip_last_update IP set in last update
1806  * @param ip_host Hosts IP
1807  * @param lastupdated Last updated
1808  * @param dns_cache_ttl DNS cache ttl
1809  * @param current_time Current time
1810  */
1811 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
1812 {
1813     int level = 1;
1814
1815     if (override_log_level)
1816         level = 0;
1817
1818     if ( level <= Loglevel )
1819     {
1820         ostringstream msg;
1821         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;
1822         log_notice(msg.str());
1823     }
1824 }
1825
1826
1827 /**
1828  * No update needed
1829  * @param override_log_level Override log level with zero if true
1830  * @param hostname Hostname
1831  * @param ip_dns_recheck Cached DNS entry
1832  * @param ip_last_update IP set in last update
1833  * @param ip_host Hosts IP
1834  * @param lastupdated Last updated
1835  */
1836 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
1837 {
1838     int level = 1;
1839
1840     if (override_log_level)
1841         level = 0;
1842
1843     if ( level <= Loglevel )
1844     {
1845         ostringstream msg;
1846         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;
1847         log_notice(msg.str());
1848     }
1849 }
1850
1851
1852 /**
1853  * Error while trying to get local wan interface IP address through getifaddrs.
1854  * @param error The system call which raised the error.
1855  * @param error The error set by getifaddrs.
1856  */
1857 void Logger::print_error_getting_local_wan_ip(const std::string& system_call, const std::string& error) const
1858 {
1859     int level = 0;
1860     if ( level <= Loglevel )
1861     {
1862         ostringstream msg;
1863         msg << "Error while trying to get local wan interface IP address through '" << system_call << "': " << error << endl;
1864         log_error(msg.str());
1865     }
1866 }
1867
1868
1869 /**
1870  * Could not get IP address of local wan interface.
1871  * @param override_log_level Override log level with zero if true
1872  */
1873 void Logger::print_no_wan_ip(bool override_log_level) const
1874 {
1875     int level = 1;
1876
1877     if (override_log_level)
1878         level = 0;
1879
1880     if ( level <= Loglevel )
1881     {
1882         ostringstream msg;
1883         msg << "Could not get IP address of local wan interface. Will retry later." << endl;
1884         log_error(msg.str());
1885     }
1886 }
1887
1888 /**
1889  * Print extenral WAN IP
1890  * @param override_log_level Override log level with zero if true
1891  * @param ip External WAN IP
1892  */
1893 void Logger::print_external_wan_ip(bool override_log_level, const std::string &ip) const
1894 {
1895     int level = 1;
1896
1897     if (override_log_level)
1898         level = 0;
1899
1900     if ( level <= Loglevel )
1901     {
1902         ostringstream msg;
1903         msg << "Determined WAN interface IP: " << ip << endl;
1904         log_error(msg.str());
1905     }
1906 }
1907
1908 /**
1909  * Could not resolve current IP for DNS name
1910  * @param override_log_level Override log level with zero if true
1911  */
1912 void Logger::print_dns_lookup_failed(bool override_log_level, const std::string &hostname) const
1913 {
1914     int level = 1;
1915
1916     if (override_log_level)
1917         level = 0;
1918
1919     if ( level <= Loglevel )
1920     {
1921         ostringstream msg;
1922         msg << "Could not resolve IP address for host " << hostname << ". Will retry later." << endl;
1923         log_error(msg.str());
1924     }
1925 }
1926
1927
1928 /**
1929  * Invalid service config was detected.
1930  */
1931 void Logger::print_invalid_service_config() const
1932 {
1933     int level = 0;
1934     if ( level <= Loglevel )
1935     {
1936         log_error("Ignoring invalid service. Please check.\n");
1937     }
1938 }
1939
1940
1941 /**
1942  * Print simple message.
1943  */
1944 void Logger::print_msg( const string& msg ) const
1945 {
1946     int level = 0;
1947     if ( level <= Loglevel )
1948     {
1949         log_error(msg);
1950     }
1951 }
1952
1953
1954 /**
1955  * Print the last updates.
1956  * @param ip_host Actual host IP.
1957  * @param max_equal_updates_in_succession Maximal number of updates for the same IP in succession.
1958  * @param last_updates Map with the last updates in it.
1959  * @param hostname The service hostname.
1960  */
1961 void Logger::print_last_updates( const std::string& ip_host, const int max_equal_updates_in_succession, const std::map<time_t,std::string>& last_updates, const std::string& hostname ) const
1962 {
1963     int level = 1;
1964  
1965     if ( level <= Loglevel )
1966     {
1967         ostringstream msg;
1968         msg << "Last updates for " << hostname << " : ";
1969
1970         int i = 0;
1971         for ( std::map<time_t,std::string>::reverse_iterator r_iter; (r_iter != last_updates.rend()) && (i < max_equal_updates_in_succession); r_iter++ )
1972         {
1973             msg << r_iter->first << "->" << r_iter->second;
1974             i++;
1975         }
1976         msg << ". Actual internet IP: " << ip_host << endl;
1977
1978         log_notice(msg.str());
1979     }
1980 }
1981
1982
1983 /**
1984  * Print the burnt IP.
1985  * @param ip_host Actual host IP which is burnt.
1986  * @param hostname The service hostname.
1987  */
1988 void Logger::print_ip_burnt( const std::string& ip_host, const std::string& hostname ) const
1989 {
1990     int level = 0;
1991     if ( level <= Loglevel )
1992     {
1993         ostringstream msg;
1994         msg << "IP address " << ip_host << " was updated too often in succession, host " << hostname  << " blocked until IP address will be different." << endl;
1995         log_error(msg.str());
1996     }
1997 }