Управление сетевыми устройствами с помощью 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' )