Groovy — различия между версиями
Xakep (обсуждение | вклад) (→expect Matcher) |
Xakep (обсуждение | вклад) (→Общие сведения) |
||
(не показано 6 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
= Общие сведения = | = Общие сведения = | ||
− | + | Groovy telnet-скрипты представляют из себя полноценные скрипты на языке программирования [http://www.groovy-lang.org/ Groovy]. | |
− | В одинарных кавычках все отправляется как есть, в двойных | + | |
− | интерполируются имена переменных с долларом (превращаются в | + | Согласно правилам языка Groovy строки нужно брать в одинарные или двойные кавычки. |
+ | В одинарных кавычках все отправляется как есть, в двойных интерполируются имена переменных с долларом (превращаются в | ||
значения). | значения). | ||
+ | <pre> | ||
+ | def port = "Ethernet1/5" | ||
+ | println "The port is $port" | ||
+ | </pre> | ||
+ | выведет <code>The port is Ethernet1/5</code>. | ||
+ | |||
+ | <pre> | ||
+ | def port = "Ethernet1/5" | ||
+ | println 'The port is $port' | ||
+ | </pre> | ||
+ | выведет <code>The port is $port</code>. | ||
+ | |||
+ | Если переменная используется не внутри сроки, то доллар вначале ставить не нужно. | ||
+ | <pre> | ||
+ | def port = "Ethernet1/5" | ||
+ | println port | ||
+ | </pre> | ||
+ | выведет <code>Ethernet1/5</code>. | ||
− | + | Язык Groovy является надмножеством языка Java, поэтому практически любые Java-конструкции в нем так же будут работать. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Скобки при вызове метода ставить не обязательно только в том случае, если метод имеет хотя бы один аргумент.<br> | |
− | + | Так: | |
+ | <code>withTimeout(5, SECONDS).expect(regexp("# $"))</code> эквивалентно <code>withTimeout 5, SECONDS expect regexp("# $")</code>. | ||
+ | Комментарии начинаются с <code>//</code>. | ||
= Доступные команды: = | = Доступные команды: = | ||
Строка 27: | Строка 42: | ||
* <code>expect prompt</code> | * <code>expect prompt</code> | ||
* <code>expect "# port_$port_number sn:$onu_sn"</code> | * <code>expect "# port_$port_number sn:$onu_sn"</code> | ||
+ | |||
== <code>expect Matcher</code> == | == <code>expect Matcher</code> == | ||
Строка 53: | Строка 69: | ||
* <code>expect sequence(contains("vasya"), contains("petya"))</code> - ожидать, пока в output появится "vasya", а затем "petya" (именно в этом порядке) | * <code>expect sequence(contains("vasya"), contains("petya"))</code> - ожидать, пока в output появится "vasya", а затем "petya" (именно в этом порядке) | ||
* <code>expect allOf(contains("vasya"), contains("petya"))</code> - ожидать, пока в output появится "vasya" и "petya" (в любом порядке) | * <code>expect allOf(contains("vasya"), contains("petya"))</code> - ожидать, пока в output появится "vasya" и "petya" (в любом порядке) | ||
+ | |||
+ | |||
+ | == <code>send "string"</code> == | ||
+ | Отослать в telnet-сессию <code>string</code> (без <code>Enter</code> в конце). | ||
+ | |||
+ | Примеры: | ||
+ | * <code>send "con t"</code> | ||
+ | * <code>send "\b\b\b\b\b"</code> | ||
+ | * <code>send "man $port_number\n"</code> | ||
+ | |||
+ | |||
+ | == <code>sendLine "string"</code> == | ||
+ | Отослать в telnet-сессию <code>string</code> (с <code>Enter</code> в конце).<br> | ||
+ | То же самое, что <code>send "string\n"</code>. | ||
+ | |||
+ | Примеры: | ||
+ | * <code>sendLine "con t"</code> | ||
+ | * <code>sendLine login</code> | ||
+ | * <code>sendLine "man $port_number"</code> | ||
+ | |||
+ | |||
+ | == <code>sendLine()</code> == | ||
+ | Отослать <code>Enter</code>.<br> | ||
+ | То же самое, что <code>send "\n"</code> или <code>sendLine ""</code>. | ||
+ | |||
+ | Примеры: | ||
+ | * <code>sendLine()</code> | ||
+ | |||
+ | |||
+ | == <code>withTimeout duration, TimeUnit</code> == | ||
+ | Переопределить таймаут для последующей команды.<br> | ||
+ | Обычно используется совместно с <code>expect</code>. | ||
+ | |||
+ | Примеры: | ||
+ | * <code>withTimeout 30, SECONDS expect "# "</code> | ||
+ | * <code>withTimeout 1, MINUTES expect prompt</code> | ||
+ | * <code>withTimeout 3000, MILLISECONDS expect "all done"</code> | ||
+ | |||
+ | |||
+ | == <code>withTimeoutMs duration</code> == | ||
+ | То же самое, что и <code>withTimeout duration, MILLISECONDS</code>. | ||
+ | |||
+ | Примеры: | ||
+ | * <code>withTimeoutMs 7000 expect "# "</code> | ||
+ | |||
+ | |||
+ | = Примеры скриптов = | ||
+ | |||
+ | == CommutatorLogin == | ||
+ | <pre> | ||
+ | expect "sername:" | ||
+ | sendLine login | ||
+ | expect "assword:" | ||
+ | sendLine password | ||
+ | expect prompt | ||
+ | </pre> | ||
+ | |||
+ | == PortAuth == | ||
+ | <pre> | ||
+ | (olt_port, onu_number) = port_number.tokenize(':') | ||
+ | sendLine "con t" | ||
+ | expect prompt | ||
+ | sendLine "interface gpon-olt_$olt_port" | ||
+ | expect prompt | ||
+ | sendLine "no onu $onu_number" | ||
+ | withTimeout 30, SECONDS expect prompt | ||
+ | |||
+ | if (onu_sn != null) { | ||
+ | sendLine "onu $onu_number type $onu_model sn $onu_sn" | ||
+ | expect prompt | ||
+ | sendLine "exit" | ||
+ | expect prompt | ||
+ | sendLine "interface gpon-onu_$port_number" | ||
+ | expect prompt | ||
+ | sendLine "tcont 1 name T1 profile 500M" | ||
+ | expect prompt | ||
+ | sendLine "gemport 1 unicast tcont 1 dir both" | ||
+ | expect prompt | ||
+ | sendLine "service-port 1 vport 1 user-vlan $vlan_number vlan $vlan_number" | ||
+ | expect prompt | ||
+ | sendLine "name $port_name" | ||
+ | expect prompt | ||
+ | sendLine "port-location format flexible-syntax vport 1" | ||
+ | expect prompt | ||
+ | sendLine "dhcp-option82 enable vport 1" | ||
+ | expect prompt | ||
+ | sendLine "dhcp-option82 trust true replace vport 1" | ||
+ | expect prompt | ||
+ | sendLine "ip dhcp snooping enable vport 1" | ||
+ | expect prompt | ||
+ | sendLine "security storm-control broadcast rate 200 direction ingress vport 1" | ||
+ | expect prompt | ||
+ | sendLine "security storm-control broadcast rate 200 direction egress vport 1" | ||
+ | expect prompt | ||
+ | sendLine "security storm-control unknowncast rate 200 direction ingress vport 1" | ||
+ | expect prompt | ||
+ | sendLine "security storm-control unknowncast rate 200 direction egress vport 1" | ||
+ | expect prompt | ||
+ | sendLine "no shutdown" | ||
+ | expect prompt | ||
+ | sendLine "exit" | ||
+ | expect prompt | ||
+ | sendLine "pon-onu-mng gpon-onu_$port_number" | ||
+ | expect prompt | ||
+ | sendLine "interface eth eth_0/1 state lock" | ||
+ | expect prompt | ||
+ | sendLine "service HSI type internet gemport 1 cos 0 vlan $vlan_number" | ||
+ | expect prompt | ||
+ | sendLine "vlan port eth_0/1 mode tag vlan $vlan_number priority 0" | ||
+ | expect prompt | ||
+ | sendLine "loop-detect ethuni eth_0/1 enable" | ||
+ | expect prompt | ||
+ | Thread.sleep(5000) | ||
+ | sendLine "interface eth eth_0/1 state unlock" | ||
+ | expect prompt | ||
+ | } | ||
+ | |||
+ | sendLine "exit" | ||
+ | expect prompt | ||
+ | sendLine "exit" | ||
+ | expect prompt | ||
+ | </pre> | ||
+ | |||
+ | == CommutatorLogout== | ||
+ | <pre> | ||
+ | sendLine 'exit' | ||
+ | </pre> |
Текущая версия на 13:00, 22 апреля 2016
Содержание
Общие сведения[править]
Groovy telnet-скрипты представляют из себя полноценные скрипты на языке программирования Groovy.
Согласно правилам языка Groovy строки нужно брать в одинарные или двойные кавычки. В одинарных кавычках все отправляется как есть, в двойных интерполируются имена переменных с долларом (превращаются в значения).
def port = "Ethernet1/5" println "The port is $port"
выведет The port is Ethernet1/5
.
def port = "Ethernet1/5" println 'The port is $port'
выведет The port is $port
.
Если переменная используется не внутри сроки, то доллар вначале ставить не нужно.
def port = "Ethernet1/5" println port
выведет Ethernet1/5
.
Язык Groovy является надмножеством языка Java, поэтому практически любые Java-конструкции в нем так же будут работать.
Скобки при вызове метода ставить не обязательно только в том случае, если метод имеет хотя бы один аргумент.
Так:
withTimeout(5, SECONDS).expect(regexp("# $"))
эквивалентно withTimeout 5, SECONDS expect regexp("# $")
.
Комментарии начинаются с //
.
Доступные команды:[править]
expect "string"
[править]
Ожидать, пока telnet-сессия выведет в output string
.
Примеры:
-
expect "#"
-
expect prompt
-
expect "# port_$port_number sn:$onu_sn"
expect Matcher
[править]
Ожидать, пока telnet-сессия выведет в output строку, соответствующую Matcher
.
Возможные Matcher-ы:
-
allOf(Matcher, Matcher...)
- Creates a matcher that matches if the examined input matches all of the specified matchers. -
anyOf(Matcher, Matcher...)
- Creates a matcher that matches if the examined input matches any of the specified matchers. -
anyString()
- Creates a matcher that matches when at least one character exists in the input buffer. -
contains(String)
- Creates a matcher ofString
that matches when examined input contains the given substring. -
eof()
- Creates a matcher that matches if input reaches the end of stream (closed telnet session). -
exact(String)
- Creates a matcher that matches when the given string is equal to the input buffer contents. -
matches(String)
- Creates a matcher ofString
that matches when examined input fully matches the given regular expression. -
matches(Pattern)
- Creates a matcher ofPattern
that matches when examined input fully matches the given regular expression. -
regexp(String)
- Creates a matcher ofString
that matches when examined input contains the given regular expression. -
regexp(Pattern)
- Creates a matcher ofPattern
that matches when examined input contains the given regular expression. -
sequence(Matcher, Matcher...)
- Matches the given matchers one by one. Every successful matches updates the internal buffer. The consequent match operation is performed after the previous match has succeeded. -
startsWith(String)
- Creates a matcher that matches when the input buffer starts with the given string. -
times(int, Matcher)
- Creates a matcher that matches if the givenMatcher
matches thenumber
of times.
Примеры:
-
expect contains("vasya")
- то же самое, что иexpect "vasya"
-
expect regexp("# $")
- ожидать, пока в output появится строка, соответствующая регулярному выражению "# $" (output будет заканчиваться на решетку и пробел) -
expect times(3, contains("vasya_$num"))
- ожидать, пока в output 3 раза встретится строка "vasya_$num" ($num будет интерполировано) -
expect anyOf(contains("vasya"), contains("petya"))
- ожидать, пока в output появится либо "vasya", либо "petya" -
expect sequence(contains("vasya"), contains("petya"))
- ожидать, пока в output появится "vasya", а затем "petya" (именно в этом порядке) -
expect allOf(contains("vasya"), contains("petya"))
- ожидать, пока в output появится "vasya" и "petya" (в любом порядке)
send "string"
[править]
Отослать в telnet-сессию string
(без Enter
в конце).
Примеры:
-
send "con t"
-
send "\b\b\b\b\b"
-
send "man $port_number\n"
sendLine "string"
[править]
Отослать в telnet-сессию string
(с Enter
в конце).
То же самое, что send "string\n"
.
Примеры:
-
sendLine "con t"
-
sendLine login
-
sendLine "man $port_number"
sendLine()
[править]
Отослать Enter
.
То же самое, что send "\n"
или sendLine ""
.
Примеры:
-
sendLine()
withTimeout duration, TimeUnit
[править]
Переопределить таймаут для последующей команды.
Обычно используется совместно с expect
.
Примеры:
-
withTimeout 30, SECONDS expect "# "
-
withTimeout 1, MINUTES expect prompt
-
withTimeout 3000, MILLISECONDS expect "all done"
withTimeoutMs duration
[править]
То же самое, что и withTimeout duration, MILLISECONDS
.
Примеры:
-
withTimeoutMs 7000 expect "# "
Примеры скриптов[править]
CommutatorLogin[править]
expect "sername:" sendLine login expect "assword:" sendLine password expect prompt
PortAuth[править]
(olt_port, onu_number) = port_number.tokenize(':') sendLine "con t" expect prompt sendLine "interface gpon-olt_$olt_port" expect prompt sendLine "no onu $onu_number" withTimeout 30, SECONDS expect prompt if (onu_sn != null) { sendLine "onu $onu_number type $onu_model sn $onu_sn" expect prompt sendLine "exit" expect prompt sendLine "interface gpon-onu_$port_number" expect prompt sendLine "tcont 1 name T1 profile 500M" expect prompt sendLine "gemport 1 unicast tcont 1 dir both" expect prompt sendLine "service-port 1 vport 1 user-vlan $vlan_number vlan $vlan_number" expect prompt sendLine "name $port_name" expect prompt sendLine "port-location format flexible-syntax vport 1" expect prompt sendLine "dhcp-option82 enable vport 1" expect prompt sendLine "dhcp-option82 trust true replace vport 1" expect prompt sendLine "ip dhcp snooping enable vport 1" expect prompt sendLine "security storm-control broadcast rate 200 direction ingress vport 1" expect prompt sendLine "security storm-control broadcast rate 200 direction egress vport 1" expect prompt sendLine "security storm-control unknowncast rate 200 direction ingress vport 1" expect prompt sendLine "security storm-control unknowncast rate 200 direction egress vport 1" expect prompt sendLine "no shutdown" expect prompt sendLine "exit" expect prompt sendLine "pon-onu-mng gpon-onu_$port_number" expect prompt sendLine "interface eth eth_0/1 state lock" expect prompt sendLine "service HSI type internet gemport 1 cos 0 vlan $vlan_number" expect prompt sendLine "vlan port eth_0/1 mode tag vlan $vlan_number priority 0" expect prompt sendLine "loop-detect ethuni eth_0/1 enable" expect prompt Thread.sleep(5000) sendLine "interface eth eth_0/1 state unlock" expect prompt } sendLine "exit" expect prompt sendLine "exit" expect prompt
CommutatorLogout[править]
sendLine 'exit'