Linux: Скрипт для генерации конфигурации ISC DHCP

DHCP

PHP скрипт, позволяющий облегчить администратору жизнь в плане формирования конфигурационного файла для dhcp сервера ISC DHCP.

На вход подаем массив (который например можно брать из базы), для простоты я взял файл разделенный табами в формате: шлюз, маска, описание:

# cat net.txt
192.168.1.1    29   local-network

На выходе получаем кусок конфига.

#local-network
subnet 192.168.1.0 netmask 255.255.255.248 {
    ddns-update-style interim;
    ddns-updates on;
    ddns-hostname = binary-to-ascii (16, 8, "-", substring (hardware, 1, 6));
    ddns-domainname "my.domain.ru";
    ddns-rev-domainname "in-addr.arpa";
    option domain-name-servers ip-dns1 ip-dns2;
 
    pool {
       range 192.168.1.2 192.168.1.6;
       option subnet-mask 255.255.255.248;
       option routers 192.168.1.1;
    }
}

Непосредственно сам скрипт: dhcpd_generate.php (github)

<?php 
 
$file_array = file("net.txt");
 
//var_dump($file_array);
 
    for ($i=0; $i<=32; $i++) {
$masks[$i]   = (pow(2,$i)-1)<<(32-$i);
$cimasks[$i] = (pow(2,32-$i)-1);
 
    };
 
foreach ($file_array as $aData) {
 
    list ($txt_gateway,$masklen,$comment) = explode(" ",$aData);
 
    $gateway = ip2long($txt_gateway);
    $mask = $masks[$masklen];
    $net     = $gateway & $mask;
 
    if ($net==$gateway) {$txt_gateway=long2ip($gateway+1);}
 
    $broadcast = $gateway | $cimasks[$masklen];
 
    $ifsettings = array(
                        "net"           => long2ip($net),
                        "mask"          => long2ip($mask),
                        "gateway"       => $txt_gateway,
                        "broadcast"     => long2ip($broadcast),
                        "first"         => long2ip($net+2),
                        "last"          => long2ip($broadcast-1),
                );
 
 
 
//    print_r($ifsettings);
    echo "#".$comment."\n";
    echo "subnet ".$ifsettings["net"]." netmask ".$ifsettings["mask"]." {\n";
    echo "    ddns-update-style interim;\n";
    echo "    ddns-updates on;\n";
    echo "    ddns-hostname = binary-to-ascii (16, 8, \"-\", substring (hardware, 1, 6));\n";
    echo "    ddns-domainname \"my.domain.ru\";\n";
    echo "    ddns-rev-domainname \"in-addr.arpa\";\n";
    echo "    option domain-name-servers ip-dns1 ip-dns2;\n";
    echo "\n";
    echo "    pool {\n";
    echo "       range ".$ifsettings["first"]." ".$ifsettings["last"].";\n";
    echo "       option subnet-mask ".$ifsettings["mask"].";\n";
    echo "       option routers ".$ifsettings["gateway"].";\n";
    echo "    }\n";
    echo "}\n";
}
 
?>

Решение «в лоб», но вполне имеет право на жизнь.

Вы можете оставить комментарий ниже.