|
@@ -39,7 +39,7 @@
|
|
|
естественный способ.
|
|
|
|
|
|
Какой из подходов лучше и проще в конкретном случае - определяется задачей.
|
|
|
-Klish в первую очередь расчитан на подход Cisco, т.е. на немедленно выполняемые
|
|
|
+Klish в первую очередь рассчитан на подход Cisco, т.е. на немедленно выполняемые
|
|
|
команды. Однако проект имеет систему плугинов, что позволяет расширять его
|
|
|
возможности. Так плугин klish-plugin-sysrepo, реализованный отдельным проектом,
|
|
|
работая на основе хранилища sysrepo, позволяет организовать Juniper подход.
|
|
@@ -168,7 +168,7 @@ VIEW. Можно определить VIEW со "стандартными" ко
|
|
|
### Команды и параметры
|
|
|
|
|
|
Команды (тег `COMMAND`) могут иметь параметры (тег `PARAM`). Команда определяется
|
|
|
-внутри какого-либо VIEW и пренадлежит ему. Параметры определяются внутри команды
|
|
|
+внутри какого-либо VIEW и принадлежит ему. Параметры определяются внутри команды
|
|
|
и, в свою очередь, принадлежат ей. Команда может состоять только из одного слова,
|
|
|
в отличие от команд в klish предыдущих версий. Если нужно определить многословную
|
|
|
команду, то создаются вложенные команды. Т.е. внутри команды, идентифицируемой по
|
|
@@ -190,7 +190,7 @@ VIEW. Можно определить VIEW со "стандартными" ко
|
|
|
|
|
|
Параметры могут быть обязательными, опциональными, либо являться обязательным
|
|
|
выбором среди нескольких параметров - кандидатов. Таким образом при вводе команды
|
|
|
-оператором некорые параметры могут быть указаны, а некоторые нет. При разборе
|
|
|
+оператором некоторые параметры могут быть указаны, а некоторые нет. При разборе
|
|
|
командной строки составляется последовательность выбранных параметров.
|
|
|
|
|
|
|
|
@@ -218,7 +218,7 @@ VIEW. Можно определить VIEW со "стандартными" ко
|
|
|
скрипт, который будет выполнен символом.
|
|
|
|
|
|
Результатом выполнения действия является "код возврата". Он определяет успешность
|
|
|
-или неуспешность выполнения команды вцелом. Если для одной команды определено
|
|
|
+или неуспешность выполнения команды в целом. Если для одной команды определено
|
|
|
более одного действия, то вычисление кода возврата становится более сложной
|
|
|
задачей. Каждое действие имеет флаг, определяющий влияет ли код возврата
|
|
|
текущего действия на общий код возврата. Так же действия имеют настройки,
|
|
@@ -245,7 +245,7 @@ VIEW. Можно определить VIEW со "стандартными" ко
|
|
|
|
|
|
### Контейнеры параметров
|
|
|
|
|
|
-Контейнеры SWITCH и SEQ используются для аггрегации вложенных в них параметров и
|
|
|
+Контейнеры SWITCH и SEQ используются для агрегации вложенных в них параметров и
|
|
|
определяют правила по которым происходит разбор командной строки относительно
|
|
|
этих параметров.
|
|
|
|
|
@@ -255,7 +255,7 @@ VIEW. Можно определить VIEW со "стандартными" ко
|
|
|
оператор ввел лишь один параметр по выбору из набора возможных параметров.
|
|
|
В таком случае может использоваться контейнер SWITCH. Если при разборе командной
|
|
|
строки внутри команды встречается контейнер SWITCH, то для соответствия
|
|
|
-следующему введенному оператором слова должет быть выбран только один параметр
|
|
|
+следующему введенному оператором слова должен быть выбран только один параметр
|
|
|
из параметров, вложенных в SWITCH. Т.е. с помощью контейнера SWITCH происходит
|
|
|
ветвление разбора.
|
|
|
|
|
@@ -285,7 +285,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
Для задания подсказок и списка возможных дополнений в конфигурации используются
|
|
|
теги `HELP` и `COMPL`. Эти теги должны быть вложенными относительно
|
|
|
соответствующих команд и параметров. Для простоты подсказки для параметра или
|
|
|
-команды могут быть заданы аттрибутом основного тега, если подказка является
|
|
|
+команды могут быть заданы атрибутом основного тега, если подсказка является
|
|
|
статическим текстом и ее не нужно генерировать. Если подсказка динамическая, то
|
|
|
ее содержимое генерируется действиями ACTION, вложенными внутрь HELP. Для
|
|
|
дополнений COMPL действия ACTION генерируют список возможных значений
|
|
@@ -425,7 +425,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
```
|
|
|
|
|
|
Заголовок вводит свое пространство имен XML по умолчанию
|
|
|
-"https://klish.libcode.org/klish3". Заголовок стардартный и чаще всего нет смысла
|
|
|
+"https://klish.libcode.org/klish3". Заголовок стандартный и чаще всего нет смысла
|
|
|
его менять.
|
|
|
|
|
|
|
|
@@ -460,7 +460,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
```
|
|
|
|
|
|
В первом случае klish будет искать "my_sym" во всех плугинах и использует первый
|
|
|
-найденый. Во втором случае поиск будет производиться только в плугине
|
|
|
+найденный. Во втором случае поиск будет производиться только в плугине
|
|
|
"my_plugin". Кроме того, разные плугины могут содержать одноименные символы и
|
|
|
указание плугина позволит узнать, какой из символов имелся в виду.
|
|
|
|
|
@@ -559,7 +559,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
```
|
|
|
|
|
|
Команда, используемая в качестве значения атрибута `cmd` должно быть определена
|
|
|
-в файлай конфигурации. Приведенный пример выполнит ранее определенную команду
|
|
|
+в файлах конфигурации. Приведенный пример выполнит ранее определенную команду
|
|
|
`exit` при нажатии сочетания клавиш "Ctrl^Z".
|
|
|
|
|
|
|
|
@@ -590,7 +590,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
Внутри одной команды может быть определено несколько блоков действий. Это
|
|
|
возможно, если команда имеет ветвление параметров или опциональные параметры.
|
|
|
Блоком считаются действия, определенные внутри одного элемента. Действия,
|
|
|
-определенные в разных элементах, включая вложенные, пренадлежат разным блокам.
|
|
|
+определенные в разных элементах, включая вложенные, принадлежат разным блокам.
|
|
|
Всегда выполняется только один блок действий.
|
|
|
|
|
|
```
|
|
@@ -645,7 +645,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
поиск символа будет проходить немного быстрее. С другой стороны, можно написать
|
|
|
некие универсальные команды, в которых указываются символы без принадлежности к
|
|
|
плугину. Тогда несколько плугинов могут реализовать "интерфейс", т.е. все
|
|
|
-используемые символы, а их реальное содержание будет зависить от того, какой
|
|
|
+используемые символы, а их реальное содержание будет зависеть от того, какой
|
|
|
плугин загружен.
|
|
|
|
|
|
|
|
@@ -733,7 +733,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
|
|
|
В одной команде может содержаться несколько элементов `ACTION`. Это называется
|
|
|
"блок действий". Каждое из действий имеет свой код
|
|
|
-возврата. Однако команда вцелом тоже должна иметь код возврата и этот код
|
|
|
+возврата. Однако команда в целом тоже должна иметь код возврата и этот код
|
|
|
должен быть одним значением, а не массивом.
|
|
|
|
|
|
По умолчанию действия `ACTION` выполняются последовательно и как только одно из
|
|
@@ -873,7 +873,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
* [`SWITCH`](#switch)
|
|
|
* [`SEQ`](#seq)
|
|
|
|
|
|
-В данном разделе будут довольно подробно рассмотрены атрибуты элемена `ENTRY`,
|
|
|
+В данном разделе будут довольно подробно рассмотрены атрибуты элемента `ENTRY`,
|
|
|
зачастую являющиеся атрибутами также и других элементов. Другие элементы будут
|
|
|
ссылаться на эти описания в разделе `ENTRY`. Примеры конфигурации, при описании
|
|
|
атрибутов, не обязательно основаны на элементе `ENTRY`, а используют другие,
|
|
@@ -1143,7 +1143,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
что это эквивалентно созданию копии элемента "#2" на том месте, где определен
|
|
|
элемент "#1".
|
|
|
|
|
|
-Если элемент являетя ссылкой, то в нем определен атрибут `ref`. Значение атрибута
|
|
|
+Если элемент является ссылкой, то в нем определен атрибут `ref`. Значение атрибута
|
|
|
- ссылка на целевой элемент схемы.
|
|
|
|
|
|
```
|
|
@@ -1192,7 +1192,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
тега `PTYPE`, который является ссылкой на ранее объявленный `PTYPE`. В итоге
|
|
|
типы двух объявленных параметров полностью эквивалентны.
|
|
|
|
|
|
-В последне примере ссылка на `VIEW` заключена внутрь тега `COMMAND`. В данном
|
|
|
+В последнем примере ссылка на `VIEW` заключена внутрь тега `COMMAND`. В данном
|
|
|
случае это будет означать, что если мы работаем с "view4", то команды из
|
|
|
"view1" будут доступны с префиксом "do". Т.е. если оператор находится во
|
|
|
`VIEW` с именем "view4", то он должен написать в командной строке `do cmd1`,
|
|
@@ -1206,7 +1206,7 @@ SEQ сам может быть элементом контейнера SWITCH.
|
|
|
#### Атрибут `restore`
|
|
|
|
|
|
Предположим текущий путь состоит из нескольких уровней. Т.е. оператор вошел во
|
|
|
-вложеный `VIEW`. Находясь во вложенном `VIEW`, оператору доступны команды не
|
|
|
+вложенный `VIEW`. Находясь во вложенном `VIEW`, оператору доступны команды не
|
|
|
только текущего `VIEW`, но и всех родительских. Оператор вводит команду,
|
|
|
определенную в родительском `VIEW`. Атрибут `restore` определяет, будет ли
|
|
|
изменен текущий путь перед выполнением команды.
|
|
@@ -2082,3 +2082,79 @@ push /view_name1
|
|
|
```
|
|
|
<PLUGIN name="lua"/>
|
|
|
```
|
|
|
+
|
|
|
+Содержимое тега может задавать конфигурацию.
|
|
|
+
|
|
|
+Рассмотрим параметры конфигурации.
|
|
|
+
|
|
|
+### Параметр autostart
|
|
|
+
|
|
|
+```
|
|
|
+autostart="/usr/share/lua/klish/autostart.lua"
|
|
|
+```
|
|
|
+
|
|
|
+Когда плугин инициализируется, создаётся состояние Lua-машины которое (после fork)
|
|
|
+и будет использоваться для вызова Lua `ACTION` кода. Если необходимо загрузить
|
|
|
+какие-то библиотеки, это можно сделать за счёт задания autostart файла. Параметр
|
|
|
+может быть только один.
|
|
|
+
|
|
|
+
|
|
|
+### Параметр package.path
|
|
|
+
|
|
|
+```
|
|
|
+package.path="/usr/lib/lua/clish/?.lua;/usr/lib/lua/?.lua"
|
|
|
+```
|
|
|
+
|
|
|
+Задаёт Lua package.path (пути по которым идёт поиск модулей). Параметр может
|
|
|
+быть только один.
|
|
|
+
|
|
|
+### Параметр backtrace
|
|
|
+
|
|
|
+```
|
|
|
+backtrace=1
|
|
|
+```
|
|
|
+
|
|
|
+Показывать ли backtrace при падениях Lua кода. 0 или 1.
|
|
|
+
|
|
|
+### API
|
|
|
+
|
|
|
+При выполнении Lua `ACTION` доступны следующие функции:
|
|
|
+
|
|
|
+#### klish.par()
|
|
|
+
|
|
|
+Возвращает информацию о параметрах. Возможно два варианта применения этой
|
|
|
+функции.
|
|
|
+
|
|
|
+```
|
|
|
+local pars = klish.par()
|
|
|
+for k, v in ipairs(pars) do
|
|
|
+ for i, p in ipairs(pars[v]) do
|
|
|
+ print(string.format("%s[%d] = %s", v, i, p)
|
|
|
+ end
|
|
|
+end
|
|
|
+```
|
|
|
+
|
|
|
+Получение информации о всех параметрах. В таком случае функция вызывается без
|
|
|
+аргументов и возвращает таблицу всех параметров. Таблица содержит как список
|
|
|
+имён, так и массив значений для каждого имени. В примере выше показан итератор
|
|
|
+по всем параметрам с выводом их значений.
|
|
|
+
|
|
|
+Кроме того, klish.par может быть вызван для взятия значений конкретного
|
|
|
+параметра, например:
|
|
|
+
|
|
|
+```
|
|
|
+print("int_val = ", klish.par('int_val')[1])
|
|
|
+```
|
|
|
+
|
|
|
+#### klish.ppar()
|
|
|
+
|
|
|
+Работает точно так же как и `klish.par()`, но только для родительских
|
|
|
+параметров, если они есть в данном контексте.
|
|
|
+
|
|
|
+#### klish.path()
|
|
|
+
|
|
|
+Возвращает текущий путь в виде массива строк. Например:
|
|
|
+
|
|
|
+```
|
|
|
+print(table.concat(klish.path(), "/"))
|
|
|
+```
|