add a way to pass "-k" to nsupdate, and document all options in the sample config...
authorRalf Jung <post@ralfj.de>
Fri, 9 Jan 2015 09:51:48 +0000 (10:51 +0100)
committerRalf Jung <post@ralfj.de>
Fri, 9 Jan 2015 09:51:48 +0000 (10:51 +0100)
dyn-nsupdate.conf.dist
nsupd-wrapper/dyn-nsupdate.cpp

index d56bc78a1f63c7b4e0aa0f0bb282b1ca50603e96..2b2112f15dcfd581a4b51ca8f575f20340a3cd43 100644 (file)
@@ -1,5 +1,12 @@
+# Full path to nsupdate binary
 nsupdate = /usr/bin/nsupdate
 nsupdate = /usr/bin/nsupdate
-key = keyname:passwd
+# You can change the port that will be used to talk to BIND (nsupdate "-p" option).
+#port = 53
+# If you need a key to authenticate updates, give its filename here (nsupdate "-k" option).
+#keyfile = /var/lib/bind/keys/zone.key
+# Alternatively, you can specify the name and secret of the key here (nsupdate "-y" option). Note that this is *discouraged* (see nsupdate man page for details).
+#key = keyname:passwd
 
 
+# Add one section per zone that can be updated, containing only the relevant password.
 [test.dyn.example.com]
 password = some_secure_password
 [test.dyn.example.com]
 password = some_secure_password
index 27db031e118420adcb2f0ceccdfcd183db2fa5e1..7424a363146affbddc18fdf89caa0cdf93753c1d 100644 (file)
@@ -102,7 +102,14 @@ int main(int argc, const char ** argv)
         pt::ini_parser::read_ini(CONFIG_FILE, config);
         std::string nsupdate = config.get<std::string>("nsupdate");
         unsigned server_port = config.get<unsigned>("port", 53);
         pt::ini_parser::read_ini(CONFIG_FILE, config);
         std::string nsupdate = config.get<std::string>("nsupdate");
         unsigned server_port = config.get<unsigned>("port", 53);
-        std::string key = config.get<std::string>("key","");
+        std::string keyfile = config.get<std::string>("keyfile", "");
+        std::string key = config.get<std::string>("key", "");
+        
+        /* check for some invalid configurations */
+        if (keyfile.size() > 0 && key.size() > 0) {
+            std::cerr << "You can only have either a keyfile or a key set. Please fix your configuration." << std::endl;
+            exit(1);
+        }
         
         /* Given the domain, check whether the password matches */
         optional<std::string> correct_password = config.get_optional<std::string>(pt::ptree::path_type(domain+"/password", '/'));
         
         /* Given the domain, check whether the password matches */
         optional<std::string> correct_password = config.get_optional<std::string>(pt::ptree::path_type(domain+"/password", '/'));
@@ -133,9 +140,13 @@ int main(int argc, const char ** argv)
                 exit(1);
             }
             /* exec nsupdate */
                 exit(1);
             }
             /* exec nsupdate */
-            if (key.size() > 0) {
+            if (keyfile.size() > 0) {
+                execl(nsupdate.c_str(), nsupdate.c_str(), "-k", keyfile.c_str(), "-p", std::to_string(server_port).c_str(), "-l", (char *)NULL);
+            }
+            else if (key.size() > 0) {
                 execl(nsupdate.c_str(), nsupdate.c_str(), "-y", key.c_str(), "-p", std::to_string(server_port).c_str(), "-l", (char *)NULL);
                 execl(nsupdate.c_str(), nsupdate.c_str(), "-y", key.c_str(), "-p", std::to_string(server_port).c_str(), "-l", (char *)NULL);
-            } else {
+            }
+            else {
                 execl(nsupdate.c_str(), nsupdate.c_str(), "-p", std::to_string(server_port).c_str(), "-l", (char *)NULL);
             }
             /* There was an error */
                 execl(nsupdate.c_str(), nsupdate.c_str(), "-p", std::to_string(server_port).c_str(), "-l", (char *)NULL);
             }
             /* There was an error */