Dlink Empty Script: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 8 промежуточных версий этого же участника)
Строка 1: Строка 1:
  +
[[Категория:Linux]]
  +
[[Категория:ShellScripting]]
  +
[[Категория:Switch]]
  +
[[Категория:DlinkSwitch]]
  +
 
=Настройка большого числа коммутаторов=
 
=Настройка большого числа коммутаторов=
 
В связи с тем, что было принято решение делать еже(дневно|недельно|годично) бекапы коммутаторов, возникла необходимость каким-то образом прописать на них коммюнити.
 
В связи с тем, что было принято решение делать еже(дневно|недельно|годично) бекапы коммутаторов, возникла необходимость каким-то образом прописать на них коммюнити.
Строка 35: Строка 40:
 
enable admin
 
enable admin
 
</PRE>
 
</PRE>
  +
===Полезная работа===
  +
Собственно полезную работу вынесу в отдельную ф-ю - то, что нужно сделать с коммутатором после авторизации.
  +
Тут может быть что угодно, я оставил для пример добавления случайной RW коммюнити..
  +
30-секундная пауза что бы коммутатор успел сохранить настройки.
  +
  +
Возможно, следует проверять успешность сохранения, но в моей практике сбоев на этом этапе не было.
  +
  +
<PRE>
  +
function load_data
  +
{
  +
RW_COMMUNITY=`$PWGEN -1`
  +
echo 'create snmp view ALL 1 view_type included' | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO
  +
echo 'create snmp community '$RW_COMMUNITY' view ALL read_write' | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO
  +
echo UPDATE switch set rw_community=\"$RW_COMMUNITY\", is_backup=1 where ip=\"$IP\" >> $SQL_LOG
  +
$EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO -t 5 'save\n'
  +
sleep 30
  +
$EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO -t 5 'logout\n'
  +
}
  +
</PRE>
  +
  +
  +
===Авторизация на коммутаторе===
  +
Наиболее запутанная часть - авторизация на коммутаторе.
  +
  +
  +
Для каждого IP: если коммутатор выдает строку UserName то использовать имя пользователя и логин для авторизации через радиус, в простивно случае передавть 2 раза \n что бы произвести вторую проверку. Если свитч выдает строку username - то использовать локальные имя пользователя и пароль.
  +
  +
<PRE>
  +
for IP in `cat $IP_LIST`
  +
do
  +
echo $IP
  +
IN_FIFO=/tmp/${IP}_in.fifo
  +
OUT_FIFO=/tmp/${IP}_out_fifo
  +
if ping -c 1 $IP -W1 2>&1 >/dev/null
  +
then
  +
# Создать соединение с коммутатором
  +
$EMPTY -f -i $IN_FIFO -o $OUT_FIFO -L /var/log/empty_log telnet $IP
  +
# Нужно различать свитчи которые авторизуют через радиус ( у них пригдашение UserName: , PassWord: и свитчи которые авторизуют локально - у них приглашение username: password:
  +
#
  +
$EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO serName: "${USERNAME_RADIUS}\n"
  +
# Проверить код возврата, если успешно ( найдено ОДНО совпадение! )- передать пароль.
  +
if [ $? = 1 ]
  +
then
  +
sleep 1
  +
echo "Use Radius Auth for "$IP
  +
$EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assWord: "${PASSWORD_RADIUS}\n"
  +
$EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n"
  +
$EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "enable admin\n"
  +
$EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assWord: "${PASSWORD_ENABLE}\n"
  +
sleep 1
  +
load_data;
  +
else
  +
$EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n"
  +
sleep 1
  +
$EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n"
  +
sleep 1
  +
echo "Use local Auth for " $IP
  +
$EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO sername: "${USERNAME_LOCAL}\n"
  +
if [ $? = 1 ]
  +
then
  +
$EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assword: "${PASSWORD_LOCAL}\n"
  +
sleep 1
  +
load_data;
  +
else
  +
echo "Unknown error or device." $IP" This error will be writen to log" >> $LOG_FILE
  +
echo "Unknown error or device." $IP" This error will be writen to log $LOG_FILE"
  +
fi
  +
fi
  +
else
  +
echo "Device is unreacheble (?)"
  +
fi
  +
done
  +
</PRE>
  +
  +
===Тонкости (мой частный случай)===
  +
Можно брать список IP напрямую из SQL но я решил этого не делать - это единоразовая операция, или по крайне мере редкая.
  +
Соответвенно, результат я пишу в sql-файлик, для того что бы сохранить коммюнити и использовать их потом для бекапа конфиолв.

Текущая версия на 15:13, 5 мая 2020


Настройка большого числа коммутаторов

В связи с тем, что было принято решение делать еже(дневно|недельно|годично) бекапы коммутаторов, возникла необходимость каким-то образом прописать на них коммюнити. Обходить руками все коммутаторы не хотелось. Задача усложнялась тем, что часть коммутаторов уже использовали централизованную авторизацию через радиус, а часть - старую схему с авторизацией из локальной базы пользователей.

Выбор средств

Существует 2 хорошо известных программы для решения данной задачи

Т.к. expect был у меня не собран, и предлогал поставить множество зависимостей, я решил использовать empty. Тем более, что написание скриптов на bash с использованием empty мне показалось значительно проще.

