/* Original at http://www.BeidelmanSoftware.com/utils/namedgen.c * namedgen.c V1.0 28-April-2008 * * Generate a named include script to add all master and slave zones. * Master zones are found by scanning /var/named/master for zone files, * which are named exactly the same as the zone for which they represent. * Reverse PTR zones are found by scanning /var/named/rev for zone files. * These zone files must be named x, x.y, or x.y.z, depending on if thy are * /8, /16, or /24 VLSM addresses. Slave zones are listed in file ./slaves. * This file has 2 entries per slave zone, the master zone's ip, and the * name of the zone. There must be a /var/named/slaves and a * /var/named/slaves/rev directory on the server, with write permissions for * named, so it can fetch the slave zones off the master named server. * named will transfer the files to these directories when it is started * (or restarted with /etc/rc.d/init.d/named restart). * * Building this Utility: * 1. Get Source: wget http://www.beidelmansoftware.com/utils/namedgen.c * 2. Compile: gcc -o namedgen namedgen.c * * Using this Utility: * 1. ./namedgen > namedgen-config * 2. Add include "namedgen-config"; to named.conf * 3. start or restart named with "/etc/rc.d/init.d/named restart". * */ #include #include #include #include #define NAMED "/var/named" // named root #define MASTER_PATH NAMED "/master" // master zone directory #define REV_PATH NAMED "/rev" // master reverse dir #define SLAVE_PATH NAMED "/namedgen/slaves" // slave file char *master = "zone \"%s\"\n" " {\n" " type master;\n" " file \"master/%s\";\n" " };\n" "\n"; char *masterrev = "zone \"%s.in-addr.arpa\"\n" " {\n" " type master;\n" " file \"rev/%s\";\n" " };\n" "\n"; char *slave = "zone \"%s\"\n" " {\n" " type slave;\n" " masters { %s; };\n" " file \"slave/%s\";\n" " };\n" "\n"; char *slaverev = "zone \"%s.in-addr.arpa\"\n" " {\n" " type slave;\n" " masters { %s; };\n" " file \"slave/rev/%s\";\n" " };\n" "\n"; int reverse (char *domain, char *rdomain) { int ip[4], i, ndots, number; ndots = 0; for (i = 0; i < 3; i++) ip[i] = 0; while (*domain) { if (!isdigit (*domain)) return 0; number = 0; while (isdigit (*domain)) { number = number * 10 + (*domain - '0'); if (number < 0 || number > 255) return 0; domain++; } ip[ndots] = number; if (*domain == '\0') break; if (*domain == '.' && ndots < 3) { ndots++; domain++; } else return 0; } *rdomain = '\0'; while (ndots >= 0) { rdomain += sprintf (rdomain, "%d", ip[ndots]); ndots--; if (ndots >= 0) strcpy (rdomain++, "."); } return 1; } main () { char domain[1024], rdomain[1024], auth[20]; DIR *dir; FILE *f; struct dirent *de; if ((dir = opendir (MASTER_PATH)) != NULL) { while (de = readdir (dir)) if (de->d_name[0] != '.') printf (master, de->d_name, de->d_name); closedir (dir); } if ((dir = opendir (REV_PATH)) != NULL) { while (de = readdir (dir)) if (de->d_name[0] != '.') if (reverse (de->d_name, rdomain)) printf (masterrev, rdomain, de->d_name); else fprintf (stderr, "Can't reverse arpa: %s\n", de->d_name); closedir (dir); } if ((f = fopen (SLAVE_PATH, "r")) != NULL) { while (fscanf (f, "%s %s\n", auth, domain) == 2) if (reverse (domain, rdomain)) printf (slaverev, rdomain, auth, domain); else printf (slave, domain, auth, domain); fclose (f); } }