Управление сетевыми устройствами с помощью Selenium

Материал из Xgu.ru

Перейти к: навигация, поиск
На этой странице рассматривается один из способов автоматизации управления сетевыми устройствами через их Web-интерфейс.

Простейшие сетевые устройства, как правило, не имеют никаких возможностей удалённого управления за исключением их собственного примитивного web-интерфейса. Web-интерфейс этот чаще всего предназначен исключительно для ручного управления и автоматизированного использования не предполагает.

Это не означает, однако, что автоматизированное управление этими устройствами невозможно.

Управление возможно, но нужно использовать специальное программное обеспечение, позволяющее работать с web-страницами, как будто это делает обычный пользователь. В зависимости от сложности web-интерфейса это может быть или простейший web-скрейпинг (для Python это lxml и requests, например) или использование полноценного браузера и автоматизирования операций в нём (например, Selenium).

Первое решение более эффективно и менее ресурсоемко, второе — более универсально и может работать во всех случая там, где работает браузер. Это особенно важно при автоматизации конфигурирования сетевых устройств, поскольку их web-интерфейсы отличаются высокой разнообразностью и непредсказуемостью реализации: здесь может использоваться и REST-интерфейс, и CGI-скрипты, и хитрое форматирование, и безумный JavaScript-код и множество других неординарных технических решений.

[править] Пример использования Selenium для настройки сетевого устройства

Первая страничка D-LINK DIR-120. Вот такими устройствами нам нужно научиться управлять автоматически

Ниже реально работающий скрипт, выполняющий реконфигурацию самого простейшего роутера, устройства 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' )

[править] См. также