Guest User

Untitled

a guest
May 26th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.91 KB | None | 0 0
  1. #!/bin/sh
  2. #
  3.  
  4. usage()
  5. {
  6.         cat << EOF
  7. Usage: $0 [ <ip> ] [ <nextmark> ] [ <switch_addr> ] [ <switch_port> ] [ <id_tariff> ]
  8.  
  9.   <ip>          - 192.168.x.x
  10.   <nextmark>    - iptables MARK
  11.   <switch_addr>  - switch address
  12.   <switch_port> - switch port
  13.   <tariff_id>   - 1-100
  14.  
  15. EOF
  16. }
  17.  
  18.  
  19. function valid_ip()
  20. {
  21.     local  ip=$1
  22.     local  stat=1
  23.  
  24.     if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
  25.         OIFS=$IFS
  26.         IFS='.'
  27.         ip=($ip)
  28.         IFS=$OIFS
  29.         [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
  30.             && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
  31.         stat=$?
  32.     fi
  33.     return $stat
  34. }
  35.  
  36.  
  37. if [ $# -ne 5 ]; then
  38.  
  39.         usage
  40.         exit 1
  41.  
  42. else
  43.         # Правила для маркировки адреса
  44.         iptables -t mangle -A PREROUTING -s $ip -j MARK --set-mark $nextmark
  45.         iptables -t mangle -A PREROUTING -s $ip -j RETURN
  46.  
  47.         # В данную переменную мы пишем строку конфига DHCP с учетом адреса юзера ($ip), адреса агента ($switch_addr) и порта агента ($switch_port)
  48.         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'";}'
  49.         # Пишем конфиг ДХЦП в соответствующий файл
  50.         echo $dhcp >/etc/dhcp/$switch_addr'_'$switch_port'.cfg'
  51.         # Рестартим ДХЦП
  52.         /etc/init.d/isc-dhcp-server restart
  53.         # Включаем интернет пользователю
  54.         iptables -t nat -A POSTROUTING -s $ip -o eth0 -j MASQUERADE
  55. fi
  56. exit 1
  57. fi
  58.  
  59.  
  60. # TODO:
  61. # Добавление юзера на порт
  62. # Конфиги свичей не правятся,изменения вносятся по telnet, и сразу конфиг выгружается по tftp
  63. # Напомню админу, что access_profile profile_id 2 access_id всегда равен номеру порта свича
  64. # соответственно и profile_id 3 аналогично. НЕ ВНОСИТЬ ИЗМЕНЕНИЙ В profile_id 1 блять!!!
  65. # Telnet-сессия со свичом
  66.  
  67.  
  68. #Логин на свич
  69. my_user_id="admin"
  70. #Пароль на свич (в безопасности особой нужды нет, ибо недоступен абонентам)
  71. my_password="1234"
  72. #Удаляем существующий профиль
  73. my_command1='config access_profile profile_id 3 delete access_id '$switch_port
  74. #Удаляем с требуемого порта все вланы
  75. my_command2='config vlan default delete '$switch_port
  76. my_command3='config vlan users delete '$switch_port
  77. my_command4='config vlan vlan23 delete '$switch_port
  78. #Добавляем нетегируемый влан юзеров на порт
  79. my_command5='config vlan users add untagged '$switch_port
  80. #Добавляем правило для порта
  81. my_command6='config access_profile profile_id 3 add access_id '$switch_port' ip source_ip '$ip' port '$switch_port' permit
  82. #Сохраняемся
  83. my_command7='save'
  84.  
  85. #Тут было бы неплохо сразу написать выгрузку конфига, но мне лень, поэтому идем дальше
  86.  
  87. #Телнетимся
  88.        spawn telnet $switch_addr
  89.   expect "username:"
  90.   # Посылаем имя пользователя и ждем запроса пароля.
  91.   send "$my_user_id\r"
  92.   expect "password:"
  93.   # Посылаем пароль и ждем приглашения ввода DES-3526:admin#
  94.   send "$my_password\r"
  95.   expect "%"
  96.   # Посылаем команду 1, и ждем следующего приглашения ввода
  97.   send "$my_command1\r"
  98.   expect "%"
  99.   # Посылаем команду 2, и ждем следующего приглашения ввода
  100.   send "$my_command2\r"
  101.   expect "%"
  102. # Посылаем команду 3, и ждем следующего приглашения ввода
  103.   send "$my_command3\r"
  104.   expect "%"
  105. # Посылаем команду 4, и ждем следующего приглашения ввода
  106.   send "$my_command4\r"
  107.   expect "%"
  108. # Посылаем команду 5, и ждем следующего приглашения ввода
  109.   send "$my_command5\r"
  110.   expect "%"
  111. # Посылаем команду 6, и ждем следующего приглашения ввода
  112.   send "$my_command6\r"
  113.   expect "%"
  114. # Посылаем команду 7, и ждем следующего приглашения ввода
  115.   send "$my_command7\r"
  116.   expect "%"
  117.   # Завершаем сессию telnet, и ждем символа конца строки (eof).
  118.   send "logout\r"
  119.   expect eof
Add Comment
Please, Sign In to add comment