Меню
Контакты
109147, Москва, ул.Воронцовская, 35Б, корп.2 офис.11, 4 этаж
Пн-Пт: с 9-00 до 17-00   Сб-вс: выходной
Интернет-магазин
сетевого оборудования
Москва +7 (495) 103-41-03 +7 (915) 420-28-94
109147, Москва, ул.Воронцовская, 35Б, корп.2 офис.11, 4 этаж
Пн-Пт: с 9-00 до 17-00   Сб-вс: выходной
Заказать звонок

Хот-спот (Wi-Fi) для Mikrotik Routerboard. Пишем скрипты. Часть 9(9/11)

 25 Июл 2011    MikroTik, Hotspot

 

Будет два файла. Первый - mysql_db.py, в нем будет происходить соединение с базой данных. Второй - hotspot.py, это скрипт, который будет выполнять действия на Mikrotik Routerboard.

Файл mysql_db.py имеет следующий вид:

#!/usr/bin/env python

# -*- coding: utf_8 -*-

import MySQLdb

def f_mysql_connect():

con = mysql_db_connect = MySQLdb.connect(user='root', passwd='1q2w3e', db='hotspot')

return con

db = f_mysql_connect()

 

Разбираем скрипт:

import MySQLdb  - импортируем модуль для работы с базой данных mysql;

def f_mysql_connect():  - создаем функцию с именем f_mysql_connect;

con = mysql_db_connect = MySQLdb.connect(user='root', passwd='1q2w3e', db='hotspot') 

- соединяемся с базой данных;

return con - возвращаем значение переменной con;

db = f_mysql_connect() - результат работы функции помещаем в переменную db.

 

Файл hotspot.py выглядит так:

#!/usr/bin/env python 

# -*- coding: utf_8 -*-

import time

import mysql_db

from paramiko import SSHClient

from paramiko import AutoAddPolicy

ssh = SSHClient()

ssh.set_missing_host_key_policy(AutoAddPolicy())

mtipaddress = '192.168.4.246'

mtlogin = 'admin'

mtpassword = '1q2w3e'

while 1:

try:

cur = mysql_db.db.cursor()

sql = ("SELECT * FROM action")

cur.execute(sql)

action = cur.fetchall()

cur.close()

print action

for user_data in action:

id = user_data[0]

mac = user_data[1]

print id

print mac

ssh.connect(mtipaddress, port=22, username=mtlogin,password=mtpassword)

cmd2 = "put [/ip dhcp-s l get [find mac-address=%s]]" % (mac)

excmd2 = ssh.exec_command(cmd2)[1].read()

ssh.close()

#print excmd2

ex2 = excmd2.split(";")

cl = ex2[1]

cl1 = cl.split("=")

user_ip = cl1[1]

print user_ip

ssh.connect(mtipaddress, port=22, username=mtlogin,password=mtpassword)

add = "/ip fi a add address=%s list=work" % (user_ip)

cmd = ssh.exec_command(add)

ssh.close()

dcur = mysql_db.db.cursor()

dsql = ("DELETE FROM action WHERE id = '%s'") % (id)

dcur.execute(dsql)

dcur.close()

except:

print u"Возникла ошибка"

time.sleep(2)

 

Разбираем скрипт:

import time  - импортируем модуль для работы с датой и временем;

import mysql_db — импортируем модуль, который мы только что создали, для соединения с базой данных;

Импортируем модуль для работы с SSH протоколом:

from paramiko import SSHClient 

from paramiko import AutoAddPolicy

Данные для соединения с SSH сервером:

ssh = SSHClient() 

ssh.set_missing_host_key_policy(AutoAddPolicy())

mtipaddress = '192.168.4.246'

mtlogin = 'admin'

mtpassword = '1q2w3e'

while 1:  - выполняем бесконечный цикл;

try:  - страхуемся от возможных ошибок. То есть, если скрипт по каким-то причинам не сможет выполнить какое-либо действие, нет соединения с SSH сервером, то он не прекратит свою работу, а выведет сообщение о том, что возникли проблемы.

except:

print u"Возникла ошибка"

 

 Работа скрипта без обработки ошибок

Рис.1. Работа скрипта без обработки ошибок.

 

Как мы видим, скрипт пытался соединится с SSH сервером, у него это не получилось и он прекратил свою работу. Теперь скрипт не выполняется и не будет предоставлять доступ авторизированным пользователям даже в случае восстановления соединения с сервером.

 

 Работа скрипта с обработкой ошибок

Рис.2. Работа скрипта с обработкой ошибок.

 

Если мы включим обработку ошибок, то скрипт не завершит работу, а выведет сообщение и будет ожидать, пока соединение с SSH сервером не восстановится.

 

 

Рис.3. База данных.

 

Пользователь авторизировался через веб-интерфейс желая получить доступ в Интернет. В таблицу Action добавилась запись с МАС-адресом пользователя.

Срабатывает следующая часть кода:

cur = mysql_db.db.cursor()

sql = ("SELECT * FROM action") — эта строка означает, что нужно извлечь все поля из таблицы Аction;

cur.execute(sql) — выполняем выборку из базы данных;

action = cur.fetchall() - все полученные данные заносим в Аction;

cur.close() - закрываем соединение с базой данных;

print action — смотрим, что получилось.

 

 Выводим на экран содержимое Аction

Рис.4. Выводим на экран содержимое Аction.

 

Из каждой записи в базе данных будут извлекаться два значения: идентификатор записи и значение МАС-адреса.

 

Евгений Рудченко специально для ASP24.