Browse Source

doc: klish-libs picture

Serj Kalichev 2 months ago
parent
commit
e98afdd49c
3 changed files with 311 additions and 84 deletions
  1. 196 0
      docs/klish-libs.drawio
  2. BIN
      docs/klish-libs.png
  3. 115 84
      docs/klish3.ru.md

+ 196 - 0
docs/klish-libs.drawio

@@ -0,0 +1,196 @@
+<mxfile host="Electron" modified="2024-02-26T14:42:40.074Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="bqdpGvCYloH_V2CmLT6M" version="23.1.5" type="device">
+  <diagram name="Страница — 1" id="ofldxw9UevGxW0dXk6p2">
+    <mxGraphModel dx="1147" dy="726" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+      <root>
+        <mxCell id="0" />
+        <mxCell id="1" parent="0" />
+        <mxCell id="FAqAWKsCC-taZUfcjODj-18" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.patternFillRect;fillStyle=diag;step=5;fillStrokeWidth=0.2;fillStrokeColor=#dddddd;dashed=1;" vertex="1" parent="1">
+          <mxGeometry x="20" y="40" width="500" height="180" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-1" value="Сервер klishd" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="160" y="80" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-2" value="Клиент klish" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="40" y="80" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-3" value="Библиотека&lt;br&gt;libtinyrl" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="40" y="160" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-4" value="Библиотека&lt;br&gt;libklish" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="160" y="160" width="140" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-7" value="Библиотека libfaux" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="40" y="280" width="190" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-9" value="Плагин функций&lt;br&gt;libklish-plugin-lua" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="400" y="80" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-11" value="Плагин БД&lt;br&gt;libklish-db-libxml2" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="280" y="80" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-13" value="Внешний плагин функций&lt;br&gt;libklish-plugin-sysrepo" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="540" y="80.48" width="150" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-19" value="Дерево исходных кодов klish" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+          <mxGeometry x="20" y="40" width="170" height="30" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-20" value="Библиотека libyang" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="490" y="280" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-21" value="Библиотека libsysrepo" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="610" y="280" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-22" value="Библиотека&lt;br&gt;liblua" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="370" y="280" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-23" value="Библиотека libxml2" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="250" y="280" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-25" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.4;exitY=0.981;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.12;entryY=0.661;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-2" target="FAqAWKsCC-taZUfcjODj-18">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="430" y="250" as="sourcePoint" />
+            <mxPoint x="480" y="200" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-26" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.071;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" target="FAqAWKsCC-taZUfcjODj-4">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="110" y="120" as="sourcePoint" />
+            <mxPoint x="175.5" y="157.9799999999999" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="110" y="150" />
+              <mxPoint x="170" y="150" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-29" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.218;exitY=0.981;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.152;entryY=-0.006;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-1" target="FAqAWKsCC-taZUfcjODj-4">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="410" y="250" as="sourcePoint" />
+            <mxPoint x="460" y="200" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-30" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.13;exitY=0.963;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="579.5" y="119.99999999999999" as="sourcePoint" />
+            <mxPoint x="290" y="160" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="580" y="150" />
+              <mxPoint x="290" y="150" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-31" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" target="FAqAWKsCC-taZUfcjODj-21">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="660" y="120.48" as="sourcePoint" />
+            <mxPoint x="660" y="278.48" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-32" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.543;exitY=1.013;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-13" target="FAqAWKsCC-taZUfcjODj-20">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="380" y="250.48" as="sourcePoint" />
+            <mxPoint x="541.5" y="280" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="621" y="270" />
+              <mxPoint x="540" y="270" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-33" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.7;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.4;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-9" target="FAqAWKsCC-taZUfcjODj-22">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="340" y="250" as="sourcePoint" />
+            <mxPoint x="390" y="200" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-34" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.619;exitY=0.442;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.795;entryY=-0.012;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-18" target="FAqAWKsCC-taZUfcjODj-23">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="340" y="250" as="sourcePoint" />
+            <mxPoint x="390" y="200" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-36" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="420" y="120" as="sourcePoint" />
+            <mxPoint x="260" y="160" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="420" y="140" />
+              <mxPoint x="260" y="140" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-38" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.424;entryY=0.656;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.205;exitY=1.013;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-11">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="300" y="130" as="sourcePoint" />
+            <mxPoint x="235.75" y="160.14000000000004" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="300" y="132" />
+              <mxPoint x="235.75" y="132.06" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-40" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.4;exitY=1.013;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-13">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="340" y="250" as="sourcePoint" />
+            <mxPoint x="210" y="280" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="600" y="260" />
+              <mxPoint x="210" y="260" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-42" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.822;exitY=0.45;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.842;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-18" target="FAqAWKsCC-taZUfcjODj-7">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="320" y="250" as="sourcePoint" />
+            <mxPoint x="370" y="200" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="430" y="250" />
+              <mxPoint x="200" y="250" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-43" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.783;entryY=-0.012;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" target="FAqAWKsCC-taZUfcjODj-7">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="320" y="120" as="sourcePoint" />
+            <mxPoint x="370" y="200" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="320" y="240" />
+              <mxPoint x="189" y="240" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-44" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.583;entryY=-0.012;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" target="FAqAWKsCC-taZUfcjODj-7">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="171" y="120" as="sourcePoint" />
+            <mxPoint x="180" y="200" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="171" y="130" />
+              <mxPoint x="150" y="130" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-45" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.051;entryY=-0.006;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" target="FAqAWKsCC-taZUfcjODj-7">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="50" y="120" as="sourcePoint" />
+            <mxPoint x="180" y="200" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="50" y="140" />
+              <mxPoint x="30" y="140" />
+              <mxPoint x="30" y="240" />
+              <mxPoint x="50" y="240" />
+            </Array>
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-46" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.08;exitY=0.889;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.105;entryY=0.013;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-18" target="FAqAWKsCC-taZUfcjODj-7">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="130" y="190" as="sourcePoint" />
+            <mxPoint x="180" y="140" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="FAqAWKsCC-taZUfcjODj-47" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.141;exitY=1.006;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.737;entryY=-0.006;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="FAqAWKsCC-taZUfcjODj-4" target="FAqAWKsCC-taZUfcjODj-7">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="130" y="200" as="sourcePoint" />
+            <mxPoint x="180" y="150" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+      </root>
+    </mxGraphModel>
+  </diagram>
+</mxfile>

