Добавляем IP телефоны в отдельный Pool IP адресов по Mac адресу

от автора

Всем привет!
Этот топик о том, как я использовал Python для написания скрипта, который производит следующие действия:

  1. Выгружает список активных мак адресов с Микротика
  2. Выбирает мак адреса IP телефонов
  3. Помещает их в отдельный pool IP адресов

Кому интересно прошу пожаловать под кат.

Для начала я определился какие инструменты я буду для этого использовать. Так как я как раз начала учить Python(как первый ЯП), то и решил применить его на практике. Далее буду приводить пример кода с его комментированием.

import telnetlib import time import ftplib import logging   class MacToPool():     def get_export_file_from_mikrotik(self):         host = "IP адрес микротика"         user = "ваш_логин"         password = "ваш_пароль"         command_1 = '/ip dhcp-server lease print file=lease_file'         command_2 = 'quit'         tn = telnetlib.Telnet(host)         tn.read_until(b"Login: ")         tn.write(user.encode('UTF-8') + b"\n")         tn.read_until(b"Password: ")         tn.write(password.encode('UTF-8') + b"\n")         tn.read_until(b'>')         ftp = ftplib.FTP('IP адрес микротика')         ftp.login('ваш_логин', 'ваш_пароль')         try:             ftp.delete('lease_file.txt')             ftp.delete('script_mac_phone.rsc')             logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')             logging.info("Файлы удалены: lease_file.txt, script_mac_phone.rsc")         except Exception:             logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')             logging.info("Файлы для удаления не найдены. Продолжаем работу.")         time.sleep(1)         tn.write(command_1.encode('UTF-8') + b"\r\n")         time.sleep(1)         logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')         logging.info("Файл конфигурации создан.")         tn.read_until(b'>')         tn.write(command_2.encode('UTF-8') + b"\r\n")         time.sleep(1)         f = open('lease_file.txt', "wb")         ftp.retrbinary("RETR lease_file.txt", f.write)         logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')         logging.info("Файл конфигурации скопирован на сервер")      lst_mac_phone = [] 

В функции get_export_file_from_mikrotik() я подключаюсь к микротику, и с помощью команды /ip dhcp-server lease print file=lease_file записываю все активные мак адреса в файл lease_ftp и далее уже с помощью FTP скачиваю его к себе в рабочую папку скрипта для дальнейшей работы.

Так же здесь создаю пустой список для мак адресов телефонов. Далее идет следующий код

def get_all_mac(self):         self.get_export_file_from_mikrotik(MacToPool)         text = open('lease_file.txt').readlines()         self.all_mac = []         for line in text:             lst_value = line.split(" ")             for symbol in lst_value:                 if len(symbol) == 17:                     self.all_mac.append(symbol)         return self.all_mac 

В файле lease_ftp у нас очень много лишней информации, и поэтому я с помощью функции get_all_mac получил список содержащий только мак адреса всех активных устройств. Следующим скриптом я выдергиваю из всех мак адресов, только нужные(в моем случае это мак адреса телефонов):

def find_mac_phone(self):         self.get_all_mac(MacToPool)         mac_phone = open("macphone.txt", "w")         for mac_address in self.all_mac:             if mac_address[0:8] == "00:15:65":                 mac_phone.write(mac_address + "\n")                 self.lst_mac_phone.append(mac_address)         logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')         logging.info("Файл с MAC адресами телефонов создан") 

Следующие команды выполнят следующие действия:
Функция make_mikrotik_script() создает файл скрипта, который сможет обработать Mikrotik для добавления маков в пул.
Функция upload_to_ftp() выгружает готовый скрипт на FTP сервер микротика.
И последняя функция выполняет непосредственный запуск скрипта на роутере.

    def make_mikrotik_script(self):         ###выполнив функцию, получаем скрипт для микротика для добавления маков телефонов в пул IP-Phones###         script_mac_phone = open("script_mac_phone.txt", "w")         script_mac_phone.write("/ip dhcp-server lease \n")         self.find_mac_phone(MacToPool)         for mac_address in self.lst_mac_phone:             script_mac_phone.write("add address=IP-Phones mac-address=" + mac_address + " server=server1" + '\n')         self.upload_to_ftp(MacToPool)         logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')         logging.info("Создан скрипт script_mac_phone.rsc")      def upload_to_ftp(self):         ftp = ftplib.FTP('IP адрес микротика')         ftp.login('ваш_логин', 'ваш_пароль')         f = open("script_mac_phone.txt", "rb")         ftp.storbinary("STOR script_mac_phone.rsc", f)         f.close()         logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')         logging.info("script_mac_phone.rsc перемещен на микротик")      def load_script_to_mikrotik(self):         self.make_mikrotik_script(MacToPool)         host = "IP адрес микротика"         user = "ваш_логин"         password = "ваш_пароль"         command_1 = '/import file-name=script_mac_phone.rsc'         command_2 = 'quit'         tn = telnetlib.Telnet(host)         tn.read_until(b"Login: ")         tn.write(user.encode('UTF-8') + b"\n")         tn.read_until(b"Password: ")         tn.write(password.encode('UTF-8') + b"\n")         tn.read_until(b'>')         tn.write(command_1.encode('UTF-8') + b"\r\n")         time.sleep(1)         logging.basicConfig(filename='log.txt', level=logging.INFO,                             format='%(asctime)s - %(levelname)s - %(message)s')         logging.info("Конфигурация загружена. Done!")         tn.read_until(b'>')         tn.write(command_2.encode('UTF-8') + b"\r\n")         time.sleep(1) 

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

P.S. Использовался Python версии 3.3

ссылка на оригинал статьи http://habrahabr.ru/post/219463/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *