#!/usr/local/bin/php "; $devs = $db->select("select dev.hostname, dev.login, dev.password, devip.id as devip_id, host(devip.ip) as ipaddr, devip.mac from device dev left join device_ip devip on (devip.device=dev.id) where dev.device_type=74 and dev.deleted='f' "); foreach( $devs as $dev ) { if(!empty($argv[1]) && $argv[1]!=$dev["ipaddr"]) continue; echo "\n----------------------------------------------------------------------------------------------------------------------------\n"; $MASTER=array(); // udaje o tomto mastri $EP=array(); // pole endpointov na tomto mastri, a ich hodnot $EPACC=array(); // pole id-ciek access-ov ktore su pripojene cez jednotlive EP // echo "\nConnecting to ".$dev["ipaddr"]." port ".$CFG["port"]." ".$dev["password"]." ...\n"; $telnet=new telnet; //$telnet->stream_blocking=false; if( $telnet->connect($dev["ipaddr"], $CFG["port"]) == false ) { echo $telnet->msg; continue; // exit(1); } //echo "\nConnecting...\n"; //echo $telnet->read(5, "login as:"); sleep(1); echo "\nLogging into $dev[ipaddr] ... "; $res = $telnet->exec($dev["login"], $CFG["read_timeout"], "Password:"); echo "pass ... \n"; $res = $telnet->exec(substr($dev["password"],0,8), $CFG["read_timeout"], "Telnet>"); //echo $res; if ( stripos($res, "Telnet command shell") === false) { echo "\nERROR! Password not accpted, or no reply received at all..."; // exit(2); continue; } echo "Getting master info... "; $res = $telnet->exec("showmaster", $CFG["read_timeout"], "command ok!"); if(ereg("master mac address: ([0-9a-f\-]+)", $res, $regs)) { $MASTER["mac"] = $regs[1]; $MASTER["mac2"] = str_replace("-", ":", $regs[1]); if($dev["mac"] != $MASTER["mac2"]) { $db->exec("update device_ip set mac='".$MASTER["mac2"]."' where id=".$dev["devip_id"] ); } } if(ereg("master note: ([^\n\r]+)", $res, $regs)) $MASTER["note"] = $regs[1]; if(ereg("working master version: ([^\n\r]+)", $res, $regs)) $MASTER["working_ver"] = $regs[1]; if(ereg("working privacy key: ([^\n\r]+)", $res, $regs)) $MASTER["working_privacy"] = $regs[1]; // var_dump($MASTER); echo "$MASTER[mac] :: $MASTER[working_ver] :: $MASTER[note]\n"; echo "Getting channel info...\n"; $res = $telnet->exec("chaninf -m $MASTER[mac]", 15, "command ok!"); $res = explode("\n", $res); foreach ($res as $row) { if(ereg("\) ([0-9a-f\:]+)-->([0-9a-f\:]+) receiver rate: +([0-9]+)Mbps +([0-9/]+) +current rate: +([0-9]+)Mbps +([0-9/]+) +snr=([0-9\.]+) +db ,Rx_Power=([0-9\.\-]+)dBm", $row, $regs)) { /* [0]=> string(127) ") 00:16:e7:01:59:7c-->00:16:e7:01:6b:55 receiver rate: 128Mbps 32/4 current rate: 128Mbps 32/4 snr=27.87 db ,Rx_Power=-18.30dBm" [1]=> string(17) "00:16:e7:01:59:7c" from mac [2]=> string(17) "00:16:e7:01:6b:55" to mac [3]=> string(3) "128" RXrate [4]=> string(4) "32/4" [5]=> string(3) "128" CurRXrate [6]=> string(4) "32/4" [7]=> string(5) "27.87" SNR [8]=> string(6) "-18.30" RXpower */ $macsrc = str_replace(":", "-", $regs[1]); $macdst = str_replace(":", "-", $regs[2]); if($macsrc == $MASTER["mac"]) { // data od mastra ku klientovi $EP[$macdst]["rxrate"] = $regs[3]; //$EP[$macdst]["snr"] = $regs[7]; $EP[$macdst]["noise"] = $regs[8] - $regs[7]; $EP[$macdst]["signal"] = $regs[8]; } else { $EP[$macsrc]["txrate"] = $regs[3]; //$EP[$macsrc]["ap_snr"] = $regs[7]; $EP[$macsrc]["ap_noise"] = $regs[8] - $regs[7]; $EP[$macsrc]["ap_signal"] = $regs[8]; } } } // var_dump($EP); echo "Getting ep info...\n"; $res = $telnet->exec("showep", 15, "command ok!"); $res = split("[\n\r]+", $res); foreach ($res as $row) { if(ereg("^([0-9a-f\-]+)\: (.*)offline$", $row, $regs)) { /* 00-01-40-2a-04-ac: NET-60226 Tischl, offline 00-16-e7-01-6a-37: NET-80908, offline 00-01-40-2a-04-9b: TEST 1, offline 00-01-40-2a-04-ac: offline */ } elseif(ereg("^([0-9a-f\-]+)\: (.*)online, (.+)", $row, $regs)) { /* 00-01-40-2a-04-9c: NET-98507, online, hpna:2.8.4RC6-3, voip:1.06, [o] 00-01-40-2a-04-7b: NET-99405, online, hpna:2.8.6RC14-0, voip:, [ep config is processing] 00-16-e7-01-6b-5c: NET-97115, online, hpna:2.8.6RC14-0, [o] 00-16-e7-01-6a-33: NET-91006, online, hpna:2.8.4RC6-3, [o] */ $EP[$regs[1]]["fw_ver"] = $regs[3]; } } // spravime lookup do vsetkych online EP, ze ake klientske MAC adresy maju za sebou pripojene // podla toho zaktualizujeme a foreach($EP as $epmac => $ep) { $clientmacs=array(); $saved=false; // pripraviem dalsie data na zapis do sql $ep["checked"] = date("Y-m-d H:i:s"); $ep["ssid"] = $MASTER["note"]; $ep["ap_mac"] = $MASTER["mac"]; $ep["status"] = 0; $ep["last"] = 't'; $ep["family"] = "HCNA"; $ep["mac"] = $epmac; $ep["method"] = "telnet"; $ep["ip"] = $dev["ipaddr"]; $ep["port"] = $CFG["port"]; $ep["device"] = "HP52/S"; if( strpos($ep["fw_ver"], "voip")!==false ) $ep["device"] .= " FXS"; $acc["cpe_lastcheck"] = $ep["checked"]; $acc["cpe_status"] = $ep["status"]; $acc["cpe_method"] = "telnet"; $acc["cpe_device"] = $ep["device"]; $acc["cpe_version"] = $ep["fw_ver"]; $acc["cpe_ssid"] = $ep["ssid"]; $acc["cpe_mac"] = $ep["mac"]; echo "\nGetting client MACs for EP $epmac ... "; $res = $telnet->exec("findep -e $epmac", 15, "command ok!"); $res = split("[\n\r]+", $res); foreach ($res as $row) { if(ereg("([0-9a-f\-]{17})", $row, $regs)) { $clientmacs[$regs[1]]=$regs[1]; } } echo @implode(" ", $clientmacs)."\n"; echo "Saving data for $epmac (rate $ep[rxrate]/$ep[txrate], signal $ep[signal]/$ep[ap_signal], noise $ep[noise]/$ep[ap_noise], $ep[fw_ver]) ..."; if(!empty($clientmacs)) { // cez tento EP je mozno niekto prihlaseny - pohladame ci ho mame v radacct, ak ano tak zapiseme data k nemu foreach($clientmacs as $clientmac) { $radacct = $db->select("select access_id from radacct where access_id is not null and acctstoptime is null and callingstationid='".strtoupper(str_replace("-", ":", $clientmac))."' and framedprotocol='PPP' group by access_id "); if(!empty($radacct)) { // nasli sme usera - zapiseme to k nemu $ep["access"] = $radacct[0]["access_id"]; // var_dump($ep); echo " access $ep[access] (online) "; $saved=true; $db->exec("update cpe_check set last='f' where access='".$ep["access"]."'"); $db->insert("cpe_check", $ep); $db->update("access", $acc, "id='$ep[access]'"); } } } if(!$saved) { // nie su online ziadni useri cez toto CPE, musime uhadnut kam to priradit // ziskame udaj z db, ktory access naposledy toto CPE pouzil $access = $db->select("select id from access where cpe_mac='$epmac' and activationnow() ) and cpe_lastcheck>=(now()-'60 days'::interval) order by cpe_lastcheck desc"); if(!empty($access)) { // nasli sme usera - zapiseme to k nemu $ep["access"] = $access[0]["id"]; echo " access $ep[access] (last used)"; $db->exec("update cpe_check set last='f' where access='".$ep["access"]."'"); $db->insert("cpe_check", $ep); $db->update("access", $acc, "id='$ep[access]'"); } else { echo " access unknown"; $db->insert("cpe_check", $ep); } } echo "\n"; } echo "Logging off... "; $res = $telnet->exec("exit", $CFG["read_timeout"]); echo "done.\n\n"; } ?>