BIN
docs/klish-libs.png


+ 115 - 84
docs/klish3.ru.md

@@ -40,8 +40,8 @@
 
 
 Какой из подходов лучше и проще в конкретном случае - определяется задачей.
 Какой из подходов лучше и проще в конкретном случае - определяется задачей.
 Klish в первую очередь рассчитан на подход Cisco, т.е. на немедленно выполняемые
 Klish в первую очередь рассчитан на подход Cisco, т.е. на немедленно выполняемые
-команды. Однако проект имеет систему плугинов, что позволяет расширять его
-возможности. Так плугин klish-plugin-sysrepo, реализованный отдельным проектом,
+команды. Однако проект имеет систему плагинов, что позволяет расширять его
+возможности. Так плагин klish-plugin-sysrepo, реализованный отдельным проектом,
 работая на основе хранилища sysrepo, позволяет организовать Juniper подход.
 работая на основе хранилища sysrepo, позволяет организовать Juniper подход.
 
 
 
 
@@ -61,19 +61,50 @@ klishd продолжает ожидать новых соединений от
 
 
 Задача клиента - передача ввода от оператора на сервер и получение от него
 Задача клиента - передача ввода от оператора на сервер и получение от него
 результата для показа оператору. Клиент не знает, какие команды существуют,
 результата для показа оператору. Клиент не знает, какие команды существуют,
-как их выполнять. Все это делает серверная сторона. Так как клиент имеет
-относительно простой код, не трудно реализовать альтернативные программы -
+как их выполнять. Выполнением занимается серверная сторона. Так как клиент имеет
+относительно простой код, нетрудно реализовать альтернативные программы -
 клиенты, например графический клиент или клиент для автоматизированного
 клиенты, например графический клиент или клиент для автоматизированного
