info Скрипты в коммутаторах Extreme Networks

Скрипты в ExOS

Всем известно, что операционная система EXOS имеет встроенный скриптовый язык $TCL, существенно расширяющий возможности администрирования оборудования. Не всем известно, что операционная система EXOS имеет технологию UPM (Universal Port Management), позволяющую выполнять скрипты при наступлении какого либо события, аутентификации пользователя, или по времени.

Скрипты

Скриптовый язык в коммутаторах позволяет создавать список команд, которые можно выполнить вручную или автоматически, при наступлении какого либо события. Скрипты позволяют автоматизировать многие рутинные действия администраторов.

Посмотреть разрешен ли cli-scripting, постоянны ли даваемые скриптами команды, режим обработки ошибок:

show management

Включаем режим скриптования.

enable cli scripting [permanent]

permanent — и для новых сессий.

Переключение режима постоянные или временные команды скрипта, временные хранятся до перезагрузки коммутатора.

enable cli mode [persistent|non-persistent]

По-умолчанию non-persistent.

Настроить режим обработки ошибок скрипта:
configure cli mode scripting [abort-on-errors|ignore-errors]

По-умолчанию ignore errors.

Настройка вывода:
enable|disable cli scripting output

если disable отображаются только команды show vars. Если enable — все команды и результат выполнения.

Каждая сессия имеет свой набор переменных и их занчений. Можно сохранять до 5 переменных за раз перед их заменой, чтобы потом восстановить их значения.

save var key <keyID> [<var1> <var2> <var3>..] — сохранить до 5 значений в keyID.
load var key <keyID> [<var1> <var2> <var3>..] — восстановить до 5 сохранённых в keyID значений в переменные.
delete var key <keyID> — удалить сохранённый набор значений.

Создание скриптов

Существуют 2 режима создания скриптов:

  • просто создаём файл скрипта с командами        - если нужно запускать скрипт вручную. Создаём и редактируем скрипт в ASCII-формате любым текстовым редактором, затем заливаем его на свич (tftp, ssh).
  • создание скрипта с Universal Port         — если нунжо запускать сприпт автоматически по какому-либо событию. Точно так же как и в 1), только с использованием universal port profile.

# — символ коментария строки

Выполнение скриптов

Осуществляется ручной загрузкой и стартом скрипта, либо с помощью Universal Port. Для ручного выполнения скрипта его надо загрузить на свич и выполнить команду:

load script <filename> {arg1} {arg2} … {arg9}

Скрипты Universal Port называются профайлами и запускаются при возникновении определённых тригерных событий. Например, обнаружение устройства на порту, потеря устройства на порту, пользовательская аутентификация и разлогинивание.

Варианты отмена выполнения скрипта.

нажать CTRL-C во время выполнения скрипта;

  • настроить отмену выполнения при возникновении ошибок: configure cli mode scripting abort-on-error
  • в тексте ввести команду return <statusCode> чтобы прекратить выполнение и поместить код возврата в $STATUS.

Переменные

Список предопределённых переменных (доступны во всех скриптах)

$STATUS — результат выполнения последней команды.
     Значения от -100 до 100 зарезервированы и устанавливаются автоматически.
     Можно переопределить значение командой return <statusCode>
                0  — успешное завершение команды;
                -53 — переменная не найдена;
                -57 — превышена глубина WHILE;
                -78 — script timeout.

$CLI.USER — имя пользователя, который запустил родительский CLI.

$CLI.SESSION_TYPE — тип сессии пользователя.

$CLI.SCRIPT_TIME_REMAINING — создаётся если дана команда configure cli script timeout <sec>
        - если скрипт не запущен, содержит значение из настроенного таймаута.
        - если скрипт прерван по таймауту, содержит 0.
        - если скрипт завершился сам до таймаута, содержит число оставшихся секунд.

$CLI.SCRIPT_TIMEOUT — создаётся если дана команда команда configure cli script timeout <sec>. Возвращает текущее значение таймаута. Если нет запущенных скриптов, возвращает настроенное значение таймаута.

