Основы автоматизации на SLAX

Материал из Juniper Exam Wiki
Перейти к навигации Перейти к поиску

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.

- Context Processing. Насколько я поняла, можно использовать (.) как current context. Пример:

var $my-ns-var := {
   <interface> {
      <name> "ge-0/0/0";
   <interface> {
      <name> "ge-0/0/1";
for-each( $my-ns-var/interface ) {
   var $ifd = .; /*                             $ifd is being assigned the 'current' interface node */
   <output> $ifd/name;

SLAX Script File Structure

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.
  • $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 - при присвоении переменной значения используем :=. Операции проводятся над node-sets. ( | ) - оператор для создания комбинации node-sets. Также отличие - к node-set можно применять операторы сравнения.

Сложные структуры данных

  • массивы - нет массивов как таковых, но можно использовать node-set XPath expressions особым образом.

Элементы массива начинаются с 1, а не с 0.

Пример задания массива:

var $numbers := { 
   <n> 30;
   <n> 10; 
   <n> 12; 
   <n> 27;

Пример использования массива:

<output> $numbers/n[2];
Вывод
10
for-each( $numbers/n ) { 
   <output> .;
Вывод:
30
10
12
27
  • хэши - (аналог Dictionary в Python) нет хешей как таковых, но можно использовать node-set XPath expressions особым образом.