Основы автоматизации на SLAX: различия между версиями
Строка 103: | Строка 103: | ||
Пример задания массива: | Пример задания массива: | ||
var $ | var $interfaces := { | ||
<int> "ge-0/0/0"; | |||
<int> "ge-0/0/1"; | |||
<int> "ge-0/0/2"; | |||
<int> "ge-0/0/3"; | |||
<int> "ge-1/0/1"; | |||
<int> "ge-1/0/2"; | |||
<int> "ge-1/0/3"; | |||
<int> "ge-1/0/4"; } | |||
match / { | |||
<op-script-results> { | |||
<output> "interface 5 = " _ $interfaces/int[5] _ "\n"; | |||
<output> "all interfaces:\n"; | |||
for-each ($interfaces/int) { | |||
<output> .; }}} | |||
Вывод: | |||
blair> op arrays | |||
interface 5 = ge-1/0/1 | |||
all interfaces: | |||
ge-0/0/0 | |||
ge-0/0/1 | |||
ge-0/0/2 | |||
ge-0/0/3 | |||
ge-1/0/1 | |||
ge-1/0/2 | |||
ge-1/0/3 | |||
ge-1/0/4 | |||
*хэши - (аналог Dictionary в Python) нет хешей как таковых, но можно использовать node-set XPath expressions особым образом. | *хэши - (аналог Dictionary в Python) нет хешей как таковых, но можно использовать node-set XPath expressions особым образом. | ||
Пример: | Пример: |
Версия 14:39, 5 января 2017
Fundamentals
- SLAX is based on XPath 1.0 and XSLT 1.0.
- Переменные задаются только 1 раз и дальше уже нет возможности их изменить.
- The “Node-Set” variable data-type is from XPath. Используется оператор :=.
var $my-ns-var := { <interface> { <name> "ge-0/0/0"; } <interface> { <name> "ge-0/0/1";
- The “Result Tree Fragment” (RTF) может хранить в себе как строку, так и блок XML данных. Используется оператор =.
var $my-ns-var = { <interface> { <name> "ge-0/0/0"; } <interface> { <name> "ge-0/0/1";
- Шаблон по умолчанию вернет RTF, но с помощью использования := можео заставить его вернуть node-set.
- Разница между node-set и RTF - в знаке назначения переменной.
- Context Processing. Насколько я поняла, можно использовать (.) как current context. Пример:
var $my := { <interface> { <name> "ge-0/0/0"; <descr> 'interface 1'; } <interface> { <name> "ge-0/0/1"; <descr> 'interface 2';}} match / { <op-script-results> { for-each ($my/interface) { <output> ./name; <output> ./descr; }}
SLAX Script File Structure
Для просмотра в XML формате используем:
blair> show configuration | display xml
Comments: - можно располагать хоть где в коде.
- (/*) - open-comment
- (*/) - close-comment
- At the top: В скриптах в начале обязательно добавляется:
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; Import "../import/junos.xsl";
после junos.xsl можно добавить любые свои файлы, написанные на SLAX, XSLT или их комбинации.
- param - не изменяемые, нужно таким образом задать параметры командной строки.
param $interface; param $mtu-size = 2000;
можно задать переменную, например mtu-size, и если юзер не будет указывать напрямую значение нужного параметра, то будет использоваться то значение, которое указано через param.
- $arguments - глобальная переменная, обеспечивает полезную информацию из CLI. Предоставляет доступные аргументы в command-line;
- $event-definition - глобальная переменная, задающая условия для выполнения скрипта.
- main template - концептуальное начало скрипта. Шаблон, который матчит первый элемент из input XML document (source tree), даже если он пустой.
Для op script - выглядит так:
match / { <op-script-results> { /* your code goes here */
Для event script - выглядит так:
match / { <event-script-results> { /* your code goes here */
Для commit script - выглядит так:
match configuration { /* your code goes here */
Variables
Простые типы данных
Начало: var $xxx
Нельзя использовать в начале juno, jcs, xnm, slax. Нельзя: $arguments, $event-definition
Можно использовать : в названии переменной. Удобно, при создании библиотек, и когда скрипт будет вложен в скрипт.
Переменную можно объявить:
- глобально - только эти переменные могут быть "перезаписаны" дальше в коде, лучше этого не допускать.
- в шаблоне/функции
- внутри программного control-block (for-each and the if/then/else)
Типы данных: строка (string), число (number), логическая (boolean), node-set.
- Boolean: true() and false(). boolean() - функция переделывает выражение в логические. 0 = false, non-0 = true и т.д. Empty RTF coverts to true.
- Numbers: целые или дробные (.)
- Strings: " " или ' '. string() - функция превращает аргумент в строку.
- Result Tree Fragments: можем использовать как script output, обработать как строку, или конвертировать в node-set. При объявлении переменной такого типа нельзя заканчивать ; после }. Каждый шаблон возвращает RTF.
- Node-set: =RTF, отличие от RTF - при присвоении переменной значения используем :=. XPath expressions работают только с node-sets. Также отличие - к node-set можно применять операторы сравнения. ( | ) - оператор для создания комбинации node-sets.
Пример: for-each( ($primary-colors | $fav-colors)/color ) {...
Сложные структуры данных
- массивы - нет массивов как таковых, но можно использовать node-set XPath expressions особым образом.
Элементы массива начинаются с 1, а не с 0.
Пример задания массива:
var $interfaces := { <int> "ge-0/0/0"; <int> "ge-0/0/1"; <int> "ge-0/0/2"; <int> "ge-0/0/3"; <int> "ge-1/0/1"; <int> "ge-1/0/2"; <int> "ge-1/0/3"; <int> "ge-1/0/4"; } match / { <op-script-results> { <output> "interface 5 = " _ $interfaces/int[5] _ "\n"; <output> "all interfaces:\n"; for-each ($interfaces/int) { <output> .; }}}
Вывод:
blair> op arrays interface 5 = ge-1/0/1 all interfaces: ge-0/0/0 ge-0/0/1 ge-0/0/2 ge-0/0/3 ge-1/0/1 ge-1/0/2 ge-1/0/3 ge-1/0/4
- хэши - (аналог Dictionary в Python) нет хешей как таковых, но можно использовать node-set XPath expressions особым образом.
Пример:
/* Define <xsl:key> elements */ <xsl:key name="protocol" match="route-table/rt" use="rt-entry/protocol-name">; <xsl:key name="next-hop" match="route-table/rt" use="rt-entry/nh/via">; var $match-protocol = "Static"; /* we want to match on "static" routes */ var $match-interface= "ge-0/0/0.60"; /*we want to match on routes via interface ge-0/0/0.60 */ match / { <op-script-results> { var $results = jcs:invoke("get-route-information"); /* Change current node to the $results XML document */ for-each( $results ) { /* Display all static routes */ <output> $match-protocol _ " routes: "; for-each( key( "protocol", $match-protocol ) ) { <output> rt-destination; } /* Display all routes with next-hop of ge-0/0/0.60 */ <output> "Next-hop " _ $match-interface _ ": "; for-each( key( "next-hop", $match-interface ) ) { <output> rt-destination; }
Вывод: blair> op route-info Static routes: 6.6.6.6/32 Next-hop ge-0/0/0.60: 10.200.86.5/32 10.200.86.6/32 10.200.86.7/32 192.168.86.4/30 192.168.86.8/30 192.168.86.28/30 192.168.86.44/30
Специальные переменные
- Общие:
- $product - name of the Junos device
- $user - user, запускающий скрипт
- $hostname - hostname
- $script - скрипт, который запускаем
- $localtime - время, когда был запущен скрипт. Вид: Fri Jan 7 14:07:33 2011
- $localtime-iso - 2011-01-08 03:38:57 UTC
- op scripts:
- $argument - особая переменная, кот предоставляет доступные аргументы в command-line;
user@junosdev> op change-interface ? Possible completions: <name> Argument name admin-control [enable | disable], default is disable detail Display detailed output Interface The interface to control | Pipe through a command
- event scripts
- $event-definition - определяет условия для срабатывания скрипта
var $event-definition = { <event-options> { <generate-event> { <name> "every-hour"; <time-interval> "3600"; } <policy> { <name> "check-var-utilization"; <events> "every-hour"; <then> { <event-script> { <name> "check-var-utilization.slax";
- $junos-context - содержит информацию об устройстве, но для каждых типов скриптов имеет свой набор параметров.