= t.dlt_timestamp and t.dlt_name = '$clientname'"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "ERROR query ipaddr"; return; } $row = pg_fetch_array( $rs ); if( !$row ) { echo "ERROR fetch ipaddr"; return; } $cnt += $row["cnt"]; $sql = "select count(*) as cnt from ipalias i, downloadtime t where i.date_upd >= t.dlt_timestamp and t.dlt_name = '$clientname'"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "ERROR query ipalias"; return; } $row = pg_fetch_array( $rs ); if( !$row ) { echo "ERROR fetch ipalias"; return; } $cnt += $row["cnt"]; if( $cnt > 0 ) { $sql = "update downloadtime set dlt_timestamp = to_timestamp( '$now', 'YYYY-MM-DD HH24:MI:SS' ) where dlt_name = '$clientname'"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "ERROR update record"; return; } echo "OK $cnt"; } else { echo "OK 0"; } } function makeSerial() { $d = strftime( "%Y%m%d" ); $h = (int)strftime( "%H" ); $m = (int)strftime( "%M" ); $n = (int)($h * 4 + $m / 15); $n = "x00" . $n; $s = $d . substr( $n, strlen($n)-2 ); return $s; } function writeFDnsFile( $conn, $id, $param ) { $domid = $param["domid"]; $domain = $param["domain"]; $ns = $param["ns"]; $mailuser = $param["mailuser"]; $ttl = $param["ttl"]; $refresh = $param["refresh"]; $retry = $param["retry"]; $expiry = $param["expiry"]; $minimum = $param["minimum"]; if( $domid == "" || $domain == "" || $ns == "" || $mailuser == "" || $ttl == "" || $refresh == "" || $retry == "" || $expiry == "" || $minimum == "" ) { echo "# domid = '" . $param["domid"] . "'\n"; echo "# domain = '" . $param["domain"] . "'\n"; echo "# ns = '" . $param["ns"] . "'\n"; echo "# mailuser = '" . $param["mailuser"] . "'\n"; echo "# ttl = '" . $param["ttl"] . "'\n"; echo "# refresh = '" . $param["refresh"] . "'\n"; echo "# retry = '" . $param["retry"] . "'\n"; echo "# expiry = '" . $param["expiry"] . "'\n"; echo "# minimum = '" . $param["minimum"] . "'\n"; echo "# ERROR missing parameters\n"; return false; } /* header */ $serial = makeSerial(); echo ";\n"; echo "; default TTL\n"; echo ";\n"; echo str_pad( "\$TTL", 31 ) . " $ttl\n"; echo ";\n"; echo "; SOA\n"; echo ";\n"; echo "@ IN SOA $domain. $mailuser. (\n"; echo str_pad( " $serial", 31 ) . "; serial YYYYMMDDNN\n"; echo str_pad( " $refresh", 31 ) . "; refresh\n"; echo str_pad( " $retry", 31 ) . "; retry\n"; echo str_pad( " $expiry", 31 ) . "; expiry\n"; echo str_pad( " $minimum", 31 ) . "; minimum\n"; echo ")\n"; echo ";\n"; echo "; origin of the entries\n"; echo ";\n"; echo str_pad( "\$ORIGIN", 31 ) . " $domain.\n"; echo ";\n"; echo "; nameserver\n"; echo ";\n"; echo str_pad( "", 31 ) . " IN NS $ns.\n"; echo "\n"; /* hostnames */ $sql = "select ipa_name, ip_addr from ipalias where " . "dom_id = $domid and ipa_alias = false and du_id_del is null " . "order by ipa_name"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "; ERROR select failed\n"; return false; } $row = pg_fetch_array( $rs ); if( $row ) { echo ";\n"; echo "; hostnames\n"; echo ";\n"; while( $row ) { echo str_pad( $row["ipa_name"], 31 ) . " IN A " . intToIp($row["ip_addr"]) . "\n"; $row = pg_fetch_array( $rs ); } echo "\n"; } /* aliases */ $sql = "select a1.ipa_name, a2.ipa_name as name2, d.dom_name " . "from ipalias a1, ipalias a2, domain d where " . "a1.dom_id = $domid and a1.ipa_alias = true and " . "a1.ip_addr = a2.ip_addr and a2.ipa_alias = false and " . "a2.dom_id = d.dom_id and " . "a1.du_id_del is null and a1.du_id_del is null " . "order by a1.ipa_name"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "; ERROR\ select failedn"; return false; } $row = pg_fetch_array( $rs ); if( $row ) { echo ";\n"; echo "; aliases\n"; echo ";\n"; while( $row ) { echo str_pad( $row["ipa_name"], 31 ) . " IN CNAME " . $row["name2"] . "." . $row["dom_name"] . ".\n"; $row = pg_fetch_array( $rs ); } echo "\n"; } /* $GENERATE statements */ $sql = "select r.ipr_min_addr, r.ipr_max_addr, d.dom_name " . "from iprange r, domain d where " . "d.dom_id = $domid and r.dom_id = d.dom_id and " . "r.ipr_dhcp = true " . "order by r.ipr_min_addr"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "; ERROR select failed\n"; return false; } $row = pg_fetch_array( $rs ); if( $row ) { echo ";\n"; echo "; IP ranges\n"; echo ";\n"; while( $row ) { $minip = $row["ipr_min_addr"]; $maxip = $row["ipr_max_addr"]; if( (($minip ^ $maxip) & ~255) == 0 ) { $minnr = $minip & 255; $maxnr = $maxip & 255; $iit = ereg_replace( ".\$", "\$", intToIP( $minip & ~255 ) ); $baseip = $minip & ~255; echo "\$GENERATE " . $minnr . "-" . $maxnr . " " . "dhcp\$" . " A " . $iit . "\n"; } $row = pg_fetch_array( $rs ); } echo "\n"; } echo "; OK\n"; } function writeRDnsFile( $conn, $id, $param ) { $minip = $param["minip"]; $maxip = $param["maxip"]; $domain = $param["domain"]; $ns = $param["ns"]; $mailuser = $param["mailuser"]; $ttl = $param["ttl"]; $refresh = $param["refresh"]; $retry = $param["retry"]; $expiry = $param["expiry"]; $minimum = $param["minimum"]; if( $minip == "" || $maxip == "" || $domain == "" || $ns == "" || $mailuser == "" || $ttl == "" || $refresh == "" || $retry == "" || $retry == "" || $expiry == "" || $minimum == "" ) { echo "# minip = '" . $param["minip"] . "'\n"; echo "# maxip = '" . $param["maxip"] . "'\n"; echo "# domain = '" . $param["domain"] . "'\n"; echo "# ns = '" . $param["ns"] . "'\n"; echo "# mailuser = '" . $param["mailuser"] . "'\n"; echo "# ttl = '" . $param["ttl"] . "'\n"; echo "# refresh = '" . $param["refresh"] . "'\n"; echo "# retry = '" . $param["retry"] . "'\n"; echo "# expiry = '" . $param["expiry"] . "'\n"; echo "# minimum = '" . $param["minimum"] . "'\n"; echo "# ERROR missing parameters\n"; return false; } /* header */ $serial = makeSerial(); echo ";\n"; echo "; default TTL\n"; echo ";\n"; echo str_pad( "\$TTL", 31 ) . " $ttl\n"; echo ";\n"; echo "; SOA\n"; echo ";\n"; echo "@ IN SOA $domain. $mailuser. (\n"; echo str_pad( " $serial", 31 ) . "; serial YYYYMMDDNN\n"; echo str_pad( " $refresh", 31 ) . "; refresh\n"; echo str_pad( " $retry", 31 ) . "; retry\n"; echo str_pad( " $expiry", 31 ) . "; expiry\n"; echo str_pad( " $minimum", 31 ) . "; minimum\n"; echo ")\n"; echo ";\n"; echo "; nameserver\n"; echo ";\n"; echo str_pad( "", 31 ) . " IN NS $ns\n"; echo "\n"; /* echo ";\n"; echo "; origin of the entries\n"; echo ";\n"; echo str_pad( "\$ORIGIN", 31 ) . " $domain.\n"; */ /* IP's */ $sql = "select a.ip_addr, a.ipa_name, d.dom_name " . "from fileiprange f, ipaddr i, ipalias a, domain d where " . "f.f_id = $id and f.ipr_id = i.ipr_id and " . "i.ip_addr = a.ip_addr and a.ipa_alias = false and " . "i.du_id_del is null and a.du_id_del is null and " . "a.dom_id = d.dom_id " . "order by i.ip_addr"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "; ERROR select failed\n"; return false; } $row = pg_fetch_array( $rs ); if( $row ) { echo ";\n"; echo "; IP's\n"; echo ";\n"; while( $row ) { $revip = intToRevIP( $row["ip_addr"] ); echo str_pad( $revip . ".in-addr.arpa.", 31 ) . " IN PTR " . $row["ipa_name"] . "." . $row["dom_name"] . ".\n"; $row = pg_fetch_array( $rs ); } echo "\n"; } $sql = "select r.ipr_min_addr, r.ipr_max_addr, d.dom_name " . "from fileiprange f, iprange r, domain d where " . "f.f_id = $id and f.ipr_id = r.ipr_id and " . "r.ipr_dhcp = true and r.dom_id = d.dom_id " . "order by r.ipr_min_addr"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "; ERROR select failed\n"; return false; } $row = pg_fetch_array( $rs ); if( $row ) { echo ";\n"; echo "; IP ranges\n"; echo ";\n"; while( $row ) { $minip = $row["ipr_min_addr"]; $maxip = $row["ipr_max_addr"]; if( (($minip ^ $maxip) & ~255) == 0 ) { $minnr = $minip & 255; $maxnr = $maxip & 255; $iit = "\$." . substr( intToRevIP( $minip & ~255 ), 2 ) . ".in-addr.arpa."; $baseip = $minip & ~255; echo "\$GENERATE " . $minnr . "-" . $maxnr . " " . $iit . " PTR dhcp\$." . $row["dom_name"] . ".\n"; } $row = pg_fetch_array( $rs ); } echo "\n"; } echo "; OK\n"; } function writeDhcpFile( $conn, $id, $param ) { $optdomain = $param["domain"]; $optdnssrv = $param["ns"]; $optnetmask = $param["netmask"]; $optbroadcast = $param["broadcast"]; $optrouter = $param["router"]; $dfllease = $param["dfllease"]; $maxlease = $param["maxlease"]; if( $optdomain == "" || $optdnssrv == "" || $optnetmask == "" || $optbroadcast == "" || $optrouter == "" || $dfllease == "" || $maxlease == "" ) { echo "# optdomain = '" . $param["domain"] . "'\n"; echo "# optdnssrv = '" . $param["ns"] . "'\n"; echo "# optnetmask = '" . $param["netmask"] . "'\n"; echo "# optbroadcast = '" . $param["broadcast"] . "'\n"; echo "# optrouter = '" . $param["router"] . "'\n"; echo "# dfllease = '" . $param["dfllease"] . "'\n"; echo "# maxlease = '" . $param["maxlease"] . "'\n"; echo "# ERROR missing parameters\n"; return false; } echo "#\n"; echo "# common options\n"; echo "#\n"; echo "option domain-name \"" . $optdomain . "\";\n"; echo "option domain-name-servers " . $optdnssrv . ";\n"; echo "option subnet-mask " . $optnetmask . ";\n"; echo "option broadcast-address " . $optbroadcast . ";\n"; echo "option routers " . $optrouter . ";\n"; echo "default-lease-time " . $dfllease . ";\n"; echo "max-lease-time " . $maxlease . ";\n"; echo "\n"; $sql = "select i.ip_addr, i.ip_hw_addr, a.ipa_name, a.ipa_descr, d.dom_name " . "from ipaddr i, ipalias a, domain d where " . "i.ip_hw_addr is not null and " . "i.du_id_del is null and " . "i.ip_addr = a.ip_addr and " . "a.ipa_alias = false and " . "a.du_id_del is null and " . "a.dom_id = d.dom_id"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "; ERROR select failed\n"; return false; } $row = pg_fetch_array( $rs ); if( $row ) { echo "#\n"; echo "# static entries\n"; echo "#\n"; while( $row ) { echo "\n"; echo "# " . ereg_replace( "\n", "# ", $row["ipa_descr"] ) . "\n"; echo "host " . $row["ipa_name"] . " {\n"; echo " hardware ethernet " . $row["ip_hw_addr"] . ";\n"; echo " fixed-address " . $row["ipa_name"] . "." . $row["dom_name"] . ";\n"; echo "}\n"; $row = pg_fetch_array( $rs ); } echo "\n"; } $sql = "select ipr_min_addr, ipr_max_addr from iprange where " . "ipr_dhcp = true"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "; ERROR select failed\n"; return false; } $row = pg_fetch_array( $rs ); if( $row ) { $nm = ipToInt( $optnetmask ); $bc = ipToInt( $optbroadcast ); $ip = $bc & $nm; echo "#\n"; echo "# dynamic ip ranges\n"; echo "#\n"; echo "subnet " . intToIp($ip) . " netmask " . $optnetmask . " {\n"; while( $row ) { echo " range " . intToIp( $row["ipr_min_addr"] ) . " " . intToIp( $row["ipr_max_addr"] ) . ";\n"; $row = pg_fetch_array( $rs ); } echo "}\n"; } echo "# OK\n"; } function writeFIdentFile( $conn, $id, $param ) { echo "# ERROR not implemented\n"; } function listFiles( $conn ) { $sql = "select f_name from file"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "# ERROR select failed\n"; return; } while( $row = pg_fetch_array( $rs ) ) { echo "FILE " . $row["f_name"] . "\n"; } echo "# OK\n"; } function getFile( $conn, $name ) { $sql = "select f_id, f_type from file where f_name = '" . addslashes( $name ) . "'"; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "# ERROR select failed\n"; return array( "type" => "0" ); } $row = pg_fetch_array( $rs ); if( !$row ) { echo "# ERROR fetch failed\n"; return array( "type" => "0" ); } $f["id"] = $row["f_id"]; $f["name"] = $name; $f["type"] = $row["f_type"]; $sql = "select fp_name, fp_value from fileparam where f_id = " . $f["id"]; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "# ERROR select failed\n"; return array( "type" => "0" ); } while( $row = pg_fetch_array( $rs ) ) { $params[$row["fp_name"]] = $row["fp_value"]; } if( isset( $params["domain"] ) ) { $params["domid"] = $params["domain"]; $sql = "select dom_name from domain where dom_id = " . $params["domid"]; $rs = pg_exec( $conn, $sql ); if( !$rs ) { echo "# ERROR select failed\n"; return array( "type" => "0" ); } if( $row = pg_fetch_array( $rs ) ) { $params["domain"] = $row["dom_name"]; } } $f["param"] = $params; return $f; } header( "Content-Type: text/plain" ); include( "dnsdb.php" ); // $conn = db_connect( $session ); $conn = db_connect(); if( !$conn ) { echo "# ERROR connect failed\n"; exit(); } $cmd = getGetVar( "cmd", "" ); $name = getGetVar( "name", "" ); $clientname = getGetVar( "clientname", "" ); switch( $cmd ) { case "changed": checkChanged( $conn, $clientname ); break; case "list": listFiles( $conn ); break; case "file": $f = getFile( $conn, $name ); $id = $f["id"]; $name = $f["name"]; $type = $f["type"]; $param = $f["param"]; switch( $type ) { case 1: writeFDnsFile( $conn, $id, $param ); break; case 2: writeRDnsFile( $conn, $id, $param ); break; case 3: writeDhcpFile( $conn, $id, $param ); break; case 4: writeFIdentFile( $conn, $id, $param ); break; default: echo "# ERROR illegal file type\n"; break; } break; default: echo "# ERROR illegal command\n"; break; } ?>