Skip to content
olevole edited this page Oct 9, 2023 · 3 revisions

Welcome to the qtbhyve wiki!

подготовка к работе со стороны пользователя:

При работе в режиме localhost, работаем с shell/cmd командами напрямую через sudo/doas. Вариант с sudo: от пользователя требуем, что его хост имеет настройку в sudoers.d вида:

Defaults     env_keep += "NOCOLOR"
Cmnd_Alias   CBSD_CMD = /usr/local/bin/cbsd
xuser   ALL=(ALL) NOPASSWD:SETENV: CBSD_CMD

(где 'xuser' - desktop пользователь). Таким образом, все операции с create/stop/start/destroy через CBSD начинаются всегда с одинакового префикса:

/usr/local/bin/sudo /usr/local/bin/cbsd [bcreate|bremove|bstop|bstart] ..
  1. пользователь, работающий с приложением, должен входить в группу 'cbsd':

% pw groupmod cbsd -m xuser

со стороны кода:

При старте приложения, необходимо 'просканировать' наличие всех необходимых команд в явно заданном PATH через утилиту which (если есть аналог на QT - использовать нативный), а именно (аналог на shell):

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

for i in cbsd vncviewer sudo; do
    _cmd=$( which $i )
    [ ! -x "${_cmd}" ] && exit 1
done

Те, если нет необходимых файлов в PATH, то вывести сообщение с ошибкой об отсутствии команды и умереть.

В коде, в местах вызова внешних команд использовать realpath именно тех путей, что были получены в результате этого скана.

При старте приложения, выполнить putenv для выключения ANSII Color через переменную окружения NOCOLOR, например:

putenv("NOCOLOR=1");

При старте приложения, найти и валидировать рабочий каталог CBSD, для этого

3a) Найти рабочий каталог

a) (макс приоритет) делаем getenv на предмет наличия переменной окружения 'cbsd_workdir', если он есть - используем его как рабочий каталог b) ищем значение параметра cbsd_workdir в ASCII файле /etc/rc.conf (парамет=значение). Например запись в /etc/rc.conf может выглядеть так:

... другие строчки
cbsd_workdir="/usr/jails"
... другие строчки

c) если a/b не найдены, форсируемся в значение cbsd_workdir равное '/usr/jails';

3b) валидирировать, что этот каталог является правильным - проверить наличие файла 'nc.inventory'. Так, если cbsd_workdir='/usr/jails', то должен существовать /usr/jails/nc.inventory.

3с) если файла nc.inventory нет, прежде чем начать работу, необходимо вызвать 'extra' команду, которая рабочий каталог проинициализирует в неинтерактивном/unattended режиме:

/usr/local/bin/sudo /usr/local/bin/cbsd /usr/local/cbsd/sudoexec/initenv inter=0 /usr/local/cbsd/share/initenv.conf
  1. При написании функций ввести некоторый уровень абстракции, в зависимости от метода работы с CBSD, предполагаются три режима: 'cmd' (через shell команды напрямую на localhost), 'ssh+cmd' (через shell команды, но на remote host через SSH), 'api' (RestAPI)

Те, функции могут быть такого вида:

realCreateVm_cmd()
{
    $cmd=SUDO_CMD . "cbsd bcreate <flavor'";
}

realCreateVm_api()
{
   ... curl ;)
}

createVM()
{
    case 'method':
        'cmd':
             realCreateVm_cmd
             ...
       'sshcmd':
             realCreateVm_cmdssh
            ...
       'api':
             realCreateVm_restapi
           ..
}