Groovy — различия между версиями

(expect Matcher)
(Общие сведения)
 
(не показано 7 промежуточных версий этого же участника)
Строка 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>
* SendLine "something" - отправить это в телнет-сессию и
+
def port = "Ethernet1/5"
добавить в конце <LF>.
+
println 'The port is $port'
* Send "something" - то же самое, но без <LF> в
+
</pre>
конце.
+
выведет <code>The port is $port</code>.
* expect "something" - ожидать, пока телнет выведет в
 
output текст "something".
 
  
Переменные вне кавычек пишутся просто без каких-либо символов
+
Если переменная используется не внутри сроки, то доллар вначале ставить не нужно.
вначале. т.е. port_name, prompt и т.п.
+
<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> ==
Строка 45: Строка 61:
 
* <code>startsWith(String)</code> - Creates a matcher that matches when the input buffer starts with the given string.
 
* <code>startsWith(String)</code> - Creates a matcher that matches when the input buffer starts with the given string.
 
* <code>times(int, Matcher)</code> - Creates a matcher that matches if the given <code>Matcher</code> matches the <code>number</code> of times.
 
* <code>times(int, Matcher)</code> - Creates a matcher that matches if the given <code>Matcher</code> matches the <code>number</code> of times.
 +
 +
Примеры:
 +
* <code>expect contains("vasya")</code> - то же самое, что и <code>expect "vasya"</code>
 +
* <code>expect regexp("# $")</code> - ожидать, пока в output появится строка, соответствующая регулярному выражению "# $" (output будет заканчиваться на решетку и пробел)
 +
* <code>expect times(3, contains("vasya_$num"))</code> - ожидать, пока в output 3 раза встретится строка "vasya_$num" ($num будет интерполировано)
 +
* <code>expect anyOf(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>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 of String 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 of String that matches when examined input fully matches the given regular expression.
  • matches(Pattern) - Creates a matcher of Pattern that matches when examined input fully matches the given regular expression.
  • regexp(String) - Creates a matcher of String that matches when examined input contains the given regular expression.
  • regexp(Pattern) - Creates a matcher of Pattern 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 given Matcher matches the number 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-сессию stringEnter в конце).
То же самое, что 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'