("http_proxy_port",po::value<int>(),"Port of the proxy.")
("external_warning_log",po::value<string>()->default_value(""),"External programm to pass warning log messages to.")
("external_warning_level",po::value<int>()->default_value(0),"Warning messages of which loglevel should be passed to external programm.")
+ ("external_log_only_once",po::value<bool>()->default_value(false),"Log the same external message only once until next reload or restart.")
("start_offline",po::value<bool>()->default_value(false),"Start in offline mode.")
;
("http_proxy_port",po::value<int>(),"Port of the proxy.")
("external_warning_log",po::value<string>()->default_value(""),"External programm to pass warning log messages to.")
("external_warning_level",po::value<int>()->default_value(0),"Warning messages of which loglevel should be passed to external programm.")
+ ("external_log_only_once",po::value<bool>()->default_value(false),"Log the same external message only once until next reload or restart.")
("start_offline",po::value<bool>()->default_value(false),"Start in offline mode.")
;
if ( VariablesMap.count("external_warning_level") )
ExternalWarningLevel = VariablesMap["external_warning_level"].as<int>();
+ if ( VariablesMap.count("external_log_only_once") )
+ StartOffline = VariablesMap["external_log_only_once"].as<bool>();
+
if ( VariablesMap.count("start_offline") )
StartOffline = VariablesMap["start_offline"].as<bool>();
}
else if(protocol == "gnudip")
{
- cout << "Server: " << server << endl;
if ( !server.empty() )
{
Service::Ptr service_gnudip(new ServiceGnudip(protocol,server,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl,Proxy,ProxyPort));
if ( VariablesMap.count("external_warning_level") )
ExternalWarningLevel = VariablesMap["external_warning_level"].as<int>();
+ if ( VariablesMap.count("external_log_only_once") )
+ StartOffline = VariablesMap["external_log_only_once"].as<bool>();
+
if ( VariablesMap.count("start_offline") )
StartOffline = VariablesMap["start_offline"].as<bool>();
{
return StartOffline;
}
+
+
+/**
+ * Get member ExternalLogOnlyOnce
+ * @return StartOffline
+ */
+bool Config::get_external_log_only_once() const
+{
+ return ExternalLogOnlyOnce;
+}
: Loglevel(0)
, Syslog(false)
, ExternalWarningLevel(0)
+ , ExternalLogOnlyOnce(false)
{
- set_log_facility(Loglevel,Syslog,ExternalWarningLog,ExternalWarningLevel);
+ set_log_facility(Loglevel,Syslog,ExternalWarningLog,ExternalWarningLevel,ExternalLogOnlyOnce);
}
/**
+ * Decides if a external log message can be send.
+ * @param msg The message to log.
+ */
+bool Logger::is_allowed_to_send( const string& msg ) const
+{
+ if ( (ExternalLogOnlyOnce) && (ExternalSendMessages.find(msg) != ExternalSendMessages.end()) )
+ return false;
+ return true;
+}
+
+
+/**
+ * Clears the external send messages set.
+ */
+void Logger::clear_external_send_messages()
+{
+ ExternalSendMessages.clear();
+}
+
+
+/**
* Decides if Logging through syslog if enabled or through std.
* @param msg The message to log.
*/
* Decides if Logging through syslog if enabled or through std.
* @param msg The message to log.
*/
-void Logger::log_warning(const string& msg, int level) const
+void Logger::log_warning(const string& msg, int level)
{
if ( Syslog )
syslog(LOG_WARNING,msg.c_str());
else
cout << msg << endl;
- if ( (level <= ExternalWarningLevel) && (!ExternalWarningLog.empty()) )
+ if ( (level <= ExternalWarningLevel) && (!ExternalWarningLog.empty()) && (is_allowed_to_send(msg)) )
{
+ string message = msg;
+ // Remove endline from msg.
+ if (!message.empty() && message[message.length()-1] == '\n')
+ message.erase(message.length()-1);
+
string external = ExternalWarningLog;
external.append(" ");
external.append("\"");
- external.append(msg);
+ external.append(message);
external.append("\"");
if ( system(external.c_str()) != 0 )
print_error_external_logging(external);
+ else
+ ExternalSendMessages.insert(msg);
}
}
* Setter for member Loglevel.
* @param _loglevel Value to set Loglevel to.
*/
+void Logger::set_external_log_only_once( const bool _external_log_only_once )
+{
+ ExternalLogOnlyOnce = _external_log_only_once;
+}
+
+
+/**
+ * Setter for member Loglevel.
+ * @param _loglevel Value to set Loglevel to.
+ */
void Logger::set_loglevel(const int _loglevel)
{
Loglevel = _loglevel;
- cout << "Loglevel set" << endl;
}
/**
* Initialize the logging facility.
*/
-void Logger::set_log_facility(const int _loglevel, const bool _syslog, const string& _external_error_log, const int _external_error_level)
+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 )
{
Loglevel = _loglevel;
Syslog = _syslog;
ExternalWarningLog = _external_error_log;
ExternalWarningLevel = _external_error_level;
-
+ ExternalLogOnlyOnce = _external_log_only_once;
if ( Syslog )
openlog("bpdyndnsd",LOG_PID,LOG_DAEMON);
* There is no object file.
* @param object_file The object file.
*/
-void Logger::print_no_object_file(const string& object_file) const
+void Logger::print_no_object_file(const string& object_file)
{
int level = 1;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
{
ostringstream msg;
msg << "Could not resolve the hostname: " << hostname << " to an IP-Address: " << errMsg << endl;
- log_warning(msg.str(),level);
+ log_error(msg.str());
}
}
/**
* No ip could be determined through webcheck
*/
-void Logger::print_webcheck_no_ip() const
+void Logger::print_webcheck_no_ip()
{
int level = 0;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
* @param curl_err_buff Curl error message
* @param url the url
*/
-void Logger::print_webcheck_url_connection_problem(const char * curl_err_buff, const string& url) const
+void Logger::print_webcheck_url_connection_problem(const char * curl_err_buff, const string& url)
{
int level = 1;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
* No IP was found through regex.
* @param data The data string which should contain a valid IP.s
*/
-void Logger::print_regex_ip_not_found(const string& data) const
+void Logger::print_regex_ip_not_found(const string& data)
{
int level = 1;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
* @param MaxUpdatesWithinInterval Number of allowed updates in one update interval.
* @param service The service which exceeds update interval.
*/
-void Logger::print_update_not_allowed(const time_t current_time, const time_t old_time, const int MaxUpdatesWithinInterval, const string& service) const
+void Logger::print_update_not_allowed(const time_t current_time, const time_t old_time, const int MaxUpdatesWithinInterval, const string& service)
{
int level = 1;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
* Failure while running update for service.
* @param service Services' name.
*/
-void Logger::print_update_service_failure(const string& service) const
+void Logger::print_update_service_failure(const string& service)
{
int level = 0;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
* Service is not initialized properly.
* @param service The service.
*/
-void Logger::print_service_not_initialized(const std::string& service) const
+void Logger::print_httphelper_not_initialized() const
{
int level = 0;
if ( level <= Loglevel )
{
- ostringstream msg;
- msg << "Service: " << service << " is not initialized properly." << endl;
- log_warning(msg.str(),level);
+ log_error("HTTP-Helper is not initialized properly.");
}
}
curl_err = "UNKNOWN";
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( (level <= Loglevel) )
{
ostringstream msg;
msg << "Curl error: " << err_msg << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
curl_err = "UNKNOWN";
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( (level <= Loglevel) )
{
ostringstream msg;
msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << endl; /*lint !e641 */
- log_warning(msg.str(),level);
+ log_error(msg.str());
}
}
curl_err = "UNKNOWN";
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( (level <= Loglevel) )
{
ostringstream msg;
msg << "Curl error while requesting following url: " << url << " Curl error code: " << curl_err_code << " " << curl_err << " " << curl_err_buff << endl; /*lint !e641 */
- log_warning(msg.str(),level);
+ log_error(msg.str());
}
}
void Logger::print_service_not_authorized(const string& service, const string& username, const string& password) const
{
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( level <= Loglevel )
{
ostringstream msg;
msg << "Not authorized to perform update operation on service: " << service << " Please check username and password: " << username << ":" << password << endl;
- log_warning(msg.str(),level);
+ log_notice(msg.str());
}
}
void Logger::print_update_failure(const string& url, const string& curl_data) const
{
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( (level <= Loglevel) )
{
ostringstream msg;
msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << curl_data << endl;
- log_warning(msg.str(),level);
+ log_error(msg.str());
}
}
void Logger::print_update_failure(const string& url, const long http_status_code) const
{
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( level <= Loglevel )
{
ostringstream msg;
msg << "Problem while trying to updating service. Requested URL: " << url << " Error Code from Server: " << http_status_code << endl;
- log_warning(msg.str(),level);
+ log_error(msg.str());
}
}
* Hostname is invalid, contains no or only one domain part.
* @param hostname The full qualified host name.
*/
-void Logger::print_invalid_hostname(const string& hostname) const
+void Logger::print_invalid_hostname(const string& hostname)
{
int level = 0;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
* An IP in a private range was detected
* @param ip The private IP
*/
-void Logger::print_ip_is_local(const string& ip) const
+void Logger::print_ip_is_local(const string& ip)
{
int level = 1;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
* @param regex Regex
* @param not_matching_string String
*/
-void Logger::print_no_regex_match(const string& regex, const string& not_matching_string) const
+void Logger::print_no_regex_match(const string& regex, const string& not_matching_string)
{
int level = 1;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
void Logger::print_could_not_parse_received_data(const string& curl_data) const
{
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( (level <= Loglevel) )
{
ostringstream msg;
msg << "Could not parse salt, time and sign from initial gnudip server reply: " << curl_data << endl;
- log_warning(msg.str(),level);
+ log_error(msg.str());
}
}
void Logger::print_could_not_get_initial_gnudip_data() const
{
int level = 0;
- if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
+ if ( (level <= Loglevel) )
{
- log_warning("Could not get salt, time and sign from map.",level);
+ log_error("Could not get salt, time and sign from map.");
}
}
/**
* Gnudip protocol requires explicit declaration of a servername.
*/
-void Logger::print_gnudip_requires_servername() const
+void Logger::print_gnudip_requires_servername()
{
int level = 0;
if ( (level <= Loglevel) || ((level <= ExternalWarningLevel) && (!ExternalWarningLog.empty())) )
bool Syslog;
std::string ExternalWarningLog;
int ExternalWarningLevel;
+ std::set<std::string> ExternalSendMessages;
+ bool ExternalLogOnlyOnce;
public:
~Logger();
+ void set_external_log_only_once( const bool _external_log_only_once );
+
+ void clear_external_send_messages();
+
void log_notice(const std::string& msg) const;
- void log_warning(const std::string& msg, int loglevel) const;
+ void log_warning(const std::string& msg, int loglevel);
void log_error(const std::string& msg) const;
bool get_syslog() const;
- void set_log_facility(const int _loglevel, const bool _syslog, const std::string& _external_error_log, const int _external_error_level);
+ void set_log_facility(const int _loglevel, const bool _syslog, const std::string& _external_error_log, const int _external_error_level, const bool _external_log_only_once );
void print_usage(const boost::shared_ptr<boost::program_options::options_description> opt_desc) const;
void print_child_killed(const int pid) const;
- void print_no_object_file(const std::string& object_file) const;
+ void print_no_object_file(const std::string& object_file);
void print_hostname(const std::string& hostname) const;
void print_update_service_successful(const std::string& service) const;
- void print_webcheck_no_ip() const;
+ void print_webcheck_no_ip();
void print_no_wan_ip() const;
- void print_webcheck_url_connection_problem(const char * curl_err_buff, const std::string& url) const;
+ void print_webcheck_url_connection_problem(const char * curl_err_buff, const std::string& url);
void print_webcheck_error(const char * curl_err_buff, const std::string& url) const;
void print_regex_found_ip(const std::string& ip) const;
- void print_regex_ip_not_found(const std::string& data) const;
+ void print_regex_ip_not_found(const std::string& data);
void print_multiple_cmd_option(const std::string& message) const;
void print_multiple_main_conf_option(const std::string& main_conf_file, const std::string& message) const;
- void print_update_not_allowed(const time_t current_time, const time_t old_time, const int MaxUpdatesWithinInterval, const std::string& service) const;
+ void print_update_not_allowed(const time_t current_time, const time_t old_time, const int MaxUpdatesWithinInterval, const std::string& service);
- void print_update_service_failure(const std::string& service) const;
+ void print_update_service_failure(const std::string& service);
void print_starting_shutdown() const;
void print_service_not_authorized(const std::string& service, const std::string& username, const std::string& password) const;
- void print_service_not_initialized(const std::string& service) const;
+ void print_httphelper_not_initialized() const;
void print_http_status_code(const std::string& url, const long http_code) const;
void print_update_failure(const std::string& url, const long http_status_code) const;
- void print_invalid_hostname(const std::string& hostname) const;
+ void print_invalid_hostname(const std::string& hostname);
- void print_ip_is_local(const std::string& ip) const;
+ void print_ip_is_local(const std::string& ip);
void print_regex_match(const std::string& regex, const std::string& matching_string) const;
- void print_no_regex_match(const std::string& regex, const std::string& not_matching_string) const;
+ void print_no_regex_match(const std::string& regex, const std::string& not_matching_string);
void print_could_not_parse_received_data(const std::string& curl_data) const;
void print_could_not_get_initial_gnudip_data() const;
- void print_gnudip_requires_servername() const;
+ void print_gnudip_requires_servername();
void print_exception_md5_sum(const std::string& what) const;
void print_error_getting_local_wan_ip(const std::string& system_call, const std::string& error) const;
void print_invalid_service_config() const;
+
+ bool is_allowed_to_send( const std::string& msg ) const;
};
#endif