-управления. Сейчас написан только текстовый клиент klish.
+управления. Сейчас существует только текстовый клиент командной строки klish.
 
 
-Основа проекта klish - библиотека libklish. На ее основе построены клиент klish
-и сервер klishd.
-
-Klish имеет два типа плугинов. Плугины для загрузки конфигурации команд
-(директория dbs/ в дереве исходных кодов) и плугины, реализующие действия для
-команд (директория plugins/ в дереве исходных кодов).
+![Библиотеки Klish](/klish-libs.png "Библиотеки Klish")
 
 
-Для настройки параметров сервера используется конфигурационный файл
+Основа проекта klish - библиотека libklish. На ее основе построены клиент klish
+и сервер klishd. Библиотека реализует все основные механизмы работы и
+взаимодействия. Библиотека входит в состав проекта klish.
+
+Текстовый клиент использует еще одну встроенную библиотеку -
+libtinyrl (Tiny ReadLine). Библиотека обеспечивает взаимодействие с пользователем
+при работе в командной строке.
+
+Все исполняемые файлы проекта klish, а также все его встроенные библиотеки
+используют в своей работе библиотеку libfaux (Library of Auxiliary Functions) -
+библиотеку вспомогательных функций. В предыдущих версиях проекта klish библиотека
+входила в состав исходных кодов klish, сейчас она выделена в отдельный проект и
+включает функции, облегчающие работу со строками, файлами, сетью, стандартными
+структурами данных и т.д. Библиотека libfaux является обязательной внешней
+зависимостью для проекта klish.
+
+Кроме этого, плагины klish, о которых будет сказано ниже, могут использовать и
+другие библиотеки для своей работы.
+
+Klish имеет два типа плагинов. Плагины для загрузки конфигурации команд
+(назовем их плагинами баз данных) и плагины, реализующие действия для
+команд от пользователя (назовем их плагинами функций). Klish не
+имеет встроенных команд и средств загрузки конфигурации (кроме специального
+случая ischeme). Вся эта функциональность реализована в плагинах. Несколько
+плагинов с базовой функциональностью входят в состав исходных кодов klish и
+находятся в директориях "dbs/" и "plugins/".
+
+Все необходимые плагины загружает слушающий сервер klishd в начале своей работы.
+Какие именно плагины для загрузки конфигурации пользовательских команд нужно
+использовать он узнает из своего базового файла конфигурации (специальный файл в
+формате INI). Затем с помощью плагина базы данных сервер klishd загружает
+конфигурацию пользовательских команд (например из XML файлов). Из этой
+конфигурации он узнает список необходимых плагинов функций, и так же загружает
+эти плагины в память. Однако использовать функции из плагинов функций будет
+только обслуживающий (не слушающий) сервер klishd по запросам от пользователя.
+
+Для настройки параметров сервера klishd используется конфигурационный файл
 `/etc/klish/klishd.conf`. Альтернативный конфигурационный файл можно указать при
 `/etc/klish/klishd.conf`. Альтернативный конфигурационный файл можно указать при
 запуске сервера klishd.
 запуске сервера klishd.
 
 
@@ -84,7 +115,7 @@ Klish имеет два типа плугинов. Плугины для заг
 
 
 ## Загрузка конфигурации команд
 ## Загрузка конфигурации команд
 
 
-В составе klish существуют следующие плугины dbs (DataBases) для загрузки
+В составе klish существуют следующие плагины dbs (DataBases) для загрузки
 конфигурации команд (схемы):
 конфигурации команд (схемы):
 
 
 * expat - Использует библиотеку expat для загрузки конфигурации из XML.
 * expat - Использует библиотеку expat для загрузки конфигурации из XML.
@@ -93,40 +124,40 @@ Klish имеет два типа плугинов. Плугины для заг
 * ischeme - Использует встроенную в C-код конфигурацию (Internal Scheme).
 * ischeme - Использует встроенную в C-код конфигурацию (Internal Scheme).
 
 
 Существует внутреннее представление схемы, совпадающее с ischeme.
 Существует внутреннее представление схемы, совпадающее с ischeme.
-Остальные плугины переводят внешние представление в ischeme, а klish
+Остальные плагины переводят внешние представление в ischeme, а klish
 обрабатывает ischeme внутренними механизмами.
 обрабатывает ischeme внутренними механизмами.
 
 
-Установленные плугины dbs находятся в `/usr/lib` (если конфигурировать
+Установленные плагины dbs находятся в `/usr/lib` (если конфигурировать
 сборку с --prefix=/usr). Их имена `libklish-db-<имя>.so`, например
 сборку с --prefix=/usr). Их имена `libklish-db-<имя>.so`, например
 `/usr/lib/libklish-db-libxml2.so`.
 `/usr/lib/libklish-db-libxml2.so`.
 
 
 
 
-## Плугины исполняемых функций
+## Плагины исполняемых функций
 
 
 Каждая команда klish выполняет какое-либо действие или несколько действий сразу.
 Каждая команда klish выполняет какое-либо действие или несколько действий сразу.
 Эти действия надо как-то описывать. Если смотреть внутрь реализации, то klish
 Эти действия надо как-то описывать. Если смотреть внутрь реализации, то klish
-может запускать только исполняемый откомпилированный код из плугина. Плугины
+может запускать только исполняемый откомпилированный код из плагина. Плагины
 содержат так называемые символы (symbol, sym), которые, по-сути, представляют
 содержат так называемые символы (symbol, sym), которые, по-сути, представляют
 собой функции с единым зафиксированным API. На эти символы могут ссылаться
 собой функции с единым зафиксированным API. На эти символы могут ссылаться
 команды klish. В свою очередь символ может выполнять сложный код, например
 команды klish. В свою очередь символ может выполнять сложный код, например
 запускать интерпретатор shell со скриптом, определяемым при описании команды
 запускать интерпретатор shell со скриптом, определяемым при описании команды
 klish в конфигурационном файле. Или же другой символ может исполнять Lua скрипт.
 klish в конфигурационном файле. Или же другой символ может исполнять Lua скрипт.
 
 
