[Из песочницы] Добавляем IP телефоны в отдельный Pool IP адресов по Mac адресу

Всем привет! Этот топик о том, как я использовал Python для написания скрипта, который производит следующие действия: Выгружает список активных мак адресов с Микротика Выбирает мак адреса IP телефонов Помещает их в отдельный 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

© Habrahabr.ru