25.12.2015

Появилась задача определять ip-адрес девайса на каком порту. Так как я использую для мониторинга Nagios то выводить адреса буду в Nagios.
В своей сети использую свичи 2го уровня (2960) и роутеры cisco (2911 и 2902).
Я планировал лазить на цыски  выгребать порты с мак адресами. Но вот незадача свичи 2го уровня ничего о ip адресах не знают.
Решил сделать тогда лазить на роутеры и выгребать ARP таблицу и сравнивать по mac со свичами.
Первоначально хотел сделать на snmp но потом решил сделать проще используя программу expect.

Все действие происходит на debian. Необходимые пакеты expect, ssh , telnet





Значит изначально настраиваем свичи и роутеры для юзера под которым это все будет работать

Лезем на цыски и добавляем пользователя для просмотра мак адресов
conf t
username nagios secret nagiossupermegapass
privilege exec level 1 sh mac address-table
exit

На линуксе делаем файлик check_all_cisco.sh

содержимое:
#!/bin/bash
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

#темповые файлы
tmpport=allport.tmp
tmprouter=allcisco.ext
exitfile_tmp=all.tmp
outfile=$tmprouter

#выходной файл (до того как его прибиваю)
exitfile=all.all

switchs=('172.16.16.12' '172.16.16.13' '172.16.16.14')
ROUTERS=('172.16.16.49' '172.16.10.1')


if [[ -z "$1" ]] || [[ -z "$2" ]]; then
        echo "Missing parameters! Syntax: ./check_all_cisco.sh  LOGIN PASSWORD"
        exit 2
fi

#пвд показывает корень поэтому на exp файлы прописываем вручную
PWD=`/bin/pwd`

PATH_EXP_FILES=/usr/lib/nagios/plugins


login=$1
passw=$2


#c ssh косяк. Нужно по ssh первоначально зайти на цыску под юзером чтобы сгенерилась пара ключей.

for ROUTER in ${ROUTERS[@]}
do
/usr/bin/expect -f $PATH_EXP_FILES/exp_cisco_ssh.exp $ROUTER $1 $2  > /dev/null 2>&1
cat /tmp/$ROUTER.ssh | grep 'Internet' |  awk '{print  $2 " " $4 " " $6}' | tee -a /tmp/$outfile > /dev/null 2>&1
done



for ii in ${switchs[@]}
do
/usr/bin/expect -f $PATH_EXP_FILES/exp_cisco_telnet.exp $ii $1 $2  > /dev/null 2>&1
cat /tmp/$ii.tel | grep -E 'DYNAMIC|STATIC'| sed '/Po/d' | sed '/CPU/d' | awk -v it=$ii '{print $2 ":" it ":" $4}' | tee -a  /tmp/$tmpport > /dev/null 2>&1
#cat /tmp/$ii.tel | grep -E 'DYNAMIC|STATIC'| sed '/Po/d' | awk -v it=$ii '{print $2 ":" it ":" $4}' | tee -a  /tmp/$tmpport > /dev/null 2>&1
done



#сделаем уникальные строки а то в-ланы под одним маком
sort /tmp/$tmpport | uniq > /tmp/tmp.tmp
cp  /tmp/tmp.tmp /tmp/$tmpport
rm /tmp/tmp.tmp



for cc in `cat /tmp/$outfile |awk '{print $1 ":" $2 ":" $3}'`
do
MACADDR=`echo $cc | cut -f 2 -d':'`  > /dev/null 2>&1
IP=`echo $cc | cut -f 1 -d':'`  > /dev/null 2>&1
PORT=`echo $cc | cut -f 3 -d':'`  > /dev/null 2>&1
ADD=`cat /tmp/$tmpport | grep -e $MACADDR |awk 'BEGIN{FS=":"}{print $2 " PORT_SW:" $3}'`  > /dev/null 2>&1
echo 'MAC:'$MACADDR 'IP:'$IP 'SW_IP:'$ADD | tee -a  /tmp/$exitfile  > /dev/null 2>&1
done

for ii in  ${switchs[@]}
do
rm -f /tmp/$ii.tel
done

for ii in  ${ROUTERS[@]}
do
rm -f /tmp/$ii.ssh
done


rm -f /tmp/$ROUTER.ssh
rm -f /tmp/$tmprouter
rm -f /tmp/$tmpport
rm -f /tmp/$exitfile_tmp

#Если нада файл то комментируем удаление. rm -f /tmp/$exitfile
cat /tmp/$exitfile
rm -f /tmp/$exitfile

exit $STATE_OK


и файлик  exp_cisco_ssh.exp

#!/usr/bin/expect

set host [ lrange $argv 0 0 ]
set login [ lrange $argv 1 1 ]
set password [ lrange $argv 2 2 ]

#set login "nagios"
set logfile /tmp/$host.ssh
exp_internal 0


spawn ssh -l $login $host
expect "Password:"
send "$password\n"
expect ">"
set running 1
log_file $logfile
send "term len 0\n"
expect ">"
send "sh arp"
send "\n"
expect ">"
send "exit\r"
log_file



теперь файл exp_cisco_telnet.exp
#!/usr/bin/expect

set host [ lrange $argv 0 0 ]
set login [ lrange $argv 1 1 ]
set password [ lrange $argv 2 2 ]

#set login "nagios"
set logfile /tmp/$host.tel
exp_internal 0

exp_cisco_telnet.exp

spawn telnet $host
expect  "Username:"
send "$login\n"
expect "Password:"
send "$password\n"
expect ">"
set running 1
log_file $logfile
send "term len 0\n"
expect ">"
send "sh mac addr"
send "\n"
expect ">"
send "exit\r"
log_file


файлы копируем где находятся плагины для нагиоса.
cp check_all_cisco.sh /usr/lib/nagios/plugins
exp_cisco_telnet.exp /usr/lib/nagios/plugins
cp exp_cisco_ssh.exp /usr/lib/nagios/plugins

 Значит какие косяки скрипта:
1. Для роутеров которые работают через ssh необходимо сгенерить пару ключей под юзером от имени которого выполняется скрипт.
проще всего
su - nagios -s /bin/bash
nagios@:~$ssh ip_роутера
 The authenticity of host 'ip_роутера (ip_роутера)' can't be established.
RSA key fingerprint is 20:e3:01:b3:d1:28:40:f9:57:2f:23:2e:e5:ed:83:3f.
Are you sure you want to continue connecting (yes/no)?
вводим yes
и выходим
2.  Есть еще прикол что для одного мака может быть несколько записей в arp таблице.поэтому в первом скрипте я их не учитываю.







Комментариев нет :

Отправить комментарий