Основы автоматизации на SLAX: различия между версиями

Материал из Juniper Exam Wiki
Перейти к навигации Перейти к поиску
Строка 113: Строка 113:
  27
  27
*хэши - (аналог Dictionary в Python) нет хешей как таковых, но можно использовать node-set XPath expressions особым образом.
*хэши - (аналог 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
==Специальные переменные==

Версия 12:22, 4 января 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.

- 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 особым образом.

Пример:

 /* 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

Специальные переменные