The Community Forums

Interact with an entire community of cPanel & WHM users!
  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

MASS DNS zone updater

Discussion in 'Workarounds and Optimization' started by simonas, May 10, 2013.

  1. simonas

    simonas Well-Known Member

    Joined:
    Apr 21, 2013
    Messages:
    141
    Likes Received:
    0
    Trophy Points:
    16
    Location:
    Lithuania
    cPanel Access Level:
    Root Administrator
    Hello,

    I wanted to better organize my DNS zones, so i wrote basic program in PHP (i feel relaxed with it and letting run perl script as root could mess up original zones), which will rewrite your .db files.

    It's a tested program, but use at your own risk, always make backups!!!

    I will keep it updated, and will accept new feature requests.

    To use:
    copy all .db files from /var/named to some folder
    Create folder where you will store new zones, make it writable if on *nix
    Update variables in the script to suit your needs, change folders
    Run the script
    Check if zone files are ok, not corrupted
    Upload new zone files to /var/named/
    Do service named restart
    If it fails do named-checkconf -z /etc/named.conf
    to see which zones are bad.

    USE at your own risk!
    By default program will delete mail autodiscover / autoconfig entries, disable them in tweak settings first
    Also it will delete ftp and mail subdomains by default.

    PHP:
    <?php
    /*
     *     Mass DNS zone update program
     *     sim@g6.lt
     *
     */

    // If you already changed some zones today, please increase it, keep it with leading zero!
    $revision '01';

    // Time to live, used on every record, change as you see fit
    $TTL 1800;
    // SOA serial number - consists of todays date and revision number, change as you see fit
    $SOA_serial date('Ymd') . $revision;
    // SOA refresh time, change as you see fit
    $SOA_refresh 3600;
    // SOA retry, change as you see fit
    $SOA_retry 1800;
    // SOA expire, change as you see fit
    $SOA_expire 604800;
    // Array records to remove, first words only. Lines starting with following words will be removed!
    $remove = array('mail','ftp','webdisk','autoconfig','autodiscover','_autodiscover._tcp');

    // Where you store your zone files
    $zones 'C:/Serveris/zones'// No trailing /
    // Where to write new zone files
    $write_to 'C:/Serveris/new'// No trailing /

    $files scandir($zones);

    foreach(
    $files as $filename) {
        if(
    $filename != '.' && $filename != '..') {
            
    $contents file($zones "/$filename"FILE_SKIP_EMPTY_LINES FILE_IGNORE_NEW_LINES);
            foreach(
    $contents as $nr => $line) {
                
    $line trim($line);

                
    $words explode("\t"$line);
                if(
    in_array($words[0], $remove)) {
                   unset(
    $contents[$nr]);
                }
                elseif(
    strpos($line'$TTL') === 0) {
                    
    $contents[$nr] = '$TTL' "\t$TTL";
                }
                elseif(
    preg_match("/IN\s+SOA/"$line)) {
                    
    $contents[$nr] = preg_replace('/\d+\s+IN\s+SOA/'$TTL "\tIN\tSOA"$line);
                }
                elseif(
    preg_match("/;\s*serial/i"$line)) {
                        
    $contents[$nr] = "\t\t\t\t\t\t$SOA_serial\t; Serial Number";
                }
                elseif(
    preg_match("/;\s*refresh/"$line)) {
                        
    $contents[$nr] = "\t\t\t\t\t\t$SOA_refresh\t\t; refresh, seconds";
                }
                elseif(
    preg_match("/;\s*retry/"$line)) {
                        
    $contents[$nr] = "\t\t\t\t\t\t$SOA_retry\t\t; retry, seconds";
                }
                elseif(
    preg_match("/;\s*expire/"$line)) {
                        
    $contents[$nr] = "\t\t\t\t\t\t$SOA_expire\t\t; expire, seconds";
                }
                elseif(
    preg_match("/\d+\s+\)/"$line)) {
                        
    $contents[$nr] = "\t\t\t\t\t\t$TTL )\t\t; minimum, seconds";
                }
                elseif(
    preg_match("/\d+\s+IN\s/"$line)) {
                        
    $contents[$nr] = preg_replace("/\d+\s+IN\s+/"$TTL "\tIN "$line);
                }
            }
            
    file_put_contents($write_to "/$filename"implode("\n"$contents));
            echo 
    "$filename updated<br>";
        }
    }
    ?>
    2013-05-11 Updated: Couple fixes.
     
    #1 simonas, May 10, 2013
    Last edited: May 11, 2013
Loading...

Share This Page