Краткое описание скриптов

Для того что бы пройтись по всем коммутаторам и внести на них изменения, я написал следующий скрипт: (разбито на части для лучшего понимания)

Описание переменных

#!/bin/bash

PWGEN=`which pwgen`
EMPTY=`which empty`
LOG_FILE="/var/log/des_empty.log"
SQL_LOG="/var/log/des_sql.log"


USERNAME_RADIUS='radiususer'
PASSWORD_RADIUS='password_in_radius'
USERNAME_LOCAL='local_user'
PASSWORD_LOCAL='local_password'
PASSWORD_ENABLE='enable_password'
IP_LIST='ip_list'

Есть 2 пользователя (из радиуса и локальный) с которыми можно авторизоваться на коммутаторе.В случае локальной авотризации сразу попадаешь в привилигированный режим. В случае авторизации через радиус требуется дополнительно выполнить комманду

enable admin

Полезная работа

Собственно полезную работу вынесу в отдельную ф-ю - то, что нужно сделать с коммутатором после авторизации. Тут может быть что угодно, я оставил для пример добавления случайной RW коммюнити.. 30-секундная пауза что бы коммутатор успел сохранить настройки.

Возможно, следует проверять успешность сохранения, но в моей практике сбоев на этом этапе не было.

function load_data
{
    RW_COMMUNITY=`$PWGEN -1`
    echo 'create snmp view ALL 1 view_type included' | $EMPTY -v  -s  -i $OUT_FIFO -o $IN_FIFO
    echo 'create snmp community '$RW_COMMUNITY'  view ALL read_write' | $EMPTY -v  -s  -i $OUT_FIFO -o $IN_FIFO
    echo UPDATE switch set rw_community=\"$RW_COMMUNITY\", is_backup=1 where ip=\"$IP\" >> $SQL_LOG
    $EMPTY -v -s  -i $OUT_FIFO -o $IN_FIFO -t 5 'save\n'
    sleep 30
    $EMPTY -v -s  -i $OUT_FIFO -o $IN_FIFO -t 5 'logout\n'
}


Авторизация на коммутаторе

Наиболее запутанная часть - авторизация на коммутаторе.


Для каждого IP: если коммутатор выдает строку UserName то использовать имя пользователя и логин для авторизации через радиус, в простивно случае передавть 2 раза \n что бы произвести вторую проверку. Если свитч выдает строку username - то использовать локальные имя пользователя и пароль.

for IP in `cat $IP_LIST`
do
    echo  $IP
    IN_FIFO=/tmp/${IP}_in.fifo
    OUT_FIFO=/tmp/${IP}_out_fifo
    if ping -c 1 $IP -W1 2>&1 >/dev/null
    then
        # Создать соединение с коммутатором
        $EMPTY -f -i $IN_FIFO  -o  $OUT_FIFO -L /var/log/empty_log  telnet $IP
        # Нужно различать свитчи которые авторизуют через радиус ( у них пригдашение UserName: , PassWord:  и свитчи которые авторизуют локально - у них приглашение username: password:
        #
        $EMPTY -t 2  -w -o $IN_FIFO -i $OUT_FIFO  serName: "${USERNAME_RADIUS}\n"
        # Проверить код возврата, если успешно  ( найдено ОДНО совпадение! )- передать пароль.
        if [ $? = 1 ]
        then
            sleep 1
            echo "Use Radius Auth for "$IP
            $EMPTY -t 2  -w -o $IN_FIFO -i $OUT_FIFO  assWord: "${PASSWORD_RADIUS}\n"
            $EMPTY -t 2  -s -o $IN_FIFO -i $OUT_FIFO  "\n"
            $EMPTY -t 2  -s -o $IN_FIFO -i $OUT_FIFO  "enable admin\n"
            $EMPTY -t 2  -w -o $IN_FIFO -i $OUT_FIFO  assWord: "${PASSWORD_ENABLE}\n"
            sleep 1
            load_data;
        else
            $EMPTY -t 2  -s -o $IN_FIFO -i $OUT_FIFO "\n"
            sleep 1
            $EMPTY -t 2  -s -o $IN_FIFO -i $OUT_FIFO "\n"
            sleep 1
            echo "Use local Auth for " $IP
            $EMPTY -t 2  -w -o $IN_FIFO -i $OUT_FIFO sername: "${USERNAME_LOCAL}\n"
            if [ $? = 1 ]
            then
                $EMPTY -t 2  -w -o $IN_FIFO -i $OUT_FIFO  assword: "${PASSWORD_LOCAL}\n"
                sleep 1
                load_data;
            else
                echo "Unknown error or device." $IP" This error will be writen to log"  >> $LOG_FILE
                echo "Unknown error or device." $IP" This error will be writen to log $LOG_FILE"
            fi
        fi
    else
        echo "Device is unreacheble (?)"
    fi
done

Тонкости (мой частный случай)

Можно брать список IP напрямую из SQL но я решил этого не делать - это единоразовая операция, или по крайне мере редкая. Соответвенно, результат я пишу в sql-файлик, для того что бы сохранить коммюнити и использовать их потом для бекапа конфиолв.