Кофигурация грейдера - .xml фаил, который парсится грейдером перед проверкой лабораторной, чтобы знать что проверять.
Вся смысловая часть конфига находится внутри тега lab.
<?xml version="1.0" encoding="utf-8"?>
<lab name="TestLab">
</lab>
Конфигурация грейдера имеет 2 основных раздела
Оценка топологии происходит на основе html кода страницы, где выполняется лабораторная
Раздел топологии находится внутри тега
<topology>
</topology>
Раздел состоит из тегов <link>
которые определяют связи между устройствами.
Рассмотрим пример:
<link descr="R1 to R2" grade="5">
<device name="R2" interface="Gi0/2"/>
<device name="R1" interface="Gi0/1"/>
</link>
descr
- содержит информацию о соединении и позволяет в отчете о проверке указать за что были сняты/не были сняты баллы.grade
- кол-во баллов, которое дается за этот элемент проверки, оценка по умолчанию = 1<device>
- тег с информацией об одном из соединенных устройств
name
- имя устройства в PNetLab (имя устройства в конфигурации устройства и данное могут отличаться)interface
- интерфейс устройства в PNetLabПример готовой конфигурации для раздела топологии:
<topology>
<link descr="R1 to R2" grade="5">
<device name="R2" interface="Gi0/2"/>
<device name="R1" interface="Gi0/1"/>
</link>
<link descr="R2 to R3" grade="5">
<device name="R2" interface="Gi0/1"/>
<device name="R3" interface="Gi0/1"/>
</link>
<link descr="S1 to R1" grade="5">
<device name="S1" interface="Gi0/0"/>
<device name="R1" interface="Gi0/0"/>
</link>
<link descr="S2 to R2" grade="5">
<device name="S2" interface="Gi0/0"/>
<device name="R2" interface="Gi0/0"/>
</link>
<link descr="S3 to R3" grade="5">
<device name="S3" interface="Gi0/0"/>
<device name="R3" interface="Gi0/0"/>
</link>
</topology>
Происходит засчет отправки комманд на устройство и проверке ответа от него.
Находится в теге
<nodes>
</nodes>
Внутри тега располагаются устройста в виде:
<node name="R1">
<configuration>
<command text="\r" expect="Password:" descr="Press RETURN to get started" grade="10" ></command>
<command text="cisco\r" expect=">" descr="con0 password input"></command>
<command text="en\r" expect="Password:" descr="enable password prompt"></command>
<command text="cisco\r" expect="#" descr="Password input"></command>
</configuration>
</node>
Представленный выше текст - это процедура ввода пароля для входа в непривелигированный режим и далее в привелигированный режим на оборудовании Cisco.
При этих операциях не происходит проверки данных, которые возвращаются, поэтому в
expect
содержится первое что ответит устройство на наш запрос.
Тег <command>
<command text="en\r" expect="Password:" descr="enable password prompt"></command>
text
- поле с текстом команды, которая отпраится на устройства (\r
- нажатие клавиши Enter)expect
- строка, которую следует ожидать после тех данных, которые надо проверитьdescr
- описание происходящего для отчета по проверке (такой же смысл как и в проверке топологии)Также тег <command>
может содержать внутри себя теги проверки.
В первой версии грейдера реализован только тег
<substring>
<command>
<substring>
Ищет подстроку указанную в text
в результате полученнлм после выполнения команды, если находит то проверка пройдена.
<command text="sh run | section hostname\r" expect="#" descr="Hostname">
<substring text="R2" descr="hostname" grade="10"/>
</command>
text
- текст, который должен находиться в проверяемой строкеdescr
- описание проверкиgrade
- оценка за эту проверку, оценка по умолчания = 1<regex>
Позволяет проверить match под регулярное выражение и выделить группы для дальнейшей проверки.
В примере проверяется входит ли ip интерфейса устройства в подсеть и правильная ли у него маска
<command text="sh run | section Vlan20\r" expect="#" descr="SVI Vlan 20">
<regex text=".*ip address (?P<ip>[\d\.]*) (?P<mask>[\d\.]*).*" descr="ip address">
<subnet argname="ip" net_address="172.16.3.0" mask="24" result="True"/>
<compare argname="mask" operation="==" value="255.255.255.0" result="True"/>
</regex>
</command>
text
- регулярное выражениеЧтобы записать регулярное выражение в xml может понадобится изменить некоторые символы.
Например:
<
-<
>
->
descr
- описание проверки для автоотчетаsubnet
- проверяет что содержимое группы argname
является ip адресом и является частью подсети
Argname
- название выделяемой группыnet_address
- адрес IPv4 подсетиmask
- маска IPv4 подсетиresult
- какой результат должна вернуть проверку чтобы элемент был засчитан
compare
- сравнивает содержимое группы argname
с value
Argname
- название выделяемой группыoperation
- как сравниватьargname
сvalue
(==, <, >, <=, >=
)value
- значение с которым сравниваетсяargname
result
- какой результат должна вернуть проверку чтобы элемент был засчитан
ping
Позволяет отправить ping
на конкретный ip с устройства.
Добавляется на том же уровне что и <command>
<command text="sh run | section hostname\r" expect="#" descr="Hostname">
<substring text="R2" descr="hostname" grade="10"/>
</command>
<ping ip="172.16.2.22" packet-loss="0" descr="ping R2 Vlan20"/>
ip
- адрес назначенияpacket-loss
- какое значение packet-loss должно быть чтобы пройти проверку
(100
- нет соединения,0
- соединение есть)descr
- описание проверки для автоотчета
<nodes>
<node name="R1">
<configuration>
<command text="\r" expect="Password:" descr="Press RETURN to get started" grade="10" ></command>
<command text="cisco\r" expect=">" descr="con0 password input"></command>
<command text="en\r" expect="Password:" descr="enable password prompt"></command>
<command text="cisco\r" expect="#" descr="Password input"></command>
<command text="sh run | section hostname\r" expect="#" descr="Hostname">
<substring text="R1" descr="hostname" grade="1"/>
</command>
<command text="sh run | section domain\r" expect="#" descr="Domain settings">
<substring text="no ip domain lookup" descr="domain lookup"/>
<substring text="ip domain name miem" descr="domain name"/>
</command>
<command text="sh run | section line con 0\r" expect="#" descr="line con 0 settings">
<substring text="password cisco" descr="password"/>
<substring text="logging synchronous" descr="logging synchronous"/>
<substring text="login" descr="login"/>
</command>
<command text="sh run | section line vty 0 4\r" expect="#" descr="line vty 0 4 settings">
<substring text="password cisco" descr="password"/>
<substring text="logging synchronous" descr="logging synchronous"/>
<substring text="login" descr="login"/>
</command>
<command text="sh run | section line vty 5 15\r" expect="#" descr="line vty 5 15 settings">
<substring text="password cisco" descr="password"/>
<substring text="logging synchronous" descr="logging synchronous"/>
<substring text="login" descr="login"/>
</command>
<command text="sh run | section GigabitEthernet0/0\r" expect="#" descr="GigabitEthernet0/0">
<substring text="ip address 192.168.11.126 255.255.255.128" descr="ip address"/>
</command>
<command text="sh run | section GigabitEthernet0/1\r" expect="#" descr="GigabitEthernet0/1">
<substring text="ip address 172.31.255.253 255.255.255.252" descr="ip address"/>
</command>
<command text="sh run | section GigabitEthernet0/2\r" expect="#" descr="GigabitEthernet0/2">
<substring text="no ip address" descr="ip address"/>
<substring text="shutdown" descr="interface status"/>
</command>
<command text="sh run | section GigabitEthernet0/3\r" expect="#" descr="GigabitEthernet0/3">
<substring text="no ip address" descr="ip address"/>
<substring text="shutdown" descr="interface status"/>
</command>
<command text="sh ip route\r" expect="#" descr="Getting routing table">
<substring text="172.31.255.192/29 [1/0] via 172.31.255.254" descr="Route 1"/>
<substring text="192.168.11.128/25 [1/0] via 172.31.255.254" descr="Route 2"/>
<substring text="192.168.12.0/24 [1/0] via 172.31.255.254" descr="Route 3"/>
</command>
<command text="exit\r" expect=" " descr="Goodbye"></command>
</configuration>
</node>
<!--Next device-->
<node name="R2">
<configuration>
<command text="\r" expect="Password:" descr="Press RETURN to get started" ></command>
<command text="cisco\r" expect=">" descr="con0 password input"></command>
<command text="en\r" expect="Password:" descr="enable password prompt"></command>
<command text="cisco\r" expect="#" descr="Password input"></command>
<command text="sh run | section hostname\r" expect="#" descr="Hostname">
<substring text="R2" descr="hostname"/>
</command>
<command text="sh run | section domain\r" expect="#" descr="Domain settings">
<substring text="no ip domain lookup" descr="domain lookup"/>
<substring text="ip domain name miem" descr="domain name"/>
</command>
<command text="sh run | section line con 0\r" expect="#" descr="line con 0 settings">
<substring text="password cisco" descr="password"/>
<substring text="logging synchronous" descr="logging synchronous"/>
<substring text="login" descr="login"/>
</command>
<command text="sh run | section line vty 0 4\r" expect="#" descr="line vty 0 4 settings">
<substring text="password cisco" descr="password"/>
<substring text="logging synchronous" descr="logging synchronous"/>
<substring text="login" descr="login"/>
</command>
<command text="sh run | section line vty 5 15\r" expect="#" descr="line vty 5 15 settings">
<substring text="password cisco" descr="password"/>
<substring text="logging synchronous" descr="logging synchronous"/>
<substring text="login" descr="login"/>
</command>
<command text="sh run | section GigabitEthernet0/0\r" expect="#" descr="GigabitEthernet0/0">
<substring text="ip address 192.168.12.1 255.255.255.0" descr="ip address"/>
</command>
<command text="sh run | section GigabitEthernet0/1\r" expect="#" descr="GigabitEthernet0/1">
<substring text="ip address 172.31.255.193 255.255.255.248" descr="ip address"/>
</command>
<command text="sh run | section GigabitEthernet0/2\r" expect="#" descr="GigabitEthernet0/2">
<substring text="ip address 172.31.255.254 255.255.255.252" descr="ip address"/>
</command>
<command text="sh run | section GigabitEthernet0/3\r" expect="#" descr="GigabitEthernet0/3">
<substring text="no ip address" descr="ip address"/>
<substring text="shutdown" descr="interface status"/>
</command>
<command text="sh ip route\r" expect="#" descr="Getting routing table">
<substring text="192.168.11.0 [1/0] via 172.31.255.253" descr="Route 1"/>
<substring text="192.168.11.128 [1/0] via 172.31.255.196" descr="Route 2"/>
</command>
<command text="exit\r" expect=" " descr="Goodbye"></command>
</configuration>
</node>
</nodes>
Eсли у вас остались вопросы или вы заметили недочеты в материале пишите в коментарии к посту. О найденых ошибках в системе пишите на netlab@miem.hse.ru, указав в теме "Ошибка в
'где-ошибка'
".