function fatlady_dhcps($prefix, $svc) { $service = cut($svc, 0, "."); $version = scut($service, 0, "DHCPS"); XNODE_set_var("FATLADY_DHCPS_PATH", $prefix); XNODE_set_var("SERVICE_NAME", $svc); $b = "/htdocs/phplib/fatlady/DHCPS"; if ($version == 4) { dophp("load", $b . "/dhcps4.php"); } else { if ($version == 6) { dophp("load", $b . "/dhcps6.php"); } else { $_GLOBALS["FATLADY_result"] = "FAILED"; $_GLOBALS["FATLADY_node"] = ""; $_GLOBALS["FATLADY_message"] = "Unsupported DHCP service : " . $svc; /* internal error, no i18n(). */ } } XNODE_del_var("FATLADY_DHCPS_PATH"); XNODE_del_var("SERVICE_NAME"); if ($_GLOBALS["FATLADY_result"] == "OK") { set($prefix . "/valid", 1); } }
function dhcp_client($mode, $inf, $devnam, $opt, $router, $dns) { $hlp = "/var/servd/" . $inf . "-dhcp6c.sh"; $pid = "/var/servd/" . $inf . "-dhcp6c.pid"; $cfg = "/var/servd/" . $inf . "-dhcp6c.cfg"; /* DHCP over PPP session ? */ $previnf = XNODE_get_var($inf . "_PREVINF"); XNODE_del_var($inf . "_PREVINF"); /* dslite ? */ $nextinf = XNODE_get_var($inf . "_NEXTINF"); XNODE_del_var($inf . "_NEXTINF"); //if ($mode=="PPPDHCP" && $_GLOBALS["PREVINF"]!="") //msg("mode is ".$mode.", previnf is ".$previnf); msg("mode is " . $mode . ", previnf is " . $previnf . ", nextinf is " . $nextinf); if ($mode == "PPPDHCP" && $previnf != "") { //$pppdev = PHYINF_getruntimeifname($_GLOBALS["PREVINF"]); $pppdev = PHYINF_getruntimeifname($previnf); if ($pppdev == "") { return error("no PPP device."); } msg("PPP device = " . $pppdev); } msg("dhcpopt: " . $opt); /* Gererate DHCP-IAID from 32-bit of mac address*/ $mac = PHYINF_getphymac($inf); $mac1 = cut($mac, 3, ":"); $mac2 = cut($mac, 0, ":"); $mac3 = cut($mac, 1, ":"); $mac4 = cut($mac, 2, ":"); $iaidstr = $mac1 . $mac2 . $mac3 . $mac4; $iaid = strtoul($iaidstr, 16); /* Generate configuration file. */ if ($mode == "INFOONLY") { $send = "\tinformation-only;\n"; $idas = ""; } else { //check if we have pd hint $stsp = XNODE_getpathbytarget("/runtime", "inf", "uid", $inf, 0); $pdhint_enable = query($stsp . "/pdhint/enable"); $pdhintmsg = "\n"; if ($pdhint_enable == "1") { $pdhint_network = query($stsp . "/pdhint/network"); $pdhint_prefix = query($stsp . "/pdhint/prefix"); $pdhint_plft = query($stsp . "/pdhint/preferlft"); $pdhint_vlft = query($stsp . "/pdhint/validlft"); if ($pdhint_vlft != "") { $pdhintmsg = "\tprefix " . $pdhint_network . "/" . $pdhint_prefix . " " . $pdhint_plft . " " . $pdhint_vlft . ";\n"; } else { $pdhintmsg = "\tprefix " . $pdhint_network . "/" . $pdhint_prefix . " " . $pdhint_plft . ";\n"; } } //check if we got the prefix before //++++ $pre_pd_network = query("/runtime/ipv6/pre_pdnetwork"); if ($pre_pd_network != "") { $pre_pd_prefix = query("/runtime/ipv6/pre_pdprefix"); $pre_pd_plft = query("/runtime/ipv6/pre_pdplft"); $pre_pd_vlft = query("/runtime/ipv6/pre_pdvlft"); if ($pre_pd_vlft != "") { $pdhintmsg = "\tprefix " . $pre_pd_network . "/" . $pre_pd_prefix . " " . $pre_pd_plft . " " . $pre_pd_vlft . ";\n"; } else { $pdhintmsg = "\tprefix " . $pre_pd_network . "/" . $pre_pd_prefix . " " . $pre_pd_plft . ";\n"; } } else { $pdhintmsg = "\tprefix ::/56 0 0;\n"; } //---- //if (strstr($opt,"IA-NA")!="") {$send=$send."\tsend ia-na 0;\n"; $idas=$idas."id-assoc na {\n};\n";} if (strstr($opt, "IA-NA") != "") { $send = $send . "\tsend ia-na " . $iaid . ";\n"; $idas = $idas . "id-assoc na " . $iaid . "{\n};\n"; } //if (strstr($opt,"IA-PD")!="") {$send=$send."\tsend ia-pd 0;\n"; $idas=$idas."id-assoc pd {\n};\n";} if (strstr($opt, "IA-PD") != "") { $send = $send . "\tsend ia-pd 0;\n"; $idas = $idas . "id-assoc pd {\n" . $pdhintmsg . "};\n"; } } if ($mode == "PPPDHCP") { $dname = $pppdev; } else { $dname = $devnam; } $nextinfp = XNODE_getpathbytarget("", "inf", "uid", $nextinf, 0); $nextinet = query($nextinfp . "/inet"); $nextinetp = XNODE_getpathbytarget("inet", "entry", "uid", $nextinet, 0); $nextmode = query($nextinetp . "/ipv4/ipv4in6/mode"); if ($nextinf != "" && $nextmode == "dslite") { $rqstmsg = "\trequest aftr-server-domain-name;\n"; } else { $rqstmsg = ""; } fwrite(w, $cfg, "interface " . $dname . " {\n" . $send . "\trequest domain-name-servers;\n" . "\trequest domain-name;\n" . "\trequest ntp-servers;\n" . $rqstmsg . "\tscript \"" . $hlp . "\";\n" . "};\n" . $idas); /* generate callback script */ fwrite(w, $hlp, "#!/bin/sh\n" . 'if [ $new_addr != "" ] || [ $new_pd_prefix != "" ]; then\\n' . "\techo [\$0]: [{$new_addr}] [{$new_pd_prefix}] [{$new_pd_plen}] [{$new_pd_pltime}] [{$new_pd_vltime}] > /dev/console\n" . "else\n" . "\texit 0\n" . "fi\n" . "phpsh /etc/services/INET/inet6_dhcpc_helper.php" . " INF=" . $inf . " MODE=" . $mode . " DEVNAM=" . $dname . " GATEWAY=" . $router . " DHCPOPT=" . $opt . ' "NAMESERVERS=$new_domain_name_servers"' . ' "DOMAIN=$new_domain_name"' . ' "NEW_ADDR=$new_addr"' . ' "NEW_PD_PREFIX=$new_pd_prefix"' . ' "NEW_PD_PLEN=$new_pd_plen"' . ' "NEW_PD_PLTIME=$new_pd_pltime"' . ' "NEW_PD_VLTIME=$new_pd_vltime"' . ' "DNS=' . $dns . '"' . ' "NEW_AFTR_NAME=$new_aftr_name"' . ' "NTPSERVER=$new_ntp_servers"' . "\n"); /* Start DHCP client */ cmd("chmod +x " . $hlp); if ($pppdev == "") { cmd("dhcp6c -c " . $cfg . " -p " . $pid . " -t LL -n " . $inf . " " . $devnam); } else { cmd("dhcp6c -c " . $cfg . " -p " . $pid . " -t LL -o " . $devnam . " -n " . $inf . " " . $pppdev); } return 0; }