Автоматическая «прибивка» пользователей к портам устройств в LanBilling 2 путем опроса MAC свичей
Дано:
1) LanBilling в которой ведется журнал авторизации пользователей по логину с указанием MAC адреса устройства с которого прошла авторизация.
2) В LanBilling нет привязки пользователя ни к порту, ни к сетевому устройству.
Задача: опросить все сетевые устройства, узнать все MAC адреса и порты свичей на которых «висят» пользователи
Решение:
— получаем у свичей информацию о MAC адресах на портах
— ищем этот MAC в истории авторизации LanBilling — получаем учетку
— «прибиваем» эту учетку в LanBilling к конкретному устройству, к конкретному порту.
Вуаля! Теперь когда пользователь звонит «ничего не работает», мы знаем на каком свиче и на каком порту он сидит. Ура товарищи!
Реализация:
Для каждого свича необходимо написать подобного вида скрипт, учитывающий особенности данного свича:
1 2 3 4 5 6 |
#!/usr/local/bin/expect spawn telnet 22.122.134.165 #expect "login:" { send "логин\r" } expect "word:" { send "пароль\r" } expect ">" { send "show fdb \" } expect ">" { send "logout\r " } |
, т.е. заходим на свич по telnet и получаем сведения по портах.
Далее собираем все скрипты в одну папочку, и рисуем скрипт который выполняется по cron:
1 2 3 4 5 6 7 8 9 10 11 12 |
rm /home/blabla/sw/ok/macraw.txt touch /home/blabla/sw/ok/macraw.txt f=`find /home/blabla/sw/ok/*sw*.sh ` for file in $f do echo "-start-">>/home/blabla/sw/ok/macraw.txt expect $file >>/home/blabla/sw/ok/macraw.txt echo "-end-">>/home/blabla/sw/ok/macraw.txt done php /home/blabla/sw/ok/./parseraw.php |
,т.е. последовательно выполняем все файлы sh в каталоге, пишем лог, а потом этот лог парсим скриптом parseraw.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
#!/usr/local/bin/php <?php // вставляем в базу function insertobase($port,$mac,$ip){ echo "Ищем по базе: $port;$mac;$ip \n"; $mac=mb_strtolower($mac); $mac=str_replace("-","",$mac); $port=trim($port); mysql_connect("localhost","erfwerf","34f234qf34"); mysql_select_db("billing"); //ищем пользователя $q = "SELECT vg_id FROM auth_history WHERE DATE(dt)>=DATE('2014-01-01 00:00:00') AND mac='$mac' AND vg_id IN (SELECT vg_id FROM vgroups WHERE id=1 AND uid IN (SELECT uid FROM usergroups_staff WHERE group_id=2)) ORDER BY record_id DESC LIMIT 1"; //echo $q."\n"; $res = mysql_query($q); while ($row = mysql_fetch_assoc($res)){ // если нашли, кричим! $vg_id=$row["vg_id"]; echo "--нашли пользователя : $vg_id\n"; // теперича ищем этот свич в базе $q="select devices_options.value as ip,device_status.param_value,devices.device_id,devices.device_name,devices.address from devices inner join device_status on device_status.device_id=devices.device_id inner join devices_options on devices_options.device_id=devices.device_id where devices.tpl=0 and device_status.param_name='Uptime' and devices_options.name='IP' and devices_options.value='$ip'"; //echo "$q\n"; $res2 = mysql_query($q); while ($row2 = mysql_fetch_assoc($res2)){ $device_id=$row2["device_id"]; $device_name=$row2["device_name"]; $address=$row2["address"]; echo "---нашел девайс! $device_name $address \n"; // смотрим порты сего девайса $q="select * from ports where vg_id='$vg_id'"; $res3 = mysql_query($q);$cc=0; while ($row3 = mysql_fetch_assoc($res3)){ echo "-пользователь уже прибит на этом устройстве на каком-то порту !\n"; $cc++; }; // если пользователь еще не прибит на этом устройстве, то проверяем, а может он где-то уже прибит? if ($cc==0){ $q="select * from ports where vg_id='$vg_id' and device_id<>'$device_id'"; $res3 = mysql_query($q);$cc=0; while ($row3 = mysql_fetch_assoc($res3)){ $dd=$row3["device_id"]; if ($row3["vg_id"]==$vg_id){echo "- ой! какимто чудесным образом пользователь уже прибит на другом ($dd) устройстве на каком-то порту !\n";$cc++;}; }; }; // ну теперь точно его прибиваю к устройству, к порту! if ($cc==0){ $q="UPDATE ports SET vg_id='$vg_id' where device_id='$device_id' and name='$port'"; echo "$q\n"; $res4 = mysql_query($q); echo "---прибил пользователя $vg_id к устройству $device_id ($device_name) порт $port\n"; }; } } }; function prepareinsertobase($macs,$i){ // var_dump($macs); //проверяем скока IP на этом порту for ($x=0;$x<$i;$x++) { $cnt=0;$port=$macs[$x]["port"]; for ($y=0;$y<$i;$y++) { if ($port==$macs[$y]["port"]){$cnt++;} } //если портов меншьше 3, то засовываем в базу if ($cnt<=3){ insertobase($macs[$x]["port"],$macs[$x]["mac"],$macs[$x]["ip"]); }; } }; // парсим все и вся! function parse($swm,$ip_sw){ //echo "--start--\n"; echo "$ip_sw\n"; //var_dump($swm); $macs=array();$i=0; foreach ($swm as $st){ $mm=explode(";",$st); $flag=0; if (($mm[3]=="Dynamic") and ($flag==0)){ echo "MAC: $mm[1] PORT: $mm[2]\n"; $macs[$i]["mac"]=$mm[1]; $macs[$i]["port"]=$mm[2]; $macs[$i]["ip"]=$ip_sw; $flag=1; }; if (isset($mm[4])){ if (($mm[4]=="Dynamic") and ($flag==0)){ echo "MAC: $mm[2] PORT: $mm[3]\n"; $macs[$i]["mac"]=$mm[2]; $macs[$i]["port"]=$mm[3]; $macs[$i]["ip"]=$ip_sw; $flag=1; };} if ((($mm[0]=="001") or ($mm[0]=="002") or ($mm[0]=="003") or ($mm[0]=="004") or ($mm[0]=="005") or ($mm[0]=="006") or ($mm[0]=="007") or ($mm[0]=="008") )and ($flag==0)){ echo "MAC: $mm[3] PORT: $mm[1]\n"; $macs[$i]["mac"]=$mm[3]; $macs[$i]["port"]=$mm[1]; $macs[$i]["ip"]=$ip_sw; $flag=1; }; $i++; if ($flag==0){var_dump($mm);}; }; prepareinsertobase($macs,$i); unset($macs); //echo "--end--\n"; }; $mfile=file("/home/blabla/sw/ok/macraw.txt"); $ip_sw=""; $swm=array();$oldip=""; foreach ($mfile as $st) { $st=trim($st); $flag=0; if (substr_count($st,"spawn telnet")>0){ //вычленяем IP свича $ip_sw=trim(str_replace("spawn telnet","",$st)); if ($oldip==""){$oldip=$ip_sw;}; // echo "$ip_sw\n"; }; //$ms=explode("",$st) if (substr_count($st,"001")>0){$flag=1;}; if (substr_count($st,"002")>0){$flag=1;}; if (substr_count($st,"003")>0){$flag=1;}; if (substr_count($st,"004")>0){$flag=1;}; if (substr_count($st,"005")>0){$flag=1;}; if (substr_count($st,"006")>0){$flag=1;}; if (substr_count($st,"007")>0){$flag=1;}; if (substr_count($st,"008")>0){$flag=1;}; if (substr_count($st,"Copyright")>0){$flag=0;}; if (substr_count($st,"default")>0){$flag=1;}; if (substr_count($st,"Dynamic")>0){$flag=1;}; if (substr_count($st,"VLAN")>0){$flag=0;}; if (substr_count($st,"Switches")>0){$flag=0;}; if (substr_count($st,"ENTER")>0){$flag=0;}; $st=str_replace(" ",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); $st=str_replace(";;",";",$st); if ($flag==1){ if ($oldip!=$ip_sw){ parse($swm,$oldip); unset($swm); $swm=array(); }; $swm[]=$st; //echo "$st\n"; $oldip=$ip_sw; }; }; parse($swm,$ip_sw); ?> |