Default Configuration API
==========================
API для управления дефолтной конфигурацией, которая применяется ко всем устройствам без кастомных настроек.
GET /api/default/config
-----------------------
Получить текущую дефолтную конфигурацию.
**URL:** ``/api/default/config``
**Метод:** ``GET``
**Теги:** ``Default-config``
Response
~~~~~~~~
**Status Code:** ``200 OK``
**Content-Type:** ``application/json``
**Body:** Объект конфигурации в формате dot notation
Пример ответа:
.. code-block:: json
{
"provision.@reload": "86400",
"provision.operator.@name": "DefaultOperator",
"provision.logo.@url": "http://example.com/default_logo.png",
"provision.time.@tz": "Europe/Moscow",
"provision.time.@ntp": "pool.ntp.org",
"provision.features.mediaplayer.@enabled": "true",
"provision.features.dvr.@enabled": "false",
"provision.features.cctv.@enabled": "false",
"provision.features.vod.@enabled": "false",
"provision.tv_stream.@type": "multicast",
"provision.tv_protocols.@default": "stalker",
"provision.tv_protocols.protocol.@type": "stalker",
"provision.tv_protocols.protocol.@server": "http://default-portal.example.com",
"provision.preferences.pref_network_config.@value": "DHCP",
"provision.preferences.pref_tv.pref_tv_streamtype.@visible": "false",
"provision.preferences.pref_tv.pref_tv_udpxyaddress.@visible": "false",
"provision.preferences.pref_tv.pref_tv_middleware.@disabled": "true"
}
Примеры использования
~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
curl http://localhost:7373/api/default/config
**Python пример:**
.. code-block:: python
import requests
response = requests.get("http://localhost:7373/api/default/config")
default_config = response.json()
print(f"Default reload interval: {default_config['provision.@reload']}")
print(f"Default operator: {default_config['provision.operator.@name']}")
**JavaScript (Frontend) пример:**
.. code-block:: javascript
const response = await fetch('http://localhost:7373/api/default/config');
const config = await response.json();
console.log('Default timezone:', config['provision.time.@tz']);
---
PUT /api/default/config/update
-------------------------------
Частичное обновление дефолтной конфигурации (merge с существующей).
**URL:** ``/api/default/config/update``
**Метод:** ``PUT``
**Теги:** ``Default-config``
Request Body
~~~~~~~~~~~~
**Content-Type:** ``application/json``
Объект с обновлениями в формате dot notation. Обновляются только указанные поля, остальные сохраняются.
.. code-block:: json
{
"provision.@reload": "3600",
"provision.time.@tz": "Europe/London",
"provision.operator.@name": "NewDefaultOperator"
}
Response
~~~~~~~~
**Status Code:** ``200 OK``
**Content-Type:** ``application/json``
**Body:** Обновлённая дефолтная конфигурация (полная)
Примеры использования
~~~~~~~~~~~~~~~~~~~~~
**Изменить интервал обновления:**
.. code-block:: bash
curl -X PUT "http://localhost:7373/api/default/config/update" \
-H "Content-Type: application/json" \
-d '{
"provision.@reload": "3600"
}'
**Изменить часовой пояс и сервер NTP:**
.. code-block:: bash
curl -X PUT "http://localhost:7373/api/default/config/update" \
-H "Content-Type: application/json" \
-d '{
"provision.time.@tz": "America/New_York",
"provision.time.@ntp": "time.google.com"
}'
**Изменить сервер портала:**
.. code-block:: bash
curl -X PUT "http://localhost:7373/api/default/config/update" \
-H "Content-Type: application/json" \
-d '{
"provision.tv_protocols.protocol.@server": "http://new-portal.example.com"
}'
**Python пример:**
.. code-block:: python
import requests
updates = {
"provision.@reload": "7200",
"provision.operator.@name": "MyCompany",
"provision.logo.@url": "http://mycompany.com/logo.png"
}
response = requests.put(
"http://localhost:7373/api/default/config/update",
json=updates
)
updated_config = response.json()
print(f"Updated reload: {updated_config['provision.@reload']}")
**JavaScript (Frontend) пример:**
.. code-block:: javascript
const updates = {
'provision.time.@tz': 'Europe/Berlin',
'provision.features.vod.@enabled': 'true'
};
const response = await fetch('http://localhost:7373/api/default/config/update', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(updates)
});
const updatedConfig = await response.json();
Влияние на устройства
~~~~~~~~~~~~~~~~~~~~~
После обновления дефолтной конфигурации:
* **Устройства без кастомной конфигурации** немедленно начнут получать новые параметры при следующем запросе
* **Устройства с кастомной конфигурацией** продолжат использовать свои индивидуальные настройки
* Изменения применяются без перезагрузки сервиса
PUT /api/default/config/replace
--------------------------------
Полная замена дефолтной конфигурации.
**URL:** ``/api/default/config/replace``
**Метод:** ``PUT``
**Теги:** ``Default-config``
.. warning::
Этот endpoint **полностью заменяет** дефолтную конфигурацию. Все предыдущие настройки будут удалены и заменены на новые.
Request Body
~~~~~~~~~~~~
**Content-Type:** ``application/json``
Полная новая конфигурация в формате dot notation:
.. code-block:: json
{
"provision.@reload": "86400",
"provision.operator.@name": "NewOperator",
"provision.logo.@url": "http://newcompany.com/logo.png",
"provision.time.@tz": "Europe/Moscow",
"provision.time.@ntp": "pool.ntp.org",
"provision.features.mediaplayer.@enabled": "true",
"provision.features.dvr.@enabled": "false",
"provision.features.cctv.@enabled": "false",
"provision.features.vod.@enabled": "true",
"provision.tv_stream.@type": "unicast",
"provision.tv_protocols.@default": "stalker",
"provision.tv_protocols.protocol.@type": "stalker",
"provision.tv_protocols.protocol.@server": "http://newportal.example.com",
"provision.preferences.pref_network_config.@value": "DHCP"
}
Response
~~~~~~~~
**Status Code:** ``200 OK``
**Content-Type:** ``application/json``
**Body:** Новая дефолтная конфигурация
Примеры использования
~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
curl -X PUT "http://localhost:7373/api/default/config/replace" \
-H "Content-Type: application/json" \
-d @complete_default_config.json
**Python пример с загрузкой из файла:**
.. code-block:: python
import requests
import json
# Загрузить конфигурацию из файла
with open('new_default_config.json', 'r') as f:
new_config = json.load(f)
response = requests.put(
"http://localhost:7373/api/default/config/replace",
json=new_config
)
if response.status_code == 200:
print("Default configuration replaced successfully")
else:
print(f"Error: {response.status_code}")
**Python пример с созданием конфигурации:**
.. code-block:: python
import requests
new_default = {
"provision.@reload": "86400",
"provision.operator.@name": "MyISP",
"provision.time.@tz": "Europe/Moscow",
"provision.tv_protocols.@default": "stalker",
"provision.tv_protocols.protocol.@type": "stalker",
"provision.tv_protocols.protocol.@server": "http://iptv.myisp.com"
}
response = requests.put(
"http://localhost:7373/api/default/config/replace",
json=new_default
)
replaced_config = response.json()
Рекомендации
~~~~~~~~~~~~
**Когда использовать update vs replace:**
* **update** — когда нужно изменить несколько конкретных параметров, сохранив остальные
* **replace** — когда нужна полная переконфигурация или миграция на новую схему
**Backup перед заменой:**
Перед полной заменой рекомендуется сохранить текущую конфигурацию:
.. code-block:: python
import requests
import json
from datetime import datetime
# Получить текущую конфигурацию
response = requests.get("http://localhost:7373/api/default/config")
current_config = response.json()
# Сохранить в файл с timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"backup_default_config_{timestamp}.json"
with open(filename, 'w') as f:
json.dump(current_config, f, indent=2)
print(f"Backup saved to {filename}")
# Теперь можно безопасно заменить
# ...
Валидация конфигурации
~~~~~~~~~~~~~~~~~~~~~~
Базовая валидация формата:
.. code-block:: python
def validate_config(config):
"""Проверка базовых требований к конфигурации"""
required_keys = [
"provision.@reload",
"provision.operator.@name",
"provision.tv_protocols.@default"
]
for key in required_keys:
if key not in config:
raise ValueError(f"Missing required key: {key}")
# Проверка reload
reload_value = int(config["provision.@reload"])
if reload_value < 60 or reload_value > 86400:
raise ValueError("Reload must be between 60 and 86400 seconds")
return True
# Использование
try:
validate_config(new_config)
# Отправить на сервер
except ValueError as e:
print(f"Configuration error: {e}")
---
Автоматическая документация
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Полная автодокументация endpoints:
.. automodule:: presentation.api.endpoints.default_config_management
:members:
:undoc-members:
:show-inheritance:
Формат конфигурации
-------------------
Dot notation
~~~~~~~~~~~~
Конфигурации используют формат **dot notation** для представления иерархической XML структуры в плоском виде.
Правила:
* Точка (``.``) разделяет уровни вложенности
* Префикс ``@`` обозначает атрибут XML элемента
* Элементы без ``@`` — это вложенные теги
Пример преобразования:
**Dot notation:**
.. code-block:: json
{
"provision.operator.@name": "MyOperator",
"provision.time.@tz": "Europe/Moscow"
}
**Эквивалентный XML:**
.. code-block:: xml
**Сложный пример:**
.. code-block:: json
{
"provision.tv_protocols.@default": "stalker",
"provision.tv_protocols.protocol.@type": "stalker",
"provision.tv_protocols.protocol.@server": "http://portal.com"
}
**XML:**
.. code-block:: xml
Типичные параметры
~~~~~~~~~~~~~~~~~~
**Базовые параметры:**
* ``provision.@reload`` — интервал обновления в секундах (3600, 86400)
* ``provision.operator.@name`` — название оператора
**Время и локализация:**
* ``provision.time.@tz`` — часовой пояс (Europe/Moscow, America/New_York)
* ``provision.time.@ntp`` — NTP сервер (pool.ntp.org, time.google.com)
**Функции:**
* ``provision.features.mediaplayer.@enabled`` — медиаплеер (true/false)
* ``provision.features.dvr.@enabled`` — DVR (true/false)
* ``provision.features.vod.@enabled`` — VoD (true/false)
* ``provision.features.cctv.@enabled`` — CCTV (true/false)
**TV протоколы:**
* ``provision.tv_protocols.@default`` — дефолтный протокол (stalker, ministra)
* ``provision.tv_protocols.protocol.@type`` — тип протокола
* ``provision.tv_protocols.protocol.@server`` — URL портала
**Сеть:**
* ``provision.preferences.pref_network_config.@value`` — DHCP или Static
**UI настройки:**
* ``provision.preferences.pref_tv.pref_tv_streamtype.@visible`` — видимость настройки
* ``provision.preferences.pref_tv.pref_tv_middleware.@disabled`` — отключение опции