-Klish умеет получать символы только из плугинов. Стандартные символы реализованы
-в плугинах включенных в состав проекта klish. В состав klish входят следующие
-плугины:
+Klish умеет получать символы только из плагинов. Стандартные символы реализованы
+в плагинах включенных в состав проекта klish. В состав klish входят следующие
+плагины:
 
 
-* klish - Базовый плугин. Навигация, типы данных (для параметров),
+* klish - Базовый плагин. Навигация, типы данных (для параметров),
 вспомогательные функции.
 вспомогательные функции.
-* lua - Исполнение скриптов Lua. Механизм встроен в плугин и не использует
+* lua - Исполнение скриптов Lua. Механизм встроен в плагин и не использует
 внешнюю программу для интерпретации.
 внешнюю программу для интерпретации.
 * script - Исполнение скриптов. Учитывает шебанг (shebang) для определения
 * script - Исполнение скриптов. Учитывает шебанг (shebang) для определения
 какой интерпретатор использовать. Таким образом могут выполняться не только
 какой интерпретатор использовать. Таким образом могут выполняться не только
 shell скрипты, но и скрипты на других интерпретируемых языках. По умолчанию
 shell скрипты, но и скрипты на других интерпретируемых языках. По умолчанию
 используется интерпретатор shell.
 используется интерпретатор shell.
 
 
-Пользователи могут писать свои плугины и использовать собственные символы в
-командах klish. Установленные плугины находятся в `/usr/lib`
+Пользователи могут писать свои плагины и использовать собственные символы в
+командах klish. Установленные плагины находятся в `/usr/lib`
 (если конфигурировать сборку с --prefix=/usr). Их имена
 (если конфигурировать сборку с --prefix=/usr). Их имена
 `libklish-plugin-<имя>.so`, например `/usr/lib/libklish-plugin-script.so`.
 `libklish-plugin-<имя>.so`, например `/usr/lib/libklish-plugin-script.so`.
 
 
@@ -218,7 +249,7 @@ VIEW. Можно определить VIEW со "стандартными" ко
 Каждая команда должна определять действие, выполняемое при вводе этой команды
 Каждая команда должна определять действие, выполняемое при вводе этой команды
 оператором. Действие может быть одно, либо несколько действий для одной команды.
 оператором. Действие может быть одно, либо несколько действий для одной команды.
 Действие объявляется тегом `ACTION` внутри команды. В ACTION указывается ссылка
 Действие объявляется тегом `ACTION` внутри команды. В ACTION указывается ссылка
-на символ (функцию) из плугина функций, которая будет исполнена в данном случае.
+на символ (функцию) из плагина функций, которая будет исполнена в данном случае.
 Все данные внутри тега ACTION доступны символу. Символ по своему усмотрению может
 Все данные внутри тега ACTION доступны символу. Символ по своему усмотрению может
 использовать эту информацию. В качестве данных, например, может быть задан
 использовать эту информацию. В качестве данных, например, может быть задан
 скрипт, который будет выполнен символом.
 скрипт, который будет выполнен символом.
@@ -307,12 +338,12 @@ SEQ сам может быть элементом контейнера SWITCH.
 оператору. Если ACTION вернули ошибку, то элемент будет скрыт.
 оператору. Если ACTION вернули ошибку, то элемент будет скрыт.
 
 
 
 
-### Плугин
+### Плагин
 
 
-Процесс klishd загружает не все существующие плугины функций подряд, а только
+Процесс klishd загружает не все существующие плагины функций подряд, а только
 те, которые указаны в конфигурации с помощью тега `PLUGIN`. Данные внутри тега
 те, которые указаны в конфигурации с помощью тега `PLUGIN`. Данные внутри тега
-могут интерпретироваться функцией инициализации плугина по своему усмотрению,
-в частности, как конфигурация для плугина.
+могут интерпретироваться функцией инициализации плагина по своему усмотрению,
+в частности, как конфигурация для плагина.
 
 
 
 
 ### Горячие клавиши
 ### Горячие клавиши
@@ -437,13 +468,13 @@ SEQ сам может быть элементом контейнера SWITCH.
 
 
 ### PLUGIN
 ### PLUGIN
 
 
-Самостоятельно klish не загружает никаких плугинов исполняемых функций.
+Самостоятельно klish не загружает никаких плагинов исполняемых функций.
 Соответственно пользователю недоступны никакие символы для использования в
 Соответственно пользователю недоступны никакие символы для использования в
-действиях ACTION. Загрузку плугинов нужно в явном виде прописывать в файлах
+действиях ACTION. Загрузку плагинов нужно в явном виде прописывать в файлах
 конфигурации. Для этого используется тег `PLUGIN`.
 конфигурации. Для этого используется тег `PLUGIN`.
 
 
-Обратите внимание, что даже базовый плугин с именем "klish" также не загружается
-автоматически и его надо прописывать в файлах конфигурации. В этом плугине, в
+Обратите внимание, что даже базовый плагин с именем "klish" также не загружается
+автоматически и его надо прописывать в файлах конфигурации. В этом плагине, в
 частности, реализована навигация. Типичная конфигурация будет содержать строку:
 частности, реализована навигация. Типичная конфигурация будет содержать строку:
 
 
 ```
 ```
@@ -455,9 +486,9 @@ SEQ сам может быть элементом контейнера SWITCH.
 
 
 #### Атрибут `name`
 #### Атрибут `name`
 
 
-Атрибут определяет имя, под которым плугин будет распознаваться внутри файлов
+Атрибут определяет имя, под которым плагин будет распознаваться внутри файлов
 конфигурации. Когда `ACTION` ссылается на символ, то может быть указано просто
 конфигурации. Когда `ACTION` ссылается на символ, то может быть указано просто
-имя символа, а может быть уточнено, в каком плугине искать символ.
+имя символа, а может быть уточнено, в каком плагине искать символ.
 
 
 ```
 ```
 <ACTION sym="my_sym"\>
 <ACTION sym="my_sym"\>
@@ -465,26 +496,26 @@ SEQ сам может быть элементом контейнера SWITCH.
 <ACTION sym="my_sym@my_plugin"\>
 <ACTION sym="my_sym@my_plugin"\>
 ```
 ```
 
 
-В первом случае klish будет искать "my_sym" во всех плугинах и использует первый
-найденный. Во втором случае поиск будет производиться только в плугине
-"my_plugin". Кроме того, разные плугины могут содержать одноименные символы и
-указание плугина позволит узнать, какой из символов имелся в виду.
+В первом случае klish будет искать "my_sym" во всех плагинах и использует первый
+найденный. Во втором случае поиск будет производиться только в плагине
+"my_plugin". Кроме того, разные плагины могут содержать одноименные символы и
+указание плагина позволит узнать, какой из символов имелся в виду.
 
 
 Если не указаны атрибуты `id` и `file`, то `name` используется также для
 Если не указаны атрибуты `id` и `file`, то `name` используется также для
-формирования имени файла плугина. Плугин должен иметь имя `kplugin-<name>.so` и
+формирования имени файла плагина. Плагин должен иметь имя `kplugin-<name>.so` и
 находиться в директории `/usr/lib/klish/plugins` (если klish был сконфигурирован
 находиться в директории `/usr/lib/klish/plugins` (если klish был сконфигурирован
 с `--prefix=/usr`).
 с `--prefix=/usr`).
 
 
 
 
 #### Атрибут `id`
 #### Атрибут `id`
 
 
-Атрибут используется для формирования имени файла плугина, если не указан атрибут
-`file`. Плугин должен иметь имя `kplugin-<id>.so` и находиться в директории
+Атрибут используется для формирования имени файла плагина, если не указан атрибут
+`file`. Плагин должен иметь имя `kplugin-<id>.so` и находиться в директории
 `/usr/lib/klish/plugins` (если klish был сконфигурирован
 `/usr/lib/klish/plugins` (если klish был сконфигурирован
 с `--prefix=/usr`).
 с `--prefix=/usr`).
 
 
 Если указан атрибут `id`, то `name` не будет использоваться для формирования
 Если указан атрибут `id`, то `name` не будет использоваться для формирования
-имени файла плугина, а только для идентификации внутри файлов конфигурации.
+имени файла плагина, а только для идентификации внутри файлов конфигурации.
 
 
 ```
 ```
 <PLUGIN name="alias_for_klish" id="klish"\>
 <PLUGIN name="alias_for_klish" id="klish"\>
@@ -495,9 +526,9 @@ SEQ сам может быть элементом контейнера SWITCH.
 
 
 #### Атрибут `file`
 #### Атрибут `file`
 
 
-Полное имя файла плугина (разделяемой библиотеки) может быть указано в явном
+Полное имя файла плагина (разделяемой библиотеки) может быть указано в явном
 виде. Если указан атрибут `file`, то никакие другие атрибуты не будут
 виде. Если указан атрибут `file`, то никакие другие атрибуты не будут
-использоваться для формирования имени файла плугина, а будет взято значение
+использоваться для формирования имени файла плагина, а будет взято значение
 `file` "как есть" и передано функции dlopen(). Это означает, что может быть
 `file` "как есть" и передано функции dlopen(). Это означает, что может быть
 указан как абсолютный путь, так и просто имя файла, но в таком случае файл
 указан как абсолютный путь, так и просто имя файла, но в таком случае файл
 должен находиться по стандартным путям, используемым при поиске разделяемой
 должен находиться по стандартным путям, используемым при поиске разделяемой
@@ -513,8 +544,8 @@ SEQ сам может быть элементом контейнера SWITCH.
 #### Данные внутри тега
 #### Данные внутри тега
 
 
 Данные внутри тега `PLUGIN` могут быть обработаны функцией инициализации
 Данные внутри тега `PLUGIN` могут быть обработаны функцией инициализации
-плугина. Формат данных остается на усмотрение самого плугина. Например,
-в качестве данных могут быть указаны настройки для плугина.
+плагина. Формат данных остается на усмотрение самого плагина. Например,
+в качестве данных могут быть указаны настройки для плагина.
 
 
 ```
 ```
 <PLUGIN name="sysrepo">
 <PLUGIN name="sysrepo">
@@ -576,7 +607,7 @@ SEQ сам может быть элементом контейнера SWITCH.
 соответствующей команды, действия, определенные в `ACTION` будут выполнены.
 соответствующей команды, действия, определенные в `ACTION` будут выполнены.
 
 
 Основным атрибутом `ACTION` является `sym`. Действие может выполнять только
 Основным атрибутом `ACTION` является `sym`. Действие может выполнять только
-символы (функции), определенные в плугинах. Атрибут `sym` ссылается на такой
+символы (функции), определенные в плагинах. Атрибут `sym` ссылается на такой
 символ.
 символ.
 
 
 Действия могут выполняться не только командой. Далее приведен список тегов,
 Действия могут выполняться не только командой. Далее приведен список тегов,
@@ -638,21 +669,21 @@ SEQ сам может быть элементом контейнера SWITCH.
 
 
 #### Атрибут `sym`
 #### Атрибут `sym`
 
 
-Атрибут ссылается на символ (функцию) из плугина. Эта функция будет выполнена при
+Атрибут ссылается на символ (функцию) из плагина. Эта функция будет выполнена при
 выполнении `ACTION`. В качестве значения может быть указано имя символа, например
 выполнении `ACTION`. В качестве значения может быть указано имя символа, например
 `sym="my_sym"`. В таком случае поиск символа будет происходить по всем
 `sym="my_sym"`. В таком случае поиск символа будет происходить по всем
-загруженным плугинам. Если указан плугин, в котором надо искать символ, например
-`sym="my_sym@my_plugin"`, то в других плугинах поиск производиться не будет.
+загруженным плагинам. Если указан плагин, в котором надо искать символ, например
+`sym="my_sym@my_plugin"`, то в других плагинах поиск производиться не будет.
 
 
 В разных ситуациях может быть выгодно использовать разные подходы, относительно
 В разных ситуациях может быть выгодно использовать разные подходы, относительно
-того, указывать ли имя плугина для символа. С одной стороны, несколько плугинов
+того, указывать ли имя плагина для символа. С одной стороны, несколько плагинов
 могут содержать символы с одинаковым именем и для однозначной идентификации
 могут содержать символы с одинаковым именем и для однозначной идентификации
-символа указание плугина будет обязательным. Кроме этого при указании плугина
+символа указание плагина будет обязательным. Кроме этого при указании плагина
 поиск символа будет проходить немного быстрее. С другой стороны, можно написать
 поиск символа будет проходить немного быстрее. С другой стороны, можно написать
 некие универсальные команды, в которых указываются символы без принадлежности к
 некие универсальные команды, в которых указываются символы без принадлежности к
-плугину. Тогда несколько плугинов могут реализовать "интерфейс", т.е. все
+плагину. Тогда несколько плагинов могут реализовать "интерфейс", т.е. все
 используемые символы, а их реальное содержание будет зависеть от того, какой
 используемые символы, а их реальное содержание будет зависеть от того, какой
-плугин загружен.
+плагин загружен.
 
 
 
 
 #### Атрибут `lock`
 #### Атрибут `lock`
@@ -707,12 +738,12 @@ SEQ сам может быть элементом контейнера SWITCH.
 Возможные значения атрибута - `true` и `false`. По умолчанию `false`, т.е.
 Возможные значения атрибута - `true` и `false`. По умолчанию `false`, т.е.
 действие не является "постоянным" и будет отключено в режиме "dry-run".
 действие не является "постоянным" и будет отключено в режиме "dry-run".
 
 
-Символы, при объявлении их в плугине, уже имеют признак постоянства. Символ
+Символы, при объявлении их в плагине, уже имеют признак постоянства. Символ
 может быть принудительно объявлен постоянным, принудительно объявлен
 может быть принудительно объявлен постоянным, принудительно объявлен
-непостоянным, либо плугин может отдать решение о постоянстве на откуп
-пользователю. Если флаг постоянства объявлен принудительно в плугине, то
+непостоянным, либо плагин может отдать решение о постоянстве на откуп
+пользователю. Если флаг постоянства объявлен принудительно в плагине, то
 настройка атрибута `permanent` не будет влиять ни на что. Она не может
 настройка атрибута `permanent` не будет влиять ни на что. Она не может
-переопределить флаг постоянства, принудительно определенный внутри плугина.
+переопределить флаг постоянства, принудительно определенный внутри плагина.
 
 
 
 
 #### Атрибут `sync`
 #### Атрибут `sync`
@@ -727,12 +758,12 @@ SEQ сам может быть элементом контейнера SWITCH.
 Возможные значения атрибута - `true` и `false`. По умолчанию `false`, т.е.
 Возможные значения атрибута - `true` и `false`. По умолчанию `false`, т.е.
 символ будет выполняться асинхронно.
 символ будет выполняться асинхронно.
 
 
-Символы, при объявлении их в плугине, уже имеют признак синхронности. Символ
-может быть принудительно объявлен синхронным, асинхронным, либо плугин может
+Символы, при объявлении их в плагине, уже имеют признак синхронности. Символ
+может быть принудительно объявлен синхронным, асинхронным, либо плагин может
 отдать решение о синхронности на откуп пользователю. Если флаг постоянства
 отдать решение о синхронности на откуп пользователю. Если флаг постоянства
-объявлен принудительно в плугине, то настройка атрибута `sync` не будет влиять
+объявлен принудительно в плагине, то настройка атрибута `sync` не будет влиять
 ни на что. Она не может переопределить флаг синхронности, принудительно
 ни на что. Она не может переопределить флаг синхронности, принудительно
-определенный внутри плугина.
+определенный внутри плагина.
 
 
 
 
 #### Атрибут `update_retcode`
 #### Атрибут `update_retcode`
@@ -832,7 +863,7 @@ SEQ сам может быть элементом контейнера SWITCH.
 #### Данные внутри тега
 #### Данные внутри тега
 
 
 Данные внутри тега `ACTION` используются по усмотрению самого символа,
 Данные внутри тега `ACTION` используются по усмотрению самого символа,
-указанного атрибутом `sym`. Как пример можно привести символ `script` из плугина
+указанного атрибутом `sym`. Как пример можно привести символ `script` из плагина
 `script`. Этот символ использует данные внутри тега, как код скрипта, который
 `script`. Этот символ использует данные внутри тега, как код скрипта, который
 он должен выполнить.
 он должен выполнить.
 
 
@@ -1675,7 +1706,7 @@ SEQ сам может быть элементом контейнера SWITCH.
 ```
 ```
 
 
 В примере объявляется тип данных "ptype1". Это целое число и символ `INT` из
 В примере объявляется тип данных "ptype1". Это целое число и символ `INT` из
-стандартного плугина "klish" проверяет, что введенный аргумент действительно
+стандартного плагина "klish" проверяет, что введенный аргумент действительно
 является целым числом.
 является целым числом.
 
 
 Другие варианты использования тега `PTYPE` и атрибута `ptype` рассматриваются в
 Другие варианты использования тега `PTYPE` и атрибута `ptype` рассматриваются в
@@ -1723,7 +1754,7 @@ SEQ сам может быть элементом контейнера SWITCH.
 
 
 В примере для `VIEW` с именем "main", который является текущим путем по
 В примере для `VIEW` с именем "main", который является текущим путем по
 умолчанию при запуске klish, определяется приглашение пользователя. В `ACTION`
 умолчанию при запуске klish, определяется приглашение пользователя. В `ACTION`
-используется символ `prompt` из стандартного плугина "klish", который помогает
+используется символ `prompt` из стандартного плагина "klish", который помогает
 в формировании приглашения, заменяя конструкции `%u` или `%h` подстановками.
 в формировании приглашения, заменяя конструкции `%u` или `%h` подстановками.
 В частности `%u` заменяется на имя текущего пользователя, а `%h` на имя хоста.
 В частности `%u` заменяется на имя текущего пользователя, а `%h` на имя хоста.
 
 
@@ -1835,23 +1866,23 @@ SEQ сам может быть элементом контейнера SWITCH.
 если не существует, то команда скрыта.
 если не существует, то команда скрыта.
 
 
 
 
-## Плугин "klish"
+## Плагин "klish"
 
 
-В состав дерева исходных кодов klish входит код стандартного плугина "klish".
-Плугин содержит базовые типы данных, команду навигации и другие вспомогательные
-символы. В подавляющем большинстве случаев этот плугин нужно использовать.
+В состав дерева исходных кодов klish входит код стандартного плагина "klish".
+Плагин содержит базовые типы данных, команду навигации и другие вспомогательные
+символы. В подавляющем большинстве случаев этот плагин нужно использовать.
 Однако он не подключается автоматически, т.к. в каких-то редких специфических
 Однако он не подключается автоматически, т.к. в каких-то редких специфических
 случаях может понадобиться возможность работать без него.
 случаях может понадобиться возможность работать без него.
 
 
