forked from cbsd/cbsd-wwwdoc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcbsdsh.html
63 lines (60 loc) · 9.81 KB
/
cbsdsh.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<!--# include file="_start.html" -->
<h2><a name="shsqlite">О cbsd shell и SQLite3</a></h2>
<div class="block">
<p>99% кода <strong>CBSD</strong> написана на <strong>sh</strong> по следующим причинам:</p>
<ul>
<li>скрипты в основном повторяют ввод команд системного администратора в консоли, то есть работают с внешними утилитами, такими как: <strong>zfs</strong>, <strong>zpool</strong>, <strong>sudo</strong>, <strong>pkg</strong>, <strong>rsync</strong>, соответственно, необходимость применять языки программирования по большей части отсутствует. Часть узких мест, а также некоторый функционал (logtail, репликация, демон следящий за нодами и тп) написаны на C (в планах переписывать узкие места на Си и дальше).</li>
<li>размер <strong>sh</strong> интерпретатора немногим больше 100 Кбайт, в отличие от bash или perl/python, что обеспечивает менее накладный bootstrap скрипта</li>
<li><strong>CBSD</strong> ориентирована в первую очередь на системных инженеров, которые могут не знать какой-либо язык из <strong>Perl, Python, Lua, C, Go</strong> и т.п, но shell-скриптинг является той базой знаний в среде Unix, которую знают все (или должны знать ;-)</li>
<li>От языка не требуется выполнять много парсинга и математики, в основном он работает с внешними утилитами или API</li>
</ul>
<p>Тем не менее, огромное количество ограничений <strong>sh</strong> (в основном при работе со строчками) делает написание сценариев делом непростым, ввиду этого, в cbsd идет форк /bin/sh в котором добавлен (и будет добавлятся) дополнительный функционал, который будет описываться в этом документе</p>
<p>Таким образом, если вы хотите изменить/дописать <strong>CBSD</strong> или ее модули, вам хватит привычных знаний по sh и нескольких расширяющих команд.</p>
</div>
<h2><a name="cbsdsh">cbsdsh</a></h2>
<div class="block">
<p>cbsdsh - это модифицированная версия /bin/sh и в данный момент она имеет следующие отличия от /bin/sh:</p>
<ul>
<li>- Добавлена функция <strong>cbsd_pwait</strong>. Отличия от <a href="http://man.freebsd.org/pwait/1" target="_blank">pwait(1)</a> в том, что она позволяет указать таймаут на ожидание конца процесса. Используется, к примеру, для обеспечения параллельного запуска клеток, когда следующая клетка может начать запускаться или останавливаться параллельно не дожидаясь предыдущей клетки, которая, возможно - зависла (ошибка в rc-скрипте, неубиваемый процесс и тд)</li>
<li>- Добавлена функция <strong>cbsd_fwatch</strong> для слежения за модификациями файлов. Например, используется для слежки за модификациями SQLite3 баз в taskd-демоне</li>
<li>- Добавлена функция <strong>strlen</strong> для определения длины строки</li>
<li>- Добавлена функция <strong>is_number</strong> для определения число ли это.</li>
<li>- Добавлена функция <strong>strpos</strong> для откусывания произвльного количества символов из строчки</li>
<li>- cbsdsh слинкован с SQLite3 для того, чтобы с базами SQL можно было работать <em>inline</em> в шелле и соотв, сценариях:
<pre class="brush:bash;ruler:true;">
cbsd@home> pwd
/tmp
cbsd@home> uname -r
11.0-CURRENT
cbsd@home> cbsdsql local SELECT dsk_controller,dsk_path,dsk_slot FROM bhyvedsk WHERE jname=\"debian1\"
ahci-hd|dsk1.vhd|0
cbsd@home>
</pre>
</li>
<li>- Добавлена функция <strong>cbsdsql</strong> как build-in функция шелла для запросов в SQL, в качестве второго аргумента идет база, все что дальше - сам SQL запрос. В качестве имени базы выступает непосредственно имя файла в <em>$workdir/var/db/</em>, при этом путь и расширение файла <em>.sqlite</em> писать не нужно. Например, если вы хотите получить список клеток с удаленной ноды node2, информация которой находится в SQLite файле <em>/usr/jails/var/db/node2.sqlite</em> и содержимое которой (в новых версиях CBSD) реплицируется с источника, в шелле вы можете написать так:
<pre class="brush:bash;ruler:true;">
...
cbsdsql node2 SELECT jname FROM jails
</pre>
<p>или назначить результат SQL команды shell-переменной, после чего разобрав его на выбранные переменные:</p>
<pre class="brush:bash;ruler:true;">
_res=$( cbsdsh local SELECT ip4_addr,jname,status FROM jails )
sqllist ${_res} ip4_addr jname status
echo "Jail name: ${jname}; IPs: ${ip4_addr}; Jail status: ${status}
</pre>
</li>
</ul>
<p>Если вы находитесь в <strong>cbsdsh</strong>, то перед <strong>CBSD</strong> командами не требуется вводить префикс <strong>cbsd</strong>:</p>
<p class="text-center"><img src="/img/cbsdsh1.png" alt="" /></p>
<p><strong>CBSD</strong> в работе использует язык SQL и SQLite3 для работы с параметрами jail по следующим причинам:</p>
<ul>
<li>Хранить и тем более работать с таким количеством параметров в обычных ascii-файлах очень тяжело</li>
<li>SQLite3 реплицируется не целым файлом, а лишь SQL инструкцией. Кроме этого, SQLite3 вместо MySQL/PgSQL/прочих позволяет добиться децентрализованности в данных, не завися от одной точки сбоя.</li>
<li>SQLite3 не требует запущенного демона и крайне портабельна</li>
<li>Многие утилиты ОС по независящим от нас причинам могут менять свой метод хранения. К примеру, до версии FreeBSD 10, jail конфигурировался через командную строчку, начиная с версии 10, оригинальные клетки обзавелись своими конфиг-файлами в формате YAML. Чтобы не страдать от таких изменений и переписывать все скрипты, работа с этими конфигами выведена в одну процедуру, остальные же подсистемы работают со своим "неизменчивым" API. Кроме этого, SQL базы является "универсальным" storage из которого легко можно формировать любые другие noSQL/xml/yaml данные</li>
<li>Вместо SQLite3 можно легко слинковать с внешней базой данных MySQL, PgSQL, которая будет выступать центральным "реестром" для всей фермы, при этом скрипты переписывать не нужно. Также, репликация данных с нод на ноду не нужна, поскольку все ноды обновляют и читают центральный реестр.</li>
<li>Каждая нода на запись работает только со своим собственным SQLite3 файлом (символический линк <em>$workdir/var/db/local.sqlite</em>), все файлы удаленных нод находятся в том же каталоге но под своими именами, поэтому локальная работа ноды не зависит от состояния информации с удаленной ноды.</li>
</ul>
<p>Модули и команды, которые мало работают с внешними утилитами, но много со строчками и математикой (хелперы <strong>CBSD</strong> для некоторых сервисов в их числе), удобно писать на LUA (которая пока не встроена в cbsdsh ;-) )</p>
</div>
<!--# include file="_end.html" -->