Внешние накопители API 1.7.0
Методы API для работы с разделом «Внешние накопители».
Базовый путь: https://{IP_контроллера}/api/v1.
Версия описания API: 1.7.0.
Примеры используют placeholder-значения для паролей, token, UUID, адресов и секретов. Перед выполнением запроса замените их на значения вашего контроллера.
Методы раздела
POST /external-storage/clean
Раздел: Внешние накопители.
Выполняет очистку файлов базы данных на внешнем накопителе. Возможные ответы: - success: успешная очистка - no_event_manager: EventDataManager недоступен - clean_failed: ошибка при очистке Если указан параметр controller, команда отправляется на указанный контроллер кластера через MQTT.
Параметры и ответы по OpenAPI
{
"summary": "Очистка файлов БД на внешнем накопителе",
"description": "Выполняет очистку файлов базы данных на внешнем накопителе.\nВозможные ответы:\n- success: успешная очистка\n- no_event_manager: EventDataManager недоступен\n- clean_failed: ошибка при очистке\n\nЕсли указан параметр `controller`, команда отправляется на указанный контроллер кластера через MQTT.\n",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"controller"
],
"properties": {
"controller": {
"type": "string",
"description": "Серийный номер контроллера, для которого выполняется команда",
"example": "00000002"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Команда очистки выполнена успешно",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции"
},
"message": {
"type": "string",
"description": "Описание результата"
},
"result": {
"type": "string",
"description": "Результат операции"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
},
"result": {
"type": "string",
"description": "Результат операции",
"example": "no_event_manager"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/clean" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data-raw '{
"controller": "00000002"
}'
Пример тела запроса
{
"controller": "00000002"
}
Пример ответа
{
"success": true,
"message": "string",
"result": "string"
}
POST /external-storage/command
Раздел: Внешние накопители.
Отправка кастомной команды внешнему накопителю. Если указан параметр controller, команда отправляется на указанный контроллер кластера через MQTT.
Параметры и ответы по OpenAPI
{
"description": "Отправка кастомной команды внешнему накопителю.\nЕсли указан параметр `controller`, команда отправляется на указанный контроллер кластера через MQTT.\n",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"type",
"controller"
],
"properties": {
"type": {
"type": "string",
"description": "Тип команды",
"example": "status"
},
"controller": {
"type": "string",
"description": "Серийный номер контроллера, для которого выполняется команда",
"example": "00000002"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Команда внешнему накопителю отправлена успешно",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": true
},
"message": {
"type": "string",
"description": "Сообщение о результате",
"example": "Команда внешнему накопителю отправлена успешно"
},
"command": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Тип команды",
"example": "format"
}
}
}
}
}
}
}
},
"400": {
"description": "Неверный запрос (отсутствует type или controller)",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/command" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data-raw '{
"type": "status",
"controller": "00000002"
}'
Пример тела запроса
{
"type": "status",
"controller": "00000002"
}
Пример ответа
{
"success": true,
"message": "Команда внешнему накопителю отправлена успешно",
"command": {
"type": "format"
}
}
DELETE /external-storage/controller/{serial}
Раздел: Внешние накопители.
Удаляет информацию о контроллере с внешним накопителем из Redis с репликацией на другие контроллеры кластера.
Параметры и ответы по OpenAPI
{
"summary": "Удаление информации о контроллере по серийному номеру",
"description": "Удаляет информацию о контроллере с внешним накопителем из Redis с репликацией на другие контроллеры кластера.",
"parameters": [
{
"name": "serial",
"in": "path",
"required": true,
"description": "Серийный номер контроллера",
"schema": {
"type": "string",
"example": "00015454"
}
}
],
"responses": {
"200": {
"description": "Информация о контроллере успешно удалена",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": true
},
"message": {
"type": "string",
"description": "Описание результата",
"example": "Информация о контроллере с серийным номером 00015454 успешно удалена"
},
"deleted_controller": {
"type": "object",
"properties": {
"serial": {
"type": "string",
"description": "Серийный номер удалённого контроллера",
"example": "00015454"
},
"timestamp": {
"type": "integer",
"format": "int64",
"description": "Временная метка удаления (мс)",
"example": 1672531200000
}
}
}
}
}
}
}
},
"400": {
"description": "Серийный номер не указан",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"example": "Серийный номер контроллера обязателен для удаления информации"
},
"result": {
"type": "string",
"example": "missing_serial"
}
}
}
}
}
},
"404": {
"description": "Информация о контроллере не найдена",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"example": "Информация о контроллере с серийным номером 00015454 не найдена"
},
"result": {
"type": "string",
"example": "controller_not_found"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X DELETE "https://{IP_контроллера}/api/v1/external-storage/controller/{serial}" \
-H "Authorization: Bearer <token>"
Пример ответа
{
"success": true,
"message": "Информация о контроллере с серийным номером 00015454 успешно удалена",
"deleted_controller": {
"serial": "00015454",
"timestamp": 1672531200000
}
}
GET /external-storage/controllers
Раздел: Внешние накопители.
Возвращает список всех контроллеров с внешним накопителем в кластере.
Параметры и ответы по OpenAPI
{
"summary": "Получение списка контроллеров с внешним накопителем",
"description": "Возвращает список всех контроллеров с внешним накопителем в кластере",
"responses": {
"200": {
"description": "Список контроллеров",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"properties": {
"controller": {
"type": "string",
"description": "IP-адрес контроллера",
"example": "192.168.0.30"
},
"description": {
"type": "string",
"description": "Описание контроллера",
"example": "Current external storage controller"
},
"status": {
"type": "string",
"description": "Статус внешнего накопителя",
"example": "mounted"
}
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"success"
],
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string"
},
"data": {
"type": "object"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X GET "https://{IP_контроллера}/api/v1/external-storage/controllers" \
-H "Authorization: Bearer <token>"
Пример ответа
[
{
"controller": "192.168.0.30",
"description": "Current external storage controller",
"status": "mounted"
}
]
GET /external-storage/controllers/status
Раздел: Внешние накопители.
Возвращает статус внешних накопителей всех контроллеров в кластере.
Параметры и ответы по OpenAPI
{
"summary": "Получение статуса контроллеров кластера",
"description": "Возвращает статус внешних накопителей всех контроллеров в кластере",
"responses": {
"200": {
"description": "Статус контроллеров успешно получен",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"properties": {
"controller": {
"type": "string",
"description": "IP-адрес контроллера в локальной сети",
"example": "172.16.165.127"
},
"status": {
"type": "string",
"description": "Статус внешнего накопителя",
"example": "mounted"
}
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"success"
],
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string"
},
"data": {
"type": "object"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X GET "https://{IP_контроллера}/api/v1/external-storage/controllers/status" \
-H "Authorization: Bearer <token>"
Пример ответа
[
{
"controller": "172.16.165.127",
"status": "mounted"
}
]
POST /external-storage/debug/create-test-file
Раздел: Внешние накопители.
Этот маршрут используется для диагностики проблемы с созданием файла базы данных на внешнем накопителе. Он проверяет права доступа к директории, возможность создания и удаления файлов, а также доступ к файлу базы данных.
Параметры и ответы по OpenAPI
{
"summary": "Тестовый маршрут для диагностики создания файлов на внешнем накопителе",
"description": "Этот маршрут используется для диагностики проблемы с созданием файла базы данных на внешнем накопителе.\nОн проверяет права доступа к директории, возможность создания и удаления файлов, а также доступ к файлу базы данных.\n",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"fileName": {
"type": "string",
"description": "Имя для тестового файла (по умолчанию 'test_db_creation')",
"default": "test_db_creation"
},
"directory": {
"type": "string",
"description": "Директория для тестирования (по умолчанию используется директория из конфигурации БД)"
},
"altPaths": {
"type": "array",
"items": {
"type": "string"
},
"description": "Один или несколько альтернативных путей для проверки (переопределяют стандартные пути)"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Диагностика выполнена успешно",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Указывает на успешность операции"
},
"message": {
"type": "string",
"description": "Сообщение о результате операции"
},
"requestedParams": {
"type": "object",
"description": "Параметры, переданные в запросе",
"properties": {
"fileName": {
"type": "string",
"description": "Имя файла, которое использовалось для теста"
},
"directory": {
"type": "string",
"description": "Директория, которая использовалась для теста (если была указана)"
},
"altPaths": {
"type": "array",
"items": {
"type": "string"
},
"description": "Альтернативные пути, которые использовались для теста (если были указаны)"
}
}
},
"diagnostics": {
"type": "object",
"description": "Диагностическая информация",
"properties": {
"dbConfig": {
"type": "object",
"description": "Конфигурация базы данных"
},
"dbPath": {
"type": "string",
"description": "Путь к файлу базы данных"
},
"dbDir": {
"type": "string",
"description": "Директория базы данных"
},
"testFilePath": {
"type": "string",
"description": "Путь к тестовому файлу"
},
"fileSystemChecks": {
"type": "object",
"description": "Результаты проверок файловой системы",
"properties": {
"directoryExists": {
"type": "boolean",
"description": "Существует ли директория"
},
"testFileCreated": {
"type": "boolean",
"description": "Удалось ли создать тестовый файл"
},
"testFileContentCorrect": {
"type": "boolean",
"description": "Правильное ли содержимое у тестового файла"
},
"testFileDeleted": {
"type": "boolean",
"description": "Удалось ли удалить тестовый файл"
},
"directoryError": {
"type": "string",
"description": "Ошибка при проверке существования директории"
},
"testFileError": {
"type": "string",
"description": "Ошибка при создании тестового файла"
}
}
},
"accessRights": {
"type": "object",
"description": "Результаты проверок прав доступа",
"properties": {
"directoryWriteable": {
"type": "boolean",
"description": "Можно ли писать в директорию"
},
"directoryReadable": {
"type": "boolean",
"description": "Можно ли читать из директории"
},
"directoryExecutable": {
"type": "boolean",
"description": "Можно ли выполнять в директории"
},
"databaseFileAccessible": {
"type": "boolean",
"description": "Можно ли получить доступ к файлу базы данных"
},
"directoryWriteError": {
"type": "string",
"description": "Ошибка при проверке прав на запись"
},
"directoryReadError": {
"type": "string",
"description": "Ошибка при проверке прав на чтение"
},
"directoryExecuteError": {
"type": "string",
"description": "Ошибка при проверке прав на выполнение"
},
"databaseFileError": {
"type": "string",
"description": "Ошибка при доступе к файлу базы данных"
}
}
}
}
}
}
}
}
}
},
"500": {
"description": "Ошибка при выполнении диагностики",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Указывает на успешность операции"
},
"message": {
"type": "string",
"description": "Сообщение о результате операции"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/debug/create-test-file" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data-raw '{
"fileName": "test_db_creation",
"directory": "string",
"altPaths": [
"string"
]
}'
Пример тела запроса
{
"fileName": "test_db_creation",
"directory": "string",
"altPaths": [
"string"
]
}
Пример ответа
{
"success": true,
"message": "string",
"requestedParams": {
"fileName": "string",
"directory": "string",
"altPaths": [
"string"
]
},
"diagnostics": {
"dbConfig": {},
"dbPath": "string",
"dbDir": "string",
"testFilePath": "string",
"fileSystemChecks": {
"directoryExists": true,
"testFileCreated": true,
"testFileContentCorrect": true,
"testFileDeleted": true,
"directoryError": "string",
"testFileError": "string"
},
"accessRights": {
"directoryWriteable": true,
"directoryReadable": true,
"directoryExecutable": true,
"databaseFileAccessible": true,
"directoryWriteError": "string",
"directoryReadError": "string",
"directoryExecuteError": "string",
"databaseFileError": "string"
}
}
}
POST /external-storage/debug/migration
Раздел: Внешние накопители.
Запускает миграцию данных на внешний накопитель аналогично автоматическому запуску по cron в 0 часов.
Параметры и ответы по OpenAPI
{
"summary": "Тестовый маршрут для ручного запуска миграции данных",
"description": "Запускает миграцию данных на внешний накопитель аналогично автоматическому запуску\nпо cron в 0 часов.\n",
"responses": {
"200": {
"description": "Миграция запущена",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Указывает на успешность операции"
},
"message": {
"type": "string",
"description": "Сообщение о результате операции"
}
}
}
}
}
},
"400": {
"description": "Внешний накопитель недоступен",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/debug/migration" \
-H "Authorization: Bearer <token>"
Пример ответа
{
"success": true,
"message": "string"
}
POST /external-storage/debug/threshold-migration
Раздел: Внешние накопители.
Проверяет общее количество событий и запускает перенос на внешний накопитель, если количество превышает порог (по умолчанию 20000). Аналог автоматической проверки, выполняемой раз в 30 минут.
Параметры и ответы по OpenAPI
{
"summary": "Отладочный запуск пороговой миграции",
"description": "Проверяет общее количество событий и запускает перенос на внешний накопитель,\nесли количество превышает порог (по умолчанию 20000).\nАналог автоматической проверки, выполняемой раз в 30 минут.\n",
"responses": {
"200": {
"description": "Результат проверки порога и миграции",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Указывает на успешность операции"
},
"message": {
"type": "string",
"description": "Сообщение о результате операции"
},
"totalCount": {
"type": "integer",
"description": "Общее количество событий в Redis"
},
"threshold": {
"type": "integer",
"description": "Пороговое значение для миграции"
},
"migrated": {
"type": "integer",
"description": "Количество перенесённых событий (0 если миграция не требовалась)"
}
}
}
}
}
},
"400": {
"description": "Внешний накопитель недоступен",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/debug/threshold-migration" \
-H "Authorization: Bearer <token>"
Пример ответа
{
"success": true,
"message": "string",
"totalCount": 1,
"threshold": 1,
"migrated": 1
}
POST /external-storage/disconnect
Раздел: Внешние накопители.
Отправка команды отключения внешнего накопителя. Если указан параметр controller, команда отправляется на указанный контроллер кластера через MQTT.
Параметры и ответы по OpenAPI
{
"description": "Отправка команды отключения внешнего накопителя.\nЕсли указан параметр `controller`, команда отправляется на указанный контроллер кластера через MQTT.\n",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"controller"
],
"properties": {
"controller": {
"type": "string",
"description": "Серийный номер контроллера, для которого выполняется команда",
"example": "00000002"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Команда отключения отправлена успешно",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": true
},
"message": {
"type": "string",
"description": "Сообщение о результате",
"example": "Команда отключения внешнего накопителя отправлена успешно"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/disconnect" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data-raw '{
"controller": "00000002"
}'
Пример тела запроса
{
"controller": "00000002"
}
Пример ответа
{
"success": true,
"message": "Команда отключения внешнего накопителя отправлена успешно"
}
GET /external-storage/events
Раздел: Внешние накопители.
Получение данных журнала действия с накопителем (без пагинации). Возвращает события всех типов, отсортированные по времени (новые первыми). Если указан параметр controller, запрос перенаправляется на указанный контроллер кластера.
Параметры и ответы по OpenAPI
{
"description": "Получение данных журнала действия с накопителем (без пагинации). Возвращает события всех типов, отсортированные по времени (новые первыми). Если указан параметр controller, запрос перенаправляется на указанный контроллер кластера.",
"parameters": [
{
"name": "controller",
"in": "query",
"description": "Серийный номер контроллера кластера, с которого нужно получить события. Если не указан, возвращаются события локального контроллера.",
"required": false,
"schema": {
"type": "string",
"example": "00000002"
}
},
{
"name": "memory_increase",
"in": "query",
"description": "Если true, возвращается укороченная схема событий (uuid, timestamp, action)",
"required": false,
"schema": {
"type": "boolean",
"default": false
}
}
],
"responses": {
"200": {
"description": "Данные журнала действия с накопителем",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": true
},
"events": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"uuid": {
"type": "string"
},
"timestamp": {
"type": "integer"
},
"action": {
"type": "string",
"description": "Текст из поля description события"
}
},
"required": [
"uuid",
"timestamp",
"action"
]
},
{
"type": "object",
"properties": {
"uuid": {
"type": "string"
},
"timestamp": {
"type": "integer"
},
"type": {
"type": "string"
},
"event_type": {
"type": "string",
"description": "Тип события (audit_event, access_event, notification_event)"
},
"data": {
"type": "object"
}
},
"required": [
"uuid",
"timestamp"
]
}
]
}
}
}
}
}
}
},
"400": {
"description": "Контроллер недоступен или не найден в VPN",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"success"
],
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string"
},
"data": {
"type": "object"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"success"
],
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string"
},
"data": {
"type": "object"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X GET "https://{IP_контроллера}/api/v1/external-storage/events" \
-H "Authorization: Bearer <token>"
Пример ответа
{
"success": true,
"events": [
{
"uuid": "string",
"timestamp": 1,
"action": "string"
}
]
}
POST /external-storage/force-migrate
Раздел: Внешние накопители.
Принудительный перенос ВСЕХ событий из Redis на внешний USB-накопитель. Перенос выполняется батчами от новых событий к старым. Если указан параметр controller, команда отправляется на указанный контроллер кластера через MQTT.
Параметры и ответы по OpenAPI
{
"description": "Принудительный перенос ВСЕХ событий из Redis на внешний USB-накопитель.\nПеренос выполняется батчами от новых событий к старым.\nЕсли указан параметр `controller`, команда отправляется на указанный контроллер кластера через MQTT.\n",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"controller"
],
"properties": {
"controller": {
"type": "string",
"description": "Серийный номер контроллера, на котором выполняется перенос",
"example": "00000002"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Принудительный перенос событий завершен",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": true
},
"message": {
"type": "string",
"example": "Принудительный перенос событий завершен"
},
"migrated": {
"type": "integer",
"description": "Количество перенесённых записей",
"example": 1250
}
}
}
}
}
},
"400": {
"description": "Ошибка выполнения:\n- Параметр `controller` не указан\n- Внешний накопитель недоступен или не готов к операции\n",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"example": "Внешний накопитель недоступен или не готов к операции"
}
}
}
}
}
},
"409": {
"description": "Миграция уже активна",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"example": "Повторите позже. Выполняется перенос событий"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/force-migrate" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data-raw '{
"controller": "00000002"
}'
Пример тела запроса
{
"controller": "00000002"
}
Пример ответа
{
"success": true,
"message": "Принудительный перенос событий завершен",
"migrated": 1250
}
GET /external-storage/format
Раздел: Внешние накопители.
Возвращает текущий статус процесса форматирования внешнего накопителя. Статусы форматирования: - idle — форматирование не запущено - running — форматирование выполняется - successful — форматирование завершено успешно - failed — форматирование завершилось ошибкой - interrupted — форматирование было прервано (накопитель стал недоступен) Проксирование на другие контроллеры: Если указан параметр controller (в query или body), запрос перенаправляется на указанный контроллер кластера через MQTT.
Параметры и ответы по OpenAPI
{
"summary": "Получение статуса форматирования внешнего накопителя",
"description": "Возвращает текущий статус процесса форматирования внешнего накопителя.\n\nСтатусы форматирования:\n- `idle` — форматирование не запущено\n- `running` — форматирование выполняется\n- `successful` — форматирование завершено успешно\n- `failed` — форматирование завершилось ошибкой\n- `interrupted` — форматирование было прервано (накопитель стал недоступен)\n\n**Проксирование на другие контроллеры:**\nЕсли указан параметр `controller` (в query или body), запрос перенаправляется на указанный контроллер кластера через MQTT.\n",
"parameters": [
{
"name": "serial",
"in": "path",
"required": true,
"description": "Серийный номер контроллера",
"schema": {
"type": "string",
"example": "00000002"
}
}
],
"responses": {
"200": {
"description": "Статус форматирования успешно получен",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": true
},
"message": {
"type": "string",
"description": "Описание результата",
"example": "Статус форматирования успешно получен"
},
"storage_available": {
"type": "boolean",
"description": "Доступен ли накопитель в момент запроса",
"example": true
},
"format_status": {
"type": "object",
"description": "Статус форматирования",
"properties": {
"status": {
"type": "string",
"description": "Статус выполнения форматирования",
"enum": [
"idle",
"running",
"successful",
"failed",
"interrupted"
],
"example": "running"
},
"timestamp": {
"type": "integer",
"format": "int64",
"nullable": true,
"description": "Временная метка в миллисекундах",
"example": 1672531200000
},
"data": {
"type": "string",
"description": "Дополнительные данные",
"example": ""
}
}
}
}
}
}
}
},
"400": {
"description": "Ошибка — неверный серийный номер контроллера или контроллер недоступен",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X GET "https://{IP_контроллера}/api/v1/external-storage/format" \
-H "Authorization: Bearer <token>"
Пример ответа
{
"success": true,
"message": "Статус форматирования успешно получен",
"storage_available": true,
"format_status": {
"status": "running",
"timestamp": 1672531200000,
"data": ""
}
}
POST /external-storage/format
Раздел: Внешние накопители.
Запускает процесс форматирования внешнего накопителя без ожидания завершения операции. Процесс включает: - Форматирование накопителя в файловую систему ext4 - Открытие криптоконтейнера - Монтирование файловой системы Команда выполняется асинхронно — для получения результата используйте GET /api/v1/external-storage/format/{serial}. Возможные статусы форматирования (возвращаются через GET /format/{serial}): - idle — форматирование не запущено - running — форматирование выполняется - successful — форматирование завершено успешно - failed — форматирование завершилось ошибкой - interrupted — форматирование было прервано (накопитель стал недоступен) Проксирование на другие контроллеры: Если указан параметр controller (в query или body), команда отправляется на указанный контроллер кластера через MQTT. В случае ошибки проксирования возвращается код 400 или 500.
Параметры и ответы по OpenAPI
{
"summary": "Отправка команды форматирования внешнего накопителя (без ожидания завершения)",
"description": "Запускает процесс форматирования внешнего накопителя без ожидания завершения операции.\nПроцесс включает:\n- Форматирование накопителя в файловую систему ext4\n- Открытие криптоконтейнера\n- Монтирование файловой системы\n\nКоманда выполняется асинхронно — для получения результата используйте GET /api/v1/external-storage/format/{serial}.\n\nВозможные статусы форматирования (возвращаются через GET /format/{serial}):\n- `idle` — форматирование не запущено\n- `running` — форматирование выполняется\n- `successful` — форматирование завершено успешно\n- `failed` — форматирование завершилось ошибкой\n- `interrupted` — форматирование было прервано (накопитель стал недоступен)\n\n**Проксирование на другие контроллеры:**\nЕсли указан параметр `controller` (в query или body), команда отправляется на указанный контроллер кластера через MQTT.\nВ случае ошибки проксирования возвращается код 400 или 500.\n",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"controller"
],
"properties": {
"controller": {
"type": "string",
"description": "Серийный номер контроллера, для которого выполняется команда",
"example": "00000002"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Команда форматирования запущена",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность запуска команды",
"example": true
},
"message": {
"type": "string",
"description": "Описание результата",
"example": "Команда форматирования внешнего накопителя запущена"
},
"format_status": {
"type": "object",
"description": "Статус форматирования",
"properties": {
"status": {
"type": "string",
"description": "Статус выполнения форматирования",
"enum": [
"idle",
"running",
"successful",
"failed",
"interrupted"
],
"example": "running"
},
"timestamp": {
"type": "integer",
"format": "int64",
"nullable": true,
"description": "Временная метка в миллисекундах",
"example": 1672531200000
},
"data": {
"type": "string",
"description": "Дополнительные данные",
"example": ""
}
}
}
}
}
}
}
},
"400": {
"description": "Ошибка выполнения:\n- Параметр `controller` не указан\n- Накопитель отсутствует или неизвестного вендора\n- Накопитель не готов к операции\n- Форматирование уже запущено\n",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки",
"example": "Внешний накопитель недоступен или не готов к операции"
},
"format_status": {
"type": "object",
"description": "Статус форматирования",
"properties": {
"status": {
"type": "string",
"description": "Статус выполнения форматирования",
"enum": [
"idle",
"running",
"successful",
"failed",
"interrupted"
],
"example": "running"
},
"timestamp": {
"type": "integer",
"format": "int64",
"nullable": true,
"description": "Временная метка в миллисекундах",
"example": 1672531200000
},
"data": {
"type": "string",
"description": "Дополнительные данные",
"example": ""
}
}
},
"result": {
"type": "string",
"description": "Код результата",
"example": "missing_controller"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки",
"example": "Внутренняя ошибка сервера"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/format" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data-raw '{
"controller": "00000002"
}'
Пример тела запроса
{
"controller": "00000002"
}
Пример ответа
{
"success": true,
"message": "Команда форматирования внешнего накопителя запущена",
"format_status": {
"status": "running",
"timestamp": 1672531200000,
"data": ""
}
}
GET /external-storage/format/{serial}
Раздел: Внешние накопители.
Возвращает статус процесса форматирования внешнего накопителя.
Параметры и ответы по OpenAPI
{
"summary": "Получение статуса форматирования",
"description": "Возвращает статус процесса форматирования внешнего накопителя",
"parameters": [
{
"name": "serial",
"in": "path",
"required": true,
"description": "Серийный номер контроллера",
"schema": {
"type": "string",
"example": "00000002"
}
}
],
"responses": {
"200": {
"description": "Статус форматирования успешно получен",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": true
},
"message": {
"type": "string",
"description": "Описание результата",
"example": "Статус форматирования успешно получен"
},
"storage_available": {
"type": "boolean",
"description": "Доступен ли накопитель в момент запроса",
"example": true
},
"format_status": {
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Статус форматирования",
"example": "successful",
"enum": [
"idle",
"running",
"successful",
"failed",
"interrupted"
]
},
"timestamp": {
"type": "integer",
"format": "int64",
"description": "Временная метка (мс)",
"example": 1672531200000
},
"data": {
"type": "string",
"description": "Зарезервировано на будущее (всегда пустая строка)",
"example": ""
}
}
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X GET "https://{IP_контроллера}/api/v1/external-storage/format/{serial}" \
-H "Authorization: Bearer <token>"
Пример ответа
{
"success": true,
"message": "Статус форматирования успешно получен",
"storage_available": true,
"format_status": {
"status": "successful",
"timestamp": 1672531200000,
"data": ""
}
}
POST /external-storage/fsck
Раздел: Внешние накопители.
Ручная проверка состояния внешнего накопителя с помощью fsck. Если указан параметр controller, команда отправляется на указанный контроллер кластера через MQTT.
Параметры и ответы по OpenAPI
{
"description": "Ручная проверка состояния внешнего накопителя с помощью fsck.\nЕсли указан параметр `controller`, команда отправляется на указанный контроллер кластера через MQTT.\n",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"controller"
],
"properties": {
"controller": {
"type": "string",
"description": "Серийный номер контроллера, для которого выполняется команда",
"example": "00000002"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Команда проверки fsck внешнего накопителя отправлена успешно",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": true
},
"message": {
"type": "string",
"description": "Сообщение о результате",
"example": "Команда проверки fsck внешнего накопителя запущена"
},
"fsck_status": {
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Статус проверки fsck",
"enum": [
"idle",
"running",
"successful",
"failed",
"interrupted"
],
"example": "running"
},
"timestamp": {
"type": "integer",
"format": "int64",
"description": "Временная метка (мс)",
"example": 1672531200000
},
"data": {
"type": "string",
"description": "Вывод утилиты fsck из топика /flash/log",
"example": ""
}
}
}
}
}
}
}
},
"400": {
"description": "Ошибка выполнения:\n- Параметр `controller` не указан\n- Проверка fsck уже запущена\n",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"example": "Команда fsck уже запущена"
},
"result": {
"type": "string",
"example": "missing_controller"
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X POST "https://{IP_контроллера}/api/v1/external-storage/fsck" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data-raw '{
"controller": "00000002"
}'
Пример тела запроса
{
"controller": "00000002"
}
Пример ответа
{
"success": true,
"message": "Команда проверки fsck внешнего накопителя запущена",
"fsck_status": {
"status": "running",
"timestamp": 1672531200000,
"data": ""
}
}
GET /external-storage/fsck/{serial}
Раздел: Внешние накопители.
Возвращает статус проверки файловой системы внешнего накопителя.
Параметры и ответы по OpenAPI
{
"summary": "Получение статуса проверки fsck",
"description": "Возвращает статус проверки файловой системы внешнего накопителя",
"parameters": [
{
"name": "serial",
"in": "path",
"required": true,
"description": "Серийный номер контроллера",
"schema": {
"type": "string",
"example": "00000002"
}
}
],
"responses": {
"200": {
"description": "Статус fsck успешно получен",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "Успешность операции",
"example": true
},
"message": {
"type": "string",
"description": "Описание результата",
"example": "Статус fsck успешно получен"
},
"storage_available": {
"type": "boolean",
"description": "Доступен ли накопитель в момент запроса",
"example": true
},
"fsck_status": {
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Статус проверки fsck",
"example": "successful",
"enum": [
"idle",
"running",
"successful",
"failed",
"interrupted"
]
},
"timestamp": {
"type": "integer",
"format": "int64",
"description": "Временная метка (мс)",
"example": 1672531200000
},
"data": {
"type": "string",
"description": "Вывод утилиты fsck из топика /flash/log",
"example": ""
}
}
}
}
}
}
}
},
"500": {
"description": "Внутренняя ошибка сервера",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"example": false
},
"message": {
"type": "string",
"description": "Описание ошибки"
}
}
}
}
}
}
}
}
Примеры по OpenAPI
Сформированы по схеме контроллера; значения полей необходимо заменить.
Пример запроса
curl -k -X GET "https://{IP_контроллера}/api/v1/external-storage/fsck/{serial}" \
-H "Authorization: Bearer <token>"
Пример ответа
{
"success": true,
"message": "Статус fsck успешно получен",
"storage_available": true,
"fsck_status": {
"status": "successful",
"timestamp": 1672531200000,
"data": ""
}
}