-Стандартный способ подключить плугин "klish" в конфигурационных файлах:
+Стандартный способ подключить плагин "klish" в конфигурационных файлах:
 
 
 ```
 ```
 <PLUGIN name="klish"/>
 <PLUGIN name="klish"/>
 ```
 ```
 
 
-Вместе с плугином идет файл `ptypes.xml`, где объявлены базовые типы данных в
+Вместе с плагином идет файл `ptypes.xml`, где объявлены базовые типы данных в
 виде элементов [`PTYPE`](#ptype). Объявленные типы данных используют символы
 виде элементов [`PTYPE`](#ptype). Объявленные типы данных используют символы
-плугина для проверки соответствия аргумента типу данных.
+плагина для проверки соответствия аргумента типу данных.
 
 
 
 
 ### Типы данных
 ### Типы данных
@@ -2016,9 +2047,9 @@ push /view_name1
 ```
 ```
 
 
 
 
-## Плугин "script"
+## Плагин "script"
 
 
-Плугин "script" содержит всего один символ `script` и служит для выполнения
+Плагин "script" содержит всего один символ `script` и служит для выполнения
 скриптов. Скрипт содержится в теле элемента `ACTION`. Скрипт может быть написан
 скриптов. Скрипт содержится в теле элемента `ACTION`. Скрипт может быть написан
 на разных скриптовых языках программирования. По умолчанию считается, что скрипт
 на разных скриптовых языках программирования. По умолчанию считается, что скрипт
 написан для интерпретатора shell и запускается при помощи `/bin/sh`. Чтобы
 написан для интерпретатора shell и запускается при помощи `/bin/sh`. Чтобы
@@ -2026,8 +2057,8 @@ push /view_name1
 текст вида `#!/path/to/binary`, находящийся в самой первой строке скрипта.
 текст вида `#!/path/to/binary`, находящийся в самой первой строке скрипта.
 Текст `/path/to/binary` - это путь, по которому находится интерпретатор скрипта.
 Текст `/path/to/binary` - это путь, по которому находится интерпретатор скрипта.
 
 
-Плугин `script` входит в состав исходного кода проекта klish, а подключить
-плугин можно следующим образом:
+Плагин `script` входит в состав исходного кода проекта klish, а подключить
+плагин можно следующим образом:
 
 
 ```
 ```
 <PLUGIN name="script"/>
 <PLUGIN name="script"/>
@@ -2074,16 +2105,16 @@ push /view_name1
 объявлен `ACTION` считается уже второй и определять шебанг в ней нельзя.
 объявлен `ACTION` считается уже второй и определять шебанг в ней нельзя.
 
 
 
 
-## Плугин "lua"
+## Плагин "lua"
 
 
-Плугин "lua" содержит всего один символ `lua` и служит для выполнения
+Плагин "lua" содержит всего один символ `lua` и служит для выполнения
 скриптов на языке "Lua". Скрипт содержится в теле элемента `ACTION`. В отличие
 скриптов на языке "Lua". Скрипт содержится в теле элемента `ACTION`. В отличие
-от символа `script` из плугина ["script"](#плугин-script), символ `lua` не
+от символа `script` из плагина ["script"](#плагин-script), символ `lua` не
 вызывает внешнюю программу-интерпретатор для выполнения скриптов, а использует
 вызывает внешнюю программу-интерпретатор для выполнения скриптов, а использует
 внутренние механизмы для этого.
 внутренние механизмы для этого.
 
 
-Плугин `lua` входит в состав исходного кода проекта klish, а подключить
-плугин можно следующим образом:
+Плагин `lua` входит в состав исходного кода проекта klish, а подключить
+плагин можно следующим образом:
 
 
 ```
 ```
 <PLUGIN name="lua"/>
 <PLUGIN name="lua"/>
@@ -2093,7 +2124,7 @@ push /view_name1
 
 
 ### Параметры конфигурации
 ### Параметры конфигурации
 
 
-Рассмотрим параметры конфигурации плугина.
+Рассмотрим параметры конфигурации плагина.
 
 
 #### autostart
 #### autostart
 
 
@@ -2101,7 +2132,7 @@ push /view_name1
 autostart="/usr/share/lua/klish/autostart.lua"
 autostart="/usr/share/lua/klish/autostart.lua"
 ```
 ```
 
 
-Когда плугин инициализируется, создаётся состояние Lua-машины которое (после fork)
+Когда плагин инициализируется, создаётся состояние Lua-машины которое (после fork)
 и будет использоваться для вызова Lua `ACTION` кода. Если необходимо загрузить
 и будет использоваться для вызова Lua `ACTION` кода. Если необходимо загрузить
 какие-то библиотеки, это можно сделать за счёт задания autostart файла. Параметр
 какие-то библиотеки, это можно сделать за счёт задания autostart файла. Параметр
 может быть только один.
 может быть только один.