Управление сетевыми устройствами с помощью Selenium
Материал из Xgu.ru
- На этой странице рассматривается один из способов автоматизации управления сетевыми устройствами через их Web-интерфейс.
Простейшие сетевые устройства, как правило, не имеют никаких возможностей удалённого управления за исключением их собственного примитивного web-интерфейса. Web-интерфейс этот чаще всего предназначен исключительно для ручного управления и автоматизированного использования не предполагает.
Это не означает, однако, что автоматизированное управление этими устройствами невозможно.
Управление возможно, но нужно использовать специальное программное обеспечение, позволяющее работать с web-страницами, как будто это делает обычный пользователь. В зависимости от сложности web-интерфейса это может быть или простейший web-скрейпинг (для Python это lxml и requests, например) или использование полноценного браузера и автоматизирования операций в нём (например, Selenium).
Первое решение более эффективно и менее ресурсоемко, второе — более универсально и может работать во всех случая там, где работает браузер. Это особенно важно при автоматизации конфигурирования сетевых устройств, поскольку их web-интерфейсы отличаются высокой разнообразностью и непредсказуемостью реализации: здесь может использоваться и REST-интерфейс, и CGI-скрипты, и хитрое форматирование, и безумный JavaScript-код и множество других неординарных технических решений.
[править] Пример использования Selenium для настройки сетевого устройства
Ниже реально работающий скрипт, выполняющий реконфигурацию самого простейшего роутера, устройства D-LINK DIR-120.
Скрипт выполняет одно единственное действие. Выключает или включает на роутере DHCP-сервер (в зависимости от переданного аргумента: on или off).
Где может быть полезен этот скрипт?
Его можно использовать в сети, где рядом с примитивным роутером DIR-120 стоит полноценный домашний компьютер под управлением Linux. Когда компьютер включен, он забирает на себя функции DHCP-сервера; когда компьютер выключается, он должен включить DHCP-сервер на роутере (естественно, что клиентские устройства нужно будет передергивать, для того чтобы они взяли новые настройки DHCP).
Для того чтобы выяснить как называются DOM-элементы, в которые необходимо внести соответствующие данные, нужно пройтись по конфигурационному пути вручную и посмотреть отладчиком или напрямую в коде страниц, как называются элементы.
Обратите так же внимание, что работа выполняется через виртуальный фреймбуфер (с помощью модуля pyvirtualdisplay), что позволяет скрипту работать без доступа к реальному X-серверу.
Работа выполняется с помощью браузера Firefox.
Скрипту необходимо наличие следующих зависимостей:
- Xvfb;
- Python-овские модули selenium и pyvirtualdisplay.
Чтобы их установить:
$ sudo apt-get install xvfb $ pip install selenium pyvirtualdisplay
Текст скрипта:
import sys
from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def show_usage():
print "Usage:"
print "\t",sys.argv[0]," off | on"
def reconfigure_router(enable_dhcp_server):
"""
enable_dhcp_server: True (yes) or False (no)
"""
display = Display(visible=0, size=(800, 600))
display.start()
driver = webdriver.Firefox()
driver.get("http://192.168.0.1")
driver.implicitly_wait(3)
elem_username = driver.find_element_by_name("authen_username")
elem_username.send_keys("admin")
elem_password = driver.find_element_by_name("password")
elem_password.send_keys("password")
elem_password.send_keys(Keys.RETURN)
driver.get("http://192.168.0.1/Home/bsc_lan.htm")
elem_dhcp_server = driver.find_element_by_name("dhcpsvr")
if enable_dhcp_server:
if not elem_dhcp_server.is_selected():
elem_dhcp_server.click()
else:
if elem_dhcp_server.is_selected():
elem_dhcp_server.click()
elem_apply = driver.find_element_by_name("apply")
elem_apply.click()
driver.close()
display.stop()
if len(sys.argv) < 2:
show_usage()
else:
reconfigure_router( sys.argv[1] == 'on' )