Don't update the same IP more than 2 times in success.
[bpdyndnsd] / src / config.cpp
index acc8a27..ff63d8e 100644 (file)
@@ -113,6 +113,7 @@ void Config::define_config_options()
         ("password",po::value<string>(),"Corresponding password.")
         ("update_interval",po::value<int>()->default_value(-1),"Update interval in minutes.")
         ("max_updates_within_interval",po::value<int>()->default_value(-1),"How many updates can be made in one interval.")
+        ("max_equal_updates_in_succession",po::value<int>()->default_value(-1),"How many updates with the same IP in succession should be made.")
         ("dns_cache_ttl",po::value<int>()->default_value(-1),"How long a dns record is valid.")
     ;
 
@@ -210,15 +211,19 @@ int Config::parse_cmd_line(int argc, char *argv[])
             if ( VariablesMap.count("max_updates_within_interval") )
                 max_updates_within_interval = VariablesMap["max_updates_within_interval"].as<int>();
 
+            int max_equal_updates_in_succession = 0;
+            if ( VariablesMap.count("max_equal_updates_in_succession") )
+                max_equal_updates_in_succession = VariablesMap["max_equal_updates_in_succession"].as<int>();
+
             int dns_cache_ttl = 0;
             if ( VariablesMap.count("dns_cache_ttl") )
                 dns_cache_ttl = VariablesMap["dns_cache_ttl"].as<int>();
 
-            Service::Ptr service = create_service(protocol,server,host,login,password,update_interval,max_updates_within_interval,dns_cache_ttl);
+            Service::Ptr service = create_service(protocol,server,host,login,password,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl);
             if ( service )
             {
                 ServiceHolder->add_service(service);
-                Log->print_service_object("New Service object from command line options:", service->get_protocol(), service->get_hostname(), service->get_login() ,service->get_password(), service->get_update_interval(), service->get_max_updates_within_interval(), service->get_dns_cache_ttl() , service->get_actual_ip(), service->get_last_updates());
+                Log->print_service_object("New Service object from command line options:", service->get_protocol(), service->get_hostname(), service->get_login() ,service->get_password(), service->get_update_interval(), service->get_max_updates_within_interval(), service->get_max_equal_updates_in_succession(), service->get_dns_cache_ttl() , service->get_actual_ip(), service->get_last_updates());
             }
             else
             {
@@ -332,7 +337,7 @@ int Config::parse_cmd_line(int argc, char *argv[])
  * @param password Password.
  * @return A pointer to the created Service object.
  */
-Service::Ptr Config::create_service(const string &protocol, const string& server, const string& hostname, const string& login, const string& password, const int update_interval, const int max_updates_within_interval, const int dns_cache_ttl)
+Service::Ptr Config::create_service(const string &protocol, const string& server, 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)
 {
     // Test for valid hostname. Must contain 3 parts minimum.
     list<string> fqhn_parts;
@@ -346,44 +351,44 @@ Service::Ptr Config::create_service(const string &protocol, const string& server
 
     if(protocol == "dhs")
     {
-        Service::Ptr service_dhs(new ServiceDhs(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl,Proxy,ProxyPort));
+        Service::Ptr service_dhs(new ServiceDhs(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl,Proxy,ProxyPort));
         return service_dhs;
     }
     else if(protocol == "ods")
     {
-        Service::Ptr service_ods(new ServiceOds(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl));
+        Service::Ptr service_ods(new ServiceOds(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl));
         return service_ods;
     }
     else if(protocol == "dyndns")
     {
-        Service::Ptr service_dyndns(new ServiceDyndns(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl,Proxy,ProxyPort,server));
+        Service::Ptr service_dyndns(new ServiceDyndns(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl,Proxy,ProxyPort,server));
         return service_dyndns;
     }
     else if(protocol == "dyns")
     {
-        Service::Ptr service_dyns(new ServiceDyns(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl,Proxy,ProxyPort));
+        Service::Ptr service_dyns(new ServiceDyns(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl,Proxy,ProxyPort));
         return service_dyns;
     }
     else if(protocol == "easydns")
     {
-        Service::Ptr service_easydns(new ServiceEasydns(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl,Proxy,ProxyPort));
+        Service::Ptr service_easydns(new ServiceEasydns(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl,Proxy,ProxyPort));
         return service_easydns;
     }
     else if(protocol == "tzo")
     {
-        Service::Ptr service_tzo(new ServiceTzo(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl,Proxy,ProxyPort));
+        Service::Ptr service_tzo(new ServiceTzo(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl,Proxy,ProxyPort));
         return service_tzo;
     }
     else if(protocol == "zoneedit")
     {
-        Service::Ptr service_zoneedit(new ServiceZoneedit(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,dns_cache_ttl,Proxy,ProxyPort));
+        Service::Ptr service_zoneedit(new ServiceZoneedit(protocol,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl,Proxy,ProxyPort));
         return service_zoneedit;
     }
     else if(protocol == "gnudip")
     {
         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));
+            Service::Ptr service_gnudip(new ServiceGnudip(protocol,server,hostname,login,password,Log,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl,Proxy,ProxyPort));
             return service_gnudip;
         }
         else
@@ -443,15 +448,19 @@ int Config::load_service_config_file(const string& full_filename)
                 if ( vm.count("max_updates_within_interval") )
                     max_updates_within_interval = vm["max_updates_within_interval"].as<int>();
 
+                int max_equal_updates_in_succession = 0;
+                if ( vm.count("max_equal_updates_in_succession") )
+                    max_equal_updates_in_succession = vm["max_equal_updates_in_succession"].as<int>();
+
                 int dns_cache_ttl = 0;
                 if ( vm.count("dns_cache_ttl") )
                     dns_cache_ttl = vm["dns_cache_ttl"].as<int>();
 
-                Service::Ptr service = create_service(protocol,server,host,login,password,update_interval,max_updates_within_interval,dns_cache_ttl);
+                Service::Ptr service = create_service(protocol,server,host,login,password,update_interval,max_updates_within_interval,max_equal_updates_in_succession,dns_cache_ttl);
                 if ( service )
                 {
                     ServiceHolder->add_service(service);
-                    Log->print_service_object("New Service object from config:", service->get_protocol(), service->get_hostname(), service->get_login() ,service->get_password(), service->get_update_interval(), service->get_max_updates_within_interval(), service->get_dns_cache_ttl() , service->get_actual_ip(), service->get_last_updates());
+                    Log->print_service_object("New Service object from config:", service->get_protocol(), service->get_hostname(), service->get_login() ,service->get_password(), service->get_update_interval(), service->get_max_updates_within_interval(), service->get_max_equal_updates_in_succession(), service->get_dns_cache_ttl() , service->get_actual_ip(), service->get_last_updates());
                 }
                 else
                 {