<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Writer</id>
	<title>Svacer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Writer"/>
	<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Special:Contributions/Writer"/>
	<updated>2026-04-15T08:57:14Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=3357</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=3357"/>
		<updated>2025-11-20T12:36:36Z</updated>

		<summary type="html">&lt;p&gt;Writer: Add Edit_markers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--edit-markers) ===&lt;br /&gt;
При импорте снимка с использованием --edit-markers можно модифицировать маркеры более гибко, см [[Edit markers (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. Параметры &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ttl&amp;lt;/code&amp;gt; обязательны. TTL указывается в днях&lt;br /&gt;
 svacer server token create --name token_name --ttl day_to_live --details more_info&lt;br /&gt;
* Просмотреть список созданных токенов&lt;br /&gt;
 svacer server token list&lt;br /&gt;
* Удалить токен &lt;br /&gt;
 svacer server token delete --id token_id&lt;br /&gt;
* Управлять токенами других пользователей (требуется наличие прав по управлению пользователями)&lt;br /&gt;
&lt;br /&gt;
 svacer server token list --user user_id_or_login — получение списка токенов пользователя&lt;br /&gt;
 svacer server token admin delete --id token_id — удаление токена&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на создаваемые токены — нельзя с помощью такого токена создавать другие токены. Каждый пользователь может создавать токены также через public API: &amp;lt;code&amp;gt;/api/public/personal_token&amp;lt;/code&amp;gt;. См. описание swagger.&lt;br /&gt;
&lt;br /&gt;
Созданные токены можно в дальнейшем использовать в качестве значения переменной окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3351</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3351"/>
		<updated>2025-11-19T08:29:16Z</updated>

		<summary type="html">&lt;p&gt;Writer: /* Механизм интеграции с внешними системами посредством Webhook-ов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию - одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей - по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer server webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''')&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
     uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2448</id>
		<title>Markup2</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2448"/>
		<updated>2024-12-24T10:58:36Z</updated>

		<summary type="html">&lt;p&gt;Writer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public REST API для экспорта, импорта и копирования разметки ==&lt;br /&gt;
Релиз 10.х Svacer включает новый API, предназначенный для экспорта, импорта и копирования разметки. API доступен по endpoint-ам&lt;br /&gt;
 POST /api/public/markup/import&lt;br /&gt;
 POST /api/public/markup/export&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
&lt;br /&gt;
Разметка описывается посредством protobuf схемы:&lt;br /&gt;
&lt;br /&gt;
 // Represents exported review (review itself + comments)&lt;br /&gt;
 // Review is associated with invariant and has list of locations&lt;br /&gt;
 message Review { &lt;br /&gt;
   &lt;br /&gt;
   // Defines model for concrete location of the review&lt;br /&gt;
   message Location {            &lt;br /&gt;
     string warnClass = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     uint32 line = 3;&lt;br /&gt;
     string details = 4;&lt;br /&gt;
     string mtid = 5;&lt;br /&gt;
     string function = 10;&lt;br /&gt;
     bytes content_hash = 6;&lt;br /&gt;
     bytes trace_hash = 7;&lt;br /&gt;
     bytes marker_hash = 8;&lt;br /&gt;
     bytes line_hash = 9;    &lt;br /&gt;
     string tool = 11;&lt;br /&gt;
     string lang = 12;&lt;br /&gt;
   }  &lt;br /&gt;
   // Defines model for comment&lt;br /&gt;
   message Comment {      &lt;br /&gt;
     string text = 1;&lt;br /&gt;
     optional string format = 2;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 3;&lt;br /&gt;
     optional google.protobuf.Timestamp update_ts = 4;&lt;br /&gt;
     string createdBy = 5;      &lt;br /&gt;
     string origin_id = 6;   &lt;br /&gt;
     optional uint64 review_id = 7; // refers to Review.id field&lt;br /&gt;
     optional string created_by_id = 8;&lt;br /&gt;
   }&lt;br /&gt;
   // Defines model for review itself&lt;br /&gt;
   message ReviewData {&lt;br /&gt;
     string status = 1;&lt;br /&gt;
     string severity = 2;&lt;br /&gt;
     string action = 3;&lt;br /&gt;
     string origin_id = 4;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 5;&lt;br /&gt;
     string created_by = 6;&lt;br /&gt;
     optional string created_by_id = 7;&lt;br /&gt;
     optional string created_from = 8;&lt;br /&gt;
   }  &lt;br /&gt;
   // Invariant of the marker&lt;br /&gt;
   string invariant = 1; &lt;br /&gt;
   // Review information associated with markers having given invariant&lt;br /&gt;
   optional ReviewData review_data = 2;  &lt;br /&gt;
   // List of comments associated with all markers having given invariant&lt;br /&gt;
   repeated Comment comments = 3; &lt;br /&gt;
   // List of locations associated with given invariant. Locations can be used to apply fuzzy matching of review with existing data when there is no invariant match  &lt;br /&gt;
   repeated Location locations = 4;&lt;br /&gt;
   // Export-specific ID, comments can refer to this id if comment is associated with review operation&lt;br /&gt;
   uint64 id = 5;&lt;br /&gt;
   // Meta-information about export, when exporting to file field is initialized only for the first element&lt;br /&gt;
   optional ReviewExportMeta meta = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Defines meta-information about exported review&lt;br /&gt;
 message ReviewExportMeta {&lt;br /&gt;
   message Container {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string name = 2;&lt;br /&gt;
   }  &lt;br /&gt;
   google.protobuf.Timestamp create_ts = 1; // timestamp when export was produced (UTC)&lt;br /&gt;
   string created_by = 2; // user who triggered export&lt;br /&gt;
   string svacer_version = 3;  // svacer version&lt;br /&gt;
   optional Container project = 4; // source container (project)&lt;br /&gt;
   optional Container branch = 5; // source container (branch)&lt;br /&gt;
   map&amp;lt;string,string&amp;gt; properties = 6; // extra properties&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Актуальную версию схемы можно получить из Svacer по API: &amp;lt;code&amp;gt;GET /api/public/markup/schema&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=При сериализации в JSON используются proto-имена полей. При работе с данными из Go рекомендуется использовать [https://pkg.go.dev/google.golang.org/protobuf/encoding/protojson protojson] для сериализации и десериализации.}}&lt;br /&gt;
&lt;br /&gt;
Svacer поддерживает два формата для экспортирования/импортирования разметки:&lt;br /&gt;
&lt;br /&gt;
* JSON с разделением по newline-ам. Каждая строка представляет собой объект типа '''Review''' (указано выше) сериализованный в JSON&lt;br /&gt;
* Бинарный формат: последовательность блоков &amp;lt;code&amp;gt;[lenght little endian][proto]&amp;lt;/code&amp;gt;, где первый блок содержит длину следующего блока в формате &amp;lt;code&amp;gt;u32 little endian&amp;lt;/code&amp;gt;, а второй блок содержит proto-сериализацию объекта '''Review'''&lt;br /&gt;
&lt;br /&gt;
В обоих случаях при выгрузке разметки первый элемент типа '''Review''' будет содержать мета-информацию об исходном контексте, откуда была выгружена разметка.&lt;br /&gt;
&lt;br /&gt;
Разметка привязывается к инварианту маркера и может содержать собственно разметку (статус маркера) и совокупность комментариев, связанных с данным маркером. При выгрузке разметки также добавляется информация о конкретных локациях предупреждений, ассоциированных с инвариантом. В будущих версиях данная информация будет использоваться для переноса разметки при отсутствии прямого совпадения инвариантов.&lt;br /&gt;
&lt;br /&gt;
=== Экспорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/export&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''body''' запроса&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API и экспорт разметки из ветки, откуда производится экспорт&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;format&amp;quot;: &amp;quot;&amp;lt;json|proto&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;export_all&amp;quot;: &amp;lt;true|false&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Пользователь должен указать либо '''source''' элемент, либо '''source_id'''&lt;br /&gt;
* Опция '''skip_comments''' позволяет игнорировать комментарии при выгрузке разметки&lt;br /&gt;
* Опция '''skip_review''' позволяет игнорировать статусы маркеров при выгрузке разметки (т. е. выгружать только комментарии)&lt;br /&gt;
* Опция '''export_all''' позволяет выгрузить пустую разметку (т. е. статусы Undecided/Unspecified/Undecided). Это позволяет получить список всех инвариантов для ветки и использовать данные для генерации требуемой разметки для импорта&lt;br /&gt;
* Метод возвращает gzipped файл содержащий разметку в указанном формате&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/import&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''query''' запроса&lt;br /&gt;
* Запрос должен быть формата '''multipart/form-data''', поле '''file''' должно содержать файл с разметкой&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API, импорт разметки, '''Update any review''' и '''Update any comment''' (для перезаписи разметки и комментарии ревью мастера)&lt;br /&gt;
&lt;br /&gt;
Query параметры:&lt;br /&gt;
&lt;br /&gt;
 project — &amp;lt;project name&amp;gt; — имя проекта&lt;br /&gt;
 branch — &amp;lt;branch name&amp;gt; — имя бранча&lt;br /&gt;
 target_id — &amp;lt;branch id&amp;gt; — id бранча. Должно быть либо id бранча, либо имя проекта + имя бранча. Приоритет — id бранча&lt;br /&gt;
 format — &amp;lt;proto|json&amp;gt; — формат импортируемой разметки. Если не указан, будет определяться автоматически&lt;br /&gt;
 overwrite — &amp;lt;none|force|last - по умолчанию last&amp;gt; — контролирует логику применения разметки к бранчу при импорте&lt;br /&gt;
 skip_comments — &amp;lt;true|false - по умолчанию false&amp;gt; — игнорировать комментарии&lt;br /&gt;
 skip_review — &amp;lt;true|false - по умолчанию false&amp;gt; — игнорировать статус разметки (импорт только комментариев)&lt;br /&gt;
 response_with_result — &amp;lt;true|false&amp;gt; — вернуть детальный список разметок, которые были применены, в формате JSON с newline-разделителями. Если не указан, то возвращается краткий статус&lt;br /&gt;
 compressed — &amp;lt;true|false&amp;gt; — формат файла с разметкой, если true то подразумевается gzip-compressed файл&lt;br /&gt;
&lt;br /&gt;
Настоятельно рекомендуется явно указывать параметр &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt;. В случае успеха, метод возвращает body со следующими данными:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
&lt;br /&gt;
Первая строка body содержит JSON с информацией о выполненных действиях. Если был указан параметр '''response_with_result''', то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритм импорта ====&lt;br /&gt;
&lt;br /&gt;
* Блокируются операции по разметке и импорту на целевой бранч&lt;br /&gt;
* Выгружается текущая разметка бранча с комментариями&lt;br /&gt;
* Загруженная разметка сопоставляется с текущей и формируется список разметки для применения. Дублирующая разметка и комментарии игнорируются&lt;br /&gt;
* Перезапись разметки контролируется параметром '''overwrite'''. Если значение '''none''', то разметка не перезаписывается при наличии разметки в целевом бранче. Если значение '''force''', то разметка будет перезаписана. Если значение '''last''', то разметка будет перезаписана, если загруженная разметка имеет более новую дату&lt;br /&gt;
* Пустая разметка (Undecided/Unspecified/Undecided) явным образом не применяется к инварианту, если разметка отсутствует на бранче&lt;br /&gt;
* Сформированный список применяется к бранчу. При выборе маркера, куда добавлять комментарий, выбирается маркер из наиболее раннего снимка, где маркер с соответствующим инвариантом появился&lt;br /&gt;
&lt;br /&gt;
'''Допустимые значения полей разметки:'''&lt;br /&gt;
&lt;br /&gt;
* Status — &amp;lt;code&amp;gt;&amp;quot;Confirmed&amp;quot;, &amp;quot;Won't fix&amp;quot;, &amp;quot;False Positive&amp;quot;, &amp;quot;Unclear&amp;quot;, &amp;quot;Undecided&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Severity — &amp;lt;code&amp;gt;&amp;quot;Unspecified&amp;quot;, &amp;quot;Critical&amp;quot;, &amp;quot;Major&amp;quot;, &amp;quot;Minor&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Action — &amp;lt;code&amp;gt;&amp;quot;Undecided&amp;quot;, &amp;quot;Fix required&amp;quot;, &amp;quot;Fix submitted&amp;quot;, &amp;quot;Ignore&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Копирование разметки ===&lt;br /&gt;
&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''body''' запроса&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API, экспорт снимков (для исходной ветки), импорт разметки (для целевой ветки), разрешения '''Update any review''' и '''Update any comment''' (для перезаписи разметки и комментарии ревью мастера)&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;target&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;target_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false - по умолчанию false&amp;gt;,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false - по умолчанию false&amp;gt;,&lt;br /&gt;
     &amp;quot;overwrite&amp;quot;: &amp;quot;&amp;lt;none|last|force&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;response_with_result&amp;quot;: &amp;lt;true|false&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
В случае успеха, метод возвращает body со следующими данными&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
&lt;br /&gt;
Первая строка body содержит JSON с информацией о выполненных действиях. Если был указан параметр '''response_with_result''', то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
== CLI API для импорта/экспорта/копирования разметки ==&lt;br /&gt;
&lt;br /&gt;
Данное API является '''экспериментальным''' и может меняться. Основные аргументы будут сохранены. По умолчанию, команды под '''markup2''' скрыты. Использовать можно, указывая их явно. Для получения помощи запустить:&lt;br /&gt;
&lt;br /&gt;
 svacer markup2 --help&lt;br /&gt;
 svacer markup2 copy --help&lt;br /&gt;
 svacer markup2 import --help&lt;br /&gt;
 svacer markup2 export --help&lt;br /&gt;
&lt;br /&gt;
Описание команд:&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 - New [experimental] API for review export/import/copy&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    import   Import markup from file and apply to specified branch&lt;br /&gt;
    export   Export markup to file or stdout. Command needs either branch ID or project and branch name. When exporting to file, data is gzipped.&lt;br /&gt;
    copy     Copy markup between branches&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --ssl                 Connect to the server using https protocol (default: false)&lt;br /&gt;
    --ssl-ca-certs value  Trusted CA cert path. Example: /usr/local/certs/* , /usr/local/certs/ca.crt, /usr/local/certs/ca*.crt&lt;br /&gt;
    --user value          Valid user name&lt;br /&gt;
    --password value      Valid user password&lt;br /&gt;
    --oidc-client value   ClientID for login with OpenID Connect protocol&lt;br /&gt;
    --oidc-secret value   Client's secret for login with OpenID Connect protocol&lt;br /&gt;
    --host value          Valid host name with running svace history server (default: localhost) [$SVACER_HOST_NAME]&lt;br /&gt;
    --port value          Defines port for REST API (default: 8080) [$SVACER_API_PORT]&lt;br /&gt;
    --grpc value          Defines port for gRPC API (default: 3002) [$SVACER_GRPC_PORT]&lt;br /&gt;
    --ldap_server value   Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --conn_file value     Use connection file [$SVACER_CONN_FILE]&lt;br /&gt;
    --dry-run             Do actions but don't commit result to database (default: false)&lt;br /&gt;
    --help                Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Импорт разметки из файла&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 import - Import markup from file and apply to specified branch&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 import [command options] &amp;lt;file&amp;gt; - path to file to import. If file is not specified, data is loaded from stdin&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value    Target project name&lt;br /&gt;
    --branch value     Target branch name&lt;br /&gt;
    --branch-id value  Target branch ID&lt;br /&gt;
    --skip-review      Import comments only (default: false)&lt;br /&gt;
    --skip-comments    Import review only (default: false)&lt;br /&gt;
    --overwrite value  Overwrite mode: none, force, last&lt;br /&gt;
    --out value        Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out      Include information about applied reviews (default: false)&lt;br /&gt;
    --format value     Specify explicit format for data. If not specified, format will be detected from content&lt;br /&gt;
    --help             Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Экспорт разметки в файл&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 export - Export markup to file or stdout. Command needs either branch ID or project and branch name. When exporting to file, data is gzipped.&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 export [command options] &amp;lt;file name or empty&amp;gt; - if no file name is specified, result is printed to stdout&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value    Source project name&lt;br /&gt;
    --branch value     Source branch name. Branch name will be resolved against source project&lt;br /&gt;
    --branch-id value  Source branch ID&lt;br /&gt;
    --skip-review      Export comments only (default: false)&lt;br /&gt;
    --skip-comments    Export review only (default: false)&lt;br /&gt;
    --format value     Format: json or proto. If format is not specified, proto is used. If output file is not specified and format is not specified, json will be used.&lt;br /&gt;
    --uncompressed     Get data in raw format without gzip compression (default: false)&lt;br /&gt;
    --export-all       Export empty (undecided) review (default: false)&lt;br /&gt;
    --help             Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Копирование разметки&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 copy - Copy markup between branches&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 copy [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --target-project value    Target project name&lt;br /&gt;
    --target-branch value     Target branch name&lt;br /&gt;
    --target-branch-id value  Target branch ID&lt;br /&gt;
    --source-project value    Source project name&lt;br /&gt;
    --source-branch value     Source branch name&lt;br /&gt;
    --source-branch-id value  Source branch ID&lt;br /&gt;
    --skip-review             Copy comments only (default: false)&lt;br /&gt;
    --skip-comments           Copy review only (default: false)&lt;br /&gt;
    --overwrite value         Overwrite mode: none, force, last&lt;br /&gt;
    --out value               Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out             Include information about applied reviews (default: false)&lt;br /&gt;
    --help                    Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Примеры использования:&lt;br /&gt;
 svacer markup2 --user admin --password admin copy --overwrite=force --source-project bash --target-project bash  --source-branch master --target-branch bash_clone &lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Log file location /tmp/svacer-1543671068.log&lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:19:41.745+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 svacer markup2 --user admin --password admin import --overwrite=force --project bash --branch bash_clone  /tmp/out.json &lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Log file location /tmp/svacer-1480510331.log&lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:20:17.435+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Log file location /tmp/svacer-1792255677.log&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T15:46:06.810+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;invariant&amp;quot;:&amp;quot;+1vB4JXkME3AAcbXR7tezA&amp;quot;, &amp;quot;review_data&amp;quot;:{&amp;quot;status&amp;quot;:&amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;:&amp;quot;Unspecified&amp;quot;, &amp;quot;action&amp;quot;:&amp;quot;Undecided&amp;quot;, &amp;quot;create_ts&amp;quot;:&amp;quot;2024-10-16T14:44:07.233554Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;created_from&amp;quot;:&amp;quot;1c8cea92-7708-4bb9-9a88-40325f39efe8&amp;quot;}, &amp;quot;locations&amp;quot;:[{&amp;quot;warnClass&amp;quot;:&amp;quot;PROC_USE.VULNERABLE&amp;quot;, &amp;quot;file&amp;quot;:&amp;quot;/.build/jobs.c&amp;quot;, &amp;quot;line&amp;quot;:4207, &amp;quot;details&amp;quot;:&amp;quot;b043c5a63bf9d432c816f2cb421c907fe912bf16&amp;quot;, &amp;quot;mtid&amp;quot;:&amp;quot;SvEng.L.1&amp;quot;, &amp;quot;function&amp;quot;:&amp;quot;run_sigchld_trap&amp;quot;, &amp;quot;content_hash&amp;quot;:&amp;quot;s4AMYzKR8Ol8k4OODPpOlPUsSWI=&amp;quot;, &amp;quot;marker_hash&amp;quot;:&amp;quot;XiVQmRu8HmhzOnq1+XY7AaujT+o=&amp;quot;, &amp;quot;tool&amp;quot;:&amp;quot;SvEng&amp;quot;, &amp;quot;lang&amp;quot;:&amp;quot;C_Cpp&amp;quot;}], &amp;quot;id&amp;quot;:&amp;quot;699&amp;quot;, &amp;quot;meta&amp;quot;:{&amp;quot;create_ts&amp;quot;:&amp;quot;2024-11-15T12:46:06.835078490Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;svacer_version&amp;quot;:&amp;quot;devel.2024-11-15@15:45:34.a290bc7e&amp;quot;, &amp;quot;project&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;0fd645aa-8e70-4a4f-b68b-766c4f337bf2&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;}, &amp;quot;branch&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;8925df5a-7a98-4f07-bc88-ee4ea5b43813&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;master&amp;quot;}}}&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2447</id>
		<title>Markup2</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2447"/>
		<updated>2024-12-24T10:55:07Z</updated>

		<summary type="html">&lt;p&gt;Writer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public REST API для экспорта, импорта и копирования разметки ==&lt;br /&gt;
Релиз 10.х Svacer включает новый API, предназначенный для экспорта, импорта и копирования разметки. API доступен по endpoint-ам&lt;br /&gt;
 POST /api/public/markup/import&lt;br /&gt;
 POST /api/public/markup/export&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
&lt;br /&gt;
Разметка описывается посредством protobuf схемы:&lt;br /&gt;
&lt;br /&gt;
 // Represents exported review (review itself + comments)&lt;br /&gt;
 // Review is associated with invariant and has list of locations&lt;br /&gt;
 message Review { &lt;br /&gt;
   &lt;br /&gt;
   // Defines model for concrete location of the review&lt;br /&gt;
   message Location {            &lt;br /&gt;
     string warnClass = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     uint32 line = 3;&lt;br /&gt;
     string details = 4;&lt;br /&gt;
     string mtid = 5;&lt;br /&gt;
     string function = 10;&lt;br /&gt;
     bytes content_hash = 6;&lt;br /&gt;
     bytes trace_hash = 7;&lt;br /&gt;
     bytes marker_hash = 8;&lt;br /&gt;
     bytes line_hash = 9;    &lt;br /&gt;
     string tool = 11;&lt;br /&gt;
     string lang = 12;&lt;br /&gt;
   }  &lt;br /&gt;
   // Defines model for comment&lt;br /&gt;
   message Comment {      &lt;br /&gt;
     string text = 1;&lt;br /&gt;
     optional string format = 2;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 3;&lt;br /&gt;
     optional google.protobuf.Timestamp update_ts = 4;&lt;br /&gt;
     string createdBy = 5;      &lt;br /&gt;
     string origin_id = 6;   &lt;br /&gt;
     optional uint64 review_id = 7; // refers to Review.id field&lt;br /&gt;
     optional string created_by_id = 8;&lt;br /&gt;
   }&lt;br /&gt;
   // Defines model for review itself&lt;br /&gt;
   message ReviewData {&lt;br /&gt;
     string status = 1;&lt;br /&gt;
     string severity = 2;&lt;br /&gt;
     string action = 3;&lt;br /&gt;
     string origin_id = 4;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 5;&lt;br /&gt;
     string created_by = 6;&lt;br /&gt;
     optional string created_by_id = 7;&lt;br /&gt;
     optional string created_from = 8;&lt;br /&gt;
   }  &lt;br /&gt;
   // Invariant of the marker&lt;br /&gt;
   string invariant = 1; &lt;br /&gt;
   // Review information associated with markers having given invariant&lt;br /&gt;
   optional ReviewData review_data = 2;  &lt;br /&gt;
   // List of comments associated with all markers having given invariant&lt;br /&gt;
   repeated Comment comments = 3; &lt;br /&gt;
   // List of locations associated with given invariant. Locations can be used to apply fuzzy matching of review with existing data when there is no invariant match  &lt;br /&gt;
   repeated Location locations = 4;&lt;br /&gt;
   // Export-specific ID, comments can refer to this id if comment is associated with review operation&lt;br /&gt;
   uint64 id = 5;&lt;br /&gt;
   // Meta-information about export, when exporting to file field is initialized only for the first element&lt;br /&gt;
   optional ReviewExportMeta meta = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Defines meta-information about exported review&lt;br /&gt;
 message ReviewExportMeta {&lt;br /&gt;
   message Container {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string name = 2;&lt;br /&gt;
   }  &lt;br /&gt;
   google.protobuf.Timestamp create_ts = 1; // timestamp when export was produced (UTC)&lt;br /&gt;
   string created_by = 2; // user who triggered export&lt;br /&gt;
   string svacer_version = 3;  // svacer version&lt;br /&gt;
   optional Container project = 4; // source container (project)&lt;br /&gt;
   optional Container branch = 5; // source container (branch)&lt;br /&gt;
   map&amp;lt;string,string&amp;gt; properties = 6; // extra properties&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Актуальную версию схемы можно получить из Svacer по API: &amp;lt;code&amp;gt;GET /api/public/markup/schema&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=При сериализации в JSON используются proto-имена полей. При работе с данными из Go рекомендуется использовать [https://pkg.go.dev/google.golang.org/protobuf/encoding/protojson protojson] для сериализации и десериализации.}}&lt;br /&gt;
&lt;br /&gt;
Svacer поддерживает два формата для экспортирования/импортирования разметки:&lt;br /&gt;
&lt;br /&gt;
* JSON с разделением по newline-ам. Каждая строка представляет собой объект типа '''Review''' (указано выше) сериализованный в JSON&lt;br /&gt;
* Бинарный формат: последовательность блоков &amp;lt;code&amp;gt;[lenght little endian][proto]&amp;lt;/code&amp;gt;, где первый блок содержит длину следующего блока в формате &amp;lt;code&amp;gt;u32 little endian&amp;lt;/code&amp;gt;, а второй блок содержит proto-сериализацию объекта '''Review'''&lt;br /&gt;
&lt;br /&gt;
В обоих случаях при выгрузке разметки первый элемент типа '''Review''' будет содержать мета-информацию об исходном контексте, откуда была выгружена разметка.&lt;br /&gt;
&lt;br /&gt;
Разметка привязывается к инварианту маркера и может содержать собственно разметку (статус маркера) и совокупность комментариев, связанных с данным маркером. При выгрузке разметки также добавляется информация о конкретных локациях предупреждений, ассоциированных с инвариантом. В будущих версиях данная информация будет использоваться для переноса разметки при отсутствии прямого совпадения инвариантов.&lt;br /&gt;
&lt;br /&gt;
=== Экспорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/export&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''body''' запроса&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API и экспорт разметки из ветки, откуда производится экспорт&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;format&amp;quot;: &amp;quot;&amp;lt;json|proto&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;export_all&amp;quot;: &amp;lt;true|false&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Пользователь должен указать либо '''source''' элемент, либо '''source_id'''&lt;br /&gt;
* Опция '''skip_comments''' позволяет игнорировать комментарии при выгрузке разметки&lt;br /&gt;
* Опция '''skip_review''' позволяет игнорировать статусы маркеров при выгрузке разметки (т. е. выгружать только комментарии)&lt;br /&gt;
* Опция '''export_all''' позволяет выгрузить пустую разметку (т. е. статусы Undecided/Unspecified/Undecided). Это позволяет получить список всех инвариантов для ветки и использовать данные для генерации требуемой разметки для импорта&lt;br /&gt;
* Метод возвращает gzipped файл содержащий разметку в указанном формате&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/import&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''query''' запроса&lt;br /&gt;
* Запрос должен быть формата '''multipart/form-data''', поле '''file''' должно содержать файл с разметкой&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API, импорт разметки, '''Update any review''' и '''Update any comment''' (для перезаписи разметки и комментарии ревью мастера)&lt;br /&gt;
&lt;br /&gt;
Query параметры:&lt;br /&gt;
&lt;br /&gt;
 project — &amp;lt;project name&amp;gt; — имя проекта&lt;br /&gt;
 branch — &amp;lt;branch name&amp;gt; — имя бранча&lt;br /&gt;
 target_id — &amp;lt;branch id&amp;gt; — id бранча. Должно быть либо id бранча, либо имя проекта + имя бранча. Приоритет — id бранча&lt;br /&gt;
 format — &amp;lt;proto|json&amp;gt; — формат импортируемой разметки. Если не указан, будет определяться автоматически&lt;br /&gt;
 overwrite — &amp;lt;none|force|last - по умолчанию last&amp;gt; — контролирует логику применения разметки к бранчу при импорте&lt;br /&gt;
 skip_comments — &amp;lt;true|false - по умолчанию false&amp;gt; — игнорировать комментарии&lt;br /&gt;
 skip_review — &amp;lt;true|false - по умолчанию false&amp;gt; — игнорировать статус разметки (импорт только комментариев)&lt;br /&gt;
 response_with_result — &amp;lt;true|false&amp;gt; — вернуть детальный список разметок, которые были применены, в формате JSON с newline-разделителями. Если не указан, то возвращается краткий статус&lt;br /&gt;
 compressed — &amp;lt;true|false&amp;gt; — формат файла с разметкой, если true то подразумевается gzip-compressed файл&lt;br /&gt;
&lt;br /&gt;
Настоятельно рекомендуется явно указывать параметр &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt;. В случае успеха, метод возвращает body со следующими данными:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
&lt;br /&gt;
Первая строка body содержит JSON с информацией о выполненных действиях. Если был указан параметр '''response_with_result''', то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритм импорта ====&lt;br /&gt;
&lt;br /&gt;
* Блокируются операции по разметке и импорту на целевой бранч&lt;br /&gt;
* Выгружается текущая разметка бранча с комментариями&lt;br /&gt;
* Загруженная разметка сопоставляется с текущей и формируется список разметки для применения. Дублирующая разметка и комментарии игнорируются&lt;br /&gt;
* Перезапись разметки контролируется параметром '''overwrite'''. Если значение '''none''', то разметка не перезаписывается при наличии разметки в целевом бранче. Если значение '''force''', то разметка будет перезаписана. Если значение '''last''', то разметка будет перезаписана, если загруженная разметка имеет более новую дату&lt;br /&gt;
* Пустая разметка (Undecided/Unspecified/Undecided) явным образом не применяется к инварианту, если разметка отсутствует на бранче&lt;br /&gt;
* Сформированный список применяется к бранчу. При выборе маркера, куда добавлять комментарий, выбирается маркер из наиболее раннего снимка, где маркер с соответствующим инвариантом появился&lt;br /&gt;
&lt;br /&gt;
'''Допустимые значения полей разметки:'''&lt;br /&gt;
&lt;br /&gt;
* Status — &amp;lt;code&amp;gt;&amp;quot;Confirmed&amp;quot;, &amp;quot;Won't fix&amp;quot;, &amp;quot;False Positive&amp;quot;, &amp;quot;Unclear&amp;quot;, &amp;quot;Undecided&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Severity — &amp;lt;code&amp;gt;&amp;quot;Unspecified&amp;quot;, &amp;quot;Critical&amp;quot;, &amp;quot;Major&amp;quot;, &amp;quot;Minor&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Action — &amp;lt;code&amp;gt;&amp;quot;Undecided&amp;quot;, &amp;quot;Fix required&amp;quot;, &amp;quot;Fix submitted&amp;quot;, &amp;quot;Ignore&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Копирование разметки ===&lt;br /&gt;
&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
&lt;br /&gt;
* Параметры передаются в '''body''' запроса&lt;br /&gt;
* Запрос должен иметь токен аутентификации&lt;br /&gt;
* Пользователь должен иметь доступы на Public API, импорт разметки, разрешения '''Update any review''' и '''Update any comment''' (для перезаписи разметки и комментарии ревью мастера)&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;target&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;target_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false - по умолчанию false&amp;gt;,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false - по умолчанию false&amp;gt;,&lt;br /&gt;
     &amp;quot;overwrite&amp;quot;: &amp;quot;&amp;lt;none|last|force&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;response_with_result&amp;quot;: &amp;lt;true|false&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
В случае успеха, метод возвращает body со следующими данными&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
&lt;br /&gt;
Первая строка body содержит JSON с информацией о выполненных действиях. Если был указан параметр '''response_with_result''', то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
== CLI API для импорта/экспорта/копирования разметки ==&lt;br /&gt;
&lt;br /&gt;
Данное API является '''экспериментальным''' и может меняться. Основные аргументы будут сохранены. По умолчанию, команды под '''markup2''' скрыты. Использовать можно, указывая их явно. Для получения помощи запустить:&lt;br /&gt;
&lt;br /&gt;
 svacer markup2 --help&lt;br /&gt;
 svacer markup2 copy --help&lt;br /&gt;
 svacer markup2 import --help&lt;br /&gt;
 svacer markup2 export --help&lt;br /&gt;
&lt;br /&gt;
Описание команд:&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 - New [experimental] API for review export/import/copy&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    import   Import markup from file and apply to specified branch&lt;br /&gt;
    export   Export markup to file or stdout. Command needs either branch ID or project and branch name. When exporting to file, data is gzipped.&lt;br /&gt;
    copy     Copy markup between branches&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --ssl                 Connect to the server using https protocol (default: false)&lt;br /&gt;
    --ssl-ca-certs value  Trusted CA cert path. Example: /usr/local/certs/* , /usr/local/certs/ca.crt, /usr/local/certs/ca*.crt&lt;br /&gt;
    --user value          Valid user name&lt;br /&gt;
    --password value      Valid user password&lt;br /&gt;
    --oidc-client value   ClientID for login with OpenID Connect protocol&lt;br /&gt;
    --oidc-secret value   Client's secret for login with OpenID Connect protocol&lt;br /&gt;
    --host value          Valid host name with running svace history server (default: localhost) [$SVACER_HOST_NAME]&lt;br /&gt;
    --port value          Defines port for REST API (default: 8080) [$SVACER_API_PORT]&lt;br /&gt;
    --grpc value          Defines port for gRPC API (default: 3002) [$SVACER_GRPC_PORT]&lt;br /&gt;
    --ldap_server value   Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --conn_file value     Use connection file [$SVACER_CONN_FILE]&lt;br /&gt;
    --dry-run             Do actions but don't commit result to database (default: false)&lt;br /&gt;
    --help                Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Импорт разметки из файла&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 import - Import markup from file and apply to specified branch&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 import [command options] &amp;lt;file&amp;gt; - path to file to import. If file is not specified, data is loaded from stdin&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value    Target project name&lt;br /&gt;
    --branch value     Target branch name&lt;br /&gt;
    --branch-id value  Target branch ID&lt;br /&gt;
    --skip-review      Import comments only (default: false)&lt;br /&gt;
    --skip-comments    Import review only (default: false)&lt;br /&gt;
    --overwrite value  Overwrite mode: none, force, last&lt;br /&gt;
    --out value        Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out      Include information about applied reviews (default: false)&lt;br /&gt;
    --format value     Specify explicit format for data. If not specified, format will be detected from content&lt;br /&gt;
    --help             Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Экспорт разметки в файл&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 export - Export markup to file or stdout. Command needs either branch ID or project and branch name. When exporting to file, data is gzipped.&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 export [command options] &amp;lt;file name or empty&amp;gt; - if no file name is specified, result is printed to stdout&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value    Source project name&lt;br /&gt;
    --branch value     Source branch name. Branch name will be resolved against source project&lt;br /&gt;
    --branch-id value  Source branch ID&lt;br /&gt;
    --skip-review      Export comments only (default: false)&lt;br /&gt;
    --skip-comments    Export review only (default: false)&lt;br /&gt;
    --format value     Format: json or proto. If format is not specified, proto is used. If output file is not specified and format is not specified, json will be used.&lt;br /&gt;
    --uncompressed     Get data in raw format without gzip compression (default: false)&lt;br /&gt;
    --export-all       Export empty (undecided) review (default: false)&lt;br /&gt;
    --help             Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Копирование разметки&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 copy - Copy markup between branches&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 copy [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --target-project value    Target project name&lt;br /&gt;
    --target-branch value     Target branch name&lt;br /&gt;
    --target-branch-id value  Target branch ID&lt;br /&gt;
    --source-project value    Source project name&lt;br /&gt;
    --source-branch value     Source branch name&lt;br /&gt;
    --source-branch-id value  Source branch ID&lt;br /&gt;
    --skip-review             Copy comments only (default: false)&lt;br /&gt;
    --skip-comments           Copy review only (default: false)&lt;br /&gt;
    --overwrite value         Overwrite mode: none, force, last&lt;br /&gt;
    --out value               Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out             Include information about applied reviews (default: false)&lt;br /&gt;
    --help                    Show help (default: false)&lt;br /&gt;
&lt;br /&gt;
Примеры использования:&lt;br /&gt;
 svacer markup2 --user admin --password admin copy --overwrite=force --source-project bash --target-project bash  --source-branch master --target-branch bash_clone &lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Log file location /tmp/svacer-1543671068.log&lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:19:41.745+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 svacer markup2 --user admin --password admin import --overwrite=force --project bash --branch bash_clone  /tmp/out.json &lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Log file location /tmp/svacer-1480510331.log&lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:20:17.435+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Log file location /tmp/svacer-1792255677.log&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T15:46:06.810+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;invariant&amp;quot;:&amp;quot;+1vB4JXkME3AAcbXR7tezA&amp;quot;, &amp;quot;review_data&amp;quot;:{&amp;quot;status&amp;quot;:&amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;:&amp;quot;Unspecified&amp;quot;, &amp;quot;action&amp;quot;:&amp;quot;Undecided&amp;quot;, &amp;quot;create_ts&amp;quot;:&amp;quot;2024-10-16T14:44:07.233554Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;created_from&amp;quot;:&amp;quot;1c8cea92-7708-4bb9-9a88-40325f39efe8&amp;quot;}, &amp;quot;locations&amp;quot;:[{&amp;quot;warnClass&amp;quot;:&amp;quot;PROC_USE.VULNERABLE&amp;quot;, &amp;quot;file&amp;quot;:&amp;quot;/.build/jobs.c&amp;quot;, &amp;quot;line&amp;quot;:4207, &amp;quot;details&amp;quot;:&amp;quot;b043c5a63bf9d432c816f2cb421c907fe912bf16&amp;quot;, &amp;quot;mtid&amp;quot;:&amp;quot;SvEng.L.1&amp;quot;, &amp;quot;function&amp;quot;:&amp;quot;run_sigchld_trap&amp;quot;, &amp;quot;content_hash&amp;quot;:&amp;quot;s4AMYzKR8Ol8k4OODPpOlPUsSWI=&amp;quot;, &amp;quot;marker_hash&amp;quot;:&amp;quot;XiVQmRu8HmhzOnq1+XY7AaujT+o=&amp;quot;, &amp;quot;tool&amp;quot;:&amp;quot;SvEng&amp;quot;, &amp;quot;lang&amp;quot;:&amp;quot;C_Cpp&amp;quot;}], &amp;quot;id&amp;quot;:&amp;quot;699&amp;quot;, &amp;quot;meta&amp;quot;:{&amp;quot;create_ts&amp;quot;:&amp;quot;2024-11-15T12:46:06.835078490Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;svacer_version&amp;quot;:&amp;quot;devel.2024-11-15@15:45:34.a290bc7e&amp;quot;, &amp;quot;project&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;0fd645aa-8e70-4a4f-b68b-766c4f337bf2&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;}, &amp;quot;branch&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;8925df5a-7a98-4f07-bc88-ee4ea5b43813&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;master&amp;quot;}}}&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2421</id>
		<title>User Management (command line)</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2421"/>
		<updated>2024-12-02T11:14:46Z</updated>

		<summary type="html">&lt;p&gt;Writer: role-provider&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== User management ==&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями ===&lt;br /&gt;
Для управления пользователями используется команда '''user-provider''' инструмента Svacer с необходимыми подкомандами. Также требуется аутентификация на сервере для выполнения запросов и необходимые права доступа.&lt;br /&gt;
&lt;br /&gt;
==== Создание пользователя ====&lt;br /&gt;
 svacer user-provider add&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --lastname &amp;lt;lastname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --change-password &amp;lt;true|false&amp;gt; (используйте для смены пароля при первой авторизации по умолчанию false)&lt;br /&gt;
    --auth-type &amp;lt;0|1|2&amp;gt; (тип аутентификации, 0 - Svacer, 1 - LDAP, 2 - OIDC_OAUTH, по умолчанию 0)&lt;br /&gt;
    --role &amp;lt;role id or name&amp;gt; (для установки нескольких ролей использовать флаг несколько раз)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master, по умолчанию false)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer user-provider add --user admin --password admin --login example --user_password Example123 --review-master true&lt;br /&gt;
 2024-12-02T13:19:41.366+0300    info    Log file location /tmp/svacer-3054598677.log&lt;br /&gt;
 2024-12-02T13:19:41.366+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:19:41.375+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:19:41.380+0300    info    Logged by user admin&lt;br /&gt;
 2024-12-02T13:19:41.401+0300    info    User added successfully: ID: e45f2ae5-4e5b-4308-a2f5-0f3461626c18 Password: Example123&lt;br /&gt;
&lt;br /&gt;
==== Удаление пользователя ====&lt;br /&gt;
 svacer user-provider delete&lt;br /&gt;
    --username &amp;lt;id or name&amp;gt;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer user-provider delete --user admin --password admin --username example321&lt;br /&gt;
 2024-12-02T13:27:38.731+0300    info    Log file location /tmp/svacer-2241911697.log&lt;br /&gt;
 2024-12-02T13:27:38.731+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:27:38.739+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:27:38.759+0300    info    User deleted successfully&lt;br /&gt;
&lt;br /&gt;
==== Получение списка пользователей ====&lt;br /&gt;
 svacer user-provider get&lt;br /&gt;
    --with-roles &amp;lt;true|false&amp;gt; (к выводу добавляются роли пользователя)&lt;br /&gt;
    --filter &amp;lt;all|active|archived&amp;gt; (используйте для фильтрации списка пользователей)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer user-provider get --user admin --password admin --with-roles true&lt;br /&gt;
 2024-12-02T13:21:30.392+0300    info    Log file location /tmp/svacer-3616394399.log&lt;br /&gt;
 2024-12-02T13:21:30.393+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:21:30.395+0300    info    Server version: [devel]&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;ID&amp;quot;: &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&lt;br /&gt;
     &amp;quot;firstName&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;lastName&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;login&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;roles&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
 ...&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
==== Обновление пользователя ====&lt;br /&gt;
 svacer user-provider update&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления (по умолчанию обновляется текущий пользователь, указанный в авторизации)&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --add-role &amp;lt;role id or name&amp;gt; (добавляет роль с переданным id или именем)&lt;br /&gt;
    --delete-role &amp;lt;role id or name&amp;gt; (удаляет роль с переданным id или именем)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer user-provider update --user admin --password admin --username example --login example321&lt;br /&gt;
 2024-12-02T13:24:43.052+0300    info    Log file location /tmp/svacer-3041843149.log&lt;br /&gt;
 2024-12-02T13:24:43.052+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:24:43.059+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:24:43.096+0300    info    User example updated successfully&lt;br /&gt;
&lt;br /&gt;
==== Изменение статуса пользователя ====&lt;br /&gt;
 svacer user-provider update-status&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления)&lt;br /&gt;
    --status &amp;lt;active|archive&amp;gt;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer user-provider update-status --user admin --password admin --username example321 --status archive&lt;br /&gt;
 2024-12-02T13:26:49.444+0300    info    Log file location /tmp/svacer-2446325878.log&lt;br /&gt;
 2024-12-02T13:26:49.444+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:26:49.452+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:26:49.479+0300    info    User status updated successfully&lt;br /&gt;
&lt;br /&gt;
== Role management ==&lt;br /&gt;
&lt;br /&gt;
=== Управление ролями ===&lt;br /&gt;
Для управления пользователями используется команда '''role-provider''' инструмента Svacer с необходимыми подкомандами. Также требуется аутентификация на сервере для выполнения запросов и необходимые права доступа.&lt;br /&gt;
&lt;br /&gt;
==== Создание роли ====&lt;br /&gt;
 svacer role-provider add&lt;br /&gt;
    --name &amp;lt;name&amp;gt;&lt;br /&gt;
    --permissions &amp;lt;permissions&amp;gt; (Укажите права вида &amp;quot;цель1(ALL, идентификатор ветки, идентификатор или имя проекта, имя проекта/имя ветки):правило(чтобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer role-provider add --name example --permissions &amp;quot;ALL:Import;test_md:Projects&amp;quot; --user admin --password admin&lt;br /&gt;
 2024-12-02T13:43:25.542+0300    info    Log file location /tmp/svacer-393346587.log&lt;br /&gt;
 2024-12-02T13:43:25.542+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:43:25.549+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:43:25.556+0300    info    Logged by user admin&lt;br /&gt;
 2024-12-02T13:43:25.578+0300    info    Role added successfully: example&lt;br /&gt;
 Id: 4c2eda54-6d3f-409e-b846-63d49752f331&lt;br /&gt;
 Permission 'ALL': 'Import', 'ReadAction'&lt;br /&gt;
 Permission 'test_md': 'Branches', 'ExportMarkup', 'GlobalFilters', 'Import', 'ImportMarkup', 'Projects', 'ReadAction'&lt;br /&gt;
&lt;br /&gt;
==== Удаление роли ====&lt;br /&gt;
 svacer role-provider delete&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer role-provider delete --role example --user admin --password admin&lt;br /&gt;
 2024-12-02T14:13:28.664+0300    info    Log file location /tmp/svacer-3511168837.log&lt;br /&gt;
 2024-12-02T14:13:28.665+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T14:13:28.670+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T14:13:28.695+0300    info    Role deleted successfully&lt;br /&gt;
&lt;br /&gt;
==== Изменение роли ====&lt;br /&gt;
 svacer role-provider update&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;&lt;br /&gt;
    --permissions &amp;lt;permissions&amp;gt; (Укажите права вида &amp;quot;цель1(ALL, идентификатор ветки, идентификатор или имя проекта, имя проекта/имя ветки):правило(чтобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
    --force &amp;lt;true|false&amp;gt; (Используйте, чтобы перезаписать правила для роли. По умолчанию указанные правила будут добавлены к уже существующим)&lt;br /&gt;
    --remove &amp;lt;true|false&amp;gt; (Используйте, чтобы удалить правила для роли. Правила, необходимые для удаления указываются в опции --permissions)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer role-provider update --role example --permissions &amp;quot;ALL:Hooks&amp;quot; --user admin --password admin --force&lt;br /&gt;
 2024-12-02T14:12:49.084+0300    info    Log file location /tmp/svacer-2403337357.log&lt;br /&gt;
 2024-12-02T14:12:49.084+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T14:12:49.093+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T14:12:49.125+0300    info    Role updated successfully: example&lt;br /&gt;
 Id: 4c2eda54-6d3f-409e-b846-63d49752f331&lt;br /&gt;
 Permission 'ALL': 'Hooks'&lt;br /&gt;
&lt;br /&gt;
==== Получение списка ролей ====&lt;br /&gt;
 svacer role-provider get&lt;br /&gt;
    --target &amp;lt;user id|name&amp;gt; (имя или идентификатор пользователя, чьи роли запрашиваются, если данный флаг не указан, будут выведены все роли)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer role-provider get --user admin --password admin --target admin&lt;br /&gt;
 2024-12-02T14:08:03.735+0300    info    Log file location /tmp/svacer-3317672156.log&lt;br /&gt;
 2024-12-02T14:08:03.737+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T14:08:03.744+0300    info    Server version: [devel]&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;ID&amp;quot;: &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&lt;br /&gt;
   &amp;quot;firstName&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
   &amp;quot;lastName&amp;quot;: &amp;quot;admin&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Назначение роли пользователю ====&lt;br /&gt;
 svacer role-provider assign&lt;br /&gt;
    --username &amp;lt;user name|id&amp;gt;&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;тобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
    --remove &amp;lt;true|false&amp;gt; (Используйте, чтобы перезаписать правила для роли. По умолчанию указанные правила будут добавлены к уже существующим)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer role-provider assign --user admin --password admin --username guest --role example&lt;br /&gt;
 2024-12-02T14:09:23.509+0300    info    Log file location /tmp/svacer-2142876769.log&lt;br /&gt;
 2024-12-02T14:09:23.509+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T14:09:23.519+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T14:09:23.543+0300    info    Role example assigned successfully&lt;br /&gt;
&lt;br /&gt;
==== Получение списка разрешений ====&lt;br /&gt;
 svacer role-provider list-permissions&lt;br /&gt;
    --format &amp;lt;json|table&amp;gt; (Укажите формат вывода json или table (table выводится с применением, названием и описанием разрешения) (по умолчанию: json))&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 svacer role-provider list-permissions --user admin --password admin --format table&lt;br /&gt;
 2024-12-02T14:10:46.061+0300    info    Log file location /tmp/svacer-3390742125.log&lt;br /&gt;
 2024-12-02T14:10:46.061+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T14:10:46.068+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T14:10:46.072+0300    info    Logged by user admin&lt;br /&gt;
 +-------------------------------------------------------------------------------------------------+&lt;br /&gt;
 | Permission Table                                                                                |&lt;br /&gt;
 +------------------+------------------------------+-------------------+---------------------------+&lt;br /&gt;
 | PERMISSION       | SCOPE                        | NAME              | DESCRIPTION               |&lt;br /&gt;
 +------------------+------------------------------+-------------------+---------------------------+&lt;br /&gt;
 | Hooks            | server                       | Run hooks         | Run hooks from Details    |&lt;br /&gt;
 |                  |                              |                   | section of the right      |&lt;br /&gt;
 |                  |                              |                   | panel                     |&lt;br /&gt;
 +------------------+------------------------------+-------------------+---------------------------+&lt;br /&gt;
 | Backups          | server                       | Create backups    | Create, view and restore  |&lt;br /&gt;
 |                  |                              |                   | backup using CLI          |&lt;br /&gt;
 +------------------+------------------------------+-------------------+---------------------------+&lt;br /&gt;
 ...&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2420</id>
		<title>User Management (command line)</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2420"/>
		<updated>2024-12-02T10:33:12Z</updated>

		<summary type="html">&lt;p&gt;Writer: user-provider&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== User management ==&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями ===&lt;br /&gt;
Для управления пользователями используется команда '''user-provider''' инструмента Svacer с необходимыми подкомандами. Также требуется аутентификация на сервере для выполнения запросов и необходимые права доступа.&lt;br /&gt;
&lt;br /&gt;
==== Создание пользователя ====&lt;br /&gt;
 svacer user-provider add&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --lastname &amp;lt;lastname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --change-password &amp;lt;true|false&amp;gt; (используйте для смены пароля при первой авторизации по умолчанию false)&lt;br /&gt;
    --auth-type &amp;lt;0|1|2&amp;gt; (тип аутентификации, 0 - Svacer, 1 - LDAP, 2 - OIDC_OAUTH, по умолчанию 0)&lt;br /&gt;
    --role &amp;lt;role id or name&amp;gt; (для установки нескольких ролей использовать флаг несколько раз)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master, по умолчанию false)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 ./bin/svacer user-provider add --user admin --password admin --login example --user_password Example123 --review-master true&lt;br /&gt;
 2024-12-02T13:19:41.366+0300    info    Log file location /tmp/svacer-3054598677.log&lt;br /&gt;
 2024-12-02T13:19:41.366+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:19:41.375+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:19:41.380+0300    info    Logged by user admin&lt;br /&gt;
 2024-12-02T13:19:41.401+0300    info    User added successfully: ID: e45f2ae5-4e5b-4308-a2f5-0f3461626c18 Password: Example123&lt;br /&gt;
&lt;br /&gt;
==== Удаление пользователя ====&lt;br /&gt;
 svacer user-provider delete&lt;br /&gt;
    --username &amp;lt;id or name&amp;gt;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 ./bin/svacer user-provider delete --user admin --password admin --username example321&lt;br /&gt;
 2024-12-02T13:27:38.731+0300    info    Log file location /tmp/svacer-2241911697.log&lt;br /&gt;
 2024-12-02T13:27:38.731+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:27:38.739+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:27:38.759+0300    info    User deleted successfully&lt;br /&gt;
&lt;br /&gt;
==== Получение списка пользователей ====&lt;br /&gt;
 svacer user-provider get&lt;br /&gt;
    --with-roles &amp;lt;true|false&amp;gt; (к выводу добавляются роли пользователя)&lt;br /&gt;
    --filter &amp;lt;all|active|archived&amp;gt; (используйте для фильтрации списка пользователей)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 ./bin/svacer user-provider get --user admin --password admin --with-roles true&lt;br /&gt;
 2024-12-02T13:21:30.392+0300    info    Log file location /tmp/svacer-3616394399.log&lt;br /&gt;
 2024-12-02T13:21:30.393+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:21:30.395+0300    info    Server version: [devel]&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;ID&amp;quot;: &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&lt;br /&gt;
     &amp;quot;firstName&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;lastName&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;login&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;roles&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;id&amp;quot;: &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
 ...&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
==== Обновление пользователя ====&lt;br /&gt;
 svacer user-provider update&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления (по умолчанию обновляется текущий пользователь, указанный в авторизации)&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --add-role &amp;lt;role id or name&amp;gt; (добавляет роль с переданным id или именем)&lt;br /&gt;
    --delete-role &amp;lt;role id or name&amp;gt; (удаляет роль с переданным id или именем)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master)&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 ./bin/svacer user-provider update --user admin --password admin --username example --login example321&lt;br /&gt;
 2024-12-02T13:24:43.052+0300    info    Log file location /tmp/svacer-3041843149.log&lt;br /&gt;
 2024-12-02T13:24:43.052+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:24:43.059+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:24:43.096+0300    info    User example updated successfully&lt;br /&gt;
&lt;br /&gt;
==== Изменение статуса пользователя ====&lt;br /&gt;
 svacer user-provider update-status&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления)&lt;br /&gt;
    --status &amp;lt;active|archive&amp;gt;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 ./bin/svacer user-provider update-status --user admin --password admin --username example321 --status archive&lt;br /&gt;
 2024-12-02T13:26:49.444+0300    info    Log file location /tmp/svacer-2446325878.log&lt;br /&gt;
 2024-12-02T13:26:49.444+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-12-02T13:26:49.452+0300    info    Server version: [devel]&lt;br /&gt;
 2024-12-02T13:26:49.479+0300    info    User status updated successfully&lt;br /&gt;
&lt;br /&gt;
== Role management ==&lt;br /&gt;
&lt;br /&gt;
=== Управление ролями ===&lt;br /&gt;
Для управления пользователями используется команда '''role-provider''' инструмента Svacer с необходимыми подкомандами. Также требуется аутентификация на сервере для выполнения запросов и необходимые права доступа.&lt;br /&gt;
&lt;br /&gt;
==== Создание роли ====&lt;br /&gt;
 svacer role-provider add&lt;br /&gt;
    --name &amp;lt;name&amp;gt;&lt;br /&gt;
    --permissions &amp;lt;permissions&amp;gt; (Укажите права вида &amp;quot;цель1(ALL, идентификатор ветки, идентификатор или имя проекта, имя проекта/имя ветки):правило(чтобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==== Удаление роли ====&lt;br /&gt;
 svacer role-provider delete&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Изменение роли ====&lt;br /&gt;
 svacer role-provider update&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;&lt;br /&gt;
    --permissions &amp;lt;permissions&amp;gt; (Укажите права вида &amp;quot;цель1(ALL, идентификатор ветки, идентификатор или имя проекта, имя проекта/имя ветки):правило(чтобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
    --force &amp;lt;true|false&amp;gt; (Используйте, чтобы перезаписать правила для роли. По умолчанию указанные правила будут добавлены к уже существующим)&lt;br /&gt;
    --remove &amp;lt;true|false&amp;gt; (Используйте, чтобы удалить правила для роли. Правила, необходимые для удаления указываются в опции --permissions)&lt;br /&gt;
&lt;br /&gt;
==== Получение списка ролей ====&lt;br /&gt;
 svacer role-provider get&lt;br /&gt;
    --target &amp;lt;user id|name&amp;gt; (имя или идентификатор пользователя, чьи роли запрашиваются, если данный флаг не указан, будут выведены все роли)&lt;br /&gt;
&lt;br /&gt;
==== Назначение роли пользователю ====&lt;br /&gt;
 svacer role-provider assign&lt;br /&gt;
    --username &amp;lt;user name|id&amp;gt;&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;тобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
    --remove &amp;lt;true|false&amp;gt; (Используйте, чтобы перезаписать правила для роли. По умолчанию указанные правила будут добавлены к уже существующим)&lt;br /&gt;
&lt;br /&gt;
==== Получение списка разрешений ====&lt;br /&gt;
 svacer role-provider list-permissions&lt;br /&gt;
    --format &amp;lt;json|table&amp;gt; (Укажите формат вывода json или table (table выводится с применением, названием и описанием разрешения) (по умолчанию: json))&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2417</id>
		<title>User Management (command line)</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2417"/>
		<updated>2024-12-02T10:06:38Z</updated>

		<summary type="html">&lt;p&gt;Writer: role-provider&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== User management ==&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями ===&lt;br /&gt;
Для управления пользователями используется команда '''user-provider''' с необходимыми подкомандами.&lt;br /&gt;
&lt;br /&gt;
==== Создание пользователя ====&lt;br /&gt;
 svacer user-provider add&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --lastname &amp;lt;lastname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --change-password &amp;lt;true|false&amp;gt; (используйте для смены пароля при первой авторизации по умолчанию false)&lt;br /&gt;
    --auth-type &amp;lt;0|1|2&amp;gt; (тип аутентификации, 0 - Svacer, 1 - LDAP, 2 - OIDC_OAUTH, по умолчанию 0)&lt;br /&gt;
    --role &amp;lt;role id or name&amp;gt; (для установки нескольких ролей использовать флаг несколько раз)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master, по умолчанию false)&lt;br /&gt;
&lt;br /&gt;
==== Удаление пользователя ====&lt;br /&gt;
 svacer user-provider delete&lt;br /&gt;
    --username &amp;lt;id or name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Получение списка пользователей ====&lt;br /&gt;
 svacer user-provider get&lt;br /&gt;
    --with-roles &amp;lt;true|false&amp;gt; (к выводу добавляются роли пользователя)&lt;br /&gt;
    --filter &amp;lt;all|active|archived&amp;gt; (используйте для фильтрации списка пользователей)&lt;br /&gt;
&lt;br /&gt;
==== Обновление пользователя ====&lt;br /&gt;
 svacer user-provider update&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления (по умолчанию обновляется текущий пользователь, указанный в авторизации)&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --add-role &amp;lt;role id or name&amp;gt; (добавляет роль с переданным id или именем)&lt;br /&gt;
    --delete-role &amp;lt;role id or name&amp;gt; (удаляет роль с переданным id или именем)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master)&lt;br /&gt;
&lt;br /&gt;
==== Изменение статуса пользователя ====&lt;br /&gt;
 svacer user-provider update-status&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления)&lt;br /&gt;
    --status &amp;lt;active|archive&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Role management ==&lt;br /&gt;
&lt;br /&gt;
=== Управление ролями ===&lt;br /&gt;
Для управления ролями используется команда '''role-provider''' с необходимыми подкомандами.&lt;br /&gt;
&lt;br /&gt;
==== Создание роли ====&lt;br /&gt;
 svacer role-provider add&lt;br /&gt;
    --name &amp;lt;name&amp;gt;&lt;br /&gt;
    --permissions &amp;lt;permissions&amp;gt; (Укажите права вида &amp;quot;цель1(ALL, идентификатор ветки, идентификатор или имя проекта, имя проекта/имя ветки):правило(чтобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==== Удаление роли ====&lt;br /&gt;
 svacer role-provider delete&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Изменение роли ====&lt;br /&gt;
 svacer role-provider update&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;&lt;br /&gt;
    --permissions &amp;lt;permissions&amp;gt; (Укажите права вида &amp;quot;цель1(ALL, идентификатор ветки, идентификатор или имя проекта, имя проекта/имя ветки):правило(чтобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
    --force &amp;lt;true|false&amp;gt; (Используйте, чтобы перезаписать правила для роли. По умолчанию указанные правила будут добавлены к уже существующим)&lt;br /&gt;
    --remove &amp;lt;true|false&amp;gt; (Используйте, чтобы удалить правила для роли. Правила, необходимые для удаления указываются в опции --permissions)&lt;br /&gt;
&lt;br /&gt;
==== Получение списка ролей ====&lt;br /&gt;
 svacer role-provider get&lt;br /&gt;
    --target &amp;lt;user id|name&amp;gt; (имя или идентификатор пользователя, чьи роли запрашиваются, если данный флаг не указан, будут выведены все роли)&lt;br /&gt;
&lt;br /&gt;
==== Назначение роли пользователю ====&lt;br /&gt;
 svacer role-provider assign&lt;br /&gt;
    --username &amp;lt;user name|id&amp;gt;&lt;br /&gt;
    --role &amp;lt;role name|id&amp;gt;тобы получить список разрешений используй команду list-permissions);цель2:правило; ... ,цельН:правило&amp;quot;)&lt;br /&gt;
    --remove &amp;lt;true|false&amp;gt; (Используйте, чтобы перезаписать правила для роли. По умолчанию указанные правила будут добавлены к уже существующим)&lt;br /&gt;
&lt;br /&gt;
==== Получение списка разрешений ====&lt;br /&gt;
 svacer role-provider list-permissions&lt;br /&gt;
    --format &amp;lt;json|table&amp;gt; (Укажите формат вывода json или table (table выводится с применением, названием и описанием разрешения) (по умолчанию: json))&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2416</id>
		<title>User Management (command line)</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=User_Management_(command_line)&amp;diff=2416"/>
		<updated>2024-12-02T09:49:23Z</updated>

		<summary type="html">&lt;p&gt;Writer: add user provider&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== User management ==&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями ===&lt;br /&gt;
Для управления пользователями используется команда '''user-provider''' с необходимыми подкомандами.&lt;br /&gt;
&lt;br /&gt;
==== Создание пользователя ====&lt;br /&gt;
 svacer user-provider add&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --lastname &amp;lt;lastname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --change-password &amp;lt;true|false&amp;gt; (используйте для смены пароля при первой авторизации по умолчанию false)&lt;br /&gt;
    --auth-type &amp;lt;0|1|2&amp;gt; (тип аутентификации, 0 - Svacer, 1 - LDAP, 2 - OIDC_OAUTH, по умолчанию 0)&lt;br /&gt;
    --role &amp;lt;role id or name&amp;gt; (для установки нескольких ролей использовать флаг несколько раз)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master, по умолчанию false)&lt;br /&gt;
&lt;br /&gt;
==== Удаление пользователя ====&lt;br /&gt;
 svacer user-provider delete&lt;br /&gt;
    --username &amp;lt;id or name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Получение списка пользователей ====&lt;br /&gt;
 svacer user-provider get&lt;br /&gt;
    --with-roles &amp;lt;true|false&amp;gt; (к выводу добавляются роли пользователя)&lt;br /&gt;
    --filter &amp;lt;all|active|archived&amp;gt; (используйте для фильтрации списка пользователей)&lt;br /&gt;
&lt;br /&gt;
==== Обновление пользователя ====&lt;br /&gt;
 svacer user-provider update&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления (по умолчанию обновляется текущий пользователь, указанный в авторизации)&lt;br /&gt;
    --login &amp;lt;login&amp;gt;&lt;br /&gt;
    --user_password &amp;lt;pwd&amp;gt;&lt;br /&gt;
    --firstname &amp;lt;firstname&amp;gt;&lt;br /&gt;
    --middlename &amp;lt;middlename&amp;gt;&lt;br /&gt;
    --email &amp;lt;email&amp;gt;&lt;br /&gt;
    --add-role &amp;lt;role id or name&amp;gt; (добавляет роль с переданным id или именем)&lt;br /&gt;
    --delete-role &amp;lt;role id or name&amp;gt; (удаляет роль с переданным id или именем)&lt;br /&gt;
    --review-master &amp;lt;true|false&amp;gt; (активировать атрибут Review Master)&lt;br /&gt;
&lt;br /&gt;
==== Изменение статуса пользователя ====&lt;br /&gt;
 svacer user-provider update-status&lt;br /&gt;
    --username &amp;lt;id|name&amp;gt; (имя или идентификатор пользователя для обновления (по умолчанию обновляется текущий пользователь, указанный в авторизации)&lt;br /&gt;
    --status &amp;lt;active|archive&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Role management ==&lt;br /&gt;
Управление пользователями&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2227</id>
		<title>Markup2</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Markup2&amp;diff=2227"/>
		<updated>2024-11-18T13:17:18Z</updated>

		<summary type="html">&lt;p&gt;Writer: Убрал лишний --help в примерах кли команд&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Public REST API для экспорта, импорта и копирования разметки ==&lt;br /&gt;
Релиз 10.х Svacer включает новый API предназначенный для экспорта, импорта и копирования разметки. API доступен по endpoint-ам&lt;br /&gt;
 POST /api/public/markup/import&lt;br /&gt;
 POST /api/public/markup/export&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
Разметка описывается посредством protobuf схемы:&lt;br /&gt;
 // Represents exported review (review itself + comments)&lt;br /&gt;
 // Review is associated with invariant and has list of locations&lt;br /&gt;
 message Review { &lt;br /&gt;
   &lt;br /&gt;
   // Defines model for concrete location of the review&lt;br /&gt;
   message Location {            &lt;br /&gt;
     string warnClass = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     uint32 line = 3;&lt;br /&gt;
     string details = 4;&lt;br /&gt;
     string mtid = 5;&lt;br /&gt;
     string function = 10;&lt;br /&gt;
     bytes content_hash = 6;&lt;br /&gt;
     bytes trace_hash = 7;&lt;br /&gt;
     bytes marker_hash = 8;&lt;br /&gt;
     bytes line_hash = 9;    &lt;br /&gt;
     string tool = 11;&lt;br /&gt;
     string lang = 12;&lt;br /&gt;
   }  &lt;br /&gt;
   // Defines model for comment&lt;br /&gt;
   message Comment {      &lt;br /&gt;
     string text = 1;&lt;br /&gt;
     optional string format = 2;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 3;&lt;br /&gt;
     optional google.protobuf.Timestamp update_ts = 4;&lt;br /&gt;
     string createdBy = 5;      &lt;br /&gt;
     string origin_id = 6;   &lt;br /&gt;
     optional uint64 review_id = 7; // refers to Review.id field&lt;br /&gt;
     optional string created_by_id = 8;&lt;br /&gt;
   }&lt;br /&gt;
   // Defines model for review itself&lt;br /&gt;
   message ReviewData {&lt;br /&gt;
     string status = 1;&lt;br /&gt;
     string severity = 2;&lt;br /&gt;
     string action = 3;&lt;br /&gt;
     string origin_id = 4;&lt;br /&gt;
     google.protobuf.Timestamp create_ts = 5;&lt;br /&gt;
     string created_by = 6;&lt;br /&gt;
     optional string created_by_id = 7;&lt;br /&gt;
     optional string created_from = 8;&lt;br /&gt;
   }  &lt;br /&gt;
   // Invariant of the marker&lt;br /&gt;
   string invariant = 1; &lt;br /&gt;
   // Review information associated with markers having given invariant&lt;br /&gt;
   optional ReviewData review_data = 2;  &lt;br /&gt;
   // List of comments associated with all markers having given invariant&lt;br /&gt;
   repeated Comment comments = 3; &lt;br /&gt;
   // List of locations associated with given invariant. Locations can be used to apply fuzzy matching of review with existing data when there is no invariant match  &lt;br /&gt;
   repeated Location locations = 4;&lt;br /&gt;
   // Export-specific ID, comments can refer to this id if comment is associated with review operation&lt;br /&gt;
   uint64 id = 5;&lt;br /&gt;
   // Meta-information about export, when exporting to file field is initialized only for the first element&lt;br /&gt;
   optional ReviewExportMeta meta = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Defines meta-information about exported review&lt;br /&gt;
 message ReviewExportMeta {&lt;br /&gt;
   message Container {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string name = 2;&lt;br /&gt;
   }  &lt;br /&gt;
   google.protobuf.Timestamp create_ts = 1; // timestamp when export was produced (UTC)&lt;br /&gt;
   string created_by = 2; // user who triggered export&lt;br /&gt;
   string svacer_version = 3;  // svacer version&lt;br /&gt;
   optional Container project = 4; // source container (project)&lt;br /&gt;
   optional Container branch = 5; // source container (branch)&lt;br /&gt;
   map&amp;lt;string,string&amp;gt; properties = 6; // extra properties&lt;br /&gt;
 }&lt;br /&gt;
Актуальную версию схемы можно получить из Svacer по API: &amp;lt;code&amp;gt;GET /api/public/markup/schema&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''ВНИМАНИЕ''': При сериализации в JSON используются proto-имена полей. При работе с данными из Go рекомендуется использовать https://pkg.go.dev/google.golang.org/protobuf/encoding/protojson для сериализации и десериализации.&lt;br /&gt;
&lt;br /&gt;
Svacer поддерживает два формата для экспортирования/импортирования разметки:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; с разделением по newline-ам. Каждая строка представляет собой объект типа &amp;lt;code&amp;gt;Review&amp;lt;/code&amp;gt; (указано выше) сериализованный в JSON&lt;br /&gt;
* бинарный формат: последовательность блоков &amp;lt;code&amp;gt;[lenght little endian][proto]&amp;lt;/code&amp;gt; , где первый блок содержит длину следующего блока в формате &amp;lt;code&amp;gt;u32 little endian&amp;lt;/code&amp;gt; , а второй блок содержит proto-сериализацию объекта &amp;lt;code&amp;gt;Review&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В обоих случаях при выгрузке разметки первый элемент типа &amp;lt;code&amp;gt;Review&amp;lt;/code&amp;gt; будет содержать мета-информацию об исходном контексте, откуда была выгружена разметка&lt;br /&gt;
&lt;br /&gt;
Разметка привязывается к инварианту маркера и может содержать собственно разметку (статус маркера) и совокупность комментариев, связанных с данным маркером. При выгрузке разметки так же добавляется информация о конкретных локациях предупреждений, ассоциированных с инвариантом. В будущих версиях данная информация будет использоваться для переноса разметки при отсутствии прямого совпадения инвариантов.&lt;br /&gt;
&lt;br /&gt;
=== Экспорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/export&lt;br /&gt;
&lt;br /&gt;
* параметры передаются в body запроса&lt;br /&gt;
* запрос должен иметь токен аутентификации&lt;br /&gt;
* пользователь должен иметь доступы на Public API и экспорт разметки из ветки, откуда производится экспорт&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;format&amp;quot;: &amp;quot;&amp;lt;json|proto&amp;gt;&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
Пользователь должен указать либо &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; элемент, либо &amp;lt;code&amp;gt;source_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Опция &amp;lt;code&amp;gt;skip_comments&amp;lt;/code&amp;gt; позволяет игнорировать комментарии при выгрузке разметки.&lt;br /&gt;
&lt;br /&gt;
Опция &amp;lt;code&amp;gt;skip_review&amp;lt;/code&amp;gt; позволяет игнорировать статусы маркеров при выгрузке разметки (т.е выгружать только комментарии).&lt;br /&gt;
&lt;br /&gt;
Метод возвращает gzipped файл содержащий разметку в указанном формате.&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки ===&lt;br /&gt;
 POST  /api/public/markup/import&lt;br /&gt;
&lt;br /&gt;
* параметры передаются в '''query''' запроса&lt;br /&gt;
* запрос должен быть формата &amp;lt;code&amp;gt;multipart/form-data&amp;lt;/code&amp;gt;, поле &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; должно содержать файл с разметкой&lt;br /&gt;
* запрос должен иметь токен аутентификации&lt;br /&gt;
* пользователь должен иметь доступы на Public API, импорт разметки или снэпшота и разрешения &amp;lt;code&amp;gt;Update any review&amp;lt;/code&amp;gt;и&amp;lt;code&amp;gt;Update any comment&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Query параметры:&lt;br /&gt;
 project - &amp;lt;project name&amp;gt; - имя проекта&lt;br /&gt;
 branch - &amp;lt;branch name&amp;gt; - имя бранча&lt;br /&gt;
 target_id - &amp;lt;branch id&amp;gt; - id бранча. Должно быть либо id бранча, либо имя проекта + имя бранча. Приоритет - id бранча&lt;br /&gt;
 format - &amp;lt;proto|json&amp;gt; - формат импортируемой разметки, если не указан - будет определяться автоматически&lt;br /&gt;
 overwrite - &amp;lt;none|force|last&amp;gt; - контролирует логику применения разметки к бранчу при импорте&lt;br /&gt;
 skip_comments - &amp;lt;true|false&amp;gt; - игнорировать комментарии&lt;br /&gt;
 skip_review - &amp;lt;true|false&amp;gt; - игнорировать статус разметки (импорт только комментариев)&lt;br /&gt;
 response_with_result - &amp;lt;true|false&amp;gt; - вернуть детальный список разметок, какие были применены в формате json с newline &lt;br /&gt;
                                       разделителями. Если не указан, то возвращается краткий статус&lt;br /&gt;
 compressed - &amp;lt;true|false&amp;gt; - формат файла с разметкой, если true то файл подразумевается gzip-compressed&lt;br /&gt;
В случае успеха, метод возвращает Body со следующими данными&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
Первая строка Body содержит JSON с информацией о выполненных действиях. Если бы указан параметр &amp;lt;code&amp;gt;response_with_result&amp;lt;/code&amp;gt;то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритм импорта ====&lt;br /&gt;
&lt;br /&gt;
* Блокируются операции по разметки и импорту на целевой бранч&lt;br /&gt;
* Выгружается текущая разметка бранча с комментариями&lt;br /&gt;
* Загруженная разметка сопоставляется с текущей и формируется список разметки для применения. Дублирующая разметка и комментарии игнорируются. Перезапись разметки контролируется параметрами &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt;. Если значение &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, то разметка не перезаписывается при наличии разметки в целевом бранче. Если значение &amp;lt;code&amp;gt;force&amp;lt;/code&amp;gt;, то разметка будет перезаписана. Если значение &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, то разметка будет перезаписана если загруженная разметка имеет более новую дату.&lt;br /&gt;
* Сформированный список применяется к бранчу. При выборе маркера, куда добавлять комментарий, выбирается маркер из наиболее раннего снимка, где маркер с соответствующим инвариантом появился.&lt;br /&gt;
&lt;br /&gt;
=== Копирование разметки ===&lt;br /&gt;
 POST /api/public/markup/copy&lt;br /&gt;
&lt;br /&gt;
*параметры передаются в '''body''' запроса&lt;br /&gt;
* запрос должен иметь токен аутентификации&lt;br /&gt;
* пользователь должен иметь доступы на Public API, импорт разметки/снимка и разрешения &amp;lt;code&amp;gt;Update any review&amp;lt;/code&amp;gt;и&amp;lt;code&amp;gt;Update any comment&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формат body:&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;source&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;source_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;target&amp;quot;: [&amp;quot;&amp;lt;project name&amp;gt;&amp;quot;,&amp;quot;&amp;lt;branch name&amp;gt;&amp;quot;],&lt;br /&gt;
     &amp;quot;target_id&amp;quot;: &amp;quot;&amp;lt;branch id&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;skip_comments&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;skip_review&amp;quot;: &amp;lt;true|false&amp;gt;,&lt;br /&gt;
     &amp;quot;overwrite&amp;quot;: &amp;quot;&amp;lt;none|last|force&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;response_with_result&amp;quot;: &amp;lt;true|false&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
В случае успеха, метод возвращает Body со следующими данными&lt;br /&gt;
 {&amp;quot;total&amp;quot;:&amp;lt;total number of loaded reviews&amp;gt;,&amp;quot;applied_reviews&amp;quot;:&amp;lt;applied reviews&amp;gt;,&amp;quot;applied_comments&amp;quot;:&amp;lt;applied comments&amp;gt;,&amp;quot;skipped_reviews&amp;quot;:&amp;lt;skipped reviews&amp;gt;,&amp;quot;duplicate_reviews&amp;quot;:&amp;lt;duplicate reviews&amp;gt;,&amp;quot;duplicate_comments&amp;quot;:&amp;lt;duplicate comments}&lt;br /&gt;
 &amp;lt;json representation of applied review&amp;gt;*&lt;br /&gt;
Первая строка Body содержит JSON с информацией о выполненных действиях. Если бы указан параметр &amp;lt;code&amp;gt;response_with_result&amp;lt;/code&amp;gt;то дальше будут идти newline-separated JSON представления примененных review.&lt;br /&gt;
&lt;br /&gt;
== CLI API для импорта/экспорта/копирования разметки ==&lt;br /&gt;
Данное API является '''экспериментальным''' и может меняться. Основные аргументы будут сохранены. По умолчанию, команды под &amp;lt;code&amp;gt;markup2&amp;lt;/code&amp;gt; скрыты. Использовать можно, указывая их явно. Для получения помощи запустить:&lt;br /&gt;
 svacer markup2 --help&lt;br /&gt;
 svacer markup2 copy --help&lt;br /&gt;
 svacer markup2 import --help&lt;br /&gt;
 svacer markup2 export --help&lt;br /&gt;
Описание команд:&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 - New [experimental] API for review export/import/copy&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    import   Import markup from file and apply to specified branch&lt;br /&gt;
    export   Export markup to file or stdout. Command needs either branch ID or project and branch name. When exporting to file, data is gzipped.&lt;br /&gt;
    copy     Copy markup between branches&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --ssl                 Connect to the server using https protocol (default: false)&lt;br /&gt;
    --ssl-ca-certs value  Trusted CA cert path. Example: /usr/local/certs/* , /usr/local/certs/ca.crt, /usr/local/certs/ca*.crt&lt;br /&gt;
    --user value          Valid user name&lt;br /&gt;
    --password value      Valid user password&lt;br /&gt;
    --oidc-client value   ClientID for login with OpenID Connect protocol&lt;br /&gt;
    --oidc-secret value   Client's secret for login with OpenID Connect protocol&lt;br /&gt;
    --host value          Valid host name with running svace history server (default: localhost) [$SVACER_HOST_NAME]&lt;br /&gt;
    --port value          Defines port for REST API (default: 8080) [$SVACER_API_PORT]&lt;br /&gt;
    --grpc value          Defines port for gRPC API (default: 3002) [$SVACER_GRPC_PORT]&lt;br /&gt;
    --ldap_server value   Server for LDAP authentication [$SVACER_LDAP_SERVER]&lt;br /&gt;
    --conn_file value     Use connection file [$SVACER_CONN_FILE]&lt;br /&gt;
    --dry-run             Do actions but don't commit result to database (default: false)&lt;br /&gt;
    --help                Show help (default: false)&lt;br /&gt;
Импорт разметки из файла&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 import - Import markup from file and apply to specified branch&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 import [command options] &amp;lt;file&amp;gt; - path to file to import. If file is not specified, data is loaded from stdin&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value    Target project name&lt;br /&gt;
    --branch value     Target branch name&lt;br /&gt;
    --branch-id value  Target branch ID&lt;br /&gt;
    --skip-review      Import comments only (default: false)&lt;br /&gt;
    --skip-comments    Import review only (default: false)&lt;br /&gt;
    --overwrite value  Overwrite mode: none, force, last&lt;br /&gt;
    --out value        Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out      Include information about applied reviews (default: false)&lt;br /&gt;
    --format value     Specify explicit format for data. If not specified, format will be detected from content&lt;br /&gt;
    --help             Show help (default: false)&lt;br /&gt;
Экспорт разметки в файл&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 export - Export markup to file or stdout. Command needs either branch ID or project and branch name. When exporting to file, data is gzipped.&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 export [command options] &amp;lt;file name or empty&amp;gt; - if no file name is specified, result is printed to stdout&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --project value    Source project name&lt;br /&gt;
    --branch value     Source branch name. Branch name will be resolved against source project&lt;br /&gt;
    --branch-id value  Source branch ID&lt;br /&gt;
    --skip-review      Export comments only (default: false)&lt;br /&gt;
    --skip-comments    Export review only (default: false)&lt;br /&gt;
    --format value     Format: json or proto. If format is not specified, proto is used. If output file is not specified and format is not specified, json will be used.&lt;br /&gt;
    --uncompressed     Get data in raw format without gzip compression (default: false)&lt;br /&gt;
    --help             Show help (default: false)&lt;br /&gt;
Копирование разметки&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacer markup2 copy - Copy markup between branches&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacer markup2 copy [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --target-project value    Target project name&lt;br /&gt;
    --target-branch value     Target branch name&lt;br /&gt;
    --target-branch-id value  Target branch ID&lt;br /&gt;
    --source-project value    Source project name&lt;br /&gt;
    --source-branch value     Source branch name&lt;br /&gt;
    --source-branch-id value  Source branch ID&lt;br /&gt;
    --skip-review             Copy comments only (default: false)&lt;br /&gt;
    --skip-comments           Copy review only (default: false)&lt;br /&gt;
    --overwrite value         Overwrite mode: none, force, last&lt;br /&gt;
    --out value               Write information about applied reviews to given file (in json format). If not specified, result is printed to stdout&lt;br /&gt;
    --verbose-out             Include information about applied reviews (default: false)&lt;br /&gt;
    --help                    Show help (default: false)&lt;br /&gt;
Примеры использования:&lt;br /&gt;
 svacer markup2 --user admin --password admin copy --overwrite=force --source-project bash --target-project bash  --source-branch master --target-branch bash_clone &lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Log file location /tmp/svacer-1543671068.log&lt;br /&gt;
 2024-11-15T13:19:41.735+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:19:41.745+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 svacer markup2 --user admin --password admin import --overwrite=force --project bash --branch bash_clone  /tmp/out.json &lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Log file location /tmp/svacer-1480510331.log&lt;br /&gt;
 2024-11-15T13:20:17.433+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T13:20:17.435+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;total&amp;quot;:771,&amp;quot;applied_reviews&amp;quot;:0,&amp;quot;applied_comments&amp;quot;:0,&amp;quot;skipped_reviews&amp;quot;:771,&amp;quot;duplicate_reviews&amp;quot;:771,&amp;quot;duplicate_comments&amp;quot;:5}&lt;br /&gt;
&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Log file location /tmp/svacer-1792255677.log&lt;br /&gt;
 2024-11-15T15:46:06.809+0300    info    Quering server configuration from &amp;lt;nowiki&amp;gt;http://localhost:8080/api/public/server/info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 2024-11-15T15:46:06.810+0300    info    Server version: [devel]&lt;br /&gt;
 {&amp;quot;invariant&amp;quot;:&amp;quot;+1vB4JXkME3AAcbXR7tezA&amp;quot;, &amp;quot;review_data&amp;quot;:{&amp;quot;status&amp;quot;:&amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;:&amp;quot;Unspecified&amp;quot;, &amp;quot;action&amp;quot;:&amp;quot;Undecided&amp;quot;, &amp;quot;create_ts&amp;quot;:&amp;quot;2024-10-16T14:44:07.233554Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;created_from&amp;quot;:&amp;quot;1c8cea92-7708-4bb9-9a88-40325f39efe8&amp;quot;}, &amp;quot;locations&amp;quot;:[{&amp;quot;warnClass&amp;quot;:&amp;quot;PROC_USE.VULNERABLE&amp;quot;, &amp;quot;file&amp;quot;:&amp;quot;/.build/jobs.c&amp;quot;, &amp;quot;line&amp;quot;:4207, &amp;quot;details&amp;quot;:&amp;quot;b043c5a63bf9d432c816f2cb421c907fe912bf16&amp;quot;, &amp;quot;mtid&amp;quot;:&amp;quot;SvEng.L.1&amp;quot;, &amp;quot;function&amp;quot;:&amp;quot;run_sigchld_trap&amp;quot;, &amp;quot;content_hash&amp;quot;:&amp;quot;s4AMYzKR8Ol8k4OODPpOlPUsSWI=&amp;quot;, &amp;quot;marker_hash&amp;quot;:&amp;quot;XiVQmRu8HmhzOnq1+XY7AaujT+o=&amp;quot;, &amp;quot;tool&amp;quot;:&amp;quot;SvEng&amp;quot;, &amp;quot;lang&amp;quot;:&amp;quot;C_Cpp&amp;quot;}], &amp;quot;id&amp;quot;:&amp;quot;699&amp;quot;, &amp;quot;meta&amp;quot;:{&amp;quot;create_ts&amp;quot;:&amp;quot;2024-11-15T12:46:06.835078490Z&amp;quot;, &amp;quot;created_by&amp;quot;:&amp;quot;admin&amp;quot;, &amp;quot;svacer_version&amp;quot;:&amp;quot;devel.2024-11-15@15:45:34.a290bc7e&amp;quot;, &amp;quot;project&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;0fd645aa-8e70-4a4f-b68b-766c4f337bf2&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;}, &amp;quot;branch&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;8925df5a-7a98-4f07-bc88-ee4ea5b43813&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;master&amp;quot;}}}&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/management/containers&amp;diff=2087</id>
		<title>Help:CLI/management/containers</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI/management/containers&amp;diff=2087"/>
		<updated>2024-10-15T13:04:48Z</updated>

		<summary type="html">&lt;p&gt;Writer: описание команд из svacer container&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание и примеры использования управления контейнерами в svacer ==&lt;br /&gt;
Управление разными видами контейнеров может осуществлять пользователь при наличии соответствующих доступов через команды &amp;lt;code&amp;gt;svacer container&amp;lt;/code&amp;gt;. Команды можно использовать в скриптах, возвращаемые значения обычно выводятся в виде JSON в &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; поток, что позволяет получать и использовать ID объекты в скриптах. &lt;br /&gt;
&lt;br /&gt;
В примерах для краткости не указываются опции доступа к серверу и пользователя и вывод приведён с сокращениями.&lt;br /&gt;
&lt;br /&gt;
Актуальную информацию по командам можно посмотреть напрямую через вызов &amp;lt;code&amp;gt;svacer &amp;lt;command&amp;gt; --help&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Добавление ветки, проекта или группы проектов ===&lt;br /&gt;
Добавление нового контейнера осуществляется командой  &amp;lt;code&amp;gt;svacer container add&amp;lt;/code&amp;gt; c указанием названия и типа создаваемого объекта: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;. Например так создаётся пустой проект&lt;br /&gt;
 svacer container add --name wiki-help --type project&lt;br /&gt;
 ...&lt;br /&gt;
 2024-10-15T14:23:56.922+0300    info    Project добавлен&lt;br /&gt;
В терминале так же будет выведен вывод с JSON строкой следующего вида&lt;br /&gt;
 {&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;550eaba9-39e8-48f7-b8b0-7bde24535d95&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;wiki-help&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
Для создания ветки надо указать проект в которые её добавлять, для этого используется опция &amp;lt;code&amp;gt;--parent&amp;lt;/code&amp;gt;&lt;br /&gt;
 svacer container add  --name wiki-help-branch --type branch --parent 550eaba9-39e8-48f7-b8b0-7bde24535d95&lt;br /&gt;
В терминале так же будет выведен вывод с JSON строкой результата действия:&lt;br /&gt;
 {&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;a162cb5b-d09b-4a34-a4a8-818a9a0f32de&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;wiki-help-branch&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;branch&amp;quot;,&amp;quot;parent&amp;quot;:&amp;quot;550eaba9-39e8-48f7-b8b0-7bde24535d95&amp;quot;}]}&lt;br /&gt;
При создании проекта можно так же указать параметр &amp;lt;code&amp;gt;--review-with-comment&amp;lt;/code&amp;gt;  для создания проекта с обязательным комментарием при изменении разметки. Если параметр не передавать, проект создаётся без этого требования.&lt;br /&gt;
&lt;br /&gt;
=== Удаление ветки, проекта или группы проектов ===&lt;br /&gt;
Удаление контейнера осуществляется командой &amp;lt;code&amp;gt;svacer container remove&amp;lt;/code&amp;gt; c указанием ID  и типа удаляемого объекта: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;. Например так удаляется проект &lt;br /&gt;
 svacer container remove --id 550eaba9-39e8-48f7-b8b0-7bde24535d95 --type project&lt;br /&gt;
 ...&lt;br /&gt;
 2024-10-15T14:34:48.725+0300    info    Удаление завершено&lt;br /&gt;
В терминале так же будет выведен вывод с JSON строкой следующего вида&lt;br /&gt;
 {&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;550eaba9-39e8-48f7-b8b0-7bde24535d95&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;wiki-help&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
&lt;br /&gt;
=== Список веток, проектов или групп проектов ===&lt;br /&gt;
С помощью команды &amp;lt;code&amp;gt;svacer container list&amp;lt;/code&amp;gt; можно просмотреть связи между контейнерами. С помощью опции &amp;lt;code&amp;gt;--name&amp;lt;/code&amp;gt; можно ограничить возвращаемые значения, например запрос по &amp;lt;code&amp;gt;wiki без указания типа, вернёт все контейнеры с именем содержащим это значение&amp;lt;/code&amp;gt;&lt;br /&gt;
  svacer container list --name wiki&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;550eaba9-39e8-48f7-b8b0-7bde24535d95&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;wiki-help&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;a162cb5b-d09b-4a34-a4a8-818a9a0f32de&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;wiki-help-branch&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;branch&amp;quot;,&amp;quot;parent&amp;quot;:&amp;quot;550eaba9-39e8-48f7-b8b0-7bde24535d95&amp;quot;}]}&lt;br /&gt;
Если добавить опцию &amp;lt;code&amp;gt;--format text&amp;lt;/code&amp;gt;  то возвращаемое значение будет отформатировано к такому виду:&lt;br /&gt;
 Id: 550eaba9-39e8-48f7-b8b0-7bde24535d95, Name: wiki-help, Type: project, ReviewWithComment: false&lt;br /&gt;
 Id: a162cb5b-d09b-4a34-a4a8-818a9a0f32de, Name: wiki-help-branch, Type: branch, Parent: 550eaba9-39e8-48f7-b8b0-7bde24535d95&lt;br /&gt;
Если указать тип ветки, то в результате так же вернётся список снимков в данной ветке.&lt;br /&gt;
 svacer container list --id 6367355f-bcf7-4f3a-a9dc-00ec8b0d7806 --type branch&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;87193c7b-6fb9-4eb5-bf55-d7e88e2cfc25&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;snapshotname&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;snapshot&amp;quot;,&amp;quot;parent&amp;quot;:&amp;quot;6367355f-bcf7-4f3a-a9dc-00ec8b0d7806&amp;quot;}]}&lt;br /&gt;
&lt;br /&gt;
=== Редактирование ветки, проекта или группы проектов ===&lt;br /&gt;
Для изменения названия ветки или настроеек проекта существует команда &amp;lt;code&amp;gt;svacer container update&amp;lt;/code&amp;gt;. Для изменения надо передать ID объекта, новое имя и опцию для проекта. &lt;br /&gt;
 svacer container update --name wiki-help_changed --id 550eaba9-39e8-48f7-b8b0-7bde24535d95 --review-with-comment&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 2024-10-15T14:55:20.043+0300    info    Редактирование завершено&lt;br /&gt;
В &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; результат операции представлен с новыми значениями&lt;br /&gt;
 {&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;550eaba9-39e8-48f7-b8b0-7bde24535d95&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;wiki-help_changed&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;,&amp;quot;review_with_comment&amp;quot;:true}]}&lt;br /&gt;
&lt;br /&gt;
=== Клонирование ветки или проекта ===&lt;br /&gt;
Клонирование осуществляется командой &amp;lt;code&amp;gt;svacer container clone&amp;lt;/code&amp;gt; с указанием типа объекта (&amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;), объекта клонирования (через &amp;lt;code&amp;gt;--parent&amp;lt;/code&amp;gt;)  и имени клонированного объекта с дополнительными параметрами (группы проектов и обязательности комментария) . Клонирование ветки происходит с ожиданием окончания, а завершения клонирование проекта по умолчнию не ожидается. Для ожидания можно использовать параметр &amp;lt;code&amp;gt;--wait&amp;lt;/code&amp;gt;.&lt;br /&gt;
 svacer container clone --name wiki-help_clone  --parent 550eaba9-39e8-48f7-b8b0-7bde24535d95 --review-with-comment true --type project &lt;br /&gt;
 ...&lt;br /&gt;
 2024-10-15T15:09:00.012+0300    info    Клонирование проекта запущено&lt;br /&gt;
При этом выводится ID задачи клонирования, для большого проекта можно её отменить&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;7c3fae83-ba42-450f-af71-91400f50c2fc&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
Проекты клонируются в порядке очерёдности на сервере, два клонирования проектов паралелльно  не запускаются. &lt;br /&gt;
&lt;br /&gt;
==== Получение состояния и отмена текущей задачи клонирования ====&lt;br /&gt;
Подкомандами &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; можно отменить или получить результаты клонирования. Тут надо учесть что параметры соединения с сервером и данные пользователя надо указывать между &amp;lt;code&amp;gt;clone&amp;lt;/code&amp;gt; и подкомандой. &lt;br /&gt;
 svacer container clone {host/user settings} status --id cd143fd6-17df-4259-a020-f54982040e09&lt;br /&gt;
Для статуса будет содержать информацию по всем клонированным веткам в проекте.&lt;br /&gt;
&lt;br /&gt;
=== Управление снимками ===&lt;br /&gt;
Снимки можно переименовывать и удалять. Создание снимков происходит только при иморте извне.&lt;br /&gt;
&lt;br /&gt;
==== Переименование и удаление снимков ====&lt;br /&gt;
Подкомандами &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; можно переименовать или удалить снимок. Для переименования достаточно указать текущий ID снимка и новое название. Для удаления можно так же указать только ID снимка, или проект/ветку/снимок.&lt;br /&gt;
 svacer container snapshot rename --id 87193c7b-6fb9-4eb5-bf55-d7e88e2cfc25  --name hahah&lt;br /&gt;
В данном случае результат операции не печатается, но его можно проверить через команду &amp;lt;code&amp;gt;svacer container list&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== [ЭКСПЕРИМЕНТАЛЬНО] Слияние снимков ====&lt;br /&gt;
Слияния снимков позволяет объеденить несколько снимков в один командой &amp;lt;code&amp;gt;svacer container snapshot merge&amp;lt;/code&amp;gt;. В неё передаётся список снимков для слияния, названия результирующего снимка и дополнительные опции (типа удалять ли старые снимки).&lt;br /&gt;
 svacer container snapshot merge --snapshot {snap1_id}  --snapshot {snap2_id} --snapshot {snap3_id} --branch {branch_id} --name target_branch&lt;br /&gt;
&lt;br /&gt;
=== Управление группами проектов ===&lt;br /&gt;
Группы проектов это опциональный способ группировки проектов, проекты можно добавить в несколько групп, так и не добавлять ни в одну группу. Поэтому управление выделено в отдельный набор команд. Для управления необходимо чтобы объекты уже существовали на сервере.&lt;br /&gt;
&lt;br /&gt;
==== Добавление проекта в группу проектов ====&lt;br /&gt;
Можно передавать как ID объектов, так и их названия. Добавление в групп проектов происходит такой командой&lt;br /&gt;
 svacer container project-groups add --project {prj_id} --project-group {project_group_id}&lt;br /&gt;
&lt;br /&gt;
==== Удалить проект из группы проектов ====&lt;br /&gt;
Удаление из группы происходит практически таким же образом, но с помощью команды &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;&lt;br /&gt;
 svacer container project-groups remove --project {prj_id} --project-group {project_group_id}&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=2070</id>
		<title>Help:Utils</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=2070"/>
		<updated>2024-08-27T06:56:38Z</updated>

		<summary type="html">&lt;p&gt;Writer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Утилиты ==&lt;br /&gt;
=== pfixer ===&lt;br /&gt;
pfixer -- утилита для исправления путей при экспорте снимков в файл. Замена путей в существующем снимке опасна, поэтому предлагается делать экспорт снимка с заменой путей. При необходимости исходный снимок пользователь может удалить с сервера. &lt;br /&gt;
&lt;br /&gt;
Утилита так же работает со снимками в файлах. pfixer поддерживает версии Svacer начиная с версии 7, но поставляется после 9-0-2. Исполняемый файл находится в bin.&lt;br /&gt;
&lt;br /&gt;
Для работы с утилитой необходимо создать файл содержащий правила замены путей. Это должен быть юниксовый текстовый файл (разделитель строк знак '\n'). Каждая строчка должна содержать заменяемый префикс и значение, разделённый двоеточием. Если префикс должен быть удалён, для замены используется знак '-'. Его указать можно через опцию --map-file или через stdin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;префикс1&amp;gt;:&amp;lt;замена1&amp;gt;&lt;br /&gt;
&amp;lt;префикс2&amp;gt;:&amp;lt;замена2&amp;gt;&lt;br /&gt;
&amp;lt;префикс3&amp;gt;:&amp;lt;замена3&amp;gt;&lt;br /&gt;
&amp;lt;префикс4&amp;gt;:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так же есть возможность использовать регулярные выражения (в экспериментальной стадии) из языка Golang (https://pkg.go.dev/regexp#Regexp.ReplaceAllString). В этом случае использовать надо знак '@' в начале строки. Так же можно использовать $var для ссылок на группы в регулярном выражении.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@&amp;lt;регулярное_выражение1&amp;gt;:&amp;lt;замена&amp;gt;&lt;br /&gt;
@&amp;lt;регулярное_выражение2&amp;gt;:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все правила упорядочиваются перед заменой, применяется самое длинное подходящее правило. Процесс прерывается в случае, если пути конфликтуют после замены (два пути превратились в один).&lt;br /&gt;
&lt;br /&gt;
Авторизацию на сервере можно передать через опции --credentials вида login:password или --token сразу токен авторизации.&lt;br /&gt;
&lt;br /&gt;
Исходный снимок с сервера можно передать сразу ссылкой с сайта.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Примеры&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pfixer --source http://svacer/mode/review/project/{project}/branch/{branch}/snapshot/{snapshot} --output updated.snap --credentials login:password --map-file map.txt &lt;br /&gt;
pfixer --source input.snap --output updated.snap -map-file map.txt --log-file test.log&lt;br /&gt;
pfixer --source input.snap --output updated.snap --log-file test.log | cat map.txt &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=2069</id>
		<title>Help:Utils</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=2069"/>
		<updated>2024-08-27T06:54:15Z</updated>

		<summary type="html">&lt;p&gt;Writer: ошибка в описании&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Утилиты ==&lt;br /&gt;
=== pfixer ===&lt;br /&gt;
pfixer -- утилита для исправления путей при экспорте снимков в файл. Замена путей в существующем снимке опасна, поэтому предлагается делать экспорт снимка с заменой путей. При необходимости исходный снимок пользователь может удалить с сервера. &lt;br /&gt;
&lt;br /&gt;
Утилита так же работает со снимками в файлах. pfixer поддерживает версии Svacer начиная с версии 7, но поставляется после 9-0-2. Исполняемый файл находится в bin.&lt;br /&gt;
&lt;br /&gt;
Для работы с утилитой необходимо создать файл содержащий правила замены путей. Это должен быть юниксовый текстовый файл (разделитель строк знак '\n'). Каждая строчка должна содержать заменяемый префикс и значение, разделённый двоеточием. Если префикс должен быть удалён, для замены используется знак '-'. Его указать можно через опцию --map-file или через stdin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;префикс1&amp;gt;:&amp;lt;замена1&amp;gt;&lt;br /&gt;
&amp;lt;префикс2&amp;gt;:&amp;lt;замена2&amp;gt;&lt;br /&gt;
&amp;lt;префикс3&amp;gt;:&amp;lt;замена3&amp;gt;&lt;br /&gt;
&amp;lt;префикс4&amp;gt;:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так же есть возможность использовать регулярные выражения (в экспериментальной стадии) из языка Golang (https://pkg.go.dev/regexp#Regexp.ReplaceAllString). В этом случае использовать надо знак '@' в начале строки. Так же можно использовать $var для ссылок на группы в регулярном выражении.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@&amp;lt;регулярное_выражение1&amp;gt;:&amp;lt;замена&amp;gt;&lt;br /&gt;
@&amp;lt;регулярное_выражение2&amp;gt;:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все правила замен упорядочиваются перед заменой, применяется самое длинное подходящее правило. Процесс прерывается в случае, если пути конфликтуют после замены (два пути превратились в один).&lt;br /&gt;
&lt;br /&gt;
Авторизацию на сервере можно передать через опции --credentials вида login:password или --token сразу токен авторизации.&lt;br /&gt;
&lt;br /&gt;
Исходный снимок с сервера можно передать сразу ссылкой с сайта.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Примеры&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pfixer --source http://svacer/mode/review/project/{project}/branch/{branch}/snapshot/{snapshot} --output updated.snap --credentials login:password --map-file map.txt &lt;br /&gt;
pfixer --source input.snap --output updated.snap -map-file map.txt --log-file test.log&lt;br /&gt;
pfixer --source input.snap --output updated.snap --log-file test.log | cat map.txt &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=2067</id>
		<title>Help:Utils</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Utils&amp;diff=2067"/>
		<updated>2024-08-27T06:35:03Z</updated>

		<summary type="html">&lt;p&gt;Writer: Создание страницы для описания pfixer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Утилиты ==&lt;br /&gt;
=== pfixer ===&lt;br /&gt;
pfixer -- утилита для исправления путей при экспорте снимков в файл. Замена путей в существующем снимке опасна, поэтому предлагается делать экспорт снимка с заменой путей. При необходимости исходный снимок пользователь может удалить с сервера. &lt;br /&gt;
&lt;br /&gt;
Утилита так же работает со снимками в файлах. pfixer поддерживает версии Svacer начиная с версии 7, но поставляется после 9-0-2. Исполняемый файл находится в bin.&lt;br /&gt;
&lt;br /&gt;
Для работы с утилитой необходимо создать файл содержащий правила замены путей. Это должен быть юниксовый текстовый файл (разделитель строк знак '\n'). Каждая строчка должна содержать заменяемый префикс и значение, разделённый двоеточием. Если префикс должен быть удалён, для замены используется знак '-'. Его указать можно через опцию --map-file или через stdin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;префикс1&amp;gt;:&amp;lt;замена1&amp;gt;&lt;br /&gt;
&amp;lt;префикс2&amp;gt;:&amp;lt;замена2&amp;gt;&lt;br /&gt;
&amp;lt;префикс3&amp;gt;:&amp;lt;замена3&amp;gt;&lt;br /&gt;
&amp;lt;префикс4&amp;gt;:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так же есть возможность использовать регулярные выражения (в экспериментальной стадии) из языка Golang (https://pkg.go.dev/regexp#Regexp.ReplaceAllString). В этом случае использовать надо знак '@' в начале строки. Так же можно использовать $var для ссылок на группы в регулярном выражении.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@&amp;lt;регулярное_выражение1&amp;gt;:&amp;lt;замена&amp;gt;&lt;br /&gt;
@&amp;lt;регулярное_выражение2&amp;gt;:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все правила замен упорядочиваются перед заменой, применяется самое длинное подходящее правило. Процесс прерывается в случае если правила приводят пути конфликтуют после замены (два пути превратились в один).&lt;br /&gt;
&lt;br /&gt;
Авторизацию на сервере можно передать через опции --credentials вида login:password или --token сразу токен авторизации.&lt;br /&gt;
&lt;br /&gt;
Исходный снимок с сервера можно передать сразу ссылкой с сайта.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Примеры&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pfixer --source http://svacer/mode/review/project/{project}/branch/{branch}/snapshot/{snapshot} --output updated.snap --credentials login:password --map-file map.txt &lt;br /&gt;
pfixer --source input.snap --output updated.snap -map-file map.txt --log-file test.log&lt;br /&gt;
pfixer --source input.snap --output updated.snap --log-file test.log | cat map.txt &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Svacer&amp;diff=2066</id>
		<title>Svacer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Svacer&amp;diff=2066"/>
		<updated>2024-08-27T05:43:14Z</updated>

		<summary type="html">&lt;p&gt;Writer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Svacer — сервер для хранения и обработки результатов статического анализа. Поддерживает импорт результатов анализа из [https://svace.ispras.ru Svace] напрямую и из прочих анализаторов через формат [[Help:Sarif|SARIF]].&lt;br /&gt;
&lt;br /&gt;
=== Техническая документация ===&lt;br /&gt;
Version 9.0.x&lt;br /&gt;
# [[Help:Introduction|Введение]]&lt;br /&gt;
# [[Help:Installation|Установка и обновление]]&lt;br /&gt;
# [[Help:Import from Svace|Импорт из Svace]]&lt;br /&gt;
# [[Help:Backup|Резервное копирование]]&lt;br /&gt;
# [[Help:UI manual|Использование веб-интерфейса]]&lt;br /&gt;
# [[Help:Public API|Public REST API]]&lt;br /&gt;
# [[Help:CLI|CLI]]&lt;br /&gt;
# [[LDAP configuration|LDAP]]&lt;br /&gt;
# [[OIDC|OpenID Connect]]&lt;br /&gt;
# [[Help:Sarif|SARIF]]&lt;br /&gt;
# [[Help:Statistics|Статистика]]&lt;br /&gt;
# [[Help:Match|Механизмы сопоставления предупреждений и переноса разметки]]&lt;br /&gt;
# [[Help:XSvacer|XSvacer — расширение функциональности Svacer]]&lt;br /&gt;
# [[Help:Utils|Утилиты поставляемые с Svacer]]&lt;br /&gt;
&lt;br /&gt;
=== Релизы ===&lt;br /&gt;
Также доступны в виде docker-образа на [https://hub.docker.com/r/ispras/svacer docker hub] и как пакеты в [[Help:Installation#.deb|apt-репозитории]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! version !! zip !! linux !! windows !! deb/rpm !! doc&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.2&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-9-0-2.zip svacer-9-0-2.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-2/svacer_9.0-2_amd64.deb svacer_9.0-2_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-2/svacer-9.0-2.x86_64.rpm svacer-9.0-2.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 9-0-2|Changelog]]&amp;lt;br /&amp;gt;[[Help:Installation#9-0-0|Upgrade notes]]&amp;lt;br /&amp;gt;[[Svacer#Техническая_документация|Documentation 9.x.x]]&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.1&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-9-0-1.zip svacer-9-0-1.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-1/svacer_9.0-1_amd64.deb svacer_9.0-1_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-1/svacer-9.0-1.x86_64.rpm svacer-9.0-1.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 9-0-1|Changelog]]&amp;lt;br /&amp;gt;[[Help:Installation#9-0-0|Upgrade notes]]&amp;lt;br /&amp;gt;[[Svacer#Техническая_документация|Documentation 9.x.x]]&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.0&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-9-0-0.zip svacer-9-0-0.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer_9.0-0_amd64.deb svacer_9.0-0_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-9.0-0.x86_64.rpm svacer-9.0-0.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 9-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 9-0-0|Release notes]]&amp;lt;br /&amp;gt;[[Help:Installation#9-0-0|Upgrade notes]]&amp;lt;br /&amp;gt;[[Svacer#Техническая_документация|Documentation 9.x.x]]&lt;br /&gt;
|-&lt;br /&gt;
| 8.0.1 &lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8-0-1.zip svacer-8-0-1.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer svacer]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer.exe svacer.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer_8.0-1_amd64.deb svacer_8.0-1_amd64.deb]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8.0-1.x86_64.rpm svacer-8.0-1.x86_64.rpm]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8.0.1.msi svacer-8.0.1.msi]&lt;br /&gt;
| [[Changelog#Release 8-0-1|Changelog]]&amp;lt;br /&amp;gt;[[Documentation 8.x.x|Documentation 8.x.x]]&lt;br /&gt;
|-&lt;br /&gt;
| 8.0.0 &lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8-0-0.zip svacer-8-0-0.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer svacer]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer.exe svacer.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer_8.0-0_amd64.deb svacer_8.0-0_amd64.deb]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8.0-0.x86_64.rpm svacer-8.0-0.x86_64.rpm]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8.0.0.msi svacer-8.0.0.msi]&lt;br /&gt;
| [[Changelog#Release 8-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 8-0-0|Release notes]]&amp;lt;br /&amp;gt;[[Documentation 8.x.x|Documentation 8.x.x]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[https://svacer.ispras.ru/releases Предыдущие релизы] | [https://nextcloud.ispras.ru/index.php/s/x4r4cMJAMr5RZtd?path=%2F Еще более старые релизы]&lt;br /&gt;
&lt;br /&gt;
=== FAQ ===&lt;br /&gt;
* [https://gitlab.ispras.ru/svace/svace-support/-/wikis/home Документация на статический анализатор Svace]&lt;br /&gt;
* [[Help:Introduction#Системные требования|Системные требования]]&lt;br /&gt;
* [[Примеры использования хуков#Создание кейсов в системах отслеживания ошибок|Создание из Svacer кейсов в Gitlab, Jira, Redmine]]&lt;br /&gt;
* Public REST API &lt;br /&gt;
:* [[Help:Public API#Примеры использования public REST API|Примеры использования]]&lt;br /&gt;
:* [https://gitlab.ispras.ru/svacer-public Репозитории с примерами на Python и Go]  &lt;br /&gt;
:* [https://svacer-demo.ispras.ru/api/public/swagger/ Спецификация OpenAPI]&lt;br /&gt;
* [https://t.me/+6pvgZ0oveNVhOTc6 Группа технической поддержки в Telegram]&lt;br /&gt;
&lt;br /&gt;
=== Демо ===&lt;br /&gt;
Попробуйте Svacer в действии на демо-сервере: https://svacer-demo.ispras.ru&lt;br /&gt;
* admin / svacer_admin_31415 — логин / пароль администратора&lt;br /&gt;
* user / user — логин / пароль пользователя&lt;br /&gt;
&lt;br /&gt;
Можете делать там что угодно, каждую ночь сервер восстанавливается до изначального состояния.&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:UI_manual&amp;diff=1511</id>
		<title>Help:UI manual</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:UI_manual&amp;diff=1511"/>
		<updated>2024-02-20T07:45:24Z</updated>

		<summary type="html">&lt;p&gt;Writer: Добавлен раздел Известные ограничения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На этой странице приведена инструкция по работе в пользовательском интерфейсе сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
== Авторизация в пользовательском интерфейсе сервера Svacer ==&lt;br /&gt;
&lt;br /&gt;
Для авторизации в пользовательском интерфейсе сервера Svacer введите логин и пароль на странице ввода учётных данных. Учётные данные по умолчанию — admin / admin.&lt;br /&gt;
[[File:Авторизация 01.png|thumb|none|x300px|alt=AutorizationMain|Страница ввода учетных данных]]&lt;br /&gt;
&lt;br /&gt;
Если на сервере настроена поддержка протокола LDAP, то войти можно с помощью внешних серверов. Для этого:&lt;br /&gt;
&lt;br /&gt;
# На странице ввода учетных данных перейдите на вкладку '''LDAP'''.&lt;br /&gt;
# Выберите LDAP-сервер в списке, если настроено больше одного сервера авторизации.&lt;br /&gt;
# Введите логин и пароль.&lt;br /&gt;
&lt;br /&gt;
[[File:Авторизация LDAP 02.png|thumb|none|x300px|alt=AutorizationLDAP|Страница входа по протоколу LDAP]]&lt;br /&gt;
&lt;br /&gt;
После успешного входа отобразится пользовательский интерфейс сервера Svacer. При этом, если в прошлой сессии пользователь [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выбрал проект, его ветку и снимок]] или [[Help:UI manual#Использование фильтров|применил фильтры]], отобразятся эти проект, ветка и фильтры.&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''': чтобы после обновления системы в пользовательском веб-интерфейсе корректно отображались изменения, после авторизации обновите страницу в браузере – нажмите клавишу F5.''&lt;br /&gt;
&lt;br /&gt;
== Описание основных элементов пользовательского интерфейса ==&lt;br /&gt;
Все страницы пользовательского интерфейса сервера Svacer устроены единообразно и состоят из двух частей:&lt;br /&gt;
# Верхняя панель – отображается на всех страницах пользовательского интерфейса&amp;lt;br /&amp;gt;Содержит:&lt;br /&gt;
#* логотип сервера Svacer&lt;br /&gt;
#* [[File:04 Кнопки для переключения режимов работы.png|x25px]] – кнопки для переключения режимов работы:&lt;br /&gt;
#** '''Разметка''' – [[Help:UI manual#Работа в режиме просмотра кода|просмотр и разметка найденных маркеров]], а также [[Help:UI manual#Сравнение снимков и маркеров|сравнение снимков или отдельных маркеров]];&lt;br /&gt;
#** '''Код''' – [[Help:UI manual#Работа в режиме разметки|просмотр снимков исходного кода]], связанного с результатами анализатора Svace;&lt;br /&gt;
#** '''Проекты''' – [[Help:UI manual#Управление проектами и группами проектов|управление проектами]] (режим доступен только пользователям с ролью admin);&lt;br /&gt;
#** '''Отчеты''' – [[Help:UI manual#Режим формирования отчетов|формирование отчетов]] на основе хранимой информации;&lt;br /&gt;
#* [[File:Icon settings.png|x25px]] – кнопка для перехода к [[Help:UI manual#Настройка сервера Svacer|настройке системы]]&lt;br /&gt;
#* [[File:Icon RuEng.png|x25px]] – переключатель языка пользовательского интерфейса&lt;br /&gt;
#* [[File:Icon question mark.png|x25px]] – кнопка для перехода на страницу документации к системе&lt;br /&gt;
#* [[File:Icon bell.png|25px]] – кнопка для перехода к [[Help:UI manual#Просмотр уведомлений|уведомлениям]]&lt;br /&gt;
#* [[File:Icon profile.png|x25px]] – кнопка меню пользователя, которое предоставляет следующие функции:&lt;br /&gt;
#** переход к [[Help:UI manual#Настройка профиля пользователя|настройке профиля пользователя]];&lt;br /&gt;
#** [[Help:UI manual#Выход из системы|выход из системы]];&lt;br /&gt;
#** [[Help:UI manual#Просмотр информации о программе|просмотр информации о программе]].&lt;br /&gt;
# Рабочая область – область экрана для просмотра информации и ввода, которая соответствует выбранному режиму работы или странице настроек.&lt;br /&gt;
&lt;br /&gt;
:[[File:03 Основные элементы интерфейса – без VSCode.png|thumb|none|upright=3]]&lt;br /&gt;
&lt;br /&gt;
== Базовые функции системы ==&lt;br /&gt;
=== Просмотр уведомлений ===&lt;br /&gt;
Чтобы посмотреть уведомления, нажмите кнопку [[File:Icon bell.png|25px]] в правом верхнем углу экрана.&lt;br /&gt;
&lt;br /&gt;
В правой части экрана отобразится панель со списком уведомлений для авторизованного пользователя:&lt;br /&gt;
[[File:05 Уведомления.png|thumb|none|x300px|alt=NotificationList|Панель уведомлений]]&lt;br /&gt;
&lt;br /&gt;
Нажмите кнопку [[File:Icon cross 01.png|15px]] для удаления уведомления.&lt;br /&gt;
&lt;br /&gt;
Нажмите кнопку '''Очистить''' для удаления всех уведомлений.&lt;br /&gt;
&lt;br /&gt;
=== Настройка профиля пользователя ===&lt;br /&gt;
Для перехода в профиль выберите пункт '''Профиль''' в меню пользователя в правом верхнем углу экрана:&lt;br /&gt;
[[File:06 Меню пользователя — без VSCode.png|thumb|none|250px|alt=UserMenu|Меню пользователя. Переход к настройке профиля]]&lt;br /&gt;
&lt;br /&gt;
В правой части экрана отобразится панель '''Профиль''', которая состоит из трех разделов:&lt;br /&gt;
:1. '''Профиль пользователя''' – в этом разделе можно изменить атрибуты своего профиля (ФИО, контакты), кроме логина, а также [[Help:UI manual#Изменение пароля|поменять пароль]].&lt;br /&gt;
:[[File: 07 Профиль основные параметры.png|thumb|none|x400px|alt=ProfileSetting|Настройки профиля пользователя]]&lt;br /&gt;
&lt;br /&gt;
:2. '''Общие настройки интерфейса''' – в этом разделе можно включить или выключить следующие функции:&lt;br /&gt;
:* сохранение примененной сортировки значений [[Help:UI manual#Таблица маркеров|в таблице маркеров]] при [[Help:UI manual#Выход из системы|выходе из системы]];&lt;br /&gt;
:* использование темной темы (темный фон, светлый текст) при просмотре файлов с исходным кодом;&lt;br /&gt;
:* переиспользование вкладки с исходным кодом [[Help:UI manual#Работа в режиме просмотра кода|в редакторе кода]].&lt;br /&gt;
:Эти настройки сохраняются для учетной записи пользователя и не сбрасываются при новой сессии.&lt;br /&gt;
:[[File:08 Профиль общие настройки интерфейса.png|thumb|none|x400px|alt=UserInterfaceSettings|Общие настройки интерфейса]]&lt;br /&gt;
&lt;br /&gt;
:3. '''Настройки панели навигации''' – в этом разделе можно настроить отображение по умолчанию для детекторов и файлов [[Help:UI manual#Функции левой навигационной панели|на панели навигации]], а также для сортировки значений [[Help:UI manual#Вкладка «Файлы»|на вкладке '''Файлы''']].&lt;br /&gt;
:Эти настройки сохраняются для учетной записи пользователя и не сбрасываются при новой сессии.&lt;br /&gt;
:Временное отображение файлов [[Help:UI manual#Функции левой навигационной панели|на панели навигации]] и их сортировку можно настроить по нажатии иконки [[File:Icon wrench.png|x15px]] на панели навигации.&lt;br /&gt;
:[[File:09 Профиль глобальные настройки навигации.png|thumb|none|x400px|alt=LeftNavigationPanelSettings|Настройки панели навигации]]&lt;br /&gt;
&lt;br /&gt;
=== Изменение пароля ===&lt;br /&gt;
Для изменения пароля:&lt;br /&gt;
:1. Выберите пункт '''Профиль''' в меню пользователя.&lt;br /&gt;
:2. В разделе '''Профиль пользователя''' нажмите на ссылку '''Изменить пароль''':&lt;br /&gt;
:[[File:10_Профиль_изменение пароля.png|thumb|none|450px|Переход к изменению пароля в профиле пользователя]]&lt;br /&gt;
:3. В открывшемся окне:&lt;br /&gt;
::а) Введите текущий пароль.&lt;br /&gt;
::б) Дважды введите новый пароль.&lt;br /&gt;
::в) Нажмите кнопку '''Изменить'''.&lt;br /&gt;
::[[File:11_Профиль_ввод нового пароля.png|thumb|none|350px|Окно изменения пароля]]&lt;br /&gt;
&lt;br /&gt;
=== Просмотр информации о программе ===&lt;br /&gt;
Чтобы посмотреть информацию о программе, выберите пункт '''О программе''' в меню пользователя в правом верхнем углу экрана.&lt;br /&gt;
[[File:12_Меню пользователя_о программе — без VSCode.png|thumb|none|250px|Меню пользователя. Переход к просмотру информации о программе]]&lt;br /&gt;
Нажмите на ссылку в строке '''Документация''' для перехода на страницу документации к системе.&lt;br /&gt;
&lt;br /&gt;
Для просмотра информации об изменениях нажмите кнопку '''Показать Журнал изменений'''.&lt;br /&gt;
&lt;br /&gt;
[[File:13_О программме.png|thumb|none|600px|Информация о программе]]&lt;br /&gt;
&lt;br /&gt;
== Выбор контекста (проекта, ветки и снимка) ==&lt;br /&gt;
Для работы [[Help:UI manual#Работа в режиме разметки|в режиме разметки]] или [[Help:UI manual#Работа в режиме просмотра кода|режиме просмотра кода]] требуется выбрать проект, ветку и снимок с результатами работы анализатора Svace, а в режиме формирования отчетов – проект и ветку. Это можно сделать в блоке, который расположен под [[Help:UI manual#Описание основных элементов пользовательского интерфейса|верхней панелью]]. &lt;br /&gt;
&lt;br /&gt;
[[File:14_Выбор проекта, верки, снимка.png|800px]]&lt;br /&gt;
&lt;br /&gt;
По умолчанию после выбора проекта автоматически выбирается ветка master и последний импортированный снимок. Если master отсутствует, то эту ветку нужно выбрать вручную.&lt;br /&gt;
&lt;br /&gt;
== Работа в режиме разметки ==&lt;br /&gt;
Режим разметки предоставляет следующий набор элементов управления:&lt;br /&gt;
# Левая навигационная панель:&lt;br /&gt;
#* [[Help:UI manual#Вкладка «Детекторы»|вкладка '''Детекторы''']];&lt;br /&gt;
#* [[Help:UI manual#Вкладка «Файлы»|вкладка '''Файлы''']].&lt;br /&gt;
# Центральная панель:&lt;br /&gt;
#* [[Help:UI manual#Вкладка «Информация о снимке»|вкладка '''Информация о снимке''']];&lt;br /&gt;
#* одна или несколько [[Help:UI manual#Вкладка с исходным кодом|вкладок с исходным кодом''']] (отображаются после выбора файлов в таблице маркеров или левой панели);&lt;br /&gt;
#* [[Help:UI manual#Таблица маркеров|таблица маркеров]];&lt;br /&gt;
# [[Help:UI manual#Функции правой панели|Правая панель]].&lt;br /&gt;
&lt;br /&gt;
[[File:96 Режим разметки. Набор элементов управления.png|800px|thumb|none|Режим разметки. Набор элементов управления]]&lt;br /&gt;
&lt;br /&gt;
=== Функции левой навигационной панели ===&lt;br /&gt;
==== Вкладка «Детекторы» ====&lt;br /&gt;
На этой вкладке отображается список детекторов Svace, которые сработали в выбранном снимке.&lt;br /&gt;
&lt;br /&gt;
Серьезность (критичность) детектора обозначена цветом:&lt;br /&gt;
* красный – наивысшая серьезность (CRITICAL);&lt;br /&gt;
* желтый – высокая серьезность (MAJOR);&lt;br /&gt;
* белый – обычная серьезность (NORMAL, MINOR, UNDEFINED).&lt;br /&gt;
&lt;br /&gt;
На вкладке '''Детекторы''' пользователю доступны следующие функции:&lt;br /&gt;
:1. Отображение данных в виде списка – для этого нажмите кнопку [[File:icon_list.png|x25px]].&lt;br /&gt;
:2. Группировка детекторов по уровням серьезности (по умолчанию) – для этого нажмите кнопку [[File:icon_tree.png|x25px]].&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  16_Детекторы_список.png|Вкладка '''Детекторы''' с данными в виде списка&lt;br /&gt;
  15_Детекторы_группировка.png|Вкладка '''Детекторы''' с группировкой детекторов по уровням серьезности&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:3. Отображение списка маркеров в файлах, в которых сработал детектор – для этого нажмите кнопку [[File:icon_uncover.png|x15px]] в левой части его имени.&lt;br /&gt;
:[[File:checker_uncover.png|thumb|none|320px|Список маркеров, найденных детектором]]&lt;br /&gt;
:4. [[Help:UI manual#Блокировка разметки|Блокировка всех маркеров]], найденных детектором, для разметки другими пользователями – для этого нажмите кнопку [[File:icon_unlocked.png|x25px]] справа от названия детектора (отображается при наведении курсора).&lt;br /&gt;
:5. Применение фильтра по детектору [[Help:UI manual#Таблица маркеров|в таблице маркеров]] – для этого нажмите на имя детектора.&lt;br /&gt;
:6. Применение фильтра по серьезности [[Help:UI manual#Таблица маркеров|в таблице маркеров]] – для этого нажмите название группы серьезности.&lt;br /&gt;
:7. Отмена фильтрации – для этого нажмите кнопку [[File:icon_return.png|x25px]].&lt;br /&gt;
:8. Отображение [[Help:UI manual#Вкладка с исходным кодом|на вкладке исходного кода]] содержимого файла, места и содержания маркера, а также подробной информации о маркере [[Help:UI manual#Функции правой панели|на правой панели]] – для этого нажмите на маркер.&lt;br /&gt;
:9. Просмотр фрагмента кода в режиме предпросмотра – для этого нажмите кнопку [[File:Icon_goto.png|x25px]].&lt;br /&gt;
&lt;br /&gt;
==== Вкладка «Файлы» ====&lt;br /&gt;
На этой вкладке отображается список файлов, в которых найдены маркеры.&lt;br /&gt;
&lt;br /&gt;
[[File:17 Файлы.png|thumb|none|300px|Вкладка '''Файлы''']]&lt;br /&gt;
&lt;br /&gt;
Для каждого файла отображаются: &lt;br /&gt;
* имя;&lt;br /&gt;
* количество найденных маркеров (предупреждений);&lt;br /&gt;
* количество размеченных маркеров;&lt;br /&gt;
* кнопки [[File:Icon plus.png|x25px]] и [[File:Icon minus.png|x25px]].&lt;br /&gt;
&lt;br /&gt;
На вкладке '''Файлы''' пользователю доступны следующие функции:&lt;br /&gt;
:1. Применение фильтра по файлу [[Help:UI manual#Таблица маркеров|в таблице маркеров]] – для этого:&lt;br /&gt;
::а) Нажмите на имя файла. В этом случае содержимое файла отобразится [[Help:UI manual#Вкладка с исходным кодом|на вкладке с исходным кодом]]&amp;lt;br /&amp;gt;или&lt;br /&gt;
::б) Нажмите кнопку [[File:Icon plus.png|x25px]] в одной или нескольких строках. В этом случае содержимое файла (файлов) не отобразится.&lt;br /&gt;
:2. Исключение файла из фильтра по файлам [[Help:UI manual#Таблица маркеров|в таблице маркеров]] – для этого нажмите кнопку [[File:Icon minus.png|x25px]] в строке файла.&lt;br /&gt;
:3. Отмена фильтрации [[Help:UI manual#Таблица маркеров|в таблице маркеров]] для всех выбранных файлов – для этого нажмите кнопку [[File:Icon minus 2.png|x25px]] или кнопку [[File:icon_return.png|x25px]] [[Help:UI manual#Вкладка «Детекторы»|на вкладке '''Детекторы''']].&lt;br /&gt;
:4. [[Help:UI manual#Блокировка разметки|Блокировка всех маркеров]] в файле для разметки другими пользователями – для этого нажмите кнопку [[File:icon_unlocked.png|x25px]] справа от названия файла (отображается при наведении курсора).&lt;br /&gt;
:5. Отображение [[Help:UI manual#Вкладка с исходным кодом|на вкладке с исходным кодом]] содержимого файла, места и содержания маркера, а также подробной информации о маркере [[Help:UI manual#Функции правой панели|на правой панели]] – для этого нажмите на имя файла.&lt;br /&gt;
:6. Фильтрация по имени/пути файла в поле '''Отфильтровать файлы по полному пути'''. Поддерживается фильтрация с использованием [[Help:UI manual#Использование регулярных выражений|регулярных выражений]].&lt;br /&gt;
:7. Временная настройка отображения файлов и сортировки полей на вкладке '''Файлы''' – для этого нажмите кнопку [[File:icon_wrench.png|x25px]] и поменяйте настройки.&lt;br /&gt;
:Эти настройки будут действовать до конца сессии пользователя или до повторного изменения.&lt;br /&gt;
&lt;br /&gt;
:[[File:18 Временная настройка панели навигации.png|thumb|none|800px|Временная настройка отображения файлов и сортировки полей]]&lt;br /&gt;
&lt;br /&gt;
=== Функции центральной панели ===&lt;br /&gt;
==== Вкладка «Информация о снимке» ====&lt;br /&gt;
На этой вкладке отображается информация о выбранном снимке.&lt;br /&gt;
&lt;br /&gt;
[[File:19 Информация о снимке.png|thumb|left|600px|Вкладка '''Информация о снимке''']]&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
На вкладке '''Информация о снимке''' пользователю доступны следующие функции:&lt;br /&gt;
# Просмотр подробной информации о снимке во всплывающем окне – для этого нажмите кнопку [[File:Icon info.png|x25px]].&lt;br /&gt;
# Переход к [[Help:UI manual#Экспорт кода с разметкой|экспорту кода с разметкой]] – для этого нажмите кнопку [[File:Icon book.png|x25px]].&lt;br /&gt;
# Экспорт снимка в формате .snap – для этого нажмите кнопку [[File:Icon export.png|x25px]].&lt;br /&gt;
# Просмотр параметров анализа во всплывающем окне – для этого нажмите кнопку [[File:Button Показать.png|x25px]] в строке '''Параметры анализа'''.&lt;br /&gt;
# Экспорт параметров анализа в формате .txt – для этого нажмите кнопку [[File:Button Скачать.png|x25px]] в строке '''Параметры анализа'''.&lt;br /&gt;
# [[Help:UI manual#Работа с таблицей статистики|Просмотр таблицы статистики]] – для этого нажмите кнопку [[File:Button Показать 2.png|x25px]] в строке '''Статистика'''. Информация в таблице сгруппирована по параметрам детекторов, найденным маркерам и статусу их разметки.&lt;br /&gt;
# Просмотр списка приложенных файлов для этого нажмите кнопку [[File:Button Показать.png|x25px]] в строке '''Приложенные файлы'''. Для скрытия списка нажмите кнопку [[File:Hide.png|x25px]].&lt;br /&gt;
&lt;br /&gt;
==== Вкладка с исходным кодом ====&lt;br /&gt;
Вкладка открывается только после выбора файла [[Help:UI manual#Вкладка «Детекторы»|на вкладке '''Детекторы''']] или [[Help:UI manual#Вкладка «Файлы»|'''Файлы''']], а также [[Help:UI manual#Таблица маркеров|в таблице маркеров]]. Одновременно может быть открыто несколько вкладок с исходным кодом, если выключена [[Help:UI manual#Настройка профиля пользователя|настройка '''Переиспользование вкладки в редакторе кода''']].&lt;br /&gt;
&lt;br /&gt;
В верхней части вкладки отображается полный путь к файлу.&lt;br /&gt;
[[File:20 Исходный код.png|thumb|none|600px|Пример двух открытых вкладок с исходным кодом]]&lt;br /&gt;
&lt;br /&gt;
На вкладке с исходным кодом пользователю доступны следующие функции:&lt;br /&gt;
:1. Отображение кода на весь экран – для этого нажмите кнопку [[File:Icon expand.png|x25px]].&lt;br /&gt;
:2. Отображение всех маркеров – для этого нажмите кнопку [[File:Icon view marks.png|x25px]].&lt;br /&gt;
:3. Скрытие всех маркеров – для этого нажмите кнопку [[File:Icon hide marks.png|x25px]].&lt;br /&gt;
:4. Отображение списка маркеров в этом файле – для этого нажмите кнопку [[File:Icon list 2.png|x25px]].&lt;br /&gt;
&lt;br /&gt;
:[[File:21 Исходный код Отображение списка маркеров.png|thumb|none|300px|right|Cписок маркеров в файле]]&lt;br /&gt;
&lt;br /&gt;
:5. Выбор отображения информации о маркере и его разметки относительно строки кода, в которой он найден:&lt;br /&gt;
:* выше строки кода (по умолчанию) – нажмите кнопку [[File:Icon above.png|x25px]];&lt;br /&gt;
:* ниже строки кода – нажмите кнопку [[File:Icon below.png|x25px]].&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;200px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:2em&amp;quot;&amp;gt;&lt;br /&gt;
  File:above_marker_info.png|Пример отображения информации о маркере над строкой кода&lt;br /&gt;
  File:below_marker_info.png|Пример отображения информации о маркере под строкой кода&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:6. Возврат к исходному маркеру (например, если был выбран другой связанный маркер на вкладке '''Трасса''' [[Help:UI manual#Функции правой панели|правой панели]]) – для этого нажмите кнопку [[File:Icon target.png|x25px]] в верхней части блока с информацией о маркере.&lt;br /&gt;
:7. [[Help:UI manual#Разметка маркера|Разметка маркера]] – установите '''Статус''', '''Серьезность''' и '''Действия''' в верхней части блока с информацией о маркере.&lt;br /&gt;
:8.	Отображение блока информации об элементе трассы для строки кода – нажмите кнопку '''К трассе'''.&lt;br /&gt;
::Для последовательного перехода к другим элементам трассы воспользуйтесь кнопками [[File:Button up.png|x25px]] и [[File:Button down.png|x25px]].&lt;br /&gt;
:[[File:97 Блок информации о элементе трассы.png|thumb|none|600px|Блок информации о элементе трассы]]&lt;br /&gt;
:9. Переход к строке, в которой объявлена/определена переменная – нажмите правую кнопку мыши на строке исходного кода и выберите пункт '''Перейти к объявлению / Перейти к определению'''.&lt;br /&gt;
:10. Просмотр ссылок на панели внизу экрана – нажмите правую кнопку мыши на строке исходного кода и выберите пункт '''Найти ссылки'''. На этой панели отображается иерархический список файлов с номерами строк, в которых найдены ссылки:&lt;br /&gt;
:[[File:Исходный_код_Референсы.png|thumb|none|600px|Cписок файлов с номерами строк, в которых найдены ссылки]]&lt;br /&gt;
&lt;br /&gt;
:* Чтобы перейти к строке кода, на которую найдена ссылка, нажмите на ссылку с номером строки на панели [1].&lt;br /&gt;
:* Чтобы посмотреть фрагмента кода, на который найдена ссылка, в режиме предпросмотра, нажмите кнопку [[File:icon_preview_code.png|x25px]] [2].&lt;br /&gt;
:11. Переход к просмотру выбранного файла [[Help:UI manual#Работа в режиме просмотра кода|в режиме просмотра кода]] – нажмите правую кнопку мыши на строке исходного кода и выберите пункт '''Открыть в режиме код'''.&lt;br /&gt;
:12. Копирование строки кода – нажмите правую кнопку мыши на строке исходного кода и выберите пункт '''Copy'''.&lt;br /&gt;
:13. Вызов командной строки – нажмите правую кнопку мыши на строке исходного кода и выберите пункт '''Command Palette'''.&lt;br /&gt;
:[[File:25 Исходный код Вызов командной строки.png|thumb|none|600px|Командная строка]]&lt;br /&gt;
&lt;br /&gt;
==== Таблица маркеров ====&lt;br /&gt;
Для раскрытия таблицы маркеров нажмите кнопку [[File:Button Показать таблицу.png|x25px]] в верхней части [[Help:UI manual#Функции центральной панели|центральной панели]], а для её скрытия – [[File:Button Скрыть таблицу.png|x25px]].&lt;br /&gt;
В верхней части таблицы находится панель, которая содержит:&lt;br /&gt;
* [[File:Field Детектор.png|x25px]] – поле с информацией [[Help:UI manual#Использование фильтров|о примененных фильтрах]]: как назначенных [[Help:UI manual#Функции левой навигационной панели|в навигационной панели]], так и с помощью [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательских фильтров]] и запросов&lt;br /&gt;
* поле запроса для фильтрации данных;&lt;br /&gt;
* кнопка [[File:Icon download.png|x25px]] – выгрузка отображаемых маркеров в формате .csv или .pdf;&lt;br /&gt;
* кнопка [[File:Icon edit.png|x25px]] – переход [[Help:UI manual#Групповая разметка маркеров|к групповой разметке]] выбранных маркеров (доступна, если выбраны маркеры в таблице).&lt;br /&gt;
&lt;br /&gt;
:[[File:26 Таблица маркеров.png|thumb|none|600px|Таблица маркеров с примененными фильтрами]]&lt;br /&gt;
&lt;br /&gt;
В таблице маркеров пользователю доступны следующие функции:&lt;br /&gt;
# Выбор маркеров для [[Help:UI manual#Групповая разметка маркеров|групповой разметки]] – для этого установите флажок в строке маркера.&lt;br /&gt;
# Просмотр подробной информации о маркере [[Help:UI manual#Функции правой панели|в правой панели]] и его места и содержания [[Help:UI manual#Вкладка с исходным кодом|на вкладке с исходным кодом]] – для этого дважды кликните на строку маркера или нажмите на имя файла в столбце '''Файл'''. Также для выбора можно использовать клавиши ↑ и ↓ – для перемещения по строкам, и Enter – для подтверждения выбора.&lt;br /&gt;
# Копирование детальной информации о маркере в буфер обмена – для этого нажмите правой кнопкой мыши на маркер и выберите пункт '''Копировать'''.&lt;br /&gt;
# Копирование ссылки на маркер в буфер обмена – для этого нажмите правой кнопкой мыши на маркер и выберите пункт '''Копировать ссылку на маркер'''.&lt;br /&gt;
# Переход к [[Help:UI manual#Сравнение маркеров|сравнению одного маркера с другим]] – для этого нажмите правой кнопкой мыши на маркер и выберите пункт '''Сравнить с ...'''&lt;br /&gt;
&lt;br /&gt;
=== Функции правой панели ===&lt;br /&gt;
Эта панель предоставляет подробную информацию о маркере и его [[Help:UI manual#Разметка маркера|разметке]]:&lt;br /&gt;
* статус [[Help:UI manual#Блокировка разметки|блокировки разметки]];&lt;br /&gt;
* статус [[Help:UI manual#Разметка маркера|разметки, его серьезность и требуемое действие]];&lt;br /&gt;
* автор последней разметки и прочее;&lt;br /&gt;
[[File:27 Правая панель.png|thumb|none|upright=3|Правая панель]]&lt;br /&gt;
&lt;br /&gt;
На правой панели пользователю доступны следующие функции:&lt;br /&gt;
:1. Копирование ссылки на маркер – для этого нажмите кнопку [[File:Icon copy link.png|x25px]].&lt;br /&gt;
:2. [[Help:UI manual#Блокировка разметки|Блокировка маркера]] для разметки другими пользователями – для этого нажмите кнопку [[File:icon_unlocked.png|x25px]] в верхней части правой панели.&lt;br /&gt;
:3. [[Help:UI manual#Разметка маркера|Разметка маркера]] – для этого установите '''Статус''', '''Серьезность''' и '''Действие''' в верхней части правой панели.&lt;br /&gt;
:4. Просмотр истории разметки со связанными комментариями – для этого нажмите кнопку [[File:Icon history.png|x25px]] в верхней части правой панели.&lt;br /&gt;
:[[File:28 История изменения маркера.png|thumb|none|upright=2.5|Пример истории изменения разметки маркера]]&lt;br /&gt;
&lt;br /&gt;
:5. Отображение маркера [[Help:UI manual#Вкладка с исходным кодом|на вкладке с исходным кодом]] одним из двух способов:&lt;br /&gt;
::а) Нажмите кнопку с именем файла и номером строки в верхней части правой панели [1].&lt;br /&gt;
::б) Нажмите кнопку '''Найти в коде''' на вкладке '''Подробности''' [2]. Это позволяет всегда вернуться к нужной точке при навигации по коду.&lt;br /&gt;
:[[File:29 Отображение маркера в коде 1.png|thumb|none|upright=2|Правая панель. Способы перехода к маркеру на вкладке с исходным кодом]]&lt;br /&gt;
:6. Переход к блоку с информацией об элементе трассы – для этого нажмите на ссылку с именем файла и номером строки на вкладке '''Трасса''' [1].&lt;br /&gt;
:7. Отображение кода, который соответствует строке трассы, в отдельном окне в режиме предпросмотра – для этого на вкладке '''Трасса''' нажмите кнопку [[File:Icon preview code.png|x25px]] рядом с именем файла и номером строки [2].&lt;br /&gt;
:[[File:31 Предпросмотр кода.png|thumb|none|upright=2.5|Элементы управления для работы с элементом трассы]]&lt;br /&gt;
:8. Просмотр и добавление комментариев к маркеру на вкладке '''Комментарии'''. Комментарии для каждого маркера уникальны. Добавление одинаковых комментариев недоступно.&lt;br /&gt;
:9. Редактирование и удаление комментариев на вкладке '''Комментарии''' с помощью кнопок [[File:Icon edit2.png|x25px]] и [[File:Icon delete.png|x25px]]. &lt;br /&gt;
:Если [[Help:UI manual#Работа с проектами|для проекта]] установлен флажок '''Обязательный комментарий при разметке''', то удаление связанного с разметкой комментария недоступно. Его можно только отредактировать.&lt;br /&gt;
:[[File:32 Комментарии.png|thumb|none|upright=2|Вкладка '''Комментарии''']]&lt;br /&gt;
:'''Примечание:''' ''Пользователь может отредактировать и удалить только свои комментарии. Пользователю с доступом '''Изменение любых комментариев''' доступно редактирование и удаление комментариев всех пользователей. Если такой пользователь внёс изменения, то изначальный автор теряет возможность изменять свой комментарий (если у него нет доступа '''Изменение любых комментариев'''), так как авторство передаётся пользователю, который последним внёс изменения. Для отредактированного комментария отображается слово '''изменено''', при наведении курсора на которое отображается сообщение с логином пользователя, изменившего комментарий, и датой редактирования.''&lt;br /&gt;
&lt;br /&gt;
:10. Просмотр подробной информации на вкладке '''Подробности'''.&lt;br /&gt;
:[[File:33 Подробная информация о маркере.png|thumb|none|upright=2|Вкладка '''Подробности''']]&lt;br /&gt;
:11. Просмотр информации о детекторе, который обнаружил маркер, – для этого нажмите на его имя на вкладке '''Подробности'''.&lt;br /&gt;
:[[File:34 Информация о детекторе.png|thumb|none|upright=2.5|Пример информации о детекторе]]&lt;br /&gt;
:12. Просмотр истории обнаружения маркера в снимках – для этого нажмите кнопку [[File:Icon history.png|x25px]] слева от названия снимка на вкладке '''Подробности'''.&lt;br /&gt;
:[[File:35 История маркера.png|thumb|none|upright=2.5|Пример истории маркера]]&lt;br /&gt;
:13. Запуск хуков (скриптов) – для этого нажмите кнопку '''Запустить''' на вкладке '''Подробности''' и выберите хук, который требуется запустить.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Использование фильтров ===&lt;br /&gt;
==== Общая информация ====&lt;br /&gt;
Настройка и использование фильтров доступны [[Help:UI manual#Работа в режиме разметки|в режиме разметки]].&lt;br /&gt;
&lt;br /&gt;
Существует пять видов фильтров:&lt;br /&gt;
&lt;br /&gt;
# Фильтры [[Help:UI manual#Функции левой навигационной панели|левой навигационной панели]] [1]: детекторы, файлы или серьезность.&lt;br /&gt;
# Доступные для разметки – позволяют отобразить только маркеры, которые доступны пользователю для разметки, т. е. при использовании этого фильтра в списке не будут отображаться маркеры, заблокированные другими пользователями. Фильтр применяется по нажатии кнопки [[File:Icon view2.png|x25px]] [2] в правой части блока [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выбора проекта, ветки и снимка]].&lt;br /&gt;
# Размеченный – позволяют отобразить только размеченные маркеры. Фильтр применяется по нажатии кнопки [[File:Icon view.png|x25px]] [3] в правой части блока [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выбора проекта, ветки и снимка]].&lt;br /&gt;
# [[Help:UI manual#Настройка и использование пользовательских фильтров|Пользовательские фильтры]] – доступны по нажатии кнопки [[File:Button Фильтры.png|x25px]] [4] в правой части блока [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выбора проекта, ветки и снимка]].&lt;br /&gt;
# Запрос – фильтр, указанный в поле в верхней части [[Help:UI manual#Таблица маркеров|таблицы маркеров]] [5].&lt;br /&gt;
 &lt;br /&gt;
:[[File:36 Фильтры.png|thumb|none|upright=3|Существующие фильтры]]&lt;br /&gt;
&lt;br /&gt;
Посмотреть примененные фильтры (кроме '''Доступные для разметки''') и последовательность их применения можно в поле [[File:field Детектор.png|x25px]] в верхней части [[Help:UI manual#Таблица маркеров|таблицы маркеров]].&lt;br /&gt;
&lt;br /&gt;
Все виды фильтров можно использовать одновременно, но при определенном порядке применения фильтры могут быть сброшены:&lt;br /&gt;
* запрос сбрасывается после применения любого другого фильтра;&lt;br /&gt;
* фильтры [[Help:UI manual#Функции левой навигационной панели|левой навигационной панели]] сбрасываются после применения [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательских фильтров]] и других фильтров [[Help:UI manual#Функции левой навигационной панели|на левой навигационной панели]];&lt;br /&gt;
* [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательские фильтры]] и фильтры [[Help:UI manual#Функции левой навигационной панели|левой навигационной панели]] не сбрасываются при применении фильтра '''Размеченный''';&lt;br /&gt;
* при переключении на другой [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|проект, ветку или снимок]] примененные фильтры '''Размеченный''' и  [[Help:UI manual#Настройка и использование пользовательских фильтров|'''Пользовательский''']] не сбрасываются и применяются к выбранному снимку.&lt;br /&gt;
&lt;br /&gt;
По нажатии кнопки [[File:Button Фильтры 2.png|x25px]] в правой части блока [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выбора проекта, ветки и снимка]] можно отменить примененные фильтры: пользовательский или все.&lt;br /&gt;
&lt;br /&gt;
==== Настройка и использование пользовательских фильтров ====&lt;br /&gt;
Настроить пользовательские фильтры можно [[Help:UI manual#Работа в режиме разметки|в режиме разметки]]. Для этого:&lt;br /&gt;
:1. Нажмите кнопку [[file:button Фильтры.png|x25px]] в правой части блока [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выбора проекта, ветки и снимка]]. В правой части экрана отобразится панель пользовательских фильтров, которые разделены на три группы:&lt;br /&gt;
:* параметры детекторов;&lt;br /&gt;
:* параметры разметки маркеров;&lt;br /&gt;
:* файлы.&lt;br /&gt;
:2. На вкладке '''Пользовательский''':&lt;br /&gt;
::а) Настройте параметры фильтрации – выберите значения в списках полей или нажмите кнопки со значениями.&lt;br /&gt;
::б) Нажмите на кнопку [[File:Icon cancel.png|x15px]] справа от значения в списке, чтобы отменить его выбор.&lt;br /&gt;
::в) Если параметры нужно исключить из поиска, нажмите на кнопку [[File:Icon plus 2.png|x25px]]. Кнопка поменяется на [[File:Icon minus 3.png|x25px]].&lt;br /&gt;
::г) Если параметры нужно включить в поиск, нажмите на кнопку [[File:Icon minus 3.png|x25px]]. Кнопка поменяется на [[File:Icon plus 2.png|x25px]].&lt;br /&gt;
::д) Нажмите кнопку [[File:Button Очистить.png|x25px]], чтобы очистить все параметры фильтрации.&lt;br /&gt;
::е) Нажмите кнопку [[File:Button Сохранить как.png|x25px]], в открывшемся диалоге введите название и нажмите кнопку '''Сохранить'''.&lt;br /&gt;
::ж) Нажмите кнопку [[File:Button Применить.png|x25px]], чтобы применить фильтр. После применения кнопка фильтра станет зеленой, а ее название поменяется на название сохраненного фильтра.&lt;br /&gt;
::[[File:36 Пользовательские фильтры.png|thumb|none|upright=2|Пользовательские фильтры. Вкладка '''Пользовательский''']]&lt;br /&gt;
:3. На вкладке '''Сохраненные''':&lt;br /&gt;
::а) Для редактирования сохраненного фильтра нажмите кнопку [[File:Icon edit3.png|x25px]].&lt;br /&gt;
::б) Создайте дубликат фильтра – нажмите кнопку [[File:Icon duplicate.png|x25px]].&lt;br /&gt;
::в) Удалите фильтр – нажмите кнопку [[File:Icon delete 2.png|x25px]].&lt;br /&gt;
::г) Примените фильтр – нажмите на его название и нажмите кнопку [[File:Button Применить.png|x25px]].&lt;br /&gt;
::[[File:37 Фильтры сохраненные.png|thumb|none|upright=2|Пользовательские фильтры. Вкладка '''Сохраненные''']]&lt;br /&gt;
После применения:&lt;br /&gt;
* примененный фильтр будет отмечен [[File:Icon check.png|x25px]];&lt;br /&gt;
* кнопка фильтра станет зеленой, а ее название поменяется на название сохраненного фильтра.&lt;br /&gt;
&lt;br /&gt;
=== Сравнение снимков и маркеров ===&lt;br /&gt;
Чтобы сравнить снимки и маркеры в них:&lt;br /&gt;
:1. [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|Выберите исходные проект, ветку и снимок]].&lt;br /&gt;
:2. [[Help:UI manual#Работа в режиме разметки|В режиме разметки]] нажмите кнопку [[File:Button Сравнить с.png|x25px]].&lt;br /&gt;
:3. В открывшемся окне выберите проект, ветку и снимок для сравнения; нажмите кнопку [[File:Button Применить.png|x25px]].&lt;br /&gt;
:[[File:38 Выбор снимка для сравнения.png|thumb|none|upright=1.5|Выбор проекта, ветки и снимка для сравнения]]&lt;br /&gt;
:Результат сравнения отобразится [[Help:UI manual#Функции левой навигационной панели|в левой навигационной панели]] и [[Help:UI manual#Функции центральной панели|центральной панели]], причем:&lt;br /&gt;
:* вкладка '''Информация о снимке''' поменяется на вкладку '''Информация о различиях''' с информацией о двух сравниваемых снимках;&lt;br /&gt;
:* применится первый режим сравнения, в котором найдены результаты.&lt;br /&gt;
:4. Выберите режим сравнения.&lt;br /&gt;
:[[File:39 Выбор режима сравнения.png|800px|thumb|none|Выбор режима сравнения]]&lt;br /&gt;
:[[Help:UI manual#Функции левой навигационной панели|В левой навигационной панели]] и [[Help:UI manual#Функции центральной панели|центральной панели]] отобразятся только результаты выбранного режима сравнения. &lt;br /&gt;
:В режимах '''Сопоставленные''' и '''Одинаковые''' [[Help:UI manual#Таблица маркеров|в таблице маркеров]] добавится столбец с номером версии: V1 – маркер в файле текущего снимка, V2 – маркер в файле целевого снимка.&lt;br /&gt;
'''''Примечание''': если при просмотре кода файла целевого снимка перейти к просмотру файла [[Help:UI manual#Работа в режиме просмотра кода|в режиме '''Код''']] (команда '''Открыть в режиме код'''), то режим сравнения закроется, отобразится контекст целевого снимка.''&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;slideshow&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:2em&amp;quot; &amp;quot;=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
File:40 Пример сравнения новые.png|Пример результатов сравнения в режиме '''Новые'''&lt;br /&gt;
File:41 Пример сравнения Отсутствующие.png|Пример результатов сравнения в режиме '''Отсутствующие'''&lt;br /&gt;
File:42 Пример сравнения Сопоставленные.png|Пример результатов сравнения в режиме '''Сопоставленные'''&lt;br /&gt;
File:43 Пример сравнения Одинаковые.png|Пример результатов сравнения в режиме '''Одинаковые'''&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:5. Посмотрите различия в параметрах анализа – нажмите кнопку '''Показать различия''' на вкладке '''Информация о различиях'''.&lt;br /&gt;
:[[File:44 Различия в результатах анализа.png|600px|thumb|none|Сравнение настроек анализа]]&lt;br /&gt;
:6. Посмотрите различия в статистике разметки – нажмите кнопку '''Различия разметок'''.&lt;br /&gt;
:[[File:45 Различия в статистике по детекторам.png|thumb|none|600px|Сравнение статистики разметок]]&lt;br /&gt;
:7. Нажмите кнопку [[File:Icon download CSV.png|x25px]] или [[File:Icon download PDF.png|x25px]], чтобы скачать статистику в формате CSV или PDF.&lt;br /&gt;
:8. Отмените сравнение – нажмите кнопку [[File:Icon cancel 2.png|x25px]] в блоке выбора проекта, ветки и снимка.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Сравнение маркеров ===&lt;br /&gt;
Чтобы сравнить два маркера:&lt;br /&gt;
:1. [[Help:UI manual#Работа в режиме разметки|В режиме разметки]] [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выберите исходные проект, ветку и снимок]].&lt;br /&gt;
:2. Раскройте [[Help:UI manual#Таблица маркеров|таблицу маркеров]].&lt;br /&gt;
:3. Нажмите правой кнопкой мыши на строке маркера и выберите пункт '''Сравнить с ...''' &amp;lt;br /&amp;gt; Откроется окно выбора маркера для сравнения.&lt;br /&gt;
:[[File:46 Выбор маркера для сравнения.png|thumb|none|upright=2|Окно выбора маркера для сравнения]]&lt;br /&gt;
:4. Выберите проект, ветку и снимок. Отобразится список маркеров в выбранном снимке, где можно ввести запрос для поиска маркеров.&lt;br /&gt;
:[[File:47 Результат сравнения маркеров.png|thumb|none|upright=2|Выбор маркера для сравнения]]&lt;br /&gt;
:5. Дважды кликните на  строке маркера, чтобы перейти в окно сравнения маркеров.&lt;br /&gt;
:[[File:48 Различия исходного кода.png|thumb|none|upright=3|Окно сравнения маркеров]]&lt;br /&gt;
&lt;br /&gt;
=== Разметка маркера ===&lt;br /&gt;
Разметить маркер можно [[Help:UI manual#Работа в режиме разметки|в режиме разметки]] с помощью кнопок в верхней части [[Help:UI manual#Функции правой панели|правой панели]] или в виждете [[Help:UI manual#Вкладка с исходным кодом|на вкладке с исходным кодом]], а также по нажатии кнопки [[File:Icon edit.png|x25px]] в этих же частях интерфейса.&amp;lt;br /&amp;gt;Разметка маркера заключается в установке статуса, а также опционально серьезности (критичности) и требуемого действия. Установка серьезности и действия доступны только после установки статуса.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;180px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:0&amp;quot;&amp;gt;&lt;br /&gt;
  49 Разметка Статус.png|Выбор Статуса разметки маркера&lt;br /&gt;
  50 Разметка Серьезность.png|Выбор Серьезности разметки маркера&lt;br /&gt;
  51 Разметка Действие.png|Выбор Действия разметки маркера&lt;br /&gt;
  20_Исходный_код.png|Кнопки разметки в виджете маркера на вкладке с исходным кодом&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
Если [[Help:UI manual#Работа с проектами|для проекта]] установлен флаг '''Обязательный комментарий при разметке''', то при установке статуса, серьезности или действия откроется окно разметки, в котором обязательно нужно ввести комментарий.&lt;br /&gt;
[[File:99 Окно разметки.png|400px|thumb|none|Окно разметки. Поле '''Комментарий''' – обязательное]]&lt;br /&gt;
Результаты разметки со связанными комментариями отображаются [[Help:UI manual#Функции правой панели|в правой панели]] на вкладке '''Комментарии'''. При этом можно поменять текст комментария, но не результат разметки. Для её изменения нужно заново установить статус, серьёзность и действие.&lt;br /&gt;
[[File:100 Правая панель Комментарии с разметкой.png|300px|thumb|none|Правая панель. Комментарии, добавленные при разметке]]&lt;br /&gt;
&lt;br /&gt;
=== Групповая разметка маркеров ===&lt;br /&gt;
Для групповой разметки:&lt;br /&gt;
:1. [[Help:UI manual#Работа в режиме разметки|В режиме разметки]] [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выберите исходные проект, ветку и снимок]].&lt;br /&gt;
:2. Включите отображение [[Help:UI manual#Таблица маркеров|таблицы маркеров]].&lt;br /&gt;
:3. Выберите маркеры для разметки – установите флажки в строках таблицы.&lt;br /&gt;
:4. Нажмите кнопку [[File:icon edit.png|x25px]] (доступна, если выбраны маркеры в таблице).&lt;br /&gt;
:[[File:53 Выбор маркеров для группразметки.png|thumb|none|upright=2.5|Выбор маркеров для групповой разметки]]&lt;br /&gt;
:Отобразится окно для групповой разметки.&lt;br /&gt;
:[[File:54 Окно групповой разметки.png|thumb|none|upright=2.5|Окно групповой разметки]]&lt;br /&gt;
:5. Разметьте выбранные маркеры: выберите статус разметки, а затем (опционально) статус серьезности (критичности) и требуемое действие – нажмите кнопки со значениями.&lt;br /&gt;
:6. Добавьте общий комментарий для выбранных маркеров.&amp;lt;br /&amp;gt;&lt;br /&gt;
:После того, как пользователь присвоил статусы и (или) написал комментарий, станет доступной кнопка '''Применить'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
:'''''Примечание''': ввод комментария обязателен, если [[Help:UI manual#Работа с проектами|для проекта]] установлен флаг '''Обязательный комментарий при разметке'''''.&lt;br /&gt;
:7. Если требуется отменить изменения, нажмите [[File:icon cross 01.png|x15px]] в правом верхнем углу окна или кнопку '''Отмена'''.&amp;lt;br /&amp;gt;Диалоговое окно закроется, изменения не будут применены, выделение с выбранных для разметки маркеров не снимается.&lt;br /&gt;
:9. Нажмите кнопку '''Применить''', чтобы запустить процесс разметки.&amp;lt;br /&amp;gt;&lt;br /&gt;
Прогресс разметки отображается в соответствующем окне. Запущенный процесс можно полностью отменить нажатием кнопки '''Отмена'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
В результате применения разметки текст маркеров [[Help:UI manual#Таблица маркеров|в таблице маркеров]] окрасится в цвет, соответствующий выставленному статусу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;120px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:0&amp;quot;&amp;gt;&lt;br /&gt;
  56 Окно прогресса разметки.png|Окно прогресса разметки&lt;br /&gt;
  57 Результат групповой разметки.png|Пример таблицы маркеров после применения групповой разметки&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Блокировка разметки маркеров===&lt;br /&gt;
Пользователь может заблокировать другим пользователям возможность [[Help:UI manual#Разметка маркера|размечать маркер]] или [[Help:UI manual#Групповая разметка маркеров|группу маркеров]]. Это позволяет избежать коллизий при разметке маркеров несколькими пользователями.&lt;br /&gt;
&lt;br /&gt;
Для блокировки разметки используйте кнопку [[File:icon unlocked.png|x25px]] в следующих частях пользовательского интерфейса:&lt;br /&gt;
:1. [[Help:UI manual#Вкладка «Детекторы»|На вкладке '''Детекторы''']]. В этом случае блокировка распространяется на все маркеры выбранного детектора в открытом проекте и ветке, для всех снимков ветки.&lt;br /&gt;
:2. [[Help:UI manual#Вкладка «Файлы»|На вкладке '''Файлы''']]. В этом случае блокировка распространяется на все маркеры в выбранном файле в открытом проекте и ветке, для всех снимков ветки.&lt;br /&gt;
:3. В верхней части [[Help:UI manual#Функции правой панели|правой панели]]. В этом случае блокировка распространяется на все эквивалентные маркеры в открытом проекте и ветке, для всех снимков ветки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  58 Блокировка на вкладке Детекторы.png|Блокировка маркера на вкладке '''Детекторы'''&lt;br /&gt;
  File:59_Блокировка_на_вкладке_Файлы.png|Блокировка маркера на вкладке '''Файлы'''&lt;br /&gt;
  60_Блокировка_на_правой_панели.png|Блокировка маркера на правой панели&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если один пользователь заблокировал маркер, то другой пользователь не сможет заблокировать детектор, которому принадлежит этот маркер, и файл, в котором этот маркер найден.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы посмотреть все блокировки, перейдите в раздел [[Help:UI manual#Настройка сервера Svacer|'''Настройки''']] на [[Help:UI manual#Управление блокировками разметки|вкладку '''Блокировки''']]:&lt;br /&gt;
&lt;br /&gt;
[[File:61 Просмотр всех блокировок.png|thumb|none|800px|Таблица блокировок]]&lt;br /&gt;
&lt;br /&gt;
В этом разделе можно удалить только свои блокировки. Пользователь с доступом '''Удаление блокировок''' может удалить любые блокировки.&lt;br /&gt;
&lt;br /&gt;
=== Экспорт кода с разметкой ===&lt;br /&gt;
Пользователь может экспортировать с сервера исходный код с разметкой (опционально) из снимка двумя способами:&lt;br /&gt;
&lt;br /&gt;
==== Способ 1 – в пользовательском интерфейсе сервера Svacer ====&lt;br /&gt;
&lt;br /&gt;
Для этого:&lt;br /&gt;
:1. [[Help:UI manual#Работа в режиме разметки|В режиме разметки]] [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|выберите исходные проект, ветку и снимок]].&lt;br /&gt;
:2. На вкладке '''Информация о снимке''' в строке свойства '''ID''' нажмите кнопку [[File:Icon book.png|x25px]].&lt;br /&gt;
:[[File:62 Переход к экспорту кода с разметкой.png|600px|thumb|none|Переход к экспорту кода с разметкой]]&lt;br /&gt;
:3. В открывшемся окне выберите шаблон для экспорта в списке справа (по умолчанию '''Нет''', т. е. разметка экспортироваться не будет) и опционально заполните поля для удаления префиксов и исключения путей:&lt;br /&gt;
:[[File:63 Окно экспорта кода с разметкой.png|600px|thumb|none|Окно экспорта кода с разметкой]]&lt;br /&gt;
&lt;br /&gt;
Пример удаления префиксов путей: &amp;lt;code&amp;gt;/.build/&amp;lt;/code&amp;gt; –  чтобы убрать папку '''.build''' при экспорте.&lt;br /&gt;
&lt;br /&gt;
При экспорте можно исключить файлы, соответствующие [[Help:UI manual#Использование регулярных выражений|регулярным выражениям]] в поле '''Исключить пути'''. В итоге создастся архив со всеми исходниками и, если был выбран шаблон разметки, то в исходном коде будет вставлена актуальная разметка, соответствующая выбранному шаблону.&lt;br /&gt;
&lt;br /&gt;
==== Способ 2 – через консольную команду svacer markup export ====&lt;br /&gt;
&lt;br /&gt;
Синтаксис команды:&lt;br /&gt;
&amp;lt;pre&amp;gt;svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; export [--stripPrefixes &amp;lt;prefix1, prefix2, … , prefixN&amp;gt; --excludePaths &amp;lt;path1, path2, … ,pathN&amp;gt; --template &amp;lt;name&amp;gt;]&amp;lt;/pre&amp;gt;&lt;br /&gt;
Где:&lt;br /&gt;
* &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; — имя пользователя и пароль учетной записи на сервере Svacer;&lt;br /&gt;
* &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt; — проект на сервере Svacer, из которого будет экспортирован код;&lt;br /&gt;
* &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt; — ветка в проекте, выбранном выше (по умолчанию '''master'''), из которой будет экспортирован код;&lt;br /&gt;
* &amp;lt;code&amp;gt;snapshot&amp;lt;/code&amp;gt; — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), из которого будет экспортирован код;&lt;br /&gt;
* &amp;lt;code&amp;gt;stripPrefixes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;excludePaths&amp;lt;/code&amp;gt; — аналогичны полям '''Удалить префиксы''' и '''Исключить пути''' в форме экспорта разметки в пользовательском интерфейсе, описанной выше;&lt;br /&gt;
* &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; — определяет название шаблона для экспорта разметки. Если название не указано, разметка не экспортируется.&lt;br /&gt;
&lt;br /&gt;
В результате будут созданы директории и файлы с исходным кодом, соответствующие выбранному проекту. Если директории и файлы уже существуют, они будут перезаписаны.&lt;br /&gt;
&lt;br /&gt;
Наличие в файлах комментариев зависит от того, был ли выбран шаблон разметки.&lt;br /&gt;
&lt;br /&gt;
=== Работа с таблицей статистики ===&lt;br /&gt;
Чтобы посмотреть краткую статистику о разметке маркеров:&lt;br /&gt;
:1. [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|Выберите исходные проект, ветку и снимок]].&lt;br /&gt;
:2. Перейдите [[Help:UI manual#Работа в режиме разметки|в режим разметки]].&lt;br /&gt;
:3. На вкладке '''Информация о снимке''' в строке свойства '''Статистика''' нажмите кнопку [[File:Button Показать 2.png|x25px]].&lt;br /&gt;
&lt;br /&gt;
:[[File:64 Переход к просмотру статистики.png|600px|thumb|none|Переход к просмотру статистики]]&lt;br /&gt;
&lt;br /&gt;
:Отобразится таблица статистики:&lt;br /&gt;
:[[File:65 Таблица статистики.png|600px|thumb|none|Таблица статистики]]&lt;br /&gt;
:4. Нажмите кнопку [[File:Icon download CSV.png|x20px]] или [[File:Icon download PDF.png|x20px]], чтобы выгрузить статистику в соответствующем формате.&lt;br /&gt;
:5. Нажмите кнопку [[File:Icon filter.png|x20px]] в строке статистики, чтобы применить [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательский фильтр]] с параметрами, которые соответствуют выбранному значению.&lt;br /&gt;
&lt;br /&gt;
== Работа в режиме просмотра кода ==&lt;br /&gt;
Режим позволяет посмотреть снимки исходного кода, связанного с результатами анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для этого:&lt;br /&gt;
:1. Перейдите в режим просмотра кода с помощью переключателя [[File:Button Код.png|x25px]] в верхней части экрана.&lt;br /&gt;
:2. [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|Выберите исходные проект, ветку и снимок]].&amp;lt;br&amp;gt;&lt;br /&gt;
:'''''Примечание''': по умолчанию выбран контекст (проект, ветка), заданный ранее в режиме [[Help:UI manual#Работа в режиме разметки|'''Разметка''']] или [[Help:UI manual#Режим формирования отчетов|'''Отчеты''']]. Если Пользователь перешел в раздел '''Кoд''' из режима сравнения снимков раздела [[Help:UI manual#Работа в режиме разметки|'''Разметка''']], то для изменения контекста требуется отменить режим сравнения.''&lt;br /&gt;
:В левой части экрана отобразится иерархический список файлов снимка, а в правой – поле для отображения исходного кода файла.&lt;br /&gt;
:[[File:67 Режим просмотра кода.png|600px|thumb|none|Режим просмотра кода]]&lt;br /&gt;
:3. В левой части экрана раскройте группу файлов и нажмите на имя файла.&lt;br /&gt;
:4. Также доступен поиск файлов, для этого кликните на поле поиска или нажмите комбинацию клавиш Ctrl+Shift+O, в открывшемся окне введите поисковый запрос и выберите файл.&lt;br /&gt;
:В правой части отобразится исходный код файла.&lt;br /&gt;
:[[File:68 Режим просмотра кода открыт один файл.png|600px|thumb|none|Пример одного открытого файла]]&lt;br /&gt;
:4. Если требуется, откройте другие файлы.&lt;br /&gt;
:Они отобразятся на отдельных вкладках, если выключена [[Help:UI manual#Настройка профиля пользователя|настройка '''Переиспользование вкладки в редакторе кода''']].&lt;br /&gt;
:[[File:69 Режим просмотра кода открыто три файла.png|600px|thumb|none|Пример трёх открытых файлов]]&lt;br /&gt;
:5. Вызовите функции, доступные по нажатию правой кнопки мыши на строке исходного кода&lt;br /&gt;
:* '''Перейти к объявлению''' – для перехода к строке, в которой объявлена переменная;&lt;br /&gt;
:* '''Перейти к определению''' – для перехода к строке, в которой определена переменная и функция;&lt;br /&gt;
:* '''Найти ссылки''' – для просмотра ссылок в панели с иерархическим списком файлов, именами файлов и номерами строк, в которых найдены ссылки;&lt;br /&gt;
::[[File:24 Исходный код Cписок файлов со ссылками.png|thumb|none|600px|Cписок файлов с номерами строк, в которых найдены ссылки]]&lt;br /&gt;
:* '''Copy''' – для копирования строки в буфер обмена;&lt;br /&gt;
:* '''Command Palette''' – для вызова командной строки.&lt;br /&gt;
&lt;br /&gt;
==Управление проектами и группами проектов==&lt;br /&gt;
В разделе '''Проекты''' отображаются все проекты со всеми ветками и снимками. &lt;br /&gt;
Для удобства работы проекты могут быть [[Help:UI manual#Работа с группами проектов|сгруппированы]]. Проект может быть включен в несколько групп проектов.&lt;br /&gt;
[[File:101 Раздел Проекты.png|thumb|none|upright=3|Раздел '''Проекты''']]&lt;br /&gt;
&lt;br /&gt;
===Работа с проектами===&lt;br /&gt;
Список проектов отображается в левой части экрана и организован в виде иерархии. При этом:&lt;br /&gt;
* для проектов, разметку маркеров которых нужно в обязательном порядке снабжать комментариями, отображается иконка [[File:Icon comment.png|x25px]];&lt;br /&gt;
* в нижней части списка отображается общее количество проектов и веток с учетом примененных фильтров, а также выбранных проектов и веток.&lt;br /&gt;
В списке доступны:&lt;br /&gt;
* поиск по имени проекта;&lt;br /&gt;
* фильтрация списка по группам проектов;&lt;br /&gt;
* сортировка по названию или дате создания (по умолчанию – по названию).&lt;br /&gt;
При работе с проектами пользователю доступны следующие функции: &lt;br /&gt;
:1.	Загрузка актуальных данных с сервера – для этого нажмите кнопку [[File:Icon refresh.png|x25px]].&lt;br /&gt;
:2.	Просмотр списка веток – для этого нажмите на название проекта.&lt;br /&gt;
:Ветки отобразятся в этом же списке проекта на втором уровне.&lt;br /&gt;
:3.	Просмотр списка снимков – для этого нажмите на название ветки.&lt;br /&gt;
:Список снимков отобразится в виде таблицы в правой части экрана.&lt;br /&gt;
:4.	[[Help:UI manual#Работа с группами проектов|Группировка проектов]].&lt;br /&gt;
:5.	Создание проекта:&lt;br /&gt;
::а) Нажмите кнопку '''Создать проект'''.&lt;br /&gt;
::б) В открывшемся окне введите его название, выберите одну или несколько групп и установите флажок, если требуется при разметке маркеров обязательно добавлять комментарий.&lt;br /&gt;
::в) Нажмите кнопку '''Создать'''.&lt;br /&gt;
:При создании проекта автоматически создается ветка '''master'''.&lt;br /&gt;
:При импорте снимка в интерфейсе командной строки проект, при его отсутствии, добавляется автоматически.&lt;br /&gt;
:[[File:102 Создание проекта.png|thumb|none|upright=1.5|Окно создания проекта]]&lt;br /&gt;
:6.	Добавление ветки:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке проекта.&lt;br /&gt;
::б) В меню выберите пункт '''Создать ветку'''.&lt;br /&gt;
::в) В открывшемся окне введите название.&lt;br /&gt;
:При импорте снимка в интерфейсе командной строки ветка, при ее отсутствии, добавляется автоматически.&lt;br /&gt;
:[[File:103 Создание ветки.png|thumb|none|upright=1.5|Окно добавления ветки в проект]]&lt;br /&gt;
:7.	Редактирование параметров проекта:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке проекта.&lt;br /&gt;
::б) В меню выберите пункт '''Редактировать'''.&lt;br /&gt;
::в) В открывшемся окне измените название проекта, скорректируйте список групп, в которые включен проект, и установите или снимите флажок обязательности комментария при разметке.&lt;br /&gt;
:8.	Удаление одного проекта:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке проекта.&lt;br /&gt;
::б) В меню выберите пункт '''Удалить'''.&lt;br /&gt;
::в) Подтвердите удаление.&lt;br /&gt;
:9.	Удаление нескольких проектов с ветками:&lt;br /&gt;
::а) Выберите проекты для удаления – установите флажки в левой части названий проектов и веток или нажмите кнопку '''Выбрать всё'''.&lt;br /&gt;
::б) Нажмите кнопку '''Удалить''' в верхней части списка проектов и подтвердите удаление.&lt;br /&gt;
При удалении проекта удаляются все его ветки и снимки, разрывается связь проекта с группами.&lt;br /&gt;
&lt;br /&gt;
===Работа с группами проектов===&lt;br /&gt;
Работа с группами проектов доступна на отдельной панели '''Группы проектов''', которая отрывается по нажатии кнопки [[File:Icon gear.png|x25px]] в списке проектов. При этом в нижней части списка отображается общее количество групп.&lt;br /&gt;
&lt;br /&gt;
В списке групп доступны:&lt;br /&gt;
* поиск по названию группы;&lt;br /&gt;
* фильтрация списка по проектам.&lt;br /&gt;
&lt;br /&gt;
[[File:104 Панель групп.png|thumb|none|upright=3|Панель '''Группы проектов''']]&lt;br /&gt;
При работе с группами проектов пользователю доступны следующие функции: &lt;br /&gt;
:1.	Просмотр списка связанных с группой проектов – для этого нажмите на название группы.&lt;br /&gt;
:Проекты отобразятся в этом же списке групп на втором уровне.&lt;br /&gt;
:2.	Добавление группы:&lt;br /&gt;
::а) Нажмите кнопку '''Создать группу'''.&lt;br /&gt;
::б) В открывшемся окне введите название группы и выберите проекты, которые в неё войдут, нажмите кнопку '''Создать'''.&lt;br /&gt;
:Созданная группа отобразится в списке на панели '''Группы проектов'''.&lt;br /&gt;
:[[File:105 Создание группы.png|thumb|none|upright=1.5|Окно '''Создать группу''']]&lt;br /&gt;
:3.	Редактирование параметров группы:&lt;br /&gt;
::а) Нажмите кнопку [[File:Icon edit2.png|x25px]] в строке группы.&lt;br /&gt;
::б) В открывшемся окне измените название группы, скорректируйте состав включенных в группу проектов.&lt;br /&gt;
::в) Нажмите на кнопку [[File:Icon cancel.png|x25px]] справа от названия проекта в списке, чтобы исключить его из группы.&lt;br /&gt;
::г) Нажмите кнопку '''Сохранить'''.&lt;br /&gt;
:[[File:106 Редактирование группы.png|thumb|none|upright=1.5|Окно Редактировать группу]]&lt;br /&gt;
:4.	Исключение одного проекта из группы – для этого нажмите кнопку [[File:Icon hide marks.png|x25px]] в правой части списка проектов группы.&lt;br /&gt;
:5.	Удаление одной группы – для этого нажмите кнопку [[File:Icon delete.png|x25px]] в правой части списка групп и подтвердите удаление.&lt;br /&gt;
:6.	Удаление нескольких групп:&lt;br /&gt;
::а) Выберите группы для удаления – установите флажки в левой части названий групп или нажмите кнопку '''Выбрать всё'''.&lt;br /&gt;
::б) Нажмите кнопку '''Удалить''' в верхней части списка групп проектов и подтвердите удаление.&lt;br /&gt;
:При удалении группы разрывается связь проекта с группой. Сами проекты не удаляются.&lt;br /&gt;
&lt;br /&gt;
===Работа с ветками===&lt;br /&gt;
При работе с ветками проекта пользователю доступны следующие функции: &lt;br /&gt;
:1.	Просмотр списка снимков – для этого нажмите на название ветки.&lt;br /&gt;
:Список снимков отобразится в виде таблицы в правой части экрана.&lt;br /&gt;
&lt;br /&gt;
:2.	Редактирование ветки:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке ветки.&lt;br /&gt;
::б) В меню выберите пункт '''Редактировать'''.&lt;br /&gt;
::в) В открывшемся окне измените название ветки.&lt;br /&gt;
:[[File:107 Редактирование ветки.png|thumb|none|upright=1.5|Окно редактирования ветки]]&lt;br /&gt;
&lt;br /&gt;
:3.	Клонирование ветки проекта:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке ветки.&lt;br /&gt;
::б) В меню выберите пункт '''Клонировать'''.&lt;br /&gt;
::в) В открывшемся окне введите название новой ветки и нажмите кнопку '''Клонировать'''.&lt;br /&gt;
:[[File:108 Клонирование ветки.png|thumb|none|upright=1.5|Окно клонирования ветки]]&lt;br /&gt;
&lt;br /&gt;
:4.	Удаление ветки:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке ветки.&lt;br /&gt;
::б) В меню выберите пункт '''Удалить'''.&lt;br /&gt;
::в) Подтвердите удаление.&lt;br /&gt;
:При удалении ветки удаляются все ее снимки.&lt;br /&gt;
&lt;br /&gt;
:5.	Копирование разметки в другой контейнер (проект и ветку):&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке ветки и в меню выберите пункт '''Копировать разметку'''.&lt;br /&gt;
::б) В открывшемся окне выберите проект и ветку, в которые нужно скопировать разметку, а также действия, которые нужно выполнить при наличии разметки.&lt;br /&gt;
::в) Нажмите кнопку '''Копировать'''.&lt;br /&gt;
:[[File:109 Копирование разметки.png|thumb|none|upright=1.5|Окно копирования разметки в другой контейнер]]&lt;br /&gt;
Разметка в контейнере состоит из множества размеченных маркеров. В целевой ветке уже может находиться разметка. Все множество маркеров в исходной ветке можно разбить на два: &lt;br /&gt;
* «Уникальные» – маркеры, которые есть только в исходной ветке;&lt;br /&gt;
* «Общие» – маркеры, которые есть как в ветке-источнике, так и в ветке-приемнике.&lt;br /&gt;
При выполнении операции копирования разметка в уникальных маркерах всегда копируется в ветку-приемник. Для «Общих» маркеров возможны несколько вариантов продолжения копирования, но по умолчанию выбран пункт '''Не копировать''' – в этом случае разметка в «Общих» маркерах в ветке-приемнике не изменяется.&lt;br /&gt;
&lt;br /&gt;
Если выбрано действие '''Перезаписать''', разметка на «Общих» маркерах в целевом контейнере будет заменена разметкой из ветки-источника. &lt;br /&gt;
&lt;br /&gt;
При выборе действия '''Перезаписать только старую разметку''' разметка из ветки-источника копируется в том случае, если ее метка времени более поздняя, чем та, которая указана в ветке-приемнике на данном маркере.&lt;br /&gt;
&lt;br /&gt;
'''Пример''' &lt;br /&gt;
:Есть несколько контейнеров: &lt;br /&gt;
:* A с разметкой {(M1, D1), (M2, D2), (M3, D3)}&lt;br /&gt;
:* B с разметкой {(M4, D4), (M2, D5), (M3, D6)},&lt;br /&gt;
::где M — это маркер, а D — разметка (включая метку времени).&lt;br /&gt;
&lt;br /&gt;
:Операцию сравнения на разметке обозначим как &amp;gt;. Если метка времени в D1 больше, чем в D2, то D1 &amp;gt; D2.&lt;br /&gt;
:Пусть D2 &amp;gt; D5, а D3 &amp;lt; D6. Тогда операция копирования всегда скопирует разметку D1 (но не сам маркер), так как маркер M1 новый для контейнера B.&lt;br /&gt;
&lt;br /&gt;
:Маркеры M2, M3 — общие для двух контейнеров, поэтому то, какая разметка будет в контейнере-приемнике, будет зависеть от выбранного варианта разрешения конфликта: &lt;br /&gt;
:* если выбран пункт '''Не копировать''', то в контейнере B на маркерах M2, M3 будет разметка D5, D6 соответственно;&lt;br /&gt;
:* если выбран пункт '''Перезаписать''', то на M2, M3 будет разметка D2, D3;&lt;br /&gt;
:* если выбран пункт '''Перезаписать только старую разметку''', то на M2, M3 разметка будет: D2, D6, так как D2 &amp;gt; D5 и D6 &amp;gt; D3.&lt;br /&gt;
:При выполнении копирования наличие маркера в ветке-приемнике не проверяется.&lt;br /&gt;
:При успешном копировании выводится всплывающее сообщение вида: ''Выполнено успешно. Всего: Х, Заменено:Y''&lt;br /&gt;
:Это сообщение означает, что всего было скопировано X инвариантов вместе с разметкой и среди скопированных инвариантов Y штук было скопировано с заменой.&lt;br /&gt;
&lt;br /&gt;
===Работа со снимками===&lt;br /&gt;
Список снимков отображается в правой части экрана в виде таблицы после выбора ветки проекта. При этом в нижней части списка отображается общее количество снимков в выбранной ветке и количество выбранных снимков.&lt;br /&gt;
В списке доступны:&lt;br /&gt;
* поиск по названию снимка;&lt;br /&gt;
* сортировка по значениям столбцов (по умолчанию — по дате создания).&lt;br /&gt;
Для настройки снимков пользователю доступны следующие функции: &lt;br /&gt;
:1. Импорт снимка из файла:&lt;br /&gt;
::а) Нажмите кнопку '''Импорт''' в верхней части табличного списка снимков.&lt;br /&gt;
::б) В открывшемся окне выберите файл в формате .snap, введите название снимка (опционально) и нажмите кнопку '''Импортировать'''.&lt;br /&gt;
:'''''Примечание''': если название не введено, то при импорте будет то же название, которое было при экспорте результатов анализа из Svace.''&lt;br /&gt;
:[[File:110 Импорт снимка.png|thumb|none|upright=1.5|Окно импорта снимка]]&lt;br /&gt;
:2.	Переход к разметке маркеров снимка:&lt;br /&gt;
::а)	Нажмите кнопку [[File:Button menu.png|x25px]] в крайнем правом столбце строки снимка.&lt;br /&gt;
::б)	В меню выберите пункт '''Разметить'''.&lt;br /&gt;
:3.	Редактирование снимка:&lt;br /&gt;
::а)	Нажмите кнопку [[File:Button menu.png|x25px]] в крайнем правом столбце строки снимка.&lt;br /&gt;
::б)	В меню выберите пункт '''Редактировать'''.&lt;br /&gt;
::в)	Поменяйте название.&lt;br /&gt;
:[[File:111 Редактирование снимка.png|thumb|none|upright=1.5|Окно редактирования снимка]]&lt;br /&gt;
:4.	Экспорт снимка в файл формата .snap:&lt;br /&gt;
::а)	Нажмите кнопку [[File:Button menu.png|x25px]] в крайнем правом столбце строки снимка.&lt;br /&gt;
::б)	В меню выберите пункт '''Экспортировать'''.&lt;br /&gt;
:5.	Просмотр информации о снимке в JSON-формате:&lt;br /&gt;
::а)	Нажмите кнопку [[File:Button menu.png|x25px]] в строке снимка крайнем правом столбце.&lt;br /&gt;
::б)	В меню выберите пункт '''Просмотреть JSON'''.&lt;br /&gt;
:[[File:112 Просмотр JSON снимка.png|thumb|none|upright=3|Окно просмотра информации о снимке в JSON-формате]]&lt;br /&gt;
:6.	Удаление одного снимка:&lt;br /&gt;
::а)	Нажмите кнопку [[File:Button menu.png|x25px]] в строке снимка крайнем правом столбце.&lt;br /&gt;
::б)	В меню выберите пункт '''Удалить'''.&lt;br /&gt;
::в)	Подтвердите удаление.&lt;br /&gt;
:7.	Удаление нескольких снимков:&lt;br /&gt;
::а)	Чтобы выбрать для удаления все снимки, установите флажок в заголовке табличного списка снимков.&lt;br /&gt;
::б)	Чтобы выбрать несколько снимков, установите флажки в крайнем правом столбце табличного списка.&lt;br /&gt;
::в)	Нажмите кнопку '''Удалить''' в верхней части табличного списка снимков и подтвердите удаление.&lt;br /&gt;
&lt;br /&gt;
== Режим формирования отчетов ==&lt;br /&gt;
Режим позволяет сформировать отчеты на основе хранимой информации, посмотреть их в пользовательском интерфейсе и выгрузить в формате .json. Для этого:&lt;br /&gt;
:1. [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|Выберите исходные проект и ветку]].&lt;br /&gt;
:'''''Примечание''': по умолчанию выбран контекст (проект, ветка), заданный ранее в режиме [[Help:UI manual#Работа в режиме разметки|'''Разметка''']] или [[Help:UI manual#Режим формирования отчетов|'''Отчеты''']]. Если Пользователь перешел в раздел '''Отчеты''' из режима сравнения снимков раздела [[Help:UI manual#Работа в режиме разметки|'''Разметка''']], то для изменения контекста требуется отменить режим сравнения.''&lt;br /&gt;
:2. Перейдите в раздел '''Отчеты''' в верхней части экрана.&lt;br /&gt;
:Отобразится форма формирования отчетов:&lt;br /&gt;
:[[File:70 Форма формирования отчетов.png|thumb|none|upright=3|Форма формирования отчетов]]&lt;br /&gt;
:3. На панели слева выберите требуемый отчет: '''Общий отчет''' или '''Тренды'''.&lt;br /&gt;
:4. Выберите текущий и целевой снимки:&lt;br /&gt;
:[[File:71 Выбор снимков для формирования отчета.png|thumb|none|upright=3|Выбор снимков для формирования отчета]]&lt;br /&gt;
:5. Нажмите кнопку [[File:Button Play.png|x25px]] для запуска формирования отчета и его отображения в пользовательском интерфейсе.&lt;br /&gt;
:6. Нажмите кнопку [[File:Icon download.png|x25px]] для выгрузки отчета в формате .json.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;slideshow&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:2em&amp;quot; &amp;quot;=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
File:72 Пример общего отчета.png|Пример общего отчета. Часть 1&lt;br /&gt;
File:72.2 Пример общего отчета часть2.png|Пример общего отчета. Часть 2&lt;br /&gt;
File:72.3 Пример общего отчета часть3.png|Пример общего отчета. Часть 3&lt;br /&gt;
File:72.4 Пример общего отчета часть4.png|Пример общего отчета. Часть 4&lt;br /&gt;
File:72.5 Пример общего отчета часть5.png|Пример общего отчета. Часть 5&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[File:73 Пример отчета Тренды.png|600px|thumb|none|Пример отчета '''Тренды''']]&lt;br /&gt;
&lt;br /&gt;
== Настройка сервера Svacer ==&lt;br /&gt;
Перейти в раздел '''Настройки''' можно по нажатии кнопки [[File:Icon settings.png|x25px]] в верхней правой части экрана.&lt;br /&gt;
&lt;br /&gt;
В этом разделе пользователю, в зависимости от роли, доступны следующие функции:&lt;br /&gt;
* [[Help:UI manual#Управление пользователями, ролями и организациями|управление пользователями, ролями и организациями]];&lt;br /&gt;
* [[Help:UI manual#Настройка глобальных фильтров|настройка глобальных фильтров]];&lt;br /&gt;
* [[Help:UI manual#Управление блокировками разметки|управление блокировками]];&lt;br /&gt;
* [[Help:UI manual#Управление шаблонами разметки|управление шаблонами разметки]];&lt;br /&gt;
* [[Help:UI manual#Просмотр списка всех детекторов и его выгрузка в формате PDF|просмотр и выгрузка списка детекторов]];&lt;br /&gt;
* [[Help:UI manual#Просмотр информации о сервере|просмотр информации о сервере]];&lt;br /&gt;
* [[Help:UI manual#Управление клиентами OAuth|управление клиентами OAuth]].&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями, ролями и организациями===&lt;br /&gt;
==== Управление пользователями ====&lt;br /&gt;
Реестром учетных записей пользователей можно управлять на вкладке '''Пользователи''' в разделе '''Управление пользователями''' страницы '''Настройки'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Для [[Help:Advanced config and CLI features#Поддержка протокола LDAP для аутентификации пользователей|учетных записей с доступом по LDAP]] рядом с логином отображается индикатор [[File:Icon LDAP.png|x25px]], а для учетных записей с признаком '''Мастер разметки''' – индикатор [[File:Icon markup master.png|x25px]].&amp;lt;br&amp;gt;&lt;br /&gt;
В разделе доступны:&lt;br /&gt;
* поиск по атрибутам учётной записи пользователя;&lt;br /&gt;
* фильтрация списка по типам учётных записей:&lt;br /&gt;
:* все;&lt;br /&gt;
:* системные;&lt;br /&gt;
:* LDAP;&lt;br /&gt;
:* заблокированные;&lt;br /&gt;
:* активные.&lt;br /&gt;
* сортировка по колонкам '''Логин''', '''ФИО''' и '''Дата создания''' (по умолчанию).&lt;br /&gt;
:[[File:74 Вкладка Пользователи на странице Настройки.png|thumb|none|upright=3|Вкладка '''Пользователи''' в разделе '''Управление пользователями''' страницы '''Настройки''']]&lt;br /&gt;
Для управления пользователями:&lt;br /&gt;
:1. Создайте учетную запись пользователя:&lt;br /&gt;
::а) Нажмите кнопку '''Создать'''.&lt;br /&gt;
::Откроется окно добавления учетной записи пользователя.&lt;br /&gt;
::[[File:76 Окно Добавить пользователя.png|thumb|none|upright=1.5|Окно '''Создать пользователя''']]&lt;br /&gt;
::б) Заполните поля:&lt;br /&gt;
::* Логин;&lt;br /&gt;
::* Пароль;&lt;br /&gt;
::* e-mail;&lt;br /&gt;
::* ФИО.&lt;br /&gt;
::в) Выберите [[Help:UI manual#Управление организациями|организации]], в которые должен входить пользователь, а также назначьте ему [[Help:UI manual#Управление ролями|роли]] – выберите значения в раскрывающихся списках полей '''Организации''' и '''Роли''' соответственно. Для отмены выбора нажмите на кнопку [[File:Icon cancel.png|x25px]] справа от значения.&lt;br /&gt;
::г) Включите опции '''Изменить пароль при первом входе в систему''' и '''Мастер разметки'''.&amp;lt;br&amp;gt;&lt;br /&gt;
::'''''Примечание''': Если для учётной записи активирована опция '''Мастер разметки''', есть разрешение на разметку и этот пользователь разметил маркер в каком-либо снимке, то изменить его разметку может только пользователь, в учётной записи которого также активирована опция '''Мастер разметки''' или которому предоставлен серверный доступ '''Изменение любой разметки'''.''&lt;br /&gt;
::д) Нажмите кнопку '''Создать'''.&lt;br /&gt;
: В таблице со списком пользователей добавится новая запись.&lt;br /&gt;
&lt;br /&gt;
:2. Воспользуйтесь функциями в строке учетной записи в крайнем правом столбце – нажмите кнопку [[File:Button menu.png|x25px]] и выберите пункт:&lt;br /&gt;
:* '''Редактировать''' – для перехода к редактированию данных профиля;&lt;br /&gt;
:* '''Изменить пароль''' – для перехода к изменению пароля;&lt;br /&gt;
:* '''Сбросить настройки пользователя''' – для возврата пользовательских настроек к их значениям по умолчанию;&lt;br /&gt;
:* '''Заблокировать''' – для блокировки учетной записи. В этом случае для учетной записи пользователя блокируется доступ к системе, а в списке рядом с логином учетной записи отображается индикатор [[File:Icon_Archived.png|x25px]];&lt;br /&gt;
:* '''Разблокировать''' – для восстановления доступа пользователя к системе;&lt;br /&gt;
:* '''Удалить''' – для удаления учётной записи пользователя;&lt;br /&gt;
:* '''Показать доступы пользователя''' – для отображения списка объединенных доступов всех ролей, назначенных пользователю:&lt;br /&gt;
::[[File:113 Список доступов пользователя.png|thumb|none|upright=3|Список доступов пользователя]]&lt;br /&gt;
:'''''Примечание''': Функции блокировки и удаления недоступны для системных учетных записей. При изменении логина или списка доступов у авторизованного пользователя, он будет перенаправлен на страницу авторизации.''&lt;br /&gt;
&lt;br /&gt;
:3. Воспользуйтесь функциями управления несколькими учётными записями одновременно:&lt;br /&gt;
::а) Чтобы выбрать несколько записей, установите флажки в первом столбце списка пользователей.&lt;br /&gt;
::б) Чтобы выбрать все отображаемые учётные записи, установите один флажок в заголовке столбцов в первом столбце списка.&lt;br /&gt;
::в) Нажмите кнопку '''Действия''' в верхней части списка пользователей и выберите пункт: '''Сбросить настройки пользователя''', '''Заблокировать''', '''Разблокировать''' или '''Удалить'''. В списке активны только действия, доступные всем выбранным учетным записям.&lt;br /&gt;
:4. Для [[Help:Advanced config and CLI features#Поддержка протокола LDAP для аутентификации пользователей|учетной записи с доступом по LDAP]] обновите данные – в окне редактирования данных профиля пользователя нажмите кнопку '''Загрузить из LDAP'''.&lt;br /&gt;
:Загрузятся параметры профиля пользователя и его контакты из профиля в службе каталогов, если они там указаны.&lt;br /&gt;
:[[File:78 Загрузка данных из LDAP.png|thumb|none|upright=1.5|Загрузка данных из LDAP]]&lt;br /&gt;
&lt;br /&gt;
==== Управление ролями ====&lt;br /&gt;
Реестром ролей можно управлять на вкладке '''Роли''' в разделе '''Управление пользователями''' страницы '''Настройки'''.&lt;br /&gt;
:[[File:79 Переход к управлению ролями.png|thumb|none|upright=3|Вкладка '''Роли''' в разделе '''Управление пользователями''' страницы '''Настройки''']]&lt;br /&gt;
'''''Примечание''': роли [[Help:UI manual#Описание ролевой модели|admin, filter_master и importer]] являются встроенными с особым значением. Их нельзя удалить или изменить.''&amp;lt;br&amp;gt;&lt;br /&gt;
Доступен поиск по названию роли и сортировка по колонкам '''Название''' (по умолчанию) и '''Пользователи'''. &amp;lt;br&amp;gt;&lt;br /&gt;
Для управления ролями доступны следующие функции:&lt;br /&gt;
:1. Создание новой роли:&lt;br /&gt;
::а) Нажмите кнопку '''Создать'''.&lt;br /&gt;
::[[File:81 Окно добавления роли.png|thumb|none|upright=3|Окно добавления роли]]&lt;br /&gt;
::б) Заполните поля появившейся формы:&lt;br /&gt;
:::*введите название роли;&lt;br /&gt;
:::*в блоке '''Серверные доступы''' выберите доступы – нажмите кнопку '''Выбрать всё''' или установите флажки для активации доступов.&lt;br /&gt;
:::При наведении курсора на иконку [[File:Icon question mark2.png|x25px]] отображается пояснение к доступу.&lt;br /&gt;
:::*в блоке '''Проектные доступы''' выберите тип доступа: группа проектов или определённый проект или его ветка;&lt;br /&gt;
:::*если выбран тип '''Группа проектов''', выберите название группы и установите флажки для активации доступов;&lt;br /&gt;
:::*если выбран тип '''Проект / Ветка''', выберите название проекта или ветки проекта, установите флажки для активации доступов.&lt;br /&gt;
:::Если выбрано значение '''Все''', то доступы будут предоставлены для всех проектов;&lt;br /&gt;
:::*для удаления строки с проектными доступами в блоке '''Проектные доступы''' нажмите кнопку [[File:Icon delete.png|x25px]] в крайнем правом столбце.&lt;br /&gt;
::в) Нажмите кнопку '''Создать'''.&lt;br /&gt;
&lt;br /&gt;
:2.	Просмотр доступов роли, нажмите на ссылку '''Показать доступы''' в столбце '''Доступы'''.&lt;br /&gt;
:[[File:114 Список доступов роли.png|thumb|none|upright=3|Список доступов роли]]&lt;br /&gt;
&lt;br /&gt;
:3.	Редактирование роли:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке роли в крайнем правом столбце.&lt;br /&gt;
::б) В меню выберите пункт '''Редактировать''' и внесите изменения.&lt;br /&gt;
&lt;br /&gt;
:4.	Создание копии роли:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке исходной роли в крайнем правом столбце.&lt;br /&gt;
::б) В меню выберите пункт '''Создать копию'''.&lt;br /&gt;
:В реестр ролей добавится новая запись с именем исходной роли и добавленным порядковым номером копии.&lt;br /&gt;
&lt;br /&gt;
:5.	Просмотр информации о роли в JSON-формате:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке исходной роли в крайнем правом столбце.&lt;br /&gt;
::б) В меню выберите пункт '''Просмотреть JSON'''.&lt;br /&gt;
&lt;br /&gt;
:6.	Удаление роли:&lt;br /&gt;
::а) Нажмите кнопку [[File:Button menu.png|x25px]] в строке исходной роли в крайнем правом столбце.&lt;br /&gt;
::б) В меню выберите пункт '''Удалить'''.&lt;br /&gt;
::в) Подтвердите удаление.&lt;br /&gt;
&lt;br /&gt;
:7.	Удаление несколько ролей одновременно:&lt;br /&gt;
::а) Для выбора нескольких записей установите флажки в первом столбце списка ролей.&lt;br /&gt;
::б) Чтобы выбрать все записи, установите один флажок в заголовке столбцов в первом столбце списка ролей.&lt;br /&gt;
::в) Нажмите кнопку '''Удалить''' и подтвердите удаление.&lt;br /&gt;
&lt;br /&gt;
==== Управление организациями ====&lt;br /&gt;
Пользователи могут быть связаны с организациями. Один пользователь может принадлежать нескольким организациям. Организации носят информационный характер и не влияют на права пользователей в системе. &amp;lt;br&amp;gt;&lt;br /&gt;
Реестром организаций можно управлять на вкладке '''Организации''' в разделе '''Управление пользователями''' страницы '''Настройки'''. &lt;br /&gt;
[[File:92 Вкладка Организации на странице Настройки.png|thumb|none|upright=3|Вкладка '''Организации''' в разделе '''Управление пользователями''' страницы '''Настройки''']]&lt;br /&gt;
Доступен поиск по названию и сокращенному названию организации и сортировка по колонкам '''Название''' (по умолчанию), '''Сокращенное название''' и '''Пользователи'''. &lt;br /&gt;
Для управления организациями, доступны следующие функции:&lt;br /&gt;
:1.	Создание организации: &lt;br /&gt;
::а) Нажмите кнопку '''Создать'''.&lt;br /&gt;
::б) Заполните поля появившейся формы.&lt;br /&gt;
::в) Нажмите кнопку '''Создать'''.&lt;br /&gt;
::[[File:93 Окно добавления организации в реестр.png|thumb|none|upright=1.5|Окно добавления организации в реестр]]&lt;br /&gt;
&lt;br /&gt;
:2.	Редактирование организации: &lt;br /&gt;
::а) Нажмите кнопку [[File:Icon edit2.png|x25px]] в крайнем правом столбце.&lt;br /&gt;
::б) В появившейся форме отредактируйте данные организации.&lt;br /&gt;
::в) Нажмите кнопку '''Сохранить'''.&lt;br /&gt;
&lt;br /&gt;
:3.	Удаление организации: &lt;br /&gt;
::а) Нажмите кнопку [[File:Icon delete.png|x25px]] в крайнем правом столбце.&lt;br /&gt;
::б) В появившемся диалоге подтвердите удаление, нажав на кнопку '''Удалить'''.&lt;br /&gt;
&lt;br /&gt;
:4.	Удаление несколько организаций одновременно:&lt;br /&gt;
::а) Для выбора нескольких записей установите флажки в первом столбце списка организаций.&lt;br /&gt;
::б) Чтобы выбрать все организации, установите один флажок в заголовке столбцов в первом столбце списка.&lt;br /&gt;
::в) Нажмите кнопку '''Удалить''' и подтвердите удаление.&lt;br /&gt;
&lt;br /&gt;
=== Настройка глобальных фильтров ===&lt;br /&gt;
В разделе '''Глобальные фильтры''' страницы '''Настройки''' можно настроить глобальные фильтры, применительно [[Help:UI manual#Выбор контекста (проекта, ветки и снимка)|к выбранным проекту или ветке проекта]]:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''': по умолчанию выбран контекст (проект, ветка), заданный ранее в режиме '''Разметка''', '''Код''' или '''Отчеты'''.''&lt;br /&gt;
[[File:82 Вкладка Фильтры на странице Настройки.png|thumb|none|upright=3|Раздел '''Фильтры''' на странице '''Настройки''']]&lt;br /&gt;
&lt;br /&gt;
В разделе доступен поиск по названию фильтра.&lt;br /&gt;
&lt;br /&gt;
Для настройки фильтров:&lt;br /&gt;
:1. Выберите проект и ветку в верхней строке раздела. По умолчанию указаны проект и ветка, выбранные в разделе '''Разметка'''.&lt;br /&gt;
:2. Чтобы добавить фильтр, нажмите кнопку '''Создать'''.&lt;br /&gt;
:Отобразится новая строка:&lt;br /&gt;
:[[File:83 Новая строка с фильтром.png|thumb|none|upright=3|Новая строка с фильтром]]&lt;br /&gt;
&lt;br /&gt;
:3. Чтобы изменить настройки фильтров:&lt;br /&gt;
::а) Введите или поменяйте название фильтра&lt;br /&gt;
::б) Включите или выключите фильтр – нажмите на значение в столбце '''Статус''', чтобы отобразилась иконка [[File:Icon check2.png|x25px]] (по умолчанию) или [[File:Icon cross 01.png|x25px]].&lt;br /&gt;
::в) Выберите область применения фильтра – нажмите на значение в столбце '''Область''' один или два раза, чтобы отобразилось значение '''ветка''' или '''проект'''.&lt;br /&gt;
::г) Введите [[Help:UI manual#Использование регулярных выражений|регулярное выражение]] или загрузите его из файла в столбцах '''Включить пути по шаблону''', '''Исключить пути по шаблону''' и '''Детекторы'''.&lt;br /&gt;
::д) Выберите уровни серьезности (критичности) и надежности:&lt;br /&gt;
::* [[File:Icon_critical_on.png|x30px]] – уровень выбран;&lt;br /&gt;
::* [[File:Icon_critical_off.png|x30px]] – уровень не выбран.&lt;br /&gt;
::Для изменения выбора нажмите на название уровня.&lt;br /&gt;
:4. Нажмите кнопку [[File:Icon delete.png|x25px]] в крайнем правом столбце, чтобы удалить один фильтр.&lt;br /&gt;
:5. Чтобы удалить несколько фильтров:&lt;br /&gt;
::а) Для выбора нескольких записей установите флажки в первом столбце списка фильтров.&lt;br /&gt;
::б) Чтобы выбрать все записи, установите один флажок в заголовке столбцов в первом столбце списка фильтров.&lt;br /&gt;
::в) Нажмите кнопку '''Удалить'''.&lt;br /&gt;
:6.	Для сохранения и применения изменений нажмите кнопку '''Применить'''.&lt;br /&gt;
:'''''Примечание''': если не применить изменения, то при переходе в другой раздел системы отобразится сообщение о том, что изменения не применены:''&lt;br /&gt;
:[[File:115 Запрос на изменение глобальных фильтров.png|thumb|none|upright=1.5]]&lt;br /&gt;
&lt;br /&gt;
=== Управление блокировками разметки ===&lt;br /&gt;
Чтобы посмотреть список всех [[Help:UI manual#Блокировка разметки|блокировок]], перейдите на вкладку '''Блокировки''' страницы '''Настройки''':&lt;br /&gt;
[[File:89 Вкладка Блокировки на странице Настройки.png|800px|thumb|none|Раздел '''Блокировки''' страницы '''Настройки''']]&lt;br /&gt;
'''''Примечание''': пользователю отображается  список блокировок в контейнерах, к которым у него есть доступ. Удаление не своих блокировок доступно пользователям с соответствующим доступом.''&amp;lt;br&amp;gt;&lt;br /&gt;
Доступен поиск по контейнерам, заблокированным сущностям и пользователям, сортировка по всем колонкам (по умолчанию – сортировка по дате).&lt;br /&gt;
&lt;br /&gt;
Для удаления одной блокировки:&lt;br /&gt;
:1.	Нажмите кнопку [[File:Icon delete.png|x25px]] в строке проекта в крайнем правом столбце.&lt;br /&gt;
:2.	Подтвердите удаление.&lt;br /&gt;
Для удаления нескольких блокировок:&lt;br /&gt;
:1.	Чтобы выбрать для удаления все блокировки, установите флажок в заголовке табличного списка.&lt;br /&gt;
:2.	Чтобы выбрать несколько блокировок, установите флажки в крайнем правом столбце табличного списка.&lt;br /&gt;
:3.	Нажмите кнопку '''Удалить''' в верхней части списка.&lt;br /&gt;
&lt;br /&gt;
=== Управление шаблонами разметки ===&lt;br /&gt;
Управление шаблонами разметки доступно в разделе '''Шаблоны разметки''' страницы '''Настройки''':&lt;br /&gt;
[[File:84 Вкладка Шаблоны на странице Настройки.png|thumb|none|upright=3|Раздел '''Шаблоны разметки''' на странице '''Настройки''']]&lt;br /&gt;
&lt;br /&gt;
Шаблоны разметки нужны для импорта/[[Help:UI manual#Экспорт кода с разметкой|экспорта разметки]]. С их помощью комментарии в исходном коде будут преобразовываться в разметку на сервере истории и обратно.&lt;br /&gt;
&lt;br /&gt;
Шаблон с именем DEFAULT есть всегда, его нельзя отредактировать или удалить.&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': ''для корректного создания или изменения шаблонов разметки следует обратиться к разработчикам Svacer.''&lt;br /&gt;
&lt;br /&gt;
Для управления шаблонами:&lt;br /&gt;
:1. Нажмите кнопку '''Создать'''.&lt;br /&gt;
:Откроется окно создания шаблона.&lt;br /&gt;
:[[File:Добавление шаблона разметки.png|thumb|none|upright=1.5|Окно создания шаблона разметки]]&lt;br /&gt;
:2. Введите название шаблона.&lt;br /&gt;
:3. Нажмите кнопку '''Создать'''.&lt;br /&gt;
:Шаблон появится в списке шаблонов для разметки в правой панели формы&lt;br /&gt;
:4. Отредактируйте поля шаблона разметки:&lt;br /&gt;
:[[File:85 Поля шаблона, доступные для редактирования.png|thumb|none|upright=2.5|Редактирование шаблона разметки]]&lt;br /&gt;
:5. Нажмите '''Сохранить'''.&lt;br /&gt;
:6. Чтобы клонировать существующий шаблон разметки, нажмите кнопку [[File:Icon_clone.png|x20px]] в правой части строки шаблона в списке.&lt;br /&gt;
:7. Для удаления одного шаблона:&lt;br /&gt;
::а) Нажмите кнопку [[File:Icon delete.png|x25px]] в правой части строки шаблона в списке.&lt;br /&gt;
::б) Подтвердите удаление.&lt;br /&gt;
:8. Для удаления нескольких шаблонов:&lt;br /&gt;
::а) Выберите шаблоны для удаления – установите флажки в левой части названий шаблонов или нажмите кнопку '''Выбрать всё'''.&lt;br /&gt;
::б) Нажмите кнопку '''Удалить''' в верхней части списка шаблонов и подтвердите удаление.&lt;br /&gt;
&lt;br /&gt;
=== Просмотр списка всех детекторов и его выгрузка в формате PDF ===&lt;br /&gt;
Чтобы посмотреть список всех детекторов, перейдите в раздел '''Детекторы''' страницы '''Настройки''':&lt;br /&gt;
[[File:88 Вкладка Детекторы на странице Настройки.png|thumb|none|upright=3|Раздел '''Детекторы''' страницы '''Настройки''']]&lt;br /&gt;
&lt;br /&gt;
Нажмите кнопку [[File:Icon question mark.png|x25px]] в строке детектора, чтобы посмотреть подробную информацию:&lt;br /&gt;
[[File:34 Информация о детекторе.png|thumb|none|upright=2.5|Окно с информацией о детекторе]]&lt;br /&gt;
&lt;br /&gt;
Нажмите кнопку '''Экспорт в PDF''', чтобы выгрузить список детекторов в формате .pdf.&lt;br /&gt;
&lt;br /&gt;
=== Управление клиентами OAuth ===&lt;br /&gt;
Svacer поддерживает авторизацию по протоколу OAuth. Для авторизации используются запросы &amp;lt;code&amp;gt;GET /api/oauth/authorize&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;POST /api/oauth/token&amp;lt;/code&amp;gt; в соответствии со стандартом.&lt;br /&gt;
&lt;br /&gt;
Управление клиентами доступно в разделе '''Клиенты OAuth''' на странице '''Настройки''':&lt;br /&gt;
[[File:91 Вкладка Клиенты OAuth на странице Настройки.png|thumb|none|upright=3|Раздел '''Клиенты OAuth''' на странице '''Настройки''']]&lt;br /&gt;
Доступен поиск по имени и домену клиента OAuth, сортировка по колонкам '''Название''' (по умолчанию) и '''Домен'''.&lt;br /&gt;
&lt;br /&gt;
Для управления клиентами OAuth:&lt;br /&gt;
:1.	Создайте клиента OAuth:&lt;br /&gt;
::а) Нажмите кнопку '''Создать'''.&lt;br /&gt;
::б) В окне '''Создание клиента OAuth''' введите название и домен.&lt;br /&gt;
::в) Нажмите кнопку '''Создать'''.&lt;br /&gt;
::[[File:116 Создание клиента OAuth.png|thumb|none|upright=1.5|Окно '''Создание клиента OAuth''']]&lt;br /&gt;
::Отобразится окно с секретом клиента.&amp;lt;br&amp;gt;&lt;br /&gt;
::'''''Внимание'''! Секрет отображается только один раз – при создании клиента.''&lt;br /&gt;
::[[File:117 Пример секрета клиента OAuth.png|thumb|none|upright=1.5]]&lt;br /&gt;
::г) Нажмите кнопку '''Скопировать в буфер обмена''' и сохраните секрет в надежном месте.&lt;br /&gt;
:2. Чтобы скопировать ID клиента OAuth, нажмите кнопку [[File:Icon clone.png|x25px]].&lt;br /&gt;
:3.	Для перехода к изменению имени и домена клиента OAuth нажмите кнопку [[File:Icon edit2.png|x25px]] в крайнем правом столбце.&lt;br /&gt;
:4.	Для удаления одного клиента OAuth:&lt;br /&gt;
::а)	Нажмите кнопку [[File:Icon delete.png|x25px]] в крайнем правом столбце.&lt;br /&gt;
::б)	Подтвердите удаление.&lt;br /&gt;
:5.	Для удаления нескольких клиентов OAuth:&lt;br /&gt;
::а)	Чтобы выбрать для удаления все клиенты, установите флажок в заголовке табличного списка.&lt;br /&gt;
::б)	Чтобы выбрать несколько клиентов, установите флажки в крайнем правом столбце табличного списка.&lt;br /&gt;
::в)	Нажмите кнопку '''Удалить''' в верхней части табличного списка клиентов и подтвердите удаление.&lt;br /&gt;
&lt;br /&gt;
=== Просмотр информации о сервере ===&lt;br /&gt;
В разделе '''Информация о сервере''' на странице '''Настройки''' отображаются:&lt;br /&gt;
* параметры, с которыми запущен сервер;&lt;br /&gt;
* логи сервера;&lt;br /&gt;
* журнал базы данных.&lt;br /&gt;
&lt;br /&gt;
[[File:90 Вкладка Информация о сервере на странице Настройки.png|thumb|none|upright=3|Раздел '''Информация о сервере''' на странице '''Настройки''']]&lt;br /&gt;
&lt;br /&gt;
Доступны функции:&lt;br /&gt;
* копирование записей в системном логе и журнале;&lt;br /&gt;
* выгрузка системного лога и журнала в файлы в формате .log&lt;br /&gt;
&lt;br /&gt;
== Выход из системы ==&lt;br /&gt;
Для выхода из системы выберите пункт '''Выйти''' в меню пользователя в правом верхнем углу экрана.&lt;br /&gt;
[[File:95 Выход из системы —без VSCode.png|thumb|none|upright=1.5|Выход из системы]]&lt;br /&gt;
&lt;br /&gt;
== Использование регулярных выражений ==&lt;br /&gt;
Регулярные выражения можно использовать для поиска и фильтрации данных [[Help:UI manual#Функции левой навигационной панели|в левой навигационной панели]] [[Help:UI manual#Вкладка «Файлы»|на вкладке '''Файлы''']] и в окне настройки [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательских фильтров]] в блоке '''Файлы'''.&lt;br /&gt;
&lt;br /&gt;
Особенности реализации:&lt;br /&gt;
:1. Поиск происходит только по регулярному выражению. Если требуется найти специальный символ в качестве обычного символа, его нужно экранировать (например, точку: &amp;lt;code&amp;gt;\.&amp;lt;/code&amp;gt;)&lt;br /&gt;
:2. При поиске находятся вхождения подстроки в полном пути к файлу (аналогично grep). Если требуется найти по полной строке, используйте символы начала и конца строки: &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Поиск не зависит от регистра символов (case insensitive)&lt;br /&gt;
:В окне настройки [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательских фильтров]]  в блоке '''Файлы''' можно применить фильтр как для отображения только маркеров из файлов, которые подходят под паттерн, так и для скрытия таких маркеров. Для переключения между этими режимами используйте кнопки [[File:Icon plus 2.png|x20px]] и [[File:Icon minus 3.png|x20px]], которые расположены рядом с полем ввода.&lt;br /&gt;
&lt;br /&gt;
Примеры регулярных выражений:&lt;br /&gt;
:1. Поиск файлов с текстом &amp;lt;code&amp;gt;sha&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;md5&amp;lt;/code&amp;gt; в любом месте пути или имени файла:&lt;br /&gt;
:&amp;lt;pre&amp;gt;sha|md5&amp;lt;/pre&amp;gt;&lt;br /&gt;
:2. Отображение только маркеров из файлов с расширением .c:&lt;br /&gt;
:&amp;lt;pre&amp;gt;.*\.c$&amp;lt;/pre&amp;gt;&lt;br /&gt;
:3. Скрытие маркеров из файлов, имя которых начинается с символа &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; и которые имеют расширения .с или .сс:&lt;br /&gt;
::а) Используйте выражение &amp;lt;code&amp;gt;/q[^/]*\.c$|/q[^/]*\.cc$&amp;lt;/code&amp;gt;&lt;br /&gt;
::б) Нажмите кнопку [[File:Icon plus 2.png|x20px]] рядом с полем ввода, чтобы она поменялась на [[File:Icon minus 3.png|x20px]]&lt;br /&gt;
:4. Отображение только маркеров из файлов, которые имеют текст &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; в конце имени файла и с расширением из одного символа:&lt;br /&gt;
:&amp;lt;pre&amp;gt;/.*string\..$&amp;lt;/pre&amp;gt;&lt;br /&gt;
:5. Скрытие маркеров из файлов в директориях &amp;lt;code&amp;gt;asn1&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;pem&amp;lt;/code&amp;gt;:&lt;br /&gt;
::а) Используйте выражение &amp;lt;code&amp;gt;/asn1/|/pem/&amp;lt;/code&amp;gt;&lt;br /&gt;
::б) Нажмите кнопку [[File:Icon plus 2.png|x20px]] рядом с полем ввода, чтобы она поменялась на [[File:Icon minus 3.png|x20px]]&lt;br /&gt;
:6. Отображение только маркеров из файлов, которые имеют в имени три цифры подряд:&lt;br /&gt;
:&amp;lt;pre&amp;gt;.*/.*[0-9]{3}[^/]*$&amp;lt;/pre&amp;gt;&lt;br /&gt;
:где &amp;lt;code&amp;gt;[^/]*$&amp;lt;/code&amp;gt; означает, что после трех цифр и до конца строки может встречаться любой символ, кроме &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. Это позволяет исключить директории, имеющие три цифры в названии.&lt;br /&gt;
&lt;br /&gt;
== Описание ролевой модели ==&lt;br /&gt;
=== Серверные доступы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Полномочие (доступ) !! Описание !! Влияние на графический интерфейс !! admin !! filter_master !! importer &lt;br /&gt;
|-&lt;br /&gt;
| Создание проектов &lt;br /&gt;
|| Создание проектов. Пользователь, создавший проект, имеет полный доступ к управлению этим проектом &lt;br /&gt;
|| Наличие полномочия делает доступным: &lt;br /&gt;
* раздел [[Help:UI manual#Управление проектами и группами проектов|'''Проекты''']]; &lt;br /&gt;
*  кнопку '''Создать проект'''; &lt;br /&gt;
*  форму создания и редактирования проекта.&lt;br /&gt;
&lt;br /&gt;
Наличие доступа предоставляет автору проекта полные права на управление своими проектами, включая разметку (даже при отсутствии у него соответствующего проектного доступа), а также позволяет удалять приложения к снимкам в созданных проектах  &lt;br /&gt;
|| + || – || – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Настройка групп проектов	&lt;br /&gt;
|| Создание, редактирование и удаление групп проектов	&lt;br /&gt;
|| Наличие полномочия делает доступным:&lt;br /&gt;
* раздел [[Help:UI manual#Управление проектами и группами проектов|'''Проекты''']] с кнопкой для перехода к настройке групп;&lt;br /&gt;
* панель [[Help:UI manual#Работа с группами проектов|'''Группы проектов''']] с полным списком проектов в группах.&lt;br /&gt;
Наличие доступа предоставляет права на просмотр маркеров во всех проектах	&lt;br /&gt;
|| + || – || – &lt;br /&gt;
 &lt;br /&gt;
|-&lt;br /&gt;
| Управление пользователями	&lt;br /&gt;
|| Создание, редактирование и удаление пользователей	&lt;br /&gt;
|| Наличие полномочия делает доступной вкладку [[Help:UI manual#Управление пользователями|'''Пользователи''']] в разделе [[Help:UI manual#Управление пользователями, ролями и организациями|'''Настройки – Управление пользователями''']] со всеми функциями управления учетными записями пользователей	&lt;br /&gt;
|| + || – || – &lt;br /&gt;
 &lt;br /&gt;
|-&lt;br /&gt;
| Управление ролями	&lt;br /&gt;
|| Создание, редактирование и удаление ролей	&lt;br /&gt;
|| Наличие полномочия делает доступной вкладку [[Help:UI manual#Управление ролями|'''Роли''']] в разделе [[Help:UI manual#Управление пользователями, ролями и организациями|'''Настройки – Управление пользователями''']] со всеми функциями управления ролями	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Управление организациями	&lt;br /&gt;
|| Создание, редактирование и удаление организаций	&lt;br /&gt;
|| Наличие полномочия делает доступной вкладку [[Help:UI manual#Управление организациями|'''Организации''']] в разделе [[Help:UI manual#Управление пользователями, ролями и организациями|'''Настройки – Управление пользователями''']] со всеми функциями управления организациями	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Управление шаблонами разметки	&lt;br /&gt;
|| Создание, редактирование и удаление шаблонов разметки	&lt;br /&gt;
|| Наличие полномочия делает доступным раздел [[Help:UI manual#Управление шаблонами разметки|'''Настройки – Шаблоны разметки''']] со всеми функциями управления учетными записями шаблонами	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Удаление блокировок	&lt;br /&gt;
|| Просмотр и удаление блокировок всех пользователей	&lt;br /&gt;
|| Наличие полномочия позволяет просматривать и удалять блокировки всех пользователей в разделе [[Help:UI manual#Управление блокировками разметки|'''Настройки – Блокировки''']]&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Управление клиентами OAuth	&lt;br /&gt;
|| Создание, редактирование и удаление клиентов OAuth	&lt;br /&gt;
|| Наличие полномочия делает доступным раздел [[Help:UI manual#Управление клиентами OAuth|'''Настройки – Клиенты OAuth''']] со всеми функциями управления клиентами OAuth	&lt;br /&gt;
|| + 	|| + 	|| + &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Администрирование сервера	&lt;br /&gt;
|| Просмотр настроек сервера, системных лог-файлов и выполнение операций по администрированию сервера Svacer	&lt;br /&gt;
|| Наличие полномочия делает доступным раздел [[Help:UI manual#Просмотр информации о сервере|'''Настройки – Информация о сервере''']]&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Создание резервных копий	&lt;br /&gt;
|| Создание, просмотр и восстановление резервных копий в интерфейсе командной строки	&lt;br /&gt;
|| – 	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Запуск скриптов	&lt;br /&gt;
|| Запуск скриптов (hooks) по кнопке, расположенной на вкладке '''Подробности''' в правой панели, содержащей информацию о маркере	&lt;br /&gt;
|| Наличие полномочия добавляет строку '''Хуки''' на вкладке '''Подробности''' правой панели с возможностью запуска скриптов&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Использование Public API	&lt;br /&gt;
|| Использование REST API для интеграции с внешними системами	&lt;br /&gt;
|| –	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Изменение любой разметки	&lt;br /&gt;
|| Изменение любой разметки маркеров, включая выполненную пользователями с признаком [[Help:UI manual#Управление пользователями, ролями и организациями|'''Мастер разметки''']]&lt;br /&gt;
|| Доступ позволяет переразмечать маркеры (добавлять новую разметку), которые разметили любые пользователи, в том числе те, для которых активирована опция [[Help:UI manual#Управление пользователями, ролями и организациями|'''Мастер разметки''']].&lt;br /&gt;
При этом:&lt;br /&gt;
# Полномочие не предоставляет доступ ко всем проектам. Т. е. пользователь с таким полномочием может изменять разметку только в проектах, к которым у него имеется доступ.&lt;br /&gt;
# Для переразметки маркеров пользователю должен быть предоставлен проектный доступ '''Разметка маркеров'''.&lt;br /&gt;
# Чтобы переразметить заблокированный маркер, сначала нужно [[Help:UI manual#Блокировка разметки маркеров|снять его блокировку]]&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
 &lt;br /&gt;
|-&lt;br /&gt;
| Изменение любых комментариев	&lt;br /&gt;
|| Редактирование и удаление любых пользовательских комментариев к маркерам	&lt;br /&gt;
|| Доступ позволяет изменять/удалять комментарии, которые создали любые пользователи, в том числе те, для которых активирована опция [[Help:UI manual#Управление пользователями, ролями и организациями|'''Мастер разметки''']].&lt;br /&gt;
При этом:&lt;br /&gt;
# Полномочие не предоставляет доступ ко всем проектам. Т. е. пользователь с таким полномочием может изменять разметку только в проектах, к которым у него имеется доступ.&lt;br /&gt;
# Для добавления комментариев пользователю должно быть предоставлено проектное полномочие '''Разметка маркеров'''.&lt;br /&gt;
# Чтобы поменять комментарий к заблокированному маркеру, сначала нужно [[Help:UI manual#Блокировка разметки маркеров|снять его блокировку]]&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
|}&lt;br /&gt;
=== Проектные доступы===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Полномочие (доступ) !! Описание !! Влияние на графический интерфейс !! admin !! filter_master !! importer &lt;br /&gt;
|-&lt;br /&gt;
| Управление проектом и его ветками	&lt;br /&gt;
|| Редактирование и удаление проекта, включая операции по управлению ветками и снимками проекта, настройке глобальных фильтров, импорту/экспорту разметки и просмотру маркеров	&lt;br /&gt;
|| Наличие полномочия делает доступным:&lt;br /&gt;
* раздел [[Help:UI manual#Управление проектами и группами проектов|'''Проекты''']];&lt;br /&gt;
* все функции управления проектом (проектами в группе) и его содержимым (за исключением разметки маркеров) – т. е. все операции с проектом, ветками и снимками.&lt;br /&gt;
Наличие полномочия позволяет удалять приложения к снимкам и экспортировать разметку с исходным кодом&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Управление ветками и снимками	&lt;br /&gt;
|| Редактирование и удаление ветки проекта, включая операции по управлению снимками, настройке глобальных фильтров, импорту/экспорту разметки и просмотру маркеров	&lt;br /&gt;
|| Наличие полномочия делает доступным:&lt;br /&gt;
* раздел [[Help:UI manual#Управление проектами и группами проектов|'''Проекты''']];&lt;br /&gt;
* все функции управления веткой и снимками проекта (за исключением разметки маркеров) – т. е. доступны все операции с веткой и снимками, но не операции управления проектом.&lt;br /&gt;
Наличие полномочия позволяет удалять приложения к снимкам и экспортировать разметку с исходным кодом.&lt;br /&gt;
Запрещено клонировать ветку при наличии доступа только к этой ветке	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Настройка глобальных фильтров	&lt;br /&gt;
|| Создание, редактирование и удаление глобальных фильтров	&lt;br /&gt;
|| Наличие полномочия делает доступным раздел [[Help:UI manual#Настройка глобальных фильтров|'''Настройки – Глобальные фильтры''']].&lt;br /&gt;
Список проектов и веток в разделе определяется полномочиями к этим проектам и веткам	&lt;br /&gt;
|| + 	|| + 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Импорт снимков	&lt;br /&gt;
|| Загрузка, редактирование названия и удаление снимков&lt;br /&gt;
|| Наличие полномочия делает доступным:&lt;br /&gt;
* раздел [[Help:UI manual#Управление проектами и группами проектов|'''Проекты''']];&lt;br /&gt;
* функции просмотра проекта и ветки, управления снимками в указанной ветке, просмотра маркеров в снимке	&lt;br /&gt;
|| + 	|| – 	|| + &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Импорт разметки	&lt;br /&gt;
|| Импорт разметки из исходного кода и управление подавлением маркеров в интерфейсе командной строки	&lt;br /&gt;
|| Наличие полномочия делает доступным просмотр маркеров в указанном контейнере	&lt;br /&gt;
|| + 	|| – 	|| + &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Экспорт разметки	&lt;br /&gt;
|| Экспорт разметки с исходным кодом	&lt;br /&gt;
|| Наличие полномочия позволяет выполнить экспорт разметки с исходными кодами и просматривать маркеры в указанном контейнере	&lt;br /&gt;
|| + 	|| – 	|| + &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Просмотр маркеров	&lt;br /&gt;
|| Просмотр маркеров и кода снимков, экспорт снимков, просмотр блокировок маркеров	&lt;br /&gt;
|| Наличие полномочия предоставляет доступ к следующим функциям [[Help:UI manual#Работа в режиме разметки|в режиме разметки]]:&lt;br /&gt;
* просмотр и выбор снимков в указанной ветке;&lt;br /&gt;
* просмотр содержимого снимков и маркеров (без возможности разметки);&lt;br /&gt;
* экспорт снимков и пр.&lt;br /&gt;
Также наличие полномочия предоставляет доступ к разделу [[Help:UI manual#Управление блокировками разметки|'''Настройки – Блокировки''']], но только в части просмотра блокировок в доступных контейнерах, без возможности их удаления	&lt;br /&gt;
|| +	|| + 	|| + &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Разметка маркеров	&lt;br /&gt;
|| Просмотр и разметка маркеров в снимках, включая добавление комментариев, управление списком блокировок	&lt;br /&gt;
|| Наличие полномочия позволяет пользователю размечать маркеры в указанном снимке, добавлять комментарии, управлять своими блокировками, т. е. для собственных блокировок доступны кнопки удаления, а блокировки других пользователей доступны только для просмотра.&lt;br /&gt;
При отсутствии полномочия в таблице маркеров недоступны поля для установки флажков, а кнопка групповой разметки – неактивна	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Использование Report API	&lt;br /&gt;
|| Использование Report API для получения статистических показателей	&lt;br /&gt;
|| –	&lt;br /&gt;
|| + 	|| – 	|| – &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Известные ограничения ===&lt;br /&gt;
&lt;br /&gt;
* Управление ''своими'' проектами без дополнительных прав может не работать для проектов, созданных до Release 7-0-0.&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Vscode&amp;diff=1478</id>
		<title>Help:Vscode</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Vscode&amp;diff=1478"/>
		<updated>2023-11-21T09:46:46Z</updated>

		<summary type="html">&lt;p&gt;Writer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Help]]&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;В версии 8.0.0 интеграция с VS Code не поддерживается: было много изменений, и мы пока не обновили расширение VSCode для работы с ними, но обновим и выпустим немного позже.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструкция по работе с расширением Svacer для Visual Studio Code ==&lt;br /&gt;
=== Установка ===&lt;br /&gt;
==== Установка из официального магазина VSCode ====&lt;br /&gt;
Чтобы установить расширение Svacer для Visual Studio Code:&lt;br /&gt;
*перейдите по ссылке [https://marketplace.visualstudio.com/items?itemName=ISP-RAS.svacer Visual Studio Marketplace] и нажмите кнопку '''Install'''&lt;br /&gt;
*или на странице расширений VSCode найдите '''Svacer''' и нажмите кнопку '''Установить''':&lt;br /&gt;
[[File:Установка из магазина приложений.png|thumb|none|800px|Установка расширения из магазина приложений]]&lt;br /&gt;
Приложение считается успешно установленным, если появилось соответствующее сообщение и на панели слева отобразилась вкладка расширения [[File:Иконка_расширения.png|x25px]]&lt;br /&gt;
&lt;br /&gt;
==== Установка из файла ====&lt;br /&gt;
Получить установочный файл можно:&lt;br /&gt;
*на странице официального магазина приложений VSCode по ссылке: [https://marketplace.visualstudio.com/items?itemName=ISP-RAS.svacer&amp;amp;ssr=false#version-history Visual Studio Marketplace]&lt;br /&gt;
*в пользовательском интерфейсе сервера Svacer. Для этого выберите пункт '''Скачать расширение для VSCode''' в меню пользователя:&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Установка из файла 1.png|800px]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Имя установочного файла имеет вид ''&amp;lt;code&amp;gt;svacer-&amp;lt;version&amp;gt;.vsix&amp;lt;/code&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
Для установки:&lt;br /&gt;
:1.	На странице расширений VSCode нажмите кнопку [[File:Иконка 3 точки.png|x25px]] и выберите пункт '''Установка из VSIX''':&lt;br /&gt;
:[[File:Установка из файла 2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
:2.	В открывшемся окне проводника выберите скачанный установочный файл ''&amp;lt;code&amp;gt;svacer-&amp;lt;version&amp;gt;.vsix&amp;lt;/code&amp;gt;''&lt;br /&gt;
Также расширение '''Svacer''' можно установить с помощью параметра командной строки &lt;br /&gt;
'''&amp;lt;code&amp;gt;--install-extension&amp;lt;/code&amp;gt;''', указав путь к файлу:&amp;lt;br/&amp;gt;&lt;br /&gt;
'''&amp;lt;code&amp;gt;--install-extension &amp;lt;path-to-file&amp;gt;/svacer-&amp;lt;version&amp;gt;.vsix&amp;lt;/code&amp;gt;'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Приложение считается успешно установленным, если появилось соответствующее сообщение и на панели слева отобразилась вкладка расширения [[File:Иконка_расширения.png|x25px]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка подключения к серверу Svacer ===&lt;br /&gt;
Для работы расширения требуется настроить подключение к серверу Svacer:&lt;br /&gt;
:1.	Перейдите на вкладку расширения [[File:Иконка расширения.png|x25px]]&lt;br /&gt;
:2.	На панели '''ИНСТРУМЕНТЫ SVACER: Информация Svacer''' нажмите кнопку [[File:Иконка Шестеренка.png|25px]] и выберите пункт '''Параметры расширения'''&amp;lt;br/&amp;gt;&lt;br /&gt;
:[[File:Настройка подключения 1.png|800px]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:В правой части окна VSCode откроется вкладка '''Параметры'''.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[File:Настройка подключения 2.png|800px]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:3.	Укажите адрес и порт сервера Svacer&lt;br /&gt;
:4.	Настройте остальные параметры (опционально)&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Название !! Описание !! По умолчанию&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; colspan=&amp;quot;3&amp;quot;| Настройки сервера&lt;br /&gt;
|-&lt;br /&gt;
| Hostname || Имя или IP-адрес Svacer || localhost&lt;br /&gt;
|-&lt;br /&gt;
| Port || Порт Svacer || 8080&lt;br /&gt;
Если значение оставить пустым, то будет использован порт по умолчанию для выбранного протокола&lt;br /&gt;
|-&lt;br /&gt;
| Use Https || Использовать протокол https || false&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; colspan=&amp;quot;3&amp;quot;| Настройки рабочей области&lt;br /&gt;
|-&lt;br /&gt;
| Include Traces || Отображать трассу для маркеров || true&lt;br /&gt;
|-&lt;br /&gt;
| Include Comments || Отображать комментарии пользователей || true&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Авторизация ===&lt;br /&gt;
Для доступа к серверу Svacer требуется авторизоваться:&lt;br /&gt;
:1.	Нажмите кнопку [[File:Иконка аккаунт.png|x25px]] и выберите пункт '''Войдите с помощью SvacerAuth, чтобы использовать Svacer''', либо на вкладке расширения в разделе '''ИНФОРМАЦИЯ SVACER''' нажмите кнопку '''Авторизоваться'''&lt;br /&gt;
:[[File:Авторизация 1.png|none|400px]] &lt;br /&gt;
&lt;br /&gt;
:[[File:Авторизация 2.png|none|600px]] &lt;br /&gt;
&lt;br /&gt;
:2.	Нажмите кнопку '''Разрешить''' в появившемся окне:&lt;br /&gt;
:[[File:Авторизация 3.png|400px]] &lt;br /&gt;
&lt;br /&gt;
:3.	Подтвердите открытие в браузере внешнего веб-сайта для авторизации&lt;br /&gt;
:В браузере по умолчанию откроется страница ввода учётных данных:&lt;br /&gt;
&amp;lt;gallery mode=packed heights=&amp;quot;350px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  Авторизация 4.png &lt;br /&gt;
  Авторизация 5.png &lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt; &lt;br /&gt;
:4.	Введите логин и пароль&lt;br /&gt;
:Отобразится страница с запросом разрешения:&lt;br /&gt;
:[[File:Авторизация 6.png|400px]] &lt;br /&gt;
:5.	Нажмите кнопку '''Разрешить'''&lt;br /&gt;
:6.	Подтвердите открытие расширения Svacer в VSCode&lt;br /&gt;
:Откроется окно VSCode с открытой вкладкой расширения, на которой отображается список проектов Svacer:&amp;lt;br/&amp;gt;&lt;br /&gt;
:[[File:Авторизация 7.png|800px|none]]&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм работы ===&lt;br /&gt;
Каждый раз для разметки маркеров того или иного снимка проекта требуется выполнять следующие действия:&lt;br /&gt;
# [[#Открытие папки исходного кода|Открыть папку для хранения исходного кода]]&lt;br /&gt;
# [[#Выбор проекта, ветки и снимка|Выбрать проект, ветку и снимок]]&lt;br /&gt;
# [[#Загрузка исходного кода|Загрузить исходный код]]&lt;br /&gt;
# [[#Загрузка маркеров|Загрузить маркеры]]&lt;br /&gt;
# [[#Выбор маркера|Выбрать маркер]]&lt;br /&gt;
# [[#Просмотр исходного кода|Посмотреть исходный код файла]]&lt;br /&gt;
# [[#Разметка маркера|Разметить маркеры]]&lt;br /&gt;
# [[#Управление комментариями|Добавить, изменить или удалить комментарии]] (опционально)&lt;br /&gt;
# [[#Блокировка и разблокировка маркеров|Заблокировать или разблокировать маркеры]] (опционально)&lt;br /&gt;
# [[#Выбор другого снимка проекта|Выбрать другие снимки проекта]] (опционально)&lt;br /&gt;
&lt;br /&gt;
==== Открытие папки исходного файла ====&lt;br /&gt;
Чтобы открыть папку для хранения исходного кода:&lt;br /&gt;
:1. Перейдите в окно проводника операционной системы одним из трех способов:&lt;br /&gt;
:* способ 1 – в меню '''Файл''' выберите пункт '''Открыть папку'''&lt;br /&gt;
:* способ 2 – на вкладке '''Проводник''' нажмите кнопку '''Открыть папку'''&lt;br /&gt;
:* способ 3 – нажмите клавиши CTRL+K и следом CTRL+O&lt;br /&gt;
:2. Выберите папку, в которой будет храниться исходный код снимка проекта&lt;br /&gt;
&amp;lt;gallery mode=packed heights=&amp;quot;400px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  Открытие папки 1.png|Открытие папки. Способ 1&lt;br /&gt;
  Открытие папки 2.png|Открытие папки. Способ 2&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
Открытая папка и её содержимое будет отображается на вкладке '''Проводник'''.&lt;br /&gt;
&lt;br /&gt;
==== Выбор проекта, ветки и снимка ====&lt;br /&gt;
Для этого перейдите в раздел '''ПРОЕКТЫ''' и с помощью кнопки [[File:Иконка стрелочка.png|x20px]] раскройте проект и ветку, нажмите на снимок.&amp;lt;br/&amp;gt;&lt;br /&gt;
Для перехода в раздел '''ПРОЕКТЫ''' можно использовать [[#Поддерживаемые команды|команду]] '''Инструменты Svacer: Перевести фокус на представление Проекты Svacer'''.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выбранные проект, ветка и снимок отмечены точкой справа, а информация о них отображается в разделе '''ИНФОРМАЦИЯ SVACER'''.&amp;lt;br/&amp;gt;&lt;br /&gt;
Для последнего загруженного снимка отображается надпись '''latest'''.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Выбор снимка.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==== Загрузка исходного кода ====&lt;br /&gt;
Для этого запустите на выполнение команду '''Svacer: Загрузить исходный код.'''&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Загрузка исходного кода 1.png|600px]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В процессе загрузки будет отображаться строка прогресса. Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Загрузка исходного кода 2.png|400px]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения загрузки отобразится сообщение об успехе и количестве загруженных файлов. Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Загрузка исходного кода 3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==== Загрузка маркеров ====&lt;br /&gt;
Для этого в разделе '''ИНФОРМАЦИЯ SVACER''' нажмите кнопку '''Загрузить маркеры''' или запустите на выполнение [[#Поддерживаемые команды|команду]] '''Svacer: Загрузить данные с сервера'''.&lt;br /&gt;
[[File:Загрузка маркера 1.png|thumb|none|300px|Загрузка маркеров. Вариант 1]]&lt;br /&gt;
[[File:Загрузка маркера 2.png|thumb|none|600px|Загрузка маркеров. Вариант 2]]&lt;br /&gt;
После завершения загрузки:&lt;br /&gt;
:1.	Отобразится сообщение об успехе и количестве загруженных маркеров. Например:&lt;br /&gt;
:[[File:Загрузка маркера 3.png|400px]] &lt;br /&gt;
:2.	Раздел '''ПРОЕКТЫ SVACER''' закроется&lt;br /&gt;
:3.	Отобразятся разделы '''ФАЙЛЫ SVACER''' и '''ДЕТЕКТОРЫ SVACER'''&lt;br /&gt;
[[File:Загрузка маркера 4.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== Выбор маркера ====&lt;br /&gt;
Для этого:&lt;br /&gt;
:1.	Выберите маркер в одном из двух разделов:&lt;br /&gt;
::а) '''ФАЙЛЫ SVACER''' – в этом разделе отображаются все файлы [[#Выбор проекта, ветки и снимка|выбранного снимка проекта]], в которых найдены маркеры&lt;br /&gt;
::: Если навести курсор на строку с файлом, отобразится сообщение, которое содержит полный путь к файлу и количество маркеров в нем, а также появится кнопка [[File:Icon block.png|x20px]] или [[File:Icon unblock.png|x20px]] для блокировки или разблокировки маркеров для разметки другими пользователями – по имени файла.&lt;br /&gt;
::: Чтобы раскрыть список маркеров в файле, нажмите кнопку [[File:Иконка стрелочка.png|x20px]] или на имя файла.&lt;br /&gt;
::б) '''ДЕТЕКТОРЫ SVACER''' – в этом разделе отображаются все детекторы, которые сработали в выбранном снимке проекта&lt;br /&gt;
::: Серьезность (критичность) детектора обозначена цветом: &lt;br /&gt;
:::* красный – наивысшая серьезность (CRITICAL)&lt;br /&gt;
:::* желтый – высокая серьезность (MAJOR)&lt;br /&gt;
:::* белый – обычная серьезность (NORMAL, MINOR, UNDEFINED)&lt;br /&gt;
::: Если навести курсор на строку с детектором, отобразится сообщение с его серьёзностью и количеством маркеров, а также появится кнопка [[File:Icon block.png|x20px]] или [[File:Icon unblock.png|x20px]] для блокировки или разблокировки маркеров для разметки другими пользователями – по детектору.&lt;br /&gt;
::: Чтобы раскрыть список маркеров, найденных этим детектором, нажмите кнопку [[File:Иконка стрелочка.png|x20px]] или на имя детектора.&lt;br /&gt;
&amp;lt;gallery mode=packed heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:4em&amp;quot;&amp;gt;&lt;br /&gt;
  Выбор маркера 1.png|Выбор маркера в списке файлов&lt;br /&gt;
  Выбор маркера 2.png|Выбор маркера в списке детекторов&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:: Слева отобразится раздел '''МАРКЕРЫ SVACER''' со списком маркеров, найденных в файле, а справа отобразится редактор исходного кода с фокусом на выбранном маркере.&lt;br /&gt;
:: В первой строке раздела '''МАРКЕРЫ SVACER''' указано имя файла, в котором обнаружен маркер. Список маркеров файла сгруппирован по названию детектора. &lt;br /&gt;
::[[File:Выбор маркера 3.png|800px]]&lt;br /&gt;
:2.	Нажмите кнопку [[File:Иконка стрелочка.png|x20px]] или на название маркера в разделе '''МАРКЕРЫ SVACER''', чтобы раскрыть следующую информацию о нем: &lt;br /&gt;
:: а) Трасса, построенная при анализе кода&lt;br /&gt;
::: Для каждого элемента (записи) трассы отображается имя файла, номер строки и описание&lt;br /&gt;
::: Если нажать на элемент трассы, в редакторе откроется исходный код файла с фокусом на строку, указанную в трассе&lt;br /&gt;
:: б) Данные [[#Разметка маркера|разметки]]&lt;br /&gt;
:: в) [[#Управление комментариями|Комментарии пользователей]]&lt;br /&gt;
::[[File:Выбор маркера 4.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==== Просмотр исходного кода ====&lt;br /&gt;
Открыть файл с исходным кодом можно открыть двумя способами:&lt;br /&gt;
:1.	Нажмите на маркер в одном из разделов: '''ФАЙЛЫ SVACER, ДЕТЕКТОРЫ'''&lt;br /&gt;
:2.	Нажмите кнопку [[File:Иконка цель.png|x20px]] справа от маркера в разделе '''МАРКЕРЫ SVACER'''&lt;br /&gt;
Наведите курсор на маркер в коде, чтобы посмотреть детальную информацию:&lt;br /&gt;
[[File:Просмотр кода 1.png|none|800px]]&lt;br /&gt;
Чтобы посмотреть и проанализировать трассу, нажмите на элемент (запись) трассы в подразделе '''Трасса маркера''' раздела '''МАРКЕРЫ SVACER'''.&lt;br /&gt;
&lt;br /&gt;
В редакторе кода откроется исходный код файла с фокусом на строку выбранного элемента трассы.&lt;br /&gt;
&lt;br /&gt;
Также просмотреть исходный код файла можно на вкладке '''Проводник'''. Для этого нажмите на имя файла в иерархическом списке файлов проекта.&lt;br /&gt;
[[File:Просмотр кода 2.png|none|800px]]&lt;br /&gt;
&lt;br /&gt;
==== Разметка маркера ====&lt;br /&gt;
Для этого в подразделе '''Разметка маркера''' раздела '''МАРКЕРЫ SVACER''' выберите '''Статус''', '''Серьёзность''' и '''Действие'''.&lt;br /&gt;
&lt;br /&gt;
Установка серьёзности и действия доступны только после установки статуса.&lt;br /&gt;
[[File:Разметка маркера.png|none|400px]]&lt;br /&gt;
&lt;br /&gt;
==== Управление комментариями ====&lt;br /&gt;
Добавлять, изменять и удалять комментарии можно в подразделе '''Комментарии маркера''' раздела '''МАРКЕРЫ SVACER''' с помощью кнопок [[File:Иконка плюс.png|x20px]], [[File:Иконка редактирования.png|x20px]] и [[File:Иконка корзина.png|x20px]] соответственно.&lt;br /&gt;
Кнопка [[File:Иконка плюс.png|x20px]] отображается при наведении курсора на шапку подраздела, а кнопки [[File:Иконка редактирования.png|x20px]] и [[File:Иконка корзина.png|x20px]] – на сам комментарий.&lt;br /&gt;
[[File:Управление комментариями.png|none|300px]]&lt;br /&gt;
&lt;br /&gt;
==== Блокировка и разблокировка маркеров ====&lt;br /&gt;
Для блокировки разметки используйте кнопку [[File:Icon block.png|x20px]] в следующих частях интерфейса: &lt;br /&gt;
:1. В разделе '''ДЕТЕКТОРЫ SVACER'''&lt;br /&gt;
: В этом случае блокировка распространяется на все маркеры выбранного детектора в открытом проекте и ветке, для всех снимков ветки.&lt;br /&gt;
:2.	В разделе '''ФАЙЛЫ SVACER'''&lt;br /&gt;
: В этом случае блокировка распространяется на все маркеры в выбранном файле в открытом проекте и ветке, для всех снимков ветки.&lt;br /&gt;
:3. В разделе '''МАРКЕРЫ SVACER'''&lt;br /&gt;
: В этом случае блокировка распространяется на все эквивалентные маркеры в открытом проекте и ветке, для всех снимков ветки.&lt;br /&gt;
Если один пользователь заблокировал маркер, то в строке маркера отображается  [[File:Icon other block.png|x20px]]. В этом случае другой пользователь не сможет заблокировать и разблокировать детектор, которому принадлежит этот маркер, и файл, в котором этот маркер найден. &lt;br /&gt;
&lt;br /&gt;
Чтобы разблокировать маркер нажмите кнопку [[File:Icon unblock.png|x20px]]&lt;br /&gt;
&lt;br /&gt;
==== Выбор другого снимка проекта ====&lt;br /&gt;
Чтобы перейти к другому снимку этого или другого проекта:&lt;br /&gt;
:1. Нажмите кнопку [[File:Иконка очистки предупреждений.png|x20px]] в шапке раздела '''ИНФОРМАЦИЯ SVACER''' (отображается при наведении курсора) или запустите на выполнение [[#Поддерживаемые команды|команду]] '''Svacer: Очистить предупреждения'''&lt;br /&gt;
:[[File:Выбор другого снимка 1.png|none|400px]]&lt;br /&gt;
&lt;br /&gt;
:2. Закройте папку с исходными кодами – в меню '''Файл''' выберите пункт '''Закрыть папку''' или воспользуйтесь горячими клавишами CTRL+K и F&lt;br /&gt;
:[[File:Выбор другого снимка 2.png|none|400px]] &lt;br /&gt;
&lt;br /&gt;
:3.	Повторите действия [[#Алгоритм работы|алгоритма работы]]&lt;br /&gt;
&lt;br /&gt;
=== Поддерживаемые команды ===&lt;br /&gt;
Чтобы открыть список доступных команд, нажмите клавиши CTRL+SHIFT+P или введите '''&amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;''' в строке поиска.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Команда !! Аналог команды !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Svacer: Информация о проекте || svacer.info || Отобразить сообщение с информацией о выбранных проекте, ветке и снимке&lt;br /&gt;
|-&lt;br /&gt;
| Svacer: Загрузить исходный код|| svacer.loadSources || Загрузка исходного кода выбранного снимка проекта&lt;br /&gt;
|-&lt;br /&gt;
| Svacer: Загрузить данные с сервера || svacer.load || Загрузка результатов анализа (маркеров) выбранного снимка проекта&lt;br /&gt;
|-&lt;br /&gt;
| Svacer: Очистить предупреждения || svacer.clear || Очистить результаты анализа (маркеры) выбранного снимка проекта. После очистки маркеров становится доступен раздел со списком проектов&lt;br /&gt;
|-&lt;br /&gt;
| Svacer: Сбросить выбранный проект || – || Сброс выбранного проекта в разделах '''ИНФОРМАЦИЯ SVACER''' и '''ПРОЕКТЫ SVACER'''&lt;br /&gt;
|-&lt;br /&gt;
| Представление: Показать Инструменты Svacer || – || Перейти к панели '''ИНСТРУМЕНТЫ SVACER'''&lt;br /&gt;
|-&lt;br /&gt;
| Инструменты Svacer: Перевести фокус на представление Информация Svacer || – || Перейти в раздел '''ИНФОРМАЦИЯ SVACER'''&lt;br /&gt;
|-&lt;br /&gt;
| Инструменты Svacer: Перевести фокус на представление Файлы Svacer || – || Перейти в раздел '''ФАЙЛЫ SVACER'''&lt;br /&gt;
|-&lt;br /&gt;
| Инструменты Svacer: Перевести фокус на представление Проекты Svacer || – || Перейти в раздел '''ПРОЕКТЫ SVACER'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=1449</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=1449"/>
		<updated>2023-11-14T09:30:22Z</updated>

		<summary type="html">&lt;p&gt;Writer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Help]]&lt;br /&gt;
=== Получение справки ===&lt;br /&gt;
Запустив Svacer без параметров, можно получить информацию о доступных командах. Дополнительная информация о каждой команде доступна при использовании опции '''--help'''&lt;br /&gt;
&lt;br /&gt;
    svacer &amp;lt;command name&amp;gt; --help&lt;br /&gt;
&lt;br /&gt;
Общий формат командной строки&lt;br /&gt;
&lt;br /&gt;
    svacer [global options] command [command options] [arguments...]&lt;br /&gt;
&lt;br /&gt;
Глобальные опции относятся ко всем командам.&lt;br /&gt;
Опции команд имеют префикс «--». Их следует указывать до списка аргументов.&lt;br /&gt;
Для команд с опцией --password доступна возможность ввода пароля с клавиатуры.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета для проекта === &lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. Назначение команды состоит в том, чтобы добиться из консоли результатов (создание PDF файла отчета), аналогичным следующим действиям пользователя в GUI:&lt;br /&gt;
# Выгрузка таблицы маркеров в формате PDF ([[#pic1|Рис. 1]])&lt;br /&gt;
# Предварительное формирование содержимого таблицы маркеров&lt;br /&gt;
#* По режимам сравнения (new, missing, same, matched) с указанием цели и источника сравнения, ([[#pic2|Рис. 2]])&lt;br /&gt;
#* По используемым фильтрам Custom (ограниченный набор из 4 параметров) ([[#pic3|Рис. 3]])&lt;br /&gt;
&lt;br /&gt;
Ниже приводятся фрагменты GUI, которым соответствует cli команда в различных вариантах ее использования:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic1&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:SimpleReport.png|none|left|alt=SimpleReport window]]&lt;br /&gt;
'''Рис. 1 — Отчет без сравнения'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic2&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:CompareReport.png|none|left|alt=CompareReport window]]&lt;br /&gt;
'''Рис. 2 — Отчет со сравнением'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic3&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:CompareFiltersReport.png|none|left|alt=CompareFiltersReport window]]&lt;br /&gt;
'''Рис. 3 — Отчет со сравнением и фильтрами'''&lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
    '''svacer pdfgen''' --cmpMode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--targetProject [name|id] --targetBranch [name|id] --targetSnapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --outFile report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
Описание параметров:&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''Project, Branch, Snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''targetProject, targetBranch, targetSnapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''File, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан.  File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т.д.) &lt;br /&gt;
* '''outFile''' — имя создаваемого файла отчета. Если не будет указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: targetProject, targetBranch, targetSnapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project → targetProject, branch → targetBranch, …). Сформированные на предварительном этапе  маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно также использовать public API. Необходимо использовать следующие параметры:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — формат JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода на сервер истории ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
    svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--excludePaths &amp;lt;path1, path2, ... ,pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере истории&lt;br /&gt;
* project — проект на сервере истории, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* excludePaths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (важно: флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект/ветку/снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
    //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
      if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
        j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
        if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Описание шаблона разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен не удаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии у пользователя доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат [[Help:UI_manual#Экспорт_кода_с_разметкой|через выгрузку кода с указанием шаблона]].&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки со статусом Undecided (или не правильным) не производится (включая комментарий).&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
    //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
    //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
    printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов для распространения разметки между снимками с несовпадающими путями ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--pathPrefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
    svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --pathPrefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, …, &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере истории&lt;br /&gt;
* project — проект на сервере истории, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* pathPrefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
    svacer markup [auth/selection] suppress list&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
    svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
    svacer markup [auth/selection] suppress remove id1 id2 id3 &lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
    svacer markup [auth/selection] suppress remove&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивание в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждения недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
 &lt;br /&gt;
=== Поддержка протокола LDAP для аутентификации пользователей ===&lt;br /&gt;
====  Общий принцип аутентификации ====&lt;br /&gt;
Схема аутентификации с помощью протокола LDAP следующая:&lt;br /&gt;
&lt;br /&gt;
# Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации&lt;br /&gt;
# В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP) &lt;br /&gt;
# При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер svacer&lt;br /&gt;
# Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя&lt;br /&gt;
# В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя&lt;br /&gt;
# Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей&lt;br /&gt;
&lt;br /&gt;
Для каждого пользователя, успешно прошедшего проверку на LDAP сервере, создается локальная запись в БД Svacer. Управлять таким пользователем можно как и обычным пользователем, за исключением:&lt;br /&gt;
* Пользователю нельзя сменить пароль&lt;br /&gt;
* Пользователь не может сменить пароль самостоятельно&lt;br /&gt;
* В случае отсутствия связи между сервером Svacer и сервером LDAP, данный пользователь не сможет зайти в систему&lt;br /&gt;
&lt;br /&gt;
====  Запуск сервера с поддержкой LDAP ====&lt;br /&gt;
Сервер может быть запущен как в с поддержкой аутентификации через LDAP, так и без. Для того, чтобы включить аутентификацию через LDAP необходимо указать конфигурационный файл. Типовой пример конфигурационного файла для подключения к контроллеру домена MS ActiveDirectory или серверу openLDAP можно получить с помощью команды:&lt;br /&gt;
&lt;br /&gt;
    svacer ldap print&lt;br /&gt;
&lt;br /&gt;
Запуск сервера с поддержкой LDAP осуществляется командой:&lt;br /&gt;
&lt;br /&gt;
    svacer  server  --ldap ldap.json&lt;br /&gt;
&lt;br /&gt;
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. Ниже приведен лог сервера, запущенного с поддержкой протокола LDAP.&lt;br /&gt;
[[File:LdapServerAdded.png|none|left|1000px|alt=LdapServerAdded]]&lt;br /&gt;
&lt;br /&gt;
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. &lt;br /&gt;
&lt;br /&gt;
[[File:LdapServerChoose.png|none|left|alt=LdapServerChoose]]&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. &lt;br /&gt;
В случае конфигурации сервера Svacer с поддержкой LDAP можно отключить возможность аутентификации пользователей встроенными средствами сервера Svacer (вкладка Svacer на странице входа). В этом случае вкладка Svacer на странице входа будет неактивной и пользователи смогут заходить в систему только с помощью LDAP аутентификации. Данное поведение распространяется и на работу с сервером с помощью интерфейса командной строки. &lt;br /&gt;
&lt;br /&gt;
Для отключения возможности аутентификации встроенными средствами сервера Svacer нужно использовать опцию '''disable-svacer-auth'''. &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
    svacer server --ldap ldap.json --disable-svacer-auth&lt;br /&gt;
&lt;br /&gt;
====  Конфигурационный файл сервера для поддержки LDAP  ====&lt;br /&gt;
Типовой пример конфигурации представлен ниже.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;active_directory&amp;quot;,&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
          &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
          &amp;quot;hideURL&amp;quot;: true,&lt;br /&gt;
          &amp;quot;checkAlivePeriod&amp;quot;: 60,	&lt;br /&gt;
          &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;ldaps://192.168.11.71:636&amp;quot;,&lt;br /&gt;
            &amp;quot;mirrors&amp;quot;:[&amp;quot;ldaps://192.168.11.72:636&amp;quot;,&amp;quot;ldaps://192.168.11.73:636&amp;quot;]&lt;br /&gt;
            &amp;quot;connectAs&amp;quot;: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
            &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
            &amp;quot;ignoreCertCheck&amp;quot;: false,&lt;br /&gt;
            &amp;quot;caCertFiles&amp;quot;:[&amp;quot;/etc/ssl/certs/a*&amp;quot;,&amp;quot;/etc/ssl/certs/my_certs/*&amp;quot;]&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;group&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Group)(cn=dep_devops))&amp;quot;,&lt;br /&gt;
            &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
            &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;svacerRole&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;user&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Person)(sAMAccountName=*))&amp;quot;,&lt;br /&gt;
            &amp;quot;login&amp;quot;: &amp;quot;sAMAccountName&amp;quot;,&lt;br /&gt;
            &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;info&amp;quot;: {&lt;br /&gt;
              &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
              &amp;quot;email&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
              &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
              &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;open_ldap&amp;quot;,&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
          &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
          &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;ldap://127.0.0.1:389&amp;quot;,&lt;br /&gt;
            &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
            &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;group&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;ou=groups&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=svacer))&amp;quot;,&lt;br /&gt;
            &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
            &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;user&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;ou=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=PosixAccount))&amp;quot;,&lt;br /&gt;
            &amp;quot;login&amp;quot;: &amp;quot;uid&amp;quot;,&lt;br /&gt;
            &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;info&amp;quot;: {&lt;br /&gt;
              &amp;quot;display&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
              &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
              &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
              &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. &lt;br /&gt;
* name — произвольное имя (уникальное для каждого сервера)&lt;br /&gt;
* basedn — DN относительно которого будут проводится все операции в LDAP каталоге &lt;br /&gt;
* useGroup — проверять ли принадлежность пользователя к группе &lt;br /&gt;
* hideURL — не передавать сетевой адрес LDAP сервера. Конечные пользователи будут видеть в выпадающем списке только имя сервера, указанное в поле name. В поле URL будет пустая строка. &lt;br /&gt;
* checkAlivePeriod — Промежуток времени в секундах, который должен проходить между периодическими проверками доступности сервера LDAP. Если параметр равен 0 или не указан, такая проверка не проводится.&lt;br /&gt;
* connection — подсекция, описывающая параметры соединения с сервером &lt;br /&gt;
:* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636).&lt;br /&gt;
:* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL.&lt;br /&gt;
:* connectAs — имя пользователя в формате DN, из под которого будут производится операции в LDAP каталоге &lt;br /&gt;
:* password — пароль пользователя &lt;br /&gt;
:* ignoreCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles.&lt;br /&gt;
:* CaCertFiles — массив значений, описывающих какие файлы корневых сертификатов добавлять в конфигурацию Svacer. Формат файлов сертификатов — PEM&lt;br /&gt;
* group — подсекция, описывает параметры проверки принадлежности пользователя к группе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп &lt;br /&gt;
:* userMember — атрибут в группе, содержащий пользователей, принадлежащих группе &lt;br /&gt;
:* display — атрибут, содержащий имя группы для отображения &lt;br /&gt;
:* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем.&lt;br /&gt;
* user — подсекция, описывает параметры получения информации о пользователе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске пользователей. &lt;br /&gt;
:* login — атрибут, в котором находится login пользователя.&lt;br /&gt;
:* group — атрибут в пользователе, на который ссылается атрибут group.userMember (обычно это «dn» пользователя)&lt;br /&gt;
:* info — подсекция описывающая в каких атрибутах находится информация о пользователе &lt;br /&gt;
::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО)&lt;br /&gt;
::* email — атрибут с почтовым адресом &lt;br /&gt;
::* firstName — атрибут с именем &lt;br /&gt;
::* lastName — атрибут с фамилией &lt;br /&gt;
* enabled — использовать или нет данный сервер &lt;br /&gt;
&lt;br /&gt;
[[LDAP_configuration|Примеры конфигурации взаимодействия с LDAP сервером]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше&lt;br /&gt;
:# Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами &lt;br /&gt;
:#* используется TLS соединение (ldaps префикс)&lt;br /&gt;
:#* порт 636&lt;br /&gt;
:#* проверяется сертификат LDAP сервера (ignoreCertCheck = false); для проверки используются сертификаты CA (из папки /etc/ssl/certs — все сертификаты, начинающиеся с буквы a; из папки /etc/ssl/certs/my_certs/ — все сертификаты)&lt;br /&gt;
:#* логин для подключения к LDAP серверу: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot; (connectAs); пароль: 12345678 (password)&lt;br /&gt;
:# Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1&lt;br /&gt;
:# Если подключение невозможно, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится поиск пользователя в LDAP каталоге со следующими параметрами:&lt;br /&gt;
:#* строка запроса: (&amp;amp;(sAMAccountName=ivanov_ii)((&amp;amp;(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&amp;amp;(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла&lt;br /&gt;
:#*начальный узел, с которого будет произведен поиск: cn=users, dc=domain,dc=home,dc=org&lt;br /&gt;
:#*поиск производится по всему поддереву&lt;br /&gt;
:# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой&lt;br /&gt;
:# Флаг useGroup = true, поэтому производится дополнительная проверка группы пользователя&lt;br /&gt;
:#* выполняется поиск групп в каталоге LDAP со следующими параметрами:&lt;br /&gt;
:#**строка запроса: (&amp;amp;(objectCategory=Group)(cn=dep_devops)) — взято из поля group.filter&lt;br /&gt;
:#**начальный узел: cn=users, dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла&lt;br /&gt;
:#**поиск производится по всему поддереву&lt;br /&gt;
:#**определяется список пользователей группы (каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла))&lt;br /&gt;
:#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой&lt;br /&gt;
:#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.  &lt;br /&gt;
:#* Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)&lt;br /&gt;
:# Если подключение не удалось создать, то процесс входа завершается с ошибкой&lt;br /&gt;
:# Процесс аутентификации пользователя произведен успешно&lt;br /&gt;
:# Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет&lt;br /&gt;
:# Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт)&lt;br /&gt;
&lt;br /&gt;
==== Привязка группы LDAP к роли Svacer ====&lt;br /&gt;
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия:&lt;br /&gt;
:* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins, ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer. &lt;br /&gt;
:* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins, ou=svacer,dc=example,dc=com)&lt;br /&gt;
:* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins&lt;br /&gt;
:* Администратор Svacer добавляет в конфигурационный файл в поле svacerRole имя атрибута, по которому будет производится привязка. Для примера выше — строчку svacerRole=&amp;quot;cn&amp;quot;&lt;br /&gt;
После выполнения данных действий, во время входа пользователя в систему пользователю будут добавлены роли по следующему алгоритму:&lt;br /&gt;
:* Производится поиск групп, к которым принадлежит пользователь. Поиск производится по параметрам, указанным в секции group конфигурационного файла. Для примера, пользователь может состоять в следующих группах: (cn=users,ou=svacer,dc=example,dc=com), (cn=dep_dev,dc=example,dc=com)&lt;br /&gt;
:* Для каждой найденной группы, выбирается значение атрибута, указанного в поле svacerRole. В примере — имя атрибута cn. Получаются два имени: users, dep_dev&lt;br /&gt;
:* Производится поиск ролей Svacer с именем users и dep_dev. Если такие роли найдены, то пользователю они будут добавлены. Так как в примере роль dep_dev не создана, то будет добавлена только роль users.&lt;br /&gt;
&lt;br /&gt;
Удаление ролей автоматически не производится. Вместо этого предлагается ручного режим синхронизации ролей пользователя. Для синхронизации ролей с текущими группами, в которых состоит пользователь, используется команда cli&lt;br /&gt;
&lt;br /&gt;
  svacer ldap sync_roles --login [user_login] --server [server_name] --apply&lt;br /&gt;
&lt;br /&gt;
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет &amp;quot;оценить&amp;quot; получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false.&lt;br /&gt;
&lt;br /&gt;
==== Использование CLI сервера Svacer с поддержкой LDAP ====&lt;br /&gt;
Для выполнения некоторых действий в cli с помощью команды svacer требуется аутентификация пользователя. Для аутентификации с помощью ldap сервера необходимо указать в команде кроме имени пользователя и пароля  имя сервера с помощью флага ldap_server (имя сервера регистр-зависимо).  Например:&lt;br /&gt;
    &lt;br /&gt;
    ./svacer quickdiff --user loginok --password loginok --ldap_server openLDAP2 --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Если флаг ldap_server не указан, аутентификация производится механизмами сервера svacer, как и в предыдущих версиях. Параметр ldap_server можно опустить, указав сервер в переменной окружения SVACER_LDAP_SERVER. Например:&lt;br /&gt;
&lt;br /&gt;
    SVACER_LDAP_SERVER=“openLDAP2“ ./svacer quickdiff --user loginok --password loginok --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Для получения списка поддерживаемых свейсером LDAP серверов можно использовать команду:&lt;br /&gt;
&lt;br /&gt;
    ./svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
&lt;br /&gt;
Вывод содержит два столбца (имя и URL сервера). В качестве значения для параметра ldap_server необходимо использовать содержимое первого столбца.&lt;br /&gt;
&lt;br /&gt;
==== Обновление данных LDAP пользователей ====&lt;br /&gt;
Для каждого LDAP пользователя создается соответствующая ему запись в  БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты.  Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. &lt;br /&gt;
Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера.&lt;br /&gt;
&lt;br /&gt;
[[File:ChangeUserProfile.png|none|left|alt=ChangeUserProfile]]&lt;br /&gt;
&lt;br /&gt;
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
    ./svacer ldap updateUsers --onlyEmpty&lt;br /&gt;
&lt;br /&gt;
Флаг '''onlyEmpty''' позволяет обновлять только пустые поля ФИО и eMail. Заполненные поля не будут изменены. Команда обновит данные всех пользователей, записи о которых имеются в базе Svacer. &lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем существует в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
    ./svacer server --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для получения данных хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий информацию о расширении сервера посредством хуков, которые пользователь может вызывать из web-интерфейса. &lt;br /&gt;
Каждый хук соответствует некоторому процессу или скрипту, который сервер запускает в ответ на вызов соответствующей команды из web-интерфейса.&lt;br /&gt;
Формат файла Hooks следующий:&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;,…],&lt;br /&gt;
          &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, …]&lt;br /&gt;
        },&lt;br /&gt;
        ...&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:100px;&amp;quot; | Параметр || Описание&lt;br /&gt;
|-&lt;br /&gt;
| ''id''&lt;br /&gt;
| Идентификатор хука.&amp;lt;br&amp;gt;Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда.&amp;lt;br&amp;gt;&lt;br /&gt;
Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе.&amp;lt;br&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Одним из типичных сценариев использования хуков является создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira и Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
&lt;br /&gt;
На svacer возможно настроить автомиграцию разметки с ветки на ветку (необходимо разрешение на администрирование сервера у пользователя).&lt;br /&gt;
&lt;br /&gt;
    svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
&lt;br /&gt;
* add - добавляет автомиграцию в соответствии с паттерном;&lt;br /&gt;
&lt;br /&gt;
* delete - удаляет автомиграцию;&lt;br /&gt;
&lt;br /&gt;
* show_config - показывает все заданные миграции (Config Table), их id, время создания и пользователя, которые её создал;&lt;br /&gt;
&lt;br /&gt;
* show_automigrate - показывает таблицу всех существующих проектов и веток с которых и на какие происходят автоматические миграции (Automigrate Table);&lt;br /&gt;
&lt;br /&gt;
* log - выводит список всех совершенных миграций (Done Automigrate Table).&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''' (применяется для command &amp;lt;add|delete|show_config|log&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Для add: Паттерн автомиграции формате: srcProject{Id|Name}/srcBranch{Id|Name}=&amp;gt;receiveProject{Id|Name|RegEx}/receiveBranch{Id|Name|RegEx}. RegEx - в формате SIMILAR TO RegEx для PostgreSQL &lt;br /&gt;
(https://www.postgresql.org/docs/current/functions-matching.html пункт 9.7.2).&lt;br /&gt;
&lt;br /&gt;
* Для delete: Паттерн автомиграции в формате: srcProject{Id|Name}/srcBranch{Id|Name}=&amp;gt;receiveProject{Id|Name|RegEx}/receiveBranch{Id|Name|RegEx}. Паттерн должен быть точно таким же, каким он записан в Config Table.&lt;br /&gt;
&lt;br /&gt;
* Для show_config: Паттерн автомиграции. Поиск будет происходить в следующем виде: ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Для log: Флаг в формате srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId или srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName для вывода автомиграций с данным паттерном.&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''' (применяется для command &amp;lt;delete|show_automigrate&amp;gt; в формате uuid):&lt;br /&gt;
&lt;br /&gt;
* Для delete: id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для show_automigrate: id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций,где присутствует данный id.&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' (применяется для command &amp;lt;show_config|show_automigrate|log&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* Для show_config: Формат вывода таблицы. Возможные значения: table - вывод в виде таблицы, json - вывод в виде json, no-id - вывод без config id. Значения можно перечислить через запятую: json,no-id. По умолчанию table.&lt;br /&gt;
&lt;br /&gt;
* Для show_automigrate|log: Формат вывода таблицы. Возможные значения: table - вывод в виде таблицы, json - вывод в виде json. По умолчанию table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать  POST запрос по адресу /api/automigrate. В теле передается json, с полями action(not null), pattern, id. Выполняется по тому же принципу, что и CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
&lt;br /&gt;
* При запуске сервера запускается сервис automigrate.&lt;br /&gt;
&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них.&lt;br /&gt;
&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций.&lt;br /&gt;
&lt;br /&gt;
* Не может копировать разметку с нескольких веток на одну (будет выдавать ошибку).&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавлен/удаление/изменение комментариев, добавление снэпшота, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снэпшота) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда не даёт выполнить действие - это upload результатов svace через CLI (либо import с флагом --upload). Тогда выдает ошибку миграции и отменяет upload (может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов).&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=1209</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=1209"/>
		<updated>2023-10-25T05:10:43Z</updated>

		<summary type="html">&lt;p&gt;Writer: Разъяснение про импорт разметки с нечитаемым названием&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Help]]&lt;br /&gt;
=== Получение справки ===&lt;br /&gt;
Запустив Svacer без параметров, можно получить информацию о доступных командах. Дополнительная информация о каждой команде доступна при использовании опции '''--help'''&lt;br /&gt;
&lt;br /&gt;
    svacer &amp;lt;command name&amp;gt; --help&lt;br /&gt;
&lt;br /&gt;
Общий формат командной строки&lt;br /&gt;
&lt;br /&gt;
    svacer [global options] command [command options] [arguments...]&lt;br /&gt;
&lt;br /&gt;
Глобальные опции относятся ко всем командам.&lt;br /&gt;
Опции команд имеют префикс «--». Их следует указывать до списка аргументов.&lt;br /&gt;
Для команд с опцией --password доступна возможность ввода пароля с клавиатуры.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета для проекта === &lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. Назначение команды состоит в том, чтобы добиться из консоли результатов (создание PDF файла отчета), аналогичным следующим действиям пользователя в GUI:&lt;br /&gt;
# Выгрузка таблицы маркеров в формате PDF ([[#pic1|Рис. 1]])&lt;br /&gt;
# Предварительное формирование содержимого таблицы маркеров&lt;br /&gt;
#* По режимам сравнения (new, missing, same, matched) с указанием цели и источника сравнения, ([[#pic2|Рис. 2]])&lt;br /&gt;
#* По используемым фильтрам Custom (ограниченный набор из 4 параметров) ([[#pic3|Рис. 3]])&lt;br /&gt;
&lt;br /&gt;
Ниже приводятся фрагменты GUI, которым соответствует cli команда в различных вариантах ее использования:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic1&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:SimpleReport.png|none|left|alt=SimpleReport window]]&lt;br /&gt;
'''Рис. 1 — Отчет без сравнения'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic2&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:CompareReport.png|none|left|alt=CompareReport window]]&lt;br /&gt;
'''Рис. 2 — Отчет со сравнением'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic3&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:CompareFiltersReport.png|none|left|alt=CompareFiltersReport window]]&lt;br /&gt;
'''Рис. 3 — Отчет со сравнением и фильтрами'''&lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
    '''svacer pdfgen''' --cmpMode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--targetProject [name|id] --targetBranch [name|id] --targetSnapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --outFile report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
Описание параметров:&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''Project, Branch, Snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''targetProject, targetBranch, targetSnapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''File, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан.  File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т.д.) &lt;br /&gt;
* '''outFile''' — имя создаваемого файла отчета. Если не будет указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: targetProject, targetBranch, targetSnapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project → targetProject, branch → targetBranch, …). Сформированные на предварительном этапе  маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно также использовать public API. Необходимо использовать следующие параметры:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — формат JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода на сервер истории ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
    svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--excludePaths &amp;lt;path1, path2, ... ,pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере истории&lt;br /&gt;
* project — проект на сервере истории, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* excludePaths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (важно: флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект/ветку/снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
    //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
      if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
        j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
        if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Описание шаблона разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен не удаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии у пользователя доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат [[Help:UI_manual#Экспорт_кода_с_разметкой|через выгрузку кода с указанием шаблона]].&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки со статусом Undecided (или не правильным) не производится (включая комментарий).&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
    //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
    //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
    printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов для распространения разметки между снимками с несовпадающими путями ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--pathPrefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
    svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --pathPrefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, …, &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере истории&lt;br /&gt;
* project — проект на сервере истории, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* pathPrefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
    svacer markup [auth/selection] suppress list&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
    svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
    svacer markup [auth/selection] suppress remove id1 id2 id3 &lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
    svacer markup [auth/selection] suppress remove&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивание в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждения недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
 &lt;br /&gt;
=== Поддержка протокола LDAP для аутентификации пользователей ===&lt;br /&gt;
====  Общий принцип аутентификации ====&lt;br /&gt;
Схема аутентификации с помощью протокола LDAP следующая:&lt;br /&gt;
&lt;br /&gt;
# Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации&lt;br /&gt;
# В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP) &lt;br /&gt;
# При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер svacer&lt;br /&gt;
# Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя&lt;br /&gt;
# В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя&lt;br /&gt;
# Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей&lt;br /&gt;
&lt;br /&gt;
Для каждого пользователя, успешно прошедшего проверку на LDAP сервере, создается локальная запись в БД Svacer. Управлять таким пользователем можно как и обычным пользователем, за исключением:&lt;br /&gt;
* Пользователю нельзя сменить пароль&lt;br /&gt;
* Пользователь не может сменить пароль самостоятельно&lt;br /&gt;
* В случае отсутствия связи между сервером Svacer и сервером LDAP, данный пользователь не сможет зайти в систему&lt;br /&gt;
&lt;br /&gt;
====  Запуск сервера с поддержкой LDAP ====&lt;br /&gt;
Сервер может быть запущен как в с поддержкой аутентификации через LDAP, так и без. Для того, чтобы включить аутентификацию через LDAP необходимо указать конфигурационный файл. Типовой пример конфигурационного файла для подключения к контроллеру домена MS ActiveDirectory или серверу openLDAP можно получить с помощью команды:&lt;br /&gt;
&lt;br /&gt;
    svacer ldap print&lt;br /&gt;
&lt;br /&gt;
Запуск сервера с поддержкой LDAP осуществляется командой:&lt;br /&gt;
&lt;br /&gt;
    svacer  server  --ldap ldap.json&lt;br /&gt;
&lt;br /&gt;
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. Ниже приведен лог сервера, запущенного с поддержкой протокола LDAP.&lt;br /&gt;
[[File:LdapServerAdded.png|none|left|1000px|alt=LdapServerAdded]]&lt;br /&gt;
&lt;br /&gt;
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. &lt;br /&gt;
&lt;br /&gt;
[[File:LdapServerChoose.png|none|left|alt=LdapServerChoose]]&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. &lt;br /&gt;
В случае конфигурации сервера Svacer с поддержкой LDAP можно отключить возможность аутентификации пользователей встроенными средствами сервера Svacer (вкладка Svacer на странице входа). В этом случае вкладка Svacer на странице входа будет неактивной и пользователи смогут заходить в систему только с помощью LDAP аутентификации. Данное поведение распространяется и на работу с сервером с помощью интерфейса командной строки. &lt;br /&gt;
&lt;br /&gt;
Для отключения возможности аутентификации встроенными средствами сервера Svacer нужно использовать опцию '''disable-svacer-auth'''. &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
    svacer server --ldap ldap.json --disable-svacer-auth&lt;br /&gt;
&lt;br /&gt;
====  Конфигурационный файл сервера для поддержки LDAP  ====&lt;br /&gt;
Типовой пример конфигурации представлен ниже.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;active_directory&amp;quot;,&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
          &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
          &amp;quot;hideURL&amp;quot;: true,&lt;br /&gt;
          &amp;quot;checkAlivePeriod&amp;quot;: 60,	&lt;br /&gt;
          &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;ldaps://192.168.11.71:636&amp;quot;,&lt;br /&gt;
            &amp;quot;mirrors&amp;quot;:[&amp;quot;ldaps://192.168.11.72:636&amp;quot;,&amp;quot;ldaps://192.168.11.73:636&amp;quot;]&lt;br /&gt;
            &amp;quot;connectAs&amp;quot;: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
            &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
            &amp;quot;ignoreCertCheck&amp;quot;: false,&lt;br /&gt;
            &amp;quot;caCertFiles&amp;quot;:[&amp;quot;/etc/ssl/certs/a*&amp;quot;,&amp;quot;/etc/ssl/certs/my_certs/*&amp;quot;]&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;group&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Group)(cn=dep_devops))&amp;quot;,&lt;br /&gt;
            &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
            &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;svacerRole&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;user&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Person)(sAMAccountName=*))&amp;quot;,&lt;br /&gt;
            &amp;quot;login&amp;quot;: &amp;quot;sAMAccountName&amp;quot;,&lt;br /&gt;
            &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;info&amp;quot;: {&lt;br /&gt;
              &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
              &amp;quot;email&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
              &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
              &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;open_ldap&amp;quot;,&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
          &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
          &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;ldap://127.0.0.1:389&amp;quot;,&lt;br /&gt;
            &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
            &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;group&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;ou=groups&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=svacer))&amp;quot;,&lt;br /&gt;
            &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
            &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;user&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;ou=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=PosixAccount))&amp;quot;,&lt;br /&gt;
            &amp;quot;login&amp;quot;: &amp;quot;uid&amp;quot;,&lt;br /&gt;
            &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;info&amp;quot;: {&lt;br /&gt;
              &amp;quot;display&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
              &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
              &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
              &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. &lt;br /&gt;
* name — произвольное имя (уникальное для каждого сервера)&lt;br /&gt;
* basedn — DN относительно которого будут проводится все операции в LDAP каталоге &lt;br /&gt;
* useGroup — проверять ли принадлежность пользователя к группе &lt;br /&gt;
* hideURL — не передавать сетевой адрес LDAP сервера. Конечные пользователи будут видеть в выпадающем списке только имя сервера, указанное в поле name. В поле URL будет пустая строка. &lt;br /&gt;
* checkAlivePeriod — Промежуток времени в секундах, который должен проходить между периодическими проверками доступности сервера LDAP. Если параметр равен 0 или не указан, такая проверка не проводится.&lt;br /&gt;
* connection — подсекция, описывающая параметры соединения с сервером &lt;br /&gt;
:* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636).&lt;br /&gt;
:* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL.&lt;br /&gt;
:* connectAs — имя пользователя в формате DN, из под которого будут производится операции в LDAP каталоге &lt;br /&gt;
:* password — пароль пользователя &lt;br /&gt;
:* ignoreCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles.&lt;br /&gt;
:* CaCertFiles — массив значений, описывающих какие файлы корневых сертификатов добавлять в конфигурацию Svacer. Формат файлов сертификатов — PEM&lt;br /&gt;
* group — подсекция, описывает параметры проверки принадлежности пользователя к группе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп &lt;br /&gt;
:* userMember — атрибут в группе, содержащий пользователей, принадлежащих группе &lt;br /&gt;
:* display — атрибут, содержащий имя группы для отображения &lt;br /&gt;
:* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем.&lt;br /&gt;
* user — подсекция, описывает параметры получения информации о пользователе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске пользователей. &lt;br /&gt;
:* login — атрибут, в котором находится login пользователя.&lt;br /&gt;
:* group — атрибут в пользователе, на который ссылается атрибут group.userMember (обычно это «dn» пользователя)&lt;br /&gt;
:* info — подсекция описывающая в каких атрибутах находится информация о пользователе &lt;br /&gt;
::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО)&lt;br /&gt;
::* email — атрибут с почтовым адресом &lt;br /&gt;
::* firstName — атрибут с именем &lt;br /&gt;
::* lastName — атрибут с фамилией &lt;br /&gt;
* enabled — использовать или нет данный сервер &lt;br /&gt;
&lt;br /&gt;
[[LDAP_configuration|Примеры конфигурации взаимодействия с LDAP сервером]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше&lt;br /&gt;
:# Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами &lt;br /&gt;
:#* используется TLS соединение (ldaps префикс)&lt;br /&gt;
:#* порт 636&lt;br /&gt;
:#* проверяется сертификат LDAP сервера (ignoreCertCheck = false); для проверки используются сертификаты CA (из папки /etc/ssl/certs — все сертификаты, начинающиеся с буквы a; из папки /etc/ssl/certs/my_certs/ — все сертификаты)&lt;br /&gt;
:#* логин для подключения к LDAP серверу: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot; (connectAs); пароль: 12345678 (password)&lt;br /&gt;
:# Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1&lt;br /&gt;
:# Если подключение невозможно, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится поиск пользователя в LDAP каталоге со следующими параметрами:&lt;br /&gt;
:#* строка запроса: (&amp;amp;(sAMAccountName=ivanov_ii)((&amp;amp;(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&amp;amp;(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла&lt;br /&gt;
:#*начальный узел, с которого будет произведен поиск: cn=users, dc=domain,dc=home,dc=org&lt;br /&gt;
:#*поиск производится по всему поддереву&lt;br /&gt;
:# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой&lt;br /&gt;
:# Флаг useGroup = true, поэтому производится дополнительная проверка группы пользователя&lt;br /&gt;
:#* выполняется поиск групп в каталоге LDAP со следующими параметрами:&lt;br /&gt;
:#**строка запроса: (&amp;amp;(objectCategory=Group)(cn=dep_devops)) — взято из поля group.filter&lt;br /&gt;
:#**начальный узел: cn=users, dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла&lt;br /&gt;
:#**поиск производится по всему поддереву&lt;br /&gt;
:#**определяется список пользователей группы (каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла))&lt;br /&gt;
:#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой&lt;br /&gt;
:#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.  &lt;br /&gt;
:#* Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)&lt;br /&gt;
:# Если подключение не удалось создать, то процесс входа завершается с ошибкой&lt;br /&gt;
:# Процесс аутентификации пользователя произведен успешно&lt;br /&gt;
:# Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет&lt;br /&gt;
:# Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт)&lt;br /&gt;
&lt;br /&gt;
==== Привязка группы LDAP к роли Svacer ====&lt;br /&gt;
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия:&lt;br /&gt;
:* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins, ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer. &lt;br /&gt;
:* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins, ou=svacer,dc=example,dc=com)&lt;br /&gt;
:* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins&lt;br /&gt;
:* Администратор Svacer добавляет в конфигурационный файл в поле svacerRole имя атрибута, по которому будет производится привязка. Для примера выше — строчку svacerRole=&amp;quot;cn&amp;quot;&lt;br /&gt;
После выполнения данных действий, во время входа пользователя в систему пользователю будут добавлены роли по следующему алгоритму:&lt;br /&gt;
:* Производится поиск групп, к которым принадлежит пользователь. Поиск производится по параметрам, указанным в секции group конфигурационного файла. Для примера, пользователь может состоять в следующих группах: (cn=users,ou=svacer,dc=example,dc=com), (cn=dep_dev,dc=example,dc=com)&lt;br /&gt;
:* Для каждой найденной группы, выбирается значение атрибута, указанного в поле svacerRole. В примере — имя атрибута cn. Получаются два имени: users, dep_dev&lt;br /&gt;
:* Производится поиск ролей Svacer с именем users и dep_dev. Если такие роли найдены, то пользователю они будут добавлены. Так как в примере роль dep_dev не создана, то будет добавлена только роль users.&lt;br /&gt;
&lt;br /&gt;
Удаление ролей автоматически не производится. Вместо этого предлагается ручного режим синхронизации ролей пользователя. Для синхронизации ролей с текущими группами, в которых состоит пользователь, используется команда cli&lt;br /&gt;
&lt;br /&gt;
  svacer ldap sync_roles --login [user_login] --server [server_name] --apply&lt;br /&gt;
&lt;br /&gt;
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет &amp;quot;оценить&amp;quot; получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false.&lt;br /&gt;
&lt;br /&gt;
==== Использование CLI сервера Svacer с поддержкой LDAP ====&lt;br /&gt;
Для выполнения некоторых действий в cli с помощью команды svacer требуется аутентификация пользователя. Для аутентификации с помощью ldap сервера необходимо указать в команде кроме имени пользователя и пароля  имя сервера с помощью флага ldap_server (имя сервера регистр-зависимо).  Например:&lt;br /&gt;
    &lt;br /&gt;
    ./svacer quickdiff --user loginok --password loginok --ldap_server openLDAP2 --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Если флаг ldap_server не указан, аутентификация производится механизмами сервера svacer, как и в предыдущих версиях. Параметр ldap_server можно опустить, указав сервер в переменной окружения SVACER_LDAP_SERVER. Например:&lt;br /&gt;
&lt;br /&gt;
    SVACER_LDAP_SERVER=“openLDAP2“ ./svacer quickdiff --user loginok --password loginok --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Для получения списка поддерживаемых свейсером LDAP серверов можно использовать команду:&lt;br /&gt;
&lt;br /&gt;
    ./svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
&lt;br /&gt;
Вывод содержит два столбца (имя и URL сервера). В качестве значения для параметра ldap_server необходимо использовать содержимое первого столбца.&lt;br /&gt;
&lt;br /&gt;
==== Обновление данных LDAP пользователей ====&lt;br /&gt;
Для каждого LDAP пользователя создается соответствующая ему запись в  БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты.  Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. &lt;br /&gt;
Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера.&lt;br /&gt;
&lt;br /&gt;
[[File:ChangeUserProfile.png|none|left|alt=ChangeUserProfile]]&lt;br /&gt;
&lt;br /&gt;
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
    ./svacer ldap updateUsers --onlyEmpty&lt;br /&gt;
&lt;br /&gt;
Флаг '''onlyEmpty''' позволяет обновлять только пустые поля ФИО и eMail. Заполненные поля не будут изменены. Команда обновит данные всех пользователей, записи о которых имеются в базе Svacer. &lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем существует в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
    ./svacer server --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для получения данных хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий информацию о расширении сервера посредством хуков, которые пользователь может вызывать из web-интерфейса. &lt;br /&gt;
Каждый хук соответствует некоторому процессу или скрипту, который сервер запускает в ответ на вызов соответствующей команды из web-интерфейса.&lt;br /&gt;
Формат файла Hooks следующий:&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;,…],&lt;br /&gt;
          &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, …]&lt;br /&gt;
        },&lt;br /&gt;
        ...&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:100px;&amp;quot; | Параметр || Описание&lt;br /&gt;
|-&lt;br /&gt;
| ''id''&lt;br /&gt;
| Идентификатор хука.&amp;lt;br&amp;gt;Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда.&amp;lt;br&amp;gt;&lt;br /&gt;
Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе.&amp;lt;br&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Одним из типичных сценариев использования хуков является создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira и Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=1133</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=1133"/>
		<updated>2023-09-13T12:53:57Z</updated>

		<summary type="html">&lt;p&gt;Writer: Описание шаблона разметки DEFAULT&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Help]]&lt;br /&gt;
=== Получение справки ===&lt;br /&gt;
Запустив Svacer без параметров, можно получить информацию о доступных командах. Дополнительная информация о каждой команде доступна при использовании опции '''--help'''&lt;br /&gt;
&lt;br /&gt;
    svacer &amp;lt;command name&amp;gt; --help&lt;br /&gt;
&lt;br /&gt;
Общий формат командной строки&lt;br /&gt;
&lt;br /&gt;
    svacer [global options] command [command options] [arguments...]&lt;br /&gt;
&lt;br /&gt;
Глобальные опции относятся ко всем командам.&lt;br /&gt;
Опции команд имеют префикс «--». Их следует указывать до списка аргументов.&lt;br /&gt;
Для команд с опцией --password доступна возможность ввода пароля с клавиатуры.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета для проекта === &lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. Назначение команды состоит в том, чтобы добиться из консоли результатов (создание PDF файла отчета), аналогичным следующим действиям пользователя в GUI:&lt;br /&gt;
# Выгрузка таблицы маркеров в формате PDF ([[#pic1|Рис. 1]])&lt;br /&gt;
# Предварительное формирование содержимого таблицы маркеров&lt;br /&gt;
#* По режимам сравнения (new, missing, same, matched) с указанием цели и источника сравнения, ([[#pic2|Рис. 2]])&lt;br /&gt;
#* По используемым фильтрам Custom (ограниченный набор из 4 параметров) ([[#pic3|Рис. 3]])&lt;br /&gt;
&lt;br /&gt;
Ниже приводятся фрагменты GUI, которым соответствует cli команда в различных вариантах ее использования:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic1&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:SimpleReport.png|none|left|alt=SimpleReport window]]&lt;br /&gt;
'''Рис. 1 — Отчет без сравнения'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic2&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:CompareReport.png|none|left|alt=CompareReport window]]&lt;br /&gt;
'''Рис. 2 — Отчет со сравнением'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pic3&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:CompareFiltersReport.png|none|left|alt=CompareFiltersReport window]]&lt;br /&gt;
'''Рис. 3 — Отчет со сравнением и фильтрами'''&lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
    '''svacer pdfgen''' --cmpMode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--targetProject [name|id] --targetBranch [name|id] --targetSnapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --outFile report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
Описание параметров:&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''Project, Branch, Snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''targetProject, targetBranch, targetSnapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''File, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан.  File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т.д.) &lt;br /&gt;
* '''outFile''' — имя создаваемого файла отчета. Если не будет указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: targetProject, targetBranch, targetSnapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project → targetProject, branch → targetBranch, …). Сформированные на предварительном этапе  маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно также использовать public API. Необходимо использовать следующие параметры:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — формат JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода на сервер истории ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
    svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--excludePaths &amp;lt;path1, path2, ... ,pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере истории&lt;br /&gt;
* project — проект на сервере истории, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* excludePaths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (важно: флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект/ветку/снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
    //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
      if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
        j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
        if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Описание шаблона разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен не удаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Server information''' (при наличии у пользователя доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через выгрузку кода с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
    //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
    //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
    printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов для распространения разметки между снимками с несовпадающими путями ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--pathPrefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
    svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --pathPrefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, …, &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере истории&lt;br /&gt;
* project — проект на сервере истории, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* pathPrefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
    svacer markup [auth/selection] suppress list&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
    svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
    svacer markup [auth/selection] suppress remove id1 id2 id3 &lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
    svacer markup [auth/selection] suppress remove&lt;br /&gt;
Пример:&lt;br /&gt;
    svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивание в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждения недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
 &lt;br /&gt;
=== Поддержка протокола LDAP для аутентификации пользователей ===&lt;br /&gt;
====  Общий принцип аутентификации ====&lt;br /&gt;
Схема аутентификации с помощью протокола LDAP следующая:&lt;br /&gt;
&lt;br /&gt;
# Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации&lt;br /&gt;
# В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP) &lt;br /&gt;
# При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер svacer&lt;br /&gt;
# Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя&lt;br /&gt;
# В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя&lt;br /&gt;
# Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей&lt;br /&gt;
&lt;br /&gt;
Для каждого пользователя, успешно прошедшего проверку на LDAP сервере, создается локальная запись в БД Svacer. Управлять таким пользователем можно как и обычным пользователем, за исключением:&lt;br /&gt;
* Пользователю нельзя сменить пароль&lt;br /&gt;
* Пользователь не может сменить пароль самостоятельно&lt;br /&gt;
* В случае отсутствия связи между сервером Svacer и сервером LDAP, данный пользователь не сможет зайти в систему&lt;br /&gt;
&lt;br /&gt;
====  Запуск сервера с поддержкой LDAP ====&lt;br /&gt;
Сервер может быть запущен как в с поддержкой аутентификации через LDAP, так и без. Для того, чтобы включить аутентификацию через LDAP необходимо указать конфигурационный файл. Типовой пример конфигурационного файла для подключения к контроллеру домена MS ActiveDirectory или серверу openLDAP можно получить с помощью команды:&lt;br /&gt;
&lt;br /&gt;
    svacer ldap print&lt;br /&gt;
&lt;br /&gt;
Запуск сервера с поддержкой LDAP осуществляется командой:&lt;br /&gt;
&lt;br /&gt;
    svacer  server  --ldap ldap.json&lt;br /&gt;
&lt;br /&gt;
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. Ниже приведен лог сервера, запущенного с поддержкой протокола LDAP.&lt;br /&gt;
[[File:LdapServerAdded.png|none|left|1000px|alt=LdapServerAdded]]&lt;br /&gt;
&lt;br /&gt;
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. &lt;br /&gt;
&lt;br /&gt;
[[File:LdapServerChoose.png|none|left|alt=LdapServerChoose]]&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. &lt;br /&gt;
В случае конфигурации сервера Svacer с поддержкой LDAP можно отключить возможность аутентификации пользователей встроенными средствами сервера Svacer (вкладка Svacer на странице входа). В этом случае вкладка Svacer на странице входа будет неактивной и пользователи смогут заходить в систему только с помощью LDAP аутентификации. Данное поведение распространяется и на работу с сервером с помощью интерфейса командной строки. &lt;br /&gt;
&lt;br /&gt;
Для отключения возможности аутентификации встроенными средствами сервера Svacer нужно использовать опцию '''disable-svacer-auth'''. &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
    svacer server --ldap ldap.json --disable-svacer-auth&lt;br /&gt;
&lt;br /&gt;
====  Конфигурационный файл сервера для поддержки LDAP  ====&lt;br /&gt;
Типовой пример конфигурации представлен ниже.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;active_directory&amp;quot;,&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
          &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
          &amp;quot;hideURL&amp;quot;: true,&lt;br /&gt;
          &amp;quot;checkAlivePeriod&amp;quot;: 60,	&lt;br /&gt;
          &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;ldaps://192.168.11.71:636&amp;quot;,&lt;br /&gt;
            &amp;quot;mirrors&amp;quot;:[&amp;quot;ldaps://192.168.11.72:636&amp;quot;,&amp;quot;ldaps://192.168.11.73:636&amp;quot;]&lt;br /&gt;
            &amp;quot;connectAs&amp;quot;: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
            &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
            &amp;quot;ignoreCertCheck&amp;quot;: false,&lt;br /&gt;
            &amp;quot;caCertFiles&amp;quot;:[&amp;quot;/etc/ssl/certs/a*&amp;quot;,&amp;quot;/etc/ssl/certs/my_certs/*&amp;quot;]&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;group&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Group)(cn=dep_devops))&amp;quot;,&lt;br /&gt;
            &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
            &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;svacerRole&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;user&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Person)(sAMAccountName=*))&amp;quot;,&lt;br /&gt;
            &amp;quot;login&amp;quot;: &amp;quot;sAMAccountName&amp;quot;,&lt;br /&gt;
            &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;info&amp;quot;: {&lt;br /&gt;
              &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
              &amp;quot;email&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
              &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
              &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;open_ldap&amp;quot;,&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
          &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
          &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;ldap://127.0.0.1:389&amp;quot;,&lt;br /&gt;
            &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
            &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;group&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;ou=groups&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=svacer))&amp;quot;,&lt;br /&gt;
            &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
            &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;user&amp;quot;: {&lt;br /&gt;
            &amp;quot;basedn&amp;quot;: &amp;quot;ou=users&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=PosixAccount))&amp;quot;,&lt;br /&gt;
            &amp;quot;login&amp;quot;: &amp;quot;uid&amp;quot;,&lt;br /&gt;
            &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;info&amp;quot;: {&lt;br /&gt;
              &amp;quot;display&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
              &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
              &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
              &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. &lt;br /&gt;
* name — произвольное имя (уникальное для каждого сервера)&lt;br /&gt;
* basedn — DN относительно которого будут проводится все операции в LDAP каталоге &lt;br /&gt;
* useGroup — проверять ли принадлежность пользователя к группе &lt;br /&gt;
* hideURL — не передавать сетевой адрес LDAP сервера. Конечные пользователи будут видеть в выпадающем списке только имя сервера, указанное в поле name. В поле URL будет пустая строка. &lt;br /&gt;
* checkAlivePeriod — Промежуток времени в секундах, который должен проходить между периодическими проверками доступности сервера LDAP. Если параметр равен 0 или не указан, такая проверка не проводится.&lt;br /&gt;
* connection — подсекция, описывающая параметры соединения с сервером &lt;br /&gt;
:* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636).&lt;br /&gt;
:* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL.&lt;br /&gt;
:* connectAs — имя пользователя в формате DN, из под которого будут производится операции в LDAP каталоге &lt;br /&gt;
:* password — пароль пользователя &lt;br /&gt;
:* ignoreCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles.&lt;br /&gt;
:* CaCertFiles — массив значений, описывающих какие файлы корневых сертификатов добавлять в конфигурацию Svacer. Формат файлов сертификатов — PEM&lt;br /&gt;
* group — подсекция, описывает параметры проверки принадлежности пользователя к группе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп &lt;br /&gt;
:* userMember — атрибут в группе, содержащий пользователей, принадлежащих группе &lt;br /&gt;
:* display — атрибут, содержащий имя группы для отображения &lt;br /&gt;
:* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем.&lt;br /&gt;
* user — подсекция, описывает параметры получения информации о пользователе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске пользователей. &lt;br /&gt;
:* login — атрибут, в котором находится login пользователя.&lt;br /&gt;
:* group — атрибут в пользователе, на который ссылается атрибут group.userMember (обычно это «dn» пользователя)&lt;br /&gt;
:* info — подсекция описывающая в каких атрибутах находится информация о пользователе &lt;br /&gt;
::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО)&lt;br /&gt;
::* email — атрибут с почтовым адресом &lt;br /&gt;
::* firstName — атрибут с именем &lt;br /&gt;
::* lastName — атрибут с фамилией &lt;br /&gt;
* enabled — использовать или нет данный сервер &lt;br /&gt;
&lt;br /&gt;
[[LDAP_configuration|Примеры конфигурации взаимодействия с LDAP сервером]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше&lt;br /&gt;
:# Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами &lt;br /&gt;
:#* используется TLS соединение (ldaps префикс)&lt;br /&gt;
:#* порт 636&lt;br /&gt;
:#* проверяется сертификат LDAP сервера (ignoreCertCheck = false); для проверки используются сертификаты CA (из папки /etc/ssl/certs — все сертификаты, начинающиеся с буквы a; из папки /etc/ssl/certs/my_certs/ — все сертификаты)&lt;br /&gt;
:#* логин для подключения к LDAP серверу: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot; (connectAs); пароль: 12345678 (password)&lt;br /&gt;
:# Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1&lt;br /&gt;
:# Если подключение невозможно, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится поиск пользователя в LDAP каталоге со следующими параметрами:&lt;br /&gt;
:#* строка запроса: (&amp;amp;(sAMAccountName=ivanov_ii)((&amp;amp;(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&amp;amp;(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла&lt;br /&gt;
:#*начальный узел, с которого будет произведен поиск: cn=users, dc=domain,dc=home,dc=org&lt;br /&gt;
:#*поиск производится по всему поддереву&lt;br /&gt;
:# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой&lt;br /&gt;
:# Флаг useGroup = true, поэтому производится дополнительная проверка группы пользователя&lt;br /&gt;
:#* выполняется поиск групп в каталоге LDAP со следующими параметрами:&lt;br /&gt;
:#**строка запроса: (&amp;amp;(objectCategory=Group)(cn=dep_devops)) — взято из поля group.filter&lt;br /&gt;
:#**начальный узел: cn=users, dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла&lt;br /&gt;
:#**поиск производится по всему поддереву&lt;br /&gt;
:#**определяется список пользователей группы (каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла))&lt;br /&gt;
:#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой&lt;br /&gt;
:#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.  &lt;br /&gt;
:#* Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)&lt;br /&gt;
:# Если подключение не удалось создать, то процесс входа завершается с ошибкой&lt;br /&gt;
:# Процесс аутентификации пользователя произведен успешно&lt;br /&gt;
:# Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет&lt;br /&gt;
:# Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт)&lt;br /&gt;
&lt;br /&gt;
==== Привязка группы LDAP к роли Svacer ====&lt;br /&gt;
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия:&lt;br /&gt;
:* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins, ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer. &lt;br /&gt;
:* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins, ou=svacer,dc=example,dc=com)&lt;br /&gt;
:* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins&lt;br /&gt;
:* Администратор Svacer добавляет в конфигурационный файл в поле svacerRole имя атрибута, по которому будет производится привязка. Для примера выше — строчку svacerRole=&amp;quot;cn&amp;quot;&lt;br /&gt;
После выполнения данных действий, во время входа пользователя в систему пользователю будут добавлены роли по следующему алгоритму:&lt;br /&gt;
:* Производится поиск групп, к которым принадлежит пользователь. Поиск производится по параметрам, указанным в секции group конфигурационного файла. Для примера, пользователь может состоять в следующих группах: (cn=users,ou=svacer,dc=example,dc=com), (cn=dep_dev,dc=example,dc=com)&lt;br /&gt;
:* Для каждой найденной группы, выбирается значение атрибута, указанного в поле svacerRole. В примере — имя атрибута cn. Получаются два имени: users, dep_dev&lt;br /&gt;
:* Производится поиск ролей Svacer с именем users и dep_dev. Если такие роли найдены, то пользователю они будут добавлены. Так как в примере роль dep_dev не создана, то будет добавлена только роль users.&lt;br /&gt;
&lt;br /&gt;
Удаление ролей автоматически не производится. Вместо этого предлагается ручного режим синхронизации ролей пользователя. Для синхронизации ролей с текущими группами, в которых состоит пользователь, используется команда cli&lt;br /&gt;
&lt;br /&gt;
  svacer ldap sync_roles --login [user_login] --server [server_name] --apply&lt;br /&gt;
&lt;br /&gt;
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет &amp;quot;оценить&amp;quot; получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false.&lt;br /&gt;
&lt;br /&gt;
==== Использование CLI сервера Svacer с поддержкой LDAP ====&lt;br /&gt;
Для выполнения некоторых действий в cli с помощью команды svacer требуется аутентификация пользователя. Для аутентификации с помощью ldap сервера необходимо указать в команде кроме имени пользователя и пароля  имя сервера с помощью флага ldap_server (имя сервера регистр-зависимо).  Например:&lt;br /&gt;
    &lt;br /&gt;
    ./svacer quickdiff --user loginok --password loginok --ldap_server openLDAP2 --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Если флаг ldap_server не указан, аутентификация производится механизмами сервера svacer, как и в предыдущих версиях. Параметр ldap_server можно опустить, указав сервер в переменной окружения SVACER_LDAP_SERVER. Например:&lt;br /&gt;
&lt;br /&gt;
    SVACER_LDAP_SERVER=“openLDAP2“ ./svacer quickdiff --user loginok --password loginok --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Для получения списка поддерживаемых свейсером LDAP серверов можно использовать команду:&lt;br /&gt;
&lt;br /&gt;
    ./svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
&lt;br /&gt;
Вывод содержит два столбца (имя и URL сервера). В качестве значения для параметра ldap_server необходимо использовать содержимое первого столбца.&lt;br /&gt;
&lt;br /&gt;
==== Обновление данных LDAP пользователей ====&lt;br /&gt;
Для каждого LDAP пользователя создается соответствующая ему запись в  БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты.  Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. &lt;br /&gt;
Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера.&lt;br /&gt;
&lt;br /&gt;
[[File:ChangeUserProfile.png|none|left|alt=ChangeUserProfile]]&lt;br /&gt;
&lt;br /&gt;
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
    ./svacer ldap updateUsers --onlyEmpty&lt;br /&gt;
&lt;br /&gt;
Флаг '''onlyEmpty''' позволяет обновлять только пустые поля ФИО и eMail. Заполненные поля не будут изменены. Команда обновит данные всех пользователей, записи о которых имеются в базе Svacer. &lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем существует в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
    ./svacer server --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для получения данных хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий информацию о расширении сервера посредством хуков, которые пользователь может вызывать из web-интерфейса. &lt;br /&gt;
Каждый хук соответствует некоторому процессу или скрипту, который сервер запускает в ответ на вызов соответствующей команды из web-интерфейса.&lt;br /&gt;
Формат файла Hooks следующий:&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;,…],&lt;br /&gt;
          &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
          &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, …]&lt;br /&gt;
        },&lt;br /&gt;
        ...&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:100px;&amp;quot; | Параметр || Описание&lt;br /&gt;
|-&lt;br /&gt;
| ''id''&lt;br /&gt;
| Идентификатор хука.&amp;lt;br&amp;gt;Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда.&amp;lt;br&amp;gt;&lt;br /&gt;
Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе.&amp;lt;br&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Одним из типичных сценариев использования хуков является создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira и Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Introduction&amp;diff=895</id>
		<title>Help:Introduction</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Introduction&amp;diff=895"/>
		<updated>2023-05-03T06:23:40Z</updated>

		<summary type="html">&lt;p&gt;Writer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Help]]&lt;br /&gt;
== Введение ==&lt;br /&gt;
Сервер историй '''Svacer''' ('''''Svace Server''''') предназначен для хранения и обработки результатов работы статического анализатора Svace. Он разработан с целью заменить старый сервер историй, встроенный в анализатор Svace. Допускается одновременное использование старого и нового серверов.&lt;br /&gt;
&lt;br /&gt;
Svacer состоит из единственного исполняемого файла, который можно запустить как в [[Help:Installation|режиме сервера]] для хранения и обработки результатов анализа (при этом требуется PostgreSQL с созданной для Svacer БД), так и использовать как клиент для взаимодействия с этим сервером (в этом случае никаких зависимостей не требуется). Будучи запущенным в качестве сервера, Svacer предоставляет [[Help:ServerClient#Вход_в_сервер|web-UI]] и [[Help:ServerClient#Публичные_REST_запросы|REST API]] для взаимодействия. При использовании Svacer как клиента доступны команды для [[Help:ServerClient#Процесс_импорта|импорта]] предупреждений, [[Help:ServerClient#Загрузка_данных_на_сервер|загрузки]] их на сервер и другие возможности взаимодействия с сервером.&lt;br /&gt;
&lt;br /&gt;
=== Термины ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| ''Project'' &lt;br /&gt;
| Проект, подлежащий анализу. По умолчанию именем проекта считается имя директории, в которой был запущен ''svace build'' и ''svace analyze''.&lt;br /&gt;
На сервере проект содержит в себе несколько '''branch''' с результатами работы анализатора&lt;br /&gt;
|-&lt;br /&gt;
| ''Branch (ветка)''&lt;br /&gt;
| Ветка в проекте с результатами работы анализатора. По умолчанию проект имеет одну ветку — master&lt;br /&gt;
|-&lt;br /&gt;
| ''Snapshot (снимок)''&lt;br /&gt;
| Результат работы ''svace analyze'', импортированный в промежуточное хранилище или на сервер. Содержит:&lt;br /&gt;
* имя проекта;&lt;br /&gt;
* имя ветки;&lt;br /&gt;
* результаты анализа (предупреждения);&lt;br /&gt;
* исходники, которые были включены в build, на котором производился анализ;&lt;br /&gt;
* вспомогательная информация для навигации по исходникам;&lt;br /&gt;
* дополнительные данные;&lt;br /&gt;
Допускается импортирование снимков без исходного кода и дополнительной информации&lt;br /&gt;
|-&lt;br /&gt;
| ''Marker (маркер, предупреждение)''&lt;br /&gt;
| Предупреждение от Svace с информацией о позиции в исходном файле&lt;br /&gt;
|-&lt;br /&gt;
| ''Svacer''&lt;br /&gt;
| Svace History Server, а также исполняемый файл, содержащий код сервера&lt;br /&gt;
|-&lt;br /&gt;
| ''Разметка''&lt;br /&gt;
| Проставление статуса маркера с опциональным добавлением комментария&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Состав дистрибутива ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| '''bin/svacer&amp;lt;br&amp;gt;bin/svacer.exe'''&lt;br /&gt;
| Бинарный файл сервера и утилита для импортирования результатов. Режим работы зависит от аргументов&lt;br /&gt;
|-&lt;br /&gt;
| '''support/svace-migration/svace-migration.jar'''&lt;br /&gt;
| Утилита подготовки данных для импорта из старого сервера историй. &lt;br /&gt;
Требует JDK для запуска. Может использоваться JDK из состава дистрибутива Svace&lt;br /&gt;
|-&lt;br /&gt;
| '''extra/docker-compose*.yml''' || Docker-compose файлы для запуска БД PostgreSQL и Svacer в docker-контейнерах&lt;br /&gt;
|-&lt;br /&gt;
| '''integrations/vscode''' || Расширение для Visual Studio Code и документация на него&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Зависимости ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| PostgreSQL версии 10 и выше. Требуется только при запуске Svacer в роли сервера&lt;br /&gt;
| Параметры подключения определяются аргументом при запуске сервера или переменной окружения SVACER_PG_URL. По умолчанию, используется следующий connect URL:&lt;br /&gt;
'''postgres://svace:svace@0.0.0.0:5432/svace'''&amp;lt;br&amp;gt;&lt;br /&gt;
Можно использовать PostgreSQL в docker-контейнере.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Настоятельно рекомендуем''' использовать выделенный сервер для хранения БД, особенно в production&lt;br /&gt;
|-&lt;br /&gt;
| libc.so&amp;lt;br&amp;gt;libpthread.so&amp;lt;br&amp;gt;libdl.so&amp;lt;br&amp;gt;linux-vdso.so&lt;br /&gt;
| Серверная часть написана на Go с CGO_ENABLED=1 ввиду необходимости читать sqlite-файлы из результатов работы анализатора Svace&lt;br /&gt;
|-&lt;br /&gt;
| Выделенная директория для хранения object storage&lt;br /&gt;
| Сервер использует встроенную key-value database для хранения информации об исходном коде: контент-файлов и вспомогательной информации для навигации&lt;br /&gt;
|-&lt;br /&gt;
| Svace&lt;br /&gt;
| Для импорта данных на сервер историй требуется наличие Svace на хосте, откуда происходит импорт. Svace используется для получения информации из .svace-dir&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Используемые порты ===&lt;br /&gt;
&lt;br /&gt;
Приведены значения по умолчанию. Все значения могут быть переопределены.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 3002&lt;br /&gt;
| Используется для предоставления gRPC API.&lt;br /&gt;
gRPC API является внутренним и предназначен для загрузки данных на сервер&lt;br /&gt;
|-&lt;br /&gt;
| 8080&lt;br /&gt;
| Используется для предоставления REST API и web-сервера для предоставления web-UI&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Системные требования ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| CPU&lt;br /&gt;
| x86-64. Для обработки больших проектов рекомендуется не менее 8 ядер&lt;br /&gt;
|-&lt;br /&gt;
| RAM&lt;br /&gt;
| От 4 Гб. Для обработки больших проектов рекомендуется не менее 16 Гб&lt;br /&gt;
|-&lt;br /&gt;
| HDD&lt;br /&gt;
| От 1 Гб до нескольких Тб при хранении множества снимков больших проектов&lt;br /&gt;
|-&lt;br /&gt;
| OS&lt;br /&gt;
| &lt;br /&gt;
* Ubuntu 18 и выше&lt;br /&gt;
* Debian 10 и выше&lt;br /&gt;
* RHEL/CentOS 7 и 8&lt;br /&gt;
* Astra Linux Special Edition 1.7, базовый уровень защищенности&lt;br /&gt;
* Microsoft Windows 10 (build 19043.2130, build 19044.2130)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Writer</name></author>
	</entry>
</feed>