2. Конфигурация модуля «Сервиса Формирования документов» (application.yml)
Файл application.yml – основной конфигурационный файл сервиса формирования документов, в котором задана логика и порядок работы сервиса:
настройка и обработка документов;
путь к pebble-шаблонам документов (секция
printable-forms);настройка сервиса формирования подписи (
sign-service);настройка подключения к базе данных (секция:
datasource);настройка проверки состояния БД (секция
health) и другие настройки необходимые для корректной работы сервиса.
2.1. Пример файла application.yml
В конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.
http-server:
port: ${HTTP_PORT:8080}
executor:
reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
prostore-rest-client:
host: ${PS_HOST:localhost}
port: ${PS_PORT:9195}
http:
max-pool-size: ${PS_MAX_POOL_SIZE:20}
metrics:
port: ${METRICS_PORT:9837}
vertx:
web-client:
max-pool-size: 20
counter-service:
host: ${COUNTER_SERVICE_HOST:localhost}
port: ${COUNTER_SERVICE_PORT:9000}
serviceName: ${COUNTER_SERVICE_NAME:printableform}
timeout: ${COUNTER_SERVICE_TIMEOUT:30}
sign-service:
url: ${SIGN_SERVICE_URL:http://localhost:8192}
timeout: ${SIGN_SERVICE_TIMEOUT:30}
pool-size: ${SIGN_SERVICE_POOL_SIZE:5}
notarius:
host: ${NOTARUIS_HOST:localhost}
port: ${NOTARUIS_PORT:8192}
enabled: ${NOTARIUS_ENABLED:FALSE}
props:
maxContentLength: ${NOTARUIS_MAX_CONTENT_LENGTH:104857600}
signatureURI: ${NOTARUIS_SIGNATURE_URI:urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256}
digestMethod: ${NOTARUIS_DIGEST_METHOD:http://www.w3.org/2001/04/xmldsig-more#gostr3411}
printable-forms:
# Таймаут по умолчанию для генерации отчётов, применяется если не задан конкретный таймаут на отчёт
default-request-timeout: 60s
# Список отчетов
reports:
# имя документа
- report: document_1
# Таймаут для генерации отчёта
request-timeout: 30s
# настройки по извлечению данных
extract:
# путь pebble шаблона, который будет извлекать данные
template: extract_static.peb
# настройки по формированию xml документа
xml:
# путь pebble шаблона, который будет формировать xml документ
template: generate_xml_1.peb
# Id подписываемого элемента, если не указано, то подписывается весь xml
elementId: elementToSign
# имя элемента, куда добавлять ЭП, если не указано, то в корень
elementName: signature
# имя файла, если не указано, то <Id_ПФ + ".xml">
fileName: document_1.xml
# настройки по формированию xml документа с открепленной подписью
xml_detached_sig:
# имя файла, если не указано, то <Id_ПФ + ".xml">
fileName: document_1.xml
# имя файла p7s, если не указано, то <Id_ПФ + ".p7s">
fileSign: xmlSign.p7s
# настройки по формированию pdf документа
pdf:
# путь pebble шаблона, который будет формировать pdf документ
template: generate_pdf_1.peb
# имя файла, если не указано, то <Id_ПФ + ".pdf">
fileName: pdfFileName.pdf
# настройки по формированию pdf документа с открепленной подписью
pdf_sig:
# путь pebble шаблона, который будет формировать подписываемый pdf документ, задается в .pdf.template
# (для генерации "pdf без ЭП" и "pdf с ЭП" используется единый pebble-шаблон)
# имя файла, если не указано, то <Id_ПФ + ".pdf">
fileName: pdfFileName.pdf
# имя файла p7s, если не указано, то <Id_ПФ + ".p7s">
fileSign: pdfSign.p7s
# Настройки модуля сбора информации о компонентах витрины
component-info:
enabled: true
# DataSource Prostore
datasource: ''
# Схема Prostore
datamart: component_info
# Имя таблицы для записи информации о компоненте
table-name: component_info
# Период попыток создания схемы, при неуспехе
create-table-period: 60s
# Период публикации health-check
publish-period: 60s
# Период после которого компонент считается неактивным при отсутствии health-check
timeout-active: 300s
# Список элементов конфига маскируемых при отправке,
# если указан узловой элемент, то маскируются все вложенные в него элементы
secrets:
- keys
3. Параметры конфигурации
Настройка конфигурации сервиса формирования документов осуществляется путем редактирования параметров настроек в файле application.yml,
где настраиваются секции:
http-server- указывается порт веб-сервера;executor- предназначена для указания размера пула для запросов;prostore-rest-client- настраивается блок параметров взаимодействия с Prostore;metrics- указывается порт для получения метрик;counter-service- указываются настройки подключения к сервису генерации номера;sign-service- указываются настройки подключения к сервису подписания документа;notarius- указываются настройки сервиса подписания и проверки подписи «Нотариус»;printable-forms- указываются настройки сервиса формирования документов;component-info- настройки модуля сбора информации о компонентах витрины.
3.1. Секция http-server
В секции http-server указывается порт веб-сервера.
Например:
http-server:
port: ${HTTP_PORT:8080}
Параметры настроек
port- порт веб-сервера, например:HTTP_PORT:8080.
3.2. Секция executor
В секции executor указывается размер пула для запросов.
Например:
executor:
reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
Параметры настроек
reader-pool-size- Размер пула для чтения запросов, напримерEXECUTOR_READER_POOL_SIZE:20
3.3. Секция prostore-rest-client
В секции prostore-rest-client настраивается блок параметров взаимодействия с Prostore.
Например:
prostore-rest-client:
host: ${PS_HOST:localhost}
port: ${PS_PORT:9195}
http:
max-pool-size: ${PS_MAX_POOL_SIZE:20}
Параметры настроек
host- адрес Prostore, напримерPS_HOST:localhost;port- порт Prostore, напримерPS_PORT:9195;max-pool-size- максимальное число подключений к Prostore, напримерPS_MAX_POOL_SIZE:20.
3.4. Секция metrics
В секции metrics указывается порт для получения метрик.
Например:
metrics:
port: ${METRICS_PORT:9837}
Параметры настроек
port- порт для получения метрик, напримерMETRICS_PORT:9837
3.5. Секция counter-service
В секции counter-service настраивается подключение к сервису генерации номера.
Например:
counter-service:
host: ${COUNTER_SERVICE_HOST:localhost}
port: ${COUNTER_SERVICE_PORT:9000}
serviceName: ${COUNTER_SERVICE_NAME:printableform}
timeout: ${COUNTER_SERVICE_TIMEOUT:30}
Параметры настроек
host- адрес сервиса генерации номера, напримерCOUNTER_SERVICE_HOST:t5-printable-form-01.ru-central1.internal;port- порт сервиса генерации номера, напримерCOUNTER_SERVICE_PORT:9000;serviceName- значение имени сервиса, напримерCOUNTER_SERVICE_NAME:printableform;timeout- таймаут на генерации номера, напримерCOUNTER_SERVICE_TIMEOUT:30.
3.6. Секция sign-service
В секции sign-service настраивается подключение к сервису подписания документа.
Например:
sign-service:
url: ${SIGN_SERVICE_URL:http://dev-dtm-poddagent01.ru-central1.internal:8192}
timeout: ${SIGN_SERVICE_TIMEOUT:30}
pool-size: ${SIGN_SERVICE_POOL_SIZE:5}
Параметры настроек
url- URL сервиса подписания документа, напримерSIGN_SERVICE_URL:http://dev-dtm-poddagent01.ru-central1.internal:8192;timeout- таймаут на подписание документа (сек), напримерSIGN_SERVICE_TIMEOUT:30;pool-size- размер пула для сервиса подписания, напримерSIGN_SERVICE_POOL_SIZE:5.
3.7. Секция notarius
В секции notarius указываются настройки сервиса Нотариус.
Например:
notarius:
host: ${NOTARUIS_HOST:dev-dtm-poddagent01.ru-central1.internal}
port: ${NOTARUIS_PORT:8192}
enabled: ${NOTARIUS_ENABLED:FALSE}
props:
maxContentLength: ${NOTARUIS_MAX_CONTENT_LENGTH:104857600}
signatureURI: ${NOTARUIS_SIGNATURE_URI:urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256}
digestMethod: ${NOTARUIS_DIGEST_METHOD:http://www.w3.org/2001/04/xmldsig-more#gostr3411}
Параметры настроек
host- адрес сервиса Нотариус, напримерNOTARUIS_HOST:dev-dtm-poddagent01.ru-central1.internal;port- порт сервиса Нотариус, напримерNOTARUIS_PORT:8192;enabled- выбор сервиса подписания между schloussler и notarius, напримерNOTARIUS_ENABLED:FALSE;maxContentLength- максимальный размер отправляемого объекта, напримерNOTARUIS_MAX_CONTENT_LENGTH:1048576005;signatureURI- URI алгоритма хэширования, напримерNOTARUIS_SIGNATURE_URI:urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256;digestMethod- алгоритм хэширования, напримерNOTARUIS_DIGEST_METHOD:http://www.w3.org/2001/04/xmldsig-more#gostr3411.
3.8. Секция printable-forms
В секции printable-forms настраивается сервис формирования документов.
Например:
printable-forms:
# Таймаут по умолчанию для генерации отчётов, применяется если не задан конкретный таймаут на отчёт
default-request-timeout: 60s
# Список отчетов
reports:
# имя документа
- report: document_1
# Таймаут для генерации отчёта
request-timeout: 30s
# настройки по извлечению данных
extract:
# путь pebble шаблона, который будет извлекать данные
template: extract_static.peb
# настройки по формированию xml документа
xml:
# путь pebble шаблона, который будет формировать xml документ
template: generate_xml_1.peb
# Id подписываемого элемента, если не указано, то подписывается весь xml
elementId: elementToSign
# имя элемента, куда добавлять ЭП, если не указано, то в корень
elementName: signature
# имя файла, если не указано, то <Id_ПФ + ".xml">
fileName: document_1.xml
# настройки по формированию xml документа с открепленной подписью
xml_detached_sig:
# имя файла, если не указано, то <Id_ПФ + ".xml">
fileName: document_1.xml
# имя файла p7s, если не указано, то <Id_ПФ + ".p7s">
fileSign: xmlSign.p7s
# настройки по формированию pdf документа
pdf:
# путь pebble шаблона, который будет формировать pdf документ
template: generate_pdf_1.peb
# имя файла, если не указано, то <Id_ПФ + ".pdf">
fileName: pdfFileName.pdf
# настройки по формированию pdf документа с открепленной подписью
pdf_sig:
# путь pebble шаблона, который будет формировать подписываемый pdf документ, задается в .pdf.template
# (для генерации "pdf без ЭП" и "pdf с ЭП" используется единый pebble-шаблон)
# имя файла, если не указано, то <Id_ПФ + ".pdf">
fileName: pdfFileName.pdf
# имя файла p7s, если не указано, то <Id_ПФ + ".p7s">
fileSign: pdfSign.p7s
Внимание
В конфигурационном файле application.yml пути к файлам pebble-шаблонов должны быть либо: относительно директории запуска, либо абсолютные пути.
3.9. Секция component-info
В секции component-info хранятся настройки компонента сбора информации о компонентах витрины.
Например:
# Настройки модуля сбора информации о компонентах витрины
component-info:
enabled: true
# DataSource Prostore
datasource: ''
# Схема Prostore
datamart: component_info
# Имя таблицы для записи информации о компоненте
table-name: component_info
# Период попыток создания схемы, при неуспехе
create-table-period: 60s
# Период публикации health-check
publish-period: 60s
# Период после которого компонент считается неактивным при отсутствии health-check
timeout-active: 300s
# Список элементов конфига маскируемых при отправке,
# если указан узловой элемент, то маскируются все вложенные в него элементы
secrets:
- keys
Параметры настроек
enabled- статус подключения компонента, указывается булево значение;datasource- датасорс Prostore;datamart- схема Prostore;table-name- имя таблицы для записи информации о компоненте;create-table-period- период попыток создания схемы, при неуспехе, указывается в секундах;publish-period- период публикации health-check, указывается в секундах;timeout-active- период после которого компонент считается неактивным при отсутствии health-check, указывается в секундах;secrets- список элементов конфига маскируемых при отправке, если указан узловой элемент, то маскируются все вложенные в него элементы.
4. Примеры pebble-шаблонов для Сервиса Формирования документов
4.1. Возможность вызова REST-сервисов из шаблона Сервиса Формирования документов
Для вызова REST-сервисов из шаблона Сервиса Формирования документов используется функция callRest.
Пример вызова функции из pebble-шаблона:
{% set host = "smevql-dtm-smevqlserver01.ru-central1.internal" %}
{% set port = "8080" %}
{% set route = "data" %}
{% set rq = "${jsonRequest.replace("\"", "\\\"")}" %}
{% set varName = callRest(
method = "POST",
url = "http://#\{host}:#{port}/#{route}",
headers = "Content-Type=application/json",
body = rq,
responseType = "JSON"
)
%}
{{ varName["response"]["ticket"][0]["id"]}}
Для асинхронного вызова (без ожидания ответа), необходимо выставить параметр async=true.
4.2. Pebble-шаблон для обработки поступившего запроса и формирования json-файла
{# формируем sql запрос в переменную passengersquery#}
{% var passengersquery %}
{% if params[0] is empty %}
select * from smart.all_types limit 10
{% else %}
select * from smart.all_types limit {{ params[0] }}
{% endif %}
{% endvar %}
{# выполняем sql запрос и помещаем результат выполнения в переменную rows.searchpassenger #}
{{ sql("searchpassenger", passengersquery) }}
{% var json_data %}
{
"passengers": [
{% for p in rows.searchpassenger %}
{# формируем json динамически #}
{% if loop.first %}
{% else %}
,
{% endif %}
{
"id": "{{ p.id }}",
"firstname": "{{ p.firstname }}",
"middlename": "{{ p.middlename }}",
"lastname": "{{ p.lastname }}",
"birthday": "{{ p.birthday }}"
}
{% endfor %}
]
}
{% endvar %}
{#выведем полученный json в неэкранированной форме#}
{{ json_data | raw }}
4.3. Pebble-шаблон для формирования xml-документа
<root>
<passengers Id="elementToSign">
{% for p in data.passengers %}
<passenger id="{{ p.id }}">
<firstname>{{ p.firstname }}</firstname>
<middlename>{{ p.middlename }}</middlename>
<lastname>{{ p.lastname }}</lastname>
<birthday>{{ p.birthday }}</birthday>
</passenger>
<cert>
<organization>{{ certification_info.subjectDN.commonName }}</organization>
<serial>{{ dec_to_hex(certification_info.serialNumber) }}</serial>
<issuer>{{ certification_info.issuerDN.commonName }}</issuer>
<valid-from>{{ certification_info.notBefore | date("dd.MM.yyyy") }}</valid-from>
<valid-until>{{ certification_info.notAfter | date("dd.MM.yyyy") }}</valid-until>
</cert>
{% endfor %}
</passengers>
<signature/>
</root>
4.4. Pebble-шаблон для формирования pdf-документа
<html>
<head>
<style>
table, th, td {
border: 1px solid black;
}
</style>
</head>
<body>
<h3>Certificate</h3>
<table>
<tr>
<th>Организация</th>
<th>Сертификат</th>
<th>Издатель</th>
<th>Действителен с</th>
<th>Действителен по</th>
</tr>
<tr>
<td>{{ certification_info.subjectDN.commonName }}</td>
<td>{{ certification_info.serialNumber }}</td>
<td>{{ certification_info.issuerDN.commonName }}</td>
<td>{{ certification_info.notBefore }}</td>
<td>{{ certification_info.notAfter }}</td>
</tr>
</table>
<h3>Passengers</h3>
<table>
<tr>
<th>id</th>
<th>firstname</th>
<th>middlename</th>
<th>lastname</th>
<th>birthday</th>
</tr>
{% for p in data.passengers %}
<tr>
<td>{{ p.id }}</td>
<td>{{ p.firstname }}</td>
<td>{{ p.middlename }}</td>
<td>{{ p.lastname }}</td>
<td>{{ p.birthday }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>