суббота, июля 26, 2008

Осваиваю TCL

Решил посмотреть на свитче, какие ip с каких портов приходят, задумался...
по snmp конечно хорошо, да еще и по расписанию если, да еще и в базу и страничку на вебе...
Начал гуглить, не нагуглилось как-то, подумал написать, подумал, что лениво...
Надумал сделать на TCL и запускать прямо на свитче, вроде как проще.
Оказалось, что не совсем проще, учитывая, что регулярные выражения каждый раз вспоминаю по доке и язык не известный.
С написанием и отладкой ковырялся полдня:) Глючная штука, по моему из консоли show ip arp | include 10 работает нормально, а из скрипта вместо кучи строк, показало три, решил, что выборку можно сделать в скрипте или уже результаты работы скрипта фильтровать. Тестировал на 3560-PS-S 12.2(40), на другом железе, может потребоваться редактирование regex'а, который вытаскивает int, т.к. вывод на 3560 и 4500 отличается.
Оказалось напрасно я возился, свитч, на котором vlan терминируется не поддерживает tcl, прошивать его не але, перерыв сервиса, лениво.
Может кому пригодится

proc get_ints {} {
#puts "BEFORE\n"
set check ""
set arp_out [exec "show ip arp\n"]

set mylist [regexp -all -nocase -line -inline {[A-Fa-f0-9]{4}\.[A-Fa-f0-9]{4}\.[A-Fa-f0-9]{4}} $arp_out]

#puts "MYLIST $mylist\n"
array set ints_out {}
set i 0
set int ""

foreach mac_addr $mylist {

set mac_out [ exec "show mac address-table address $mac_addr\n" ]
set int [regexp -all -nocase -line -inline {[a-z]*[0-9]/[0-9]*} $mac_out]
set ip_out [exec "show ip arp $mac_addr\n"]
set ip [regexp -all -nocase -line -inline {[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*} $ip_out]


puts "$ip : $mac_addr : $int"

}

#return $int
}

puts ""
puts [eval get_ints]