Будет два файла. Первый - 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 — смотрим, что получилось.
Рис.4. Выводим на экран содержимое Аction.
Из каждой записи в базе данных будут извлекаться два значения: идентификатор записи и значение МАС-адреса.
Евгений Рудченко специально для ASP24.