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