Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- #
- usage()
- {
- cat << EOF
- Usage: $0 [ <ip> ] [ <nextmark> ] [ <switch_addr> ] [ <switch_port> ] [ <id_tariff> ]
- <ip> - 192.168.x.x
- <nextmark> - iptables MARK
- <switch_addr> - switch address
- <switch_port> - switch port
- <tariff_id> - 1-100
- EOF
- }
- function valid_ip()
- {
- local ip=$1
- local stat=1
- if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
- OIFS=$IFS
- IFS='.'
- ip=($ip)
- IFS=$OIFS
- [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
- && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
- stat=$?
- fi
- return $stat
- }
- if [ $# -ne 5 ]; then
- usage
- exit 1
- else
- # Правила для маркировки адреса
- iptables -t mangle -A PREROUTING -s $ip -j MARK --set-mark $nextmark
- iptables -t mangle -A PREROUTING -s $ip -j RETURN
- # В данную переменную мы пишем строку конфига DHCP с учетом адреса юзера ($ip), адреса агента ($switch_addr) и порта агента ($switch_port)
- dhcp='class "'$switch_addr'_'$switch_port'{ match if (binary-to-ascii(10,8,"",suffix(option agent.circuit-id,1)) ="'$switch_port'") and binary-to-ascii(10,8,".",packet(24,4))="'$switch_addr'";} pool { range '$ip'; allow members of"'$switch_addr'_'$switch_port'";}'
- # Пишем конфиг ДХЦП в соответствующий файл
- echo $dhcp >/etc/dhcp/$switch_addr'_'$switch_port'.cfg'
- # Рестартим ДХЦП
- /etc/init.d/isc-dhcp-server restart
- # Включаем интернет пользователю
- iptables -t nat -A POSTROUTING -s $ip -o eth0 -j MASQUERADE
- fi
- exit 1
- fi
- # TODO:
- # Добавление юзера на порт
- # Конфиги свичей не правятся,изменения вносятся по telnet, и сразу конфиг выгружается по tftp
- # Напомню админу, что access_profile profile_id 2 access_id всегда равен номеру порта свича
- # соответственно и profile_id 3 аналогично. НЕ ВНОСИТЬ ИЗМЕНЕНИЙ В profile_id 1 блять!!!
- # Telnet-сессия со свичом
- #Логин на свич
- my_user_id="admin"
- #Пароль на свич (в безопасности особой нужды нет, ибо недоступен абонентам)
- my_password="1234"
- #Удаляем существующий профиль
- my_command1='config access_profile profile_id 3 delete access_id '$switch_port
- #Удаляем с требуемого порта все вланы
- my_command2='config vlan default delete '$switch_port
- my_command3='config vlan users delete '$switch_port
- my_command4='config vlan vlan23 delete '$switch_port
- #Добавляем нетегируемый влан юзеров на порт
- my_command5='config vlan users add untagged '$switch_port
- #Добавляем правило для порта
- my_command6='config access_profile profile_id 3 add access_id '$switch_port' ip source_ip '$ip' port '$switch_port' permit
- #Сохраняемся
- my_command7='save'
- #Тут было бы неплохо сразу написать выгрузку конфига, но мне лень, поэтому идем дальше
- #Телнетимся
- spawn telnet $switch_addr
- expect "username:"
- # Посылаем имя пользователя и ждем запроса пароля.
- send "$my_user_id\r"
- expect "password:"
- # Посылаем пароль и ждем приглашения ввода DES-3526:admin#
- send "$my_password\r"
- expect "%"
- # Посылаем команду 1, и ждем следующего приглашения ввода
- send "$my_command1\r"
- expect "%"
- # Посылаем команду 2, и ждем следующего приглашения ввода
- send "$my_command2\r"
- expect "%"
- # Посылаем команду 3, и ждем следующего приглашения ввода
- send "$my_command3\r"
- expect "%"
- # Посылаем команду 4, и ждем следующего приглашения ввода
- send "$my_command4\r"
- expect "%"
- # Посылаем команду 5, и ждем следующего приглашения ввода
- send "$my_command5\r"
- expect "%"
- # Посылаем команду 6, и ждем следующего приглашения ввода
- send "$my_command6\r"
- expect "%"
- # Посылаем команду 7, и ждем следующего приглашения ввода
- send "$my_command7\r"
- expect "%"
- # Завершаем сессию telnet, и ждем символа конца строки (eof).
- send "logout\r"
- expect eof
Add Comment
Please, Sign In to add comment