$CLI.OUT — содержит вывод последней команды show.
 Перед использованием необходима инициализация (set var CLI.OUT 0).
 После использования необходимо удаление (delete var CLI.OUT).

Определение собственных переменных

set var <name> <expression>

Примеры:

set var x 100
set var x ($x + 2)
set var y ($x — 100)
show var [<varname>]   
     - посмотреть все переменные, или значение определённой переменной.

При работе с переменными надо помнить следующее:

  • имена чувствительны к регистру, ограничены 32 символами.
  • имя переменной должно быть уникально.
  • ссылаться на значение переменной можно так: $X или $(X)
  • если переменная уже существует, её значение переписывается. Ошибок не выдаётся.
  • <expression> может быть константой, другой переменной, комбинацией с использованием операторов и функций.
  • только команда set var поддерживает вычисление выражений.
  • если переменная содержит специальные символы (+-/*), то должна быть помещена в круглые скобки. — set var z ( ($x) + 100 ).
  • если переменная со спец.символами используется в TCL-функции, она должна быть заключена в фигурные скобки: set var $TCL(string length ${CLI.USER})
  • eсли нужно использовать специальные символы ($«итд) как обычные, их требуется экранировать: \$, \».

set var variname \$<vname>
set var $CLI.USER «Robert \«Bob\» Smith»

Операнды

Поддерживаемые операции в выражениях (в порядке убывания приоритета):

  • - (унарный минус)
  • + (унарный плюс)
  • ~ побитовое НЕ
  • ! логическое НЕ

  • * умножение

  • / деление

  • % остаток

  • + плюс

  • - минус

  • << смещение влево        (только для целочисленных операндов)

  • >> смещение вправо

  • < булево меньше

  • > булево больше

  • <= меньше или равно

  • >= больше или равно

  • == равно

  • != не равно

  • & побитовое И

  • ^ побитовое эксклюзивное ИЛИ

  • | побитовое ИЛИ

  • || логическое ИЛИ

  • && логическое И

  • x?y:z if-then-elst (как в C)

Управляющие структуры

Вложение возможно до 5 уровней. CTRL-C прерывает все циклы.

IF (<expression>) THEN
  <statements>
ELSE
  <statements>
ENDIF

WHILE(<expresson>) DO
  <statements>
ENDWHILE

Встроенные функции

$MATCH(string1, string2)        - сравнивает 2 строки. Возвращает
                                 -1        string1 меньше string2
                                 0        string1 равна string2
                                 1        string1 больше string2

$READ(prompt)                        - отображает prompt и ожидает пользовательского ввода. Заверщение ввода по [Return]

$UPPERCASE(string)                - возвращает строку в верхнем регистре.

$VAREXISTS(varname)                - 0 — если переменная существует, не 0 если переменной не существует.

$TCL(function args)                - запуск встроенной TCL-функции.

Список поддерживаемых tcl-функций

after                - системная функция. Запускает команду после временной задержки.
append                - обработка строк. Добавляет к переменной.
binary                - обработка строк. Вставляет и выделяет поля из бинарных строк.
clock                - системная функция. Получает и управляет временем.
concat                - обработка списков. Объединяет списки вместе.
expr                - математика. Вычисляет выражение.
join                - обработка списков. Возвращает строку, являющуюся объединением строк списка.
lappend        - обработка списков. Добавляет элементы списка в переменную.
lindex                - обработка списков. Получает элемент из списка.
linsert        - обработка списков. Вставляет элемент в список.
list                - обработка списков. Создаёт список.
llength        - обработка списков. Возвращает число элементов списка.
lrange                - обработка списков. Возвращает один или более соседних элементов списка.
lreplace        - обработка списков. Замещает элементы списка новыми.
lsearch                - обработка списков. Посмотреть, содержит ли список определённый элемент.
lsort                - обработка списков. Сортирует элементы списка.
regexp                - обработка строк. Сопоставляет строку с регулярным выражением.
regsub                - обработка строк. Выполнение подстановки на основе соответствия регулярному выражению.
re_syntax        - обработка строк. Синтаксис регулярного выражения TCL.
split                - обработка списков. Разбивает строку на элементы TCL-списка.
string                - обработка строк. Манипуляция строками.
Если вы используете специальные символы в названии переменной в TCL-функции, переменная должна быть заключена в фигурные скобки. Пример: set var x $TCL(string length ${CLI.USER}).

Вложенные скрипты

ExtremeXOS поддерживает 3 уровня вложенности скриптов. Пример вложенности:

sitch# load script x1.xsf

содержание скрипта x1.xsf:

Cmd 1
Cmd 2
load script x2.xsf
Cmd 3
Cmd 4

содержание скрипта x2.xsf:

Cmd 1
Cmd 2
load script x3.xsf

Выполнение скриптов

Выполнение скрптов можно осуществлять через ручной запуск и через возможночти Universal Port.

Запуск срипта.

Для выполнения скрипта, загрузки скрипта на коммутатор используется команда: load script <filename> {arg1} {arg2} … {arg9}

Запуск скриптов Universal Port

Скрипты Universal port называются профили и выполняются различными триггерами, подключение устройста, отключение устройства, авторизация пользователя и выход. 

UNIVERSAL PORT MANAGEMENT

Технология UPM (Universal Port Management) позволяет выполнять скрипты на коммутаторе, при наступлении событий.

Основным компонентом UPM являяется профайл, который состоит из скриптового языка, команд коммутатора и выполняется при наступлении того или иного события. Профайл представляет собой файл, находящийся на файловой системе коммутатора.

Профайлы можно получать на сайте Extreme Networks, от разработчиков или создавать самому.

На свиче может быть много профайлов, но одновременно может быть запущенным только один.

Профайлы бывают статические и динамические.

  • Статические профайлы не срабатывают по динамическим событиям. Для запуска статического профайла нужно ввести команду в CLI или запустить скрипт содержащий команды запуска профайла.
  • Статические профайлы имеют следующие ограничения:
    • статические профайлы не ограничены конкретными портами и могут содержать команды конфигурирования всей системы коммутатора.
    • Статические профайлы не могут быть привязаны к порту, устройству или пользователю.
    • Изменения сделанные статическими профайлами перманентны, сохраняются в конфигурационный файл и действительны между перезагрузками.
  • Статические профайлы обычно используются для начальной комплексной настройки коммутатора. Используя скрипты и переменные можно создавать статические профайлы как шаблоны конфигурации коммутатора для реконфигурирования под различное сетевое окружение, запускаемые в ручную при необходимости.
  • Динамические профайлы не требуют ручного запуска, старт по событиям.
  • Настройки сделанные в динамических профайлах являются временными, не добавляются в конфиг и не переживают перезагрузки. Это поведение настраивается.
  • Динамические профайлы запускаются по возникновению следующих событий:
    • обнаружение или отключение устройства.
    • аутентификация и разлогинивание пользователя.
    • время дня.
    • сообщения от Event Management System (EMS).

Правила написания профайлов:

  • максимум 5000 символов в профайле;
  • максимум 128 профайлов на свич;
  • профайлы хранятся как часть файла конфигурации свича;
  • copy/past — единственный метод для перемещения данных профайла с помощью CLI.
  • по-умолчанию статические профайлы всегда persistent а динамические — non-persistent.

Профайл можно запустить вручную, выполнив команду:

run upm profile

Триггеры запуска профайлов

  • Device Triggers
  • Запускаются, когда устройства подключается (device-detect type) или отключается(device undetect type) от порта. Используются для подготовки настроек порта. Для работы на порту должен быть включён LLDP. На порту может быть один device-detect и один device-undetect профайл.
  • User authentication Triggers
  • Активируется, когда пользователь или устройство логинится в сети используя фичу Network Login. Для Network Login нужен RADIUS. Так же аутентификация может быть по маку или на основе веба.
  • Time Triggers
  • Запускают профайлы на основе времени дня или с заданным периодом.
  • EMS Triggers
  • Обычно используются для изменения настроек свича в ответ на событие свича или сети. События на которые нужно реагировать задаются фильтром. Форматcomponent.subcomponent.condition. Все компоненты и подкомпоненты, для которых можно фильтровать события показываются по команде

show log components
show log enents all — отображает все условия и события которые можно фильтровать. 

Команды конфигурации категории Non-Persistent-Capable

В динамических профайлах можно выполнять следующие действия:

Применять ACL по событию:

configure access-list add <dynamic_rule> [ [[first | last] {priority <p_number>} {zone <zone>} ] | after] <rule>] | [ priority<p_number> {zone <zone>} [ any | vlan <vlanname> | ports <portlist> ] {ingress | egress}
configure access-list delete <ruleName> [ any | vlan <vlanname> | ports <portlist> | all] {ingress | egress}

Изменять политику LLDP на порту:

configure lldp ports <portlist> [advertise|don't-advertise]…

Включить/выключить PORT (jumbo-frame):

disable port [<port-list>|all]
enable port [<port_list> | all]
disable jumbo-frame ports [<port-list>|all] 
enable jumbo-frame ports [<port-list>|all] 

Манипуляции с PoE:

configure inline-power label <string> ports <port_list>
configure inline-power operator-limit <milliwatts> ports [all |<port_list>]
configure inline-power priority [critical | high | low] ports <port_list>
disable inline-power
enable inline-power
disable inline-power ports [all | <port_list>]
enable inline-power ports [all | <port_list>]
disable inline-power slot <slot>
enable inline-power slot <slot>
unconfigure inline-power priority ports [all | <port_list>]

Конфигурировать VLAN:

configure {vlan} <vlan_name> add ports [<port_list> |all] {tagged | untagged} {{stpd} <stpd_name>} {dot1d | emistp | pvst-plus}}
configure ip-mtu <mtu> vlan <vlan_name>

«Навесить» QoS/RateLimit по событию:

configure ports <port_list> {qosprofile} <qosprofile>

Universal Port Variables

Общие переменные (доступны во всех скриптах)

$STATUS                        - статус выполнения последней команды
$CLI.USER                - имя пользователя, который запустил CLI.
$CLI.SESSION_ID                - Этот идентификатор доступен для обратного события, когда девайс или юзер отваливается по таймауту.
$CLI.SESSION_TYPE        - тип сессии (telnet, ssh…)
$EVENT.NAME                - событие, которое активировало этот профайл.
$EVENT.TIME                - время, когда произошло событие (с начала unix-эпохи?)
$EVENT.TIMER_TYPE        - тип таймера (периодичный и непериодичный)
$EVENT.TIMER_NAME        - имя таймера, который вызывает Universial Port.
$EVENT.TIMER_LATE_SECS        - разница между временем, когда тикнул таймер и когда запустился профайл (в секундах)
$EVENT.PROFILE                - имя профайла, который сейчас запущен.

Переменные пользовательских профайлов

$EVENT.USERNAME                - имя аутентифицированного пользователя. Содержит мак-адрес в случае доступа на основе мака.
$EVENT.NUMUSERS                - количество аутентифицированных посетителей на порту, после того, как случилось событие.
$EVENT.USER_MAC                - мак-адрес пользователя.
$EVENT.USER_PORT        - порт, ассоциированный с этим событием.
$EVENT.USER_VLAN        - влан, ассоциированный с этим событием или пользователем.
$EVENT.USER_ALL_VLANS        - когда пользователь аутентифицирован во множество вланов, эта переменная содержит их список.
$EVENT.USER_IP                - ip-адрес пользователя (если применим). Если нет, эта переменная пуста.

Переменные профайлов устройств (device-profile)

$EVENT.DEVICE                - Device identification string. Возможные занчения:
                         AVAYA_PHONE, GEN_TEL_PHONE, ROUTER, BRIDGE, REPEATER, WLAN_ACCESS_PT, DOCSIS_CABLE_SER, STATION_ONLY, OTHER.
$EVENT.DEVICE_IP        - ip-адрес девайса (если доступен). Если нет, пусто.
$EVENT.DEVICE_MAC        - мак-адрес девайса.
$EVENT.DEVICE_POWER        - мощьность девайса в миливаттах. Пусто, если не доступна.
$EVENT.DEVICE_MANUFACTURER_NAME — производитель устройства.
$EVENT.DEVICE_MODEL_NAME — модель устройства.
$EVENT.USER_PORT        - порт, соответствующий событию.

Переменные профайлов EMS

$EVENT.NAME                - сообщение события.
$EVENT.LOG_DATE                - дата события.
$EVENT.LOG_TIME                - время события.
$EVENT.LOG_COMPONENT_SUBCOMPONENT — компонент и подкомпонент события, которые отображаются в show log components
$EVENT.LOG_EVENT        - состояние события, из списка show log events
$EVENT.LOG_FILTER_NAME        - EMS-фильтр, который активировал профайл.
$EVENT.LOG_SEVERITY        - уровень северити этого события, который определён в EMS.
$EVENT.LOG_MESSAGE        - сообщение о событии с аргументами в формате %1%
$EVENT.LOG_PARAM_0 to _9 — аргументы события.

Настройка Universal Port

show upm event <event-type>                - посмотреть, какие события соответствуют каким профайлам.
show upm profile <name>                        - посмотреть содержимое профайла.
show upm timers                                - посмотреть список таймеров.
show upm history {profile <profile-name> | event <upm-event> | status [pass | fail] | timer <timer-name> | detail} — история запуска.
show upm history exec-id <number>

configure upm profile <profile-name> maximum execution-time <seconds> — создать и настроить новый профайл.
edit upm profile <name>                - редактирование профайла.
disable upm profile <profile-name>        - выключение/включение профайла.
enable upm profile <profile-name>
delete upm profile <profile-name>        - удаление профайла.
configure upm event <upm-event> profile <profile-name> ports <port_list> — настройка device-event-trigger, где <upm-envent> может быть device-detect или device-undetect
create upm timer <timer-name>         — создание таймера upm.
configure upm timer <timer-name> after <time-in-secs> [every <seconds>] - настройка таймера upm.
configure upm timer <timer-name> at <month> <day> <year> <hour> <min> <sec> [every <seconds>]
configure upm timer <timer-name> profile <profile-name> — настройка триггера по таймеру.
delete upm timer <timer-name>                 — удаление таймера upm.
create log filter <name> {copy <filter-name>} - создание фильтра журнальных событий EMS
configure log filter <name> [add|delete] {exclude} events [<event-condition> | [all | <event-component>] {severity <severity> {only}}]
configure log filter <name> [add|delete] {exclude} events [<event-condition> | [all | <event-component>] {severity
<severity> {only}}] [match | strict-match] <type> <value> — его настройка.
create log target upm {<upm_profile_name>} - создание журнальной цели для получения сообщения о событии
delete log target upm {<upm_profile_name>} - удаление журнальной цели (триггера).
configure log target upm {<upm_profile_name>} filter <filter-name> {severity [[<severity>] {only}]}
configure log target upm {<upm_profile_name>} match {any | <regex>}

enable log target upm {<upm_profile_name>} - после завершения настроек включение работы триггера.

unconfigure upm event <upm-event> profile <profile-name> ports <port_list> — удаление триггера устройства или пользователя.
unconfigure upm timer <timerName> profile <profileName>         - удаление триггера времени.

run upm profile <profile-name> {event <event-name>} {variables <variable-string>} — ручной запуск профайла для теста.
run upm profile afterhours

Примеры скриптов

Пример 1

Создание 100 вланов с ip-адресами 10.1.1.1/16 — 10.100.1.1/16

enable cli scripting
set var count 1
while ($conut < 101) do
create vlan v$count
configure vlan v$count tag $count
configure vlan v$count ipaddress 10.$(count).1.1/16
set var count ($count + 1)
endwhile
show vlan

Пример 2

Осуществление 60-секундной задержки перед продолжением выполнения.

set var temp $TCL(after [expr 60*1000])

Пример 3

Отображение даты и времени.

set var CLI.OUT 0
show switch
set var date $TCL(lrange ${CLI.OUT} 27 29)
set var year $TCL(lrange ${CLI.OUT} 31 31)
set var date $TCL(linsert $date 3 $year)
set var time $TCL(lrange ${CLI.OUT} 30 30)
show var date
show var time

Пример 4

Сортировка FDB в сторону уменьшения.

set var CLI.OUT 0
show fdb
set var x1 $TCL(split ${CLI.OUT} «\n»)
set var x2 $TCL(lsort -decreasing $x1)
set var output $TCL(join $x2 «\n»)
show var ouput

Пример 5

Получение fdb age маков.

set var CLI.OUT 0
show fdb
set var input $TCL(split ${CLI.OUT} «\n»)
set var y1 $TCL(lsearch -glob $input *age*)
set var y2 $TCL(lindex $input $y1)
set var y3 $TCL(split $y2 «»)
set var y4 $TCL(lindex $y3 0)
show var y4

Пример 6

Контроль широковещательных штормов.

config port 1-23 rate-limit flood broadcast 5000 — установка порога (в пакетах в секунду), при превышении которого блочить порт.
create upm profile bcast_rt_lim_pdown — формируем профайл следующего содержания:

enable cli scripting
disable clipaging
set var CLI.OUT «»
show ports 1-24 rate-limit flood no-refresh
set var rlf_strings $TCL(split ${CLI.OUT} «\n»)
set var num_strings_rlf $TCL(llength $rlf_strings)
set var count 4
while ($count < ($num_strings_rlf-4)) do
  set var rate_exceeded $TCL(lindex $rlf_strings $count)
  set var rate_exceeded $TCL(string range $rate_exceeded 69 81)
    if ($rate_exceeded != «0») then
      set var numprt ($count-3)
      disable port $numprt
      create log entry «STORM_CONTROL_SCRIPT: disable port $numprt by flood rate-limit»
      clear counters ports
      delete var numprt
    endif
    set var count ($count+1)

endwhile
delete var CLI.OUT
delete var rlf_strings
delete var num_strings_rlf
delete var count
delete var rate_exceeded

create upm timer bcast_rt_lim_pdown_timer         — создаём таймер.
configure upm timer bcast_rt_lim_pdown_timer profile bcast_rt_lim_pdown — делаем таймер тригером профайла.
configure upm timer bcast_rt_lim_pdown_timer after 10 every 10 — запускаем таймер через 10 сек с отсчётами в 10с.
configure log filter «DefaultFilter» add exclude events UPM.Msg.upmMsgExshLaunch — пока непонятно зачем, но работает.

Пример 7

Скрипт createVlanAddPort.xsf создаёт вланы из диапазона и разбрасывает их на указанные порты. Имена вланов соответствуют шаблону vlan_<x>, где <x> — номер влана.

Использование:

load script createVlanAddPort.xsf <VLANS> <PORTS>
Пример:
load script createVlanAddPort.xsf 500-599,650-657,310 4,12-15,8  - создаёт вланы 310 и все в диапазонах от 500 до 599 и с 650 до 657 и разбрасывает их в порты 4, с 12 по 15, и в 8.

скрипт:

#
# Usage:
# load script createVlanAddPort.xsf $VLANS $PORTS
#
set var i 0
set var vlanId 0
set var vlanList $TCL(split ${CLI.ARGV1} «,»)
set var vlanListLength $TCL(llength ${vlanList})
set var portList $TCL(split ${CLI.ARGV2} «,»)
set var rangeMark «\-»
set var vlanId $TCL(lindex ${vlanList} $i)
while ($i < $vlanListLength) do
    set var rangeMatch $TCL(regexp -all ${rangeMark} ${vlanId})
    if ($rangeMatch > 0) then
        set var vlanIdRange $TCL(split ${vlanId} «-»)
        set var vlanIdStart $TCL(lindex ${vlanIdRange} 0)
        set var vlanIdEnd $TCL(lindex ${vlanIdRange} 1)
        set var vlanId $vlanIdStart
        while ($vlanId < $vlanIdEnd+1) do
            create vlan vlan_$vlanId
            configure vlan vlan_$vlanId tag $vlanId
            configure vlan vlan_$vlanId add port $portList tag
            set var vlanId ($vlanId + 1)
        endwhile
    else
        create vlan vlan_$vlanId
        configure vlan_$vlanId tag $vlanId
        configure vlan vlan_$vlanId add port $portList tag
    endif
    set var i ($i + 1)
    set var vlanId $TCL(lindex ${vlanList} $i)
endwhile

Пример 8

Скрипт addVlanPortToMsti.xsf назначает указанные вланы на нужных портах в определённый инстанс MSTP.

Использование:

load script addVlanPortToMsti.xsf <VLANS> <PORTS> <MSTI_name>
Пример:
load script addVlanPortToMsti.xsf 2-199 25-26 mst5 — к MSTI инстансу с именем mst5 на портах 25-26 привызяваются вланы 2-199.

скрипт:

set var i 0
set var vlanId 0
set var vlanList $TCL(split ${CLI.ARGV1} «,»)
set var vlanListLength $TCL(llength ${vlanList})
set var portList $TCL(split ${CLI.ARGV2} «,»)
set var rangeMark «\-»
set var vlanId $TCL(lindex ${vlanList} $i)
set var msti $CLI.ARGV3
while ($i < $vlanListLength) do
    set var rangeMatch $TCL(regexp -all ${rangeMark} ${vlanId})
    if ($rangeMatch > 0) then
        set var vlanIdRange $TCL(split ${vlanId} «-»)
        set var vlanIdStart $TCL(lindex ${vlanIdRange} 0)
        set var vlanIdEnd $TCL(lindex ${vlanIdRange} 1)
        set var vlanId $vlanIdStart
        while ($vlanId < $vlanIdEnd+1) do
            configure stpd $msti add vlan vlan_$vlanId ports $portList dot1d
            set var vlanId ($vlanId + 1)
        endwhile
    else
        configure stpd $msti add vlan vlan_$vlanId ports $portList dot1d
    endif
    set var i ($i + 1)
    set var vlanId $TCL(lindex ${vlanList} $i)
endwhile

Пример 9

 

Скрипт setupVlansToPorts.xsf добавляет или удаляет указанные существующие вланы с/на указанные порты.

Использование:

load script setupVlansToPorts.xsf <VLANS> <PORTS> <add | delete>
Пример:
load script setupVlansToPorts.xsf 300-600 9,17-20 add   - добавляет вланы 300-600 на порты 9,17,18,19,20
load script setupVlansToPorts.xsf 100-150 19,11 delete  — удаляет вланы 100-150 с портов 11 и 19.

скрипт:

#
# USAGE: load script setupVlansToPorts.xsf <vlans> <ports> <add|delete>
# EXAMPLE: load script setupVlansToPorts.xsf 250-251 11-12 add
#
set var i 0
set var vlanId 0
set var vlanList $TCL(split ${CLI.ARGV1} «,»)
set var vlanListLength $TCL(llength ${vlanList})
set var portList $TCL(split ${CLI.ARGV2} «,»)
set var ACTION $(CLI.ARGV3)
set var rangeMark «\-»
set var vlanId $TCL(lindex ${vlanList} $i)
while ($i < $vlanListLength) do
    set var rangeMatch $TCL(regexp -all ${rangeMark} ${vlanId})
    if ($rangeMatch > 0) then
        set var vlanIdRange $TCL(split ${vlanId} «-»)
        set var vlanIdStart $TCL(lindex ${vlanIdRange} 0)
        set var vlanIdEnd $TCL(lindex ${vlanIdRange} 1)
        set var vlanId $vlanIdStart
        while ($vlanId < $vlanIdEnd+1) do
            if («$(ACTION)» == «add») then
                configure vlan vlan_$vlanId add port $portList tag
            endif
            if («$(ACTION)» == «delete») then
                configure vlan vlan_$vlanId delete port $portList
            endif
            set var vlanId ($vlanId + 1)
        endwhile
    else
        if («$(ACTION)» == «add») then
            configure vlan vlan_$vlanId add port $portList tag
        endif
        if («$(ACTION)» == «delete») then
            configure vlan vlan_$vlanId delete port $portList
        endif
    endif
    set var i ($i + 1)
    set var vlanId $TCL(lindex ${vlanList} $i)
endwhile