Между веб интерфейсом платформы и бекендом HTTP API, который может быть использован, в том числе, для скриптов и автоматизации.
Разграничение доступа
Для разграничения доступа на платформе Wimark используются иерархические локации. Каждый объект CPE, WLAN, Radius, Firewal и т.д. может быть привязан к локации по ее UUID.
Для этого при создании / удалении объекта используется поле base_location внутри JSON объекта.
Авторизация
Для доступа к API необходимо авторизоваться на платформе.
Для этого нужно сделать запрос POST /auth/login с указанием пользователя и его пароля:
# POST /auth/login { "username": "admin", "password": "qwerty123" }
В ответ придет сгенерированный JWT токен:
# Response /auth/login { "status":"success", "statuscode":"", "data":{ "count":13, "total":0, "items":{ "id":"103390aa-665d-453a-9c27-6d2c9a38fce4", "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MjY0NjA3ODgsImxvY2F0aW9uIjoiZTY4NDI0ZWItNGFkMC00NTMxLTlmM2ItMmNiZTFkNTRhZjI5Iiwicm9sZSI6ImFkbWluIiwic2FsdCI6MTUyNjI4Nzk4ODE1NywidXNlcl9pZCI6IjEwMzM5MGFhLTY2NWQtNDUzYS05YzI3LTZkMmM5YTM4ZmNlNCIsInVzZXJuYW1lIjoid2ltYXJrIn0.YW9V4bF52tuINoGdZ4nJzMhhGJtEf47SgAvzHKK4fBE", "username":"admin" }, "itemslist":[ ] } }
Токен из response.data.items.token необходимо передавать с каждым запросом через заголовок HTTP запроса к API. Время жизни токена - 30 суток.
"Authorization": "Bearer <response.data.items.token>"
Работа с локациями
API: /api/locations
Создание объекта локации
{ "action": "C", "items": { "0": { "name": "test/location" } } }
После выполнения указанного запроса будут созданы 2 локации (если таких имен не было раньше) и в ответ придет следующий JSON:
{ "status":"success", "statuscode":"", "data":{ "count":2, "total":0, "items":{ "a12fe8fa-f4c7-4819-8f66-64de131d1e0b":{ "id":"a12fe8fa-f4c7-4819-8f66-64de131d1e0b", "name":"/test/location/" }, "d1d4a22f-d013-44a3-a9e2-b6b3deb79502":{ "id":"d1d4a22f-d013-44a3-a9e2-b6b3deb79502", "name":"/test/" } } } }
Созданные локации можно использовать при создании других объектов. Если не заполнять поле base_location, то по умолчанию выставляется локация пользователя, от которого идут запросы.
При удалении локации удаляются все нижестоящие локации, а объекты назначаются на первую вышестоящую в иерархии локацию. Локацию с именем “/” (root) удалить нельзя.
Поиск локации
{ "action": "R" }
Пример ответа (Возвращает все локации):
{ 'status': 'success', 'statuscode': '', 'data': { 'count': 3, 'total': 3, 'items': {}, 'itemslist': [ { 'address': '', 'coords': { 'lat': 0, 'lng': 0 }, 'create_at': '2022-10-31T10:58:58.251Z', 'custom_styles': { 'bodybackgroundcolor': '', 'bodycolor': '', 'footerbackgroundcolor': '', 'headerbackgroundcolor': '', 'headercolor': '', 'sidebarbackgroundactivelink': '', 'sidebarbackgroundcolor': '', 'sidebarbackgroundhoverlink': '', 'sidebarcolor': '' }, 'custom_styles_enable': False, 'description': '', 'id': '5b6c60de-2e28-4a70-8724-7e89ca504aec', 'limits': { 'cpe': 0, 'heatmap': 0, 'portal': 0, 'radar': 0 }, 'loc_id': 'P51P7J9tp', 'manager': '', 'name': '/wimark/location/', 'owner': '240ac710-8b67-4865-a7fb-05c3ba7b7406', 'party': { 'formal_name': '', 'inn': '', 'kpp': '', 'name': '', 'ogrn': '', 'phone': '' }, 'tags': [] }, { 'address': 'Moscow', 'coords': { 'lat': 55.711124, 'lng': 37.652399 }, 'create_at': '2022-10-25T11:25:31.916Z', 'custom_styles': { 'bodybackgroundcolor': '', 'bodycolor': '', 'footerbackgroundcolor': '', 'headerbackgroundcolor': '', 'headercolor': '', 'sidebarbackgroundactivelink': '', 'sidebarbackgroundcolor': '', 'sidebarbackgroundhoverlink': '', 'sidebarcolor': '' }, 'custom_styles_enable': False, 'description': 'superuser location', 'id': '63b2deb5-08f6-428d-acd5-c95d530499fd', 'limits': { 'cpe': 0, 'heatmap': 0, 'portal': 0, 'radar': 0 }, 'loc_id': 'E1asaSraM', 'manager': '', 'name': '/', 'owner': '', 'party': { 'formal_name': '', 'inn': '', 'kpp': '', 'name': '', 'ogrn': '', 'phone': '' }, 'tags': [] }, { 'address': '', 'coords': { 'lat': 0, 'lng': 0 }, 'create_at': '2022-10-31T10:58:58.249Z', 'custom_styles': { 'bodybackgroundcolor': '', 'bodycolor': '', 'footerbackgroundcolor': '', 'headerbackgroundcolor': '', 'headercolor': '', 'sidebarbackgroundactivelink': '', 'sidebarbackgroundcolor': '', 'sidebarbackgroundhoverlink': '', 'sidebarcolor': '' }, 'custom_styles_enable': False, 'description': '', 'id': 'c8e3b4d5-0192-4931-a7ea-70579aedc62d', 'limits': { 'cpe': 0, 'heatmap': 0, 'portal': 0, 'radar': 0 }, 'loc_id': '951gNJraM', 'manager': '', 'name': '/wimark/', 'owner': '240ac710-8b67-4865-a7fb-05c3ba7b7406', 'party': { 'formal_name': '', 'inn': '', 'kpp': '', 'name': '', 'ogrn': '', 'phone': '' }, 'tags': [] } ] } }
Работа с пользователями
API: /api/users
Чтение / обновление / удаление : с помощью POST запроса с указанием поля action R (read) | U (update) | D (delete)
Создание пользователя
{ "action":"C", "items":{ "0":{ "role":"admin", "base_location":"53117f16-62bc-4942-8fb6-8185f0c37dc8", "username":"some_user", "password":"12345678" } } }
В ответ при успешном добавлении:
{ "status":"success", "statuscode":"", "data":{ "count":1, "total":0, "items":{ "5694adf4-1d8f-4167-b3dd-8d4db3e08e62":{ "id":"5694adf4-1d8f-4167-b3dd-8d4db3e08e62", "username":"some_user", "password":"hashed", "email":"", "photo":"", "base_location":"53117f16-62bc-4942-8fb6-8185f0c37dc8", "role":"admin", "created_at":1560440585, "created_by":"3f3ba5b8-33c8-415d-83b5-2643c991e7d8", "first_login":0, "last_login":0, "login_number":0, } } } }
Поиск пользователей
{ "action": "R" }
Пример ответа (Возвращает всех пользователей):
{ 'status': 'success', 'statuscode': '', 'data': { 'count': 2, 'total': 2, 'items': {}, 'itemslist': [ { 'access': { 'ads': False, 'analytics': False, 'nms': False, 'polls': False, 'portal': False }, 'active_until': 0, 'base_location': '63b2deb5-08f6-428d-acd5-c95d530499fd', 'bee_pro_bis_id': 0, 'bee_pro_ctn': '', 'block': False, 'company': '', 'created_at': 1667211486, 'created_by': '240ac710-8b67-4865-a7fb-05c3ba7b7406', 'description': '', 'email': '', 'first_login': 0, 'id': '6cb6e9ec-ed76-421a-83c0-e3ad1ecf4568', 'last_login': 0, 'login_number': 0, 'mac_mask': False, 'password': '', 'permissions': {}, 'phone': '', 'photo': '', 'role': 'operator', 'username': 'wimark123' }, { 'access': { 'ads': False, 'analytics': False, 'nms': False, 'polls': False, 'portal': False }, 'active_until': 0, 'base_location': '63b2deb5-08f6-428d-acd5-c95d530499fd', 'bee_pro_bis_id': 0, 'bee_pro_ctn': '', 'block': False, 'company': '', 'created_at': 1667207826, 'created_by': '240ac710-8b67-4865-a7fb-05c3ba7b7406', 'description': '', 'email': '', 'first_login': 1667207865, 'id': 'b964be78-5049-48c6-8ef6-77f0dafc7093', 'last_login': 1667207865, 'login_number': 1, 'mac_mask': False, 'password': '', 'permissions': {}, 'phone': '', 'photo': '', 'role': 'operator', 'username': 'test123' } ] } }
Работа с CPE
API: /api/cpes
Чтение / обновление / удаление : с помощью POST запроса с указанием поля action R (read) | U (update) | D (delete)
Чтение CPE
Для чтения CPE, и других объектов (WLAN, RADIUS, Templates, hs20, users, locations) применяется один общий шаблон. Самое важное в запросе - поле action со значением R. Остальное все опционально. По умолчанию отдаются первые 30 объектов, удовлетворяющих запросу. В поле q можно вставить различные запросы к mongodb например, запрос ниже нацелен на получения первых 300 подключенных к платформе ТД с сортировкой по имени, модель которых равна QTECH QWP-82E
и статус connected
:
{ "action":"R", "search":"", "page": {"limit":300,"offset":0}, "sort_by":{"field":"name","order":-1}, "q":{"model.name": "QTECH QWP-82E","connected":true} }
Запрос ниже нацелен на получения первых 300 подключенных к платформе ТД с сортировкой по имени из локации с ID c15..298:
{ "action":"R", "search":"", "page": {"limit":300,"offset":0}, "sort_by":{"field":"name","order":-1}, "q":{"base_location":"c15e4754-4539-4be1-a6ca-749be5681298","connected":true} }
В ответе соответственно будет JSON следующей структуры:
{ "status":"success", # или error "statuscode":"", # или описание ошибки "data":{ # data "count":1, # длина списка itemslist "total":1, # сколько всего данных удовлетворили запросу "itemslist":[ ] } }
И конкретно на запрос по CPE выше имеем следующий ответ:
{ "status":"success", "statuscode":"", "data":{ "count":1, "total":1, "itemslist":[ { "base_location":"4969622a-5935-416a-b1ff-440fe43287fd", "clients":{ }, "config":{ "beeline_config":{ "nas_ip":"192.168.1.38" }, "description":"", "dhcpcap_config":{ "enabled":true, "msgtypefilter":[ ] }, "firewall":{ "l2_chain":"", "l3_filter":{ "ip_list":[ ], "mac_list":[ ] }, "nat_access":false, "wan_access_block":false }, "firmware":{ "checksum":"", "file":"", "mode":"check", "storage":"", "timeout":0 }, "gre_peer_addr":"", "lbs_config":{ "blacklist":[ ], "clienttimeout":0, "emptywatcher":false, "enabled":false, "filtermode":"None", "maxcachequeue":0, "maxquiet":0, "reportperiod":0, "whitelist":[ ] }, "log_config":{ "enabled":false, "log_ip":"", "log_port":0, "log_prefix":"", "log_proto":"" }, "name":"", "net_manual":{ }, "stats_config":{ "enabled":true, "reportperiod":60 }, "tunnels":{ }, "wifi":{ "radio0":{ "bandmode":"11g", "bandwidth":"HT20", "basic_rate":"", "channels":[ 4 ], "country":"RU", "frequency":"2.4", "legacy_rates":"0", "log_level":"0", "max_inactivity":0, "maxclients":0, "mintxpower":"", "power":{ "auto":false, "range":[ 0, 15 ] }, "require_mode":"off", "scanningconfig":{ "enabled":true, "reportperiod":0, "scannumber":0, "scantimeout":0 }, "supported_rates":null, "txpower":"", "wlans":[ ] }, "radio1":{ "bandmode":"11a", "bandwidth":"HE80", "basic_rate":"", "channels":[ 149 ], "country":"RU", "frequency":"5", "legacy_rates":"0", "log_level":"0", "max_inactivity":0, "maxclients":0, "mintxpower":"", "power":{ "auto":false, "range":[ 0, 20 ] }, "require_mode":"off", "scanningconfig":{ "enabled":true, "reportperiod":0, "scannumber":0, "scantimeout":0 }, "supported_rates":null, "txpower":"", "wlans":[ "033e6a26-42df-42b7-81b8-eeec16c57c19", "56951c46-3b1d-4e1b-8e49-aae779422ed1" ] } }, "wifi_lock":false, "wifi_manual":{ }, "wired":{ }, "wmsnmpd":{ "default":{ "community":"public", "enabled":true, "interfaces":[ "lan", "wan" ], "listen_interface":"lan", "location":"wimarkovo" } } }, "config_not_send":false, "config_status":"offline", "connected":false, "description":"dubai danya", "first_connection":1660128498, "id":"c30009d8-73be-c6ee-f216-44d1fab238a7", "last_connection":1666197211, "last_disconnection":1666197308, "last_error":{ "description":"", "module":"", "module_id":"", "recommendation":"", "type":"" }, "latitude":0, "longitude":0, "model":{ "id":"13b42565-ec28-481d-93df-6831c53fb037", "name":"YunCore AX820", "short":"yuncore,ax820" }, "name":"Qtech-38a6", "rrm_group":{ }, "state":{ "firmware":{ "current_md5":"", "features":[ "cpeagent", "dhcp-cap", "ethernet-accounting", "firewall", "firmware", "get", "lbs", "network", "openwrt", "radius", "scanning", "snmp", "statistic", "tc", "ubus", "uci", "umdns", "wifi" ], "has_update":false, "version":{ "build":0, "commit":"31dc8dacc99b894a475f2057780ab67c4d81fa8b", "version":"v1.9.4" } }, "l2tp_state":{ "enabled":true, "host":"wm-dev", "host_addr":"45.89.25.58", "host_tunnel":0, "local_addr":"192.168.1.38", "local_iface":"", "local_tunnel":1, "tunnel_type":"none" }, "net_manual":{ "alan":{ ".type":"interface", "proto":"static" }, "ipsec_lo":{ ".type":"interface", "ifname":"lo", "proto":"static" }, "lan":{ ".type":"interface", "ipv6":"0", "proto":"dhcp" }, "loopback":{ ".type":"interface", "proto":"static" }, "nat_wlan_1":{ ".type":"interface", "proto":"static", "type":"bridge" }, "nat_wlan_2":{ ".type":"interface", "proto":"static", "type":"bridge" }, "wwan":{ ".type":"interface", "proto":"wwan" } }, "network":{ "gateway":"192.168.1.1", "ipaddr":"192.168.1.38", "ipaddrs":[ { "ipaddr":"192.168.1.38", "netmask":"255.255.255." } ], "macaddr":"44:D1:FA:B2:38:A7" }, "tunnels":{ }, "wan":{ "iface":"lan", "proto":"dhcp" }, "wifi":{ "radio0":{ "bandmode":"11g", "bandwidth":"HT20", "channel":"4", "enabled":false, "frequency":"2.4", "txpower":"15", "wlanstates":{ } }, "radio1":{ "bandmode":"11a", "bandwidth":"HE80", "channel":"149", "enabled":false, "frequency":"5", "txpower":"20", "wlanstates":{ } } }, }, "tags":[ ] } ] } }
Привязка CPE к Локации
API: /api/bulk/locations/cpes
Для массовой привязки точек доступа к локации следует послать следующего вида запрос:
{ "action":"U", "ids":["4174f9dd-648f-0785-6640-7a6a417b618f"], # cpe ids "items": { "0":{ "base_location":"ae4cb1af-2af5-47ec-8cfd-5fa911b7a166" # location id } } }
Работа с WLAN
API: /api/wlans
Создание
Создание ssid без пароля с именем name-wifi-ssifap1i
{ "action": "C", "items": { "0": { "ssid": "name-wifi-ssifap1i" } } }
Создание ssid с типом безопасности WPA2 PERSONAL, именем name-wifi-ssifap1i
и паролем 12345678
{ "action": "C", "items": { "0": { "ssid": "name-wifi-ssifap1i", "security": { "type": "wpa2personal", "data": { "psk": "12345678" } } } } }
Чтение
{ "action": "R" }
Работа с шаблонами
API: /api/cpe_config_templates
Создание
Создание шаблона с именем test-api
фильтрами: подсеть 10.30.40.0/24 и mac префиксом 90:B8:32:49
, шаблон будет добавлять ssid с id 10b5f52d-70d4-47f2-b59d-4ddfe1a6a493
на все ТД подходящие под условие выше.
{ "action": "C", "items": { "0": { "name": "test-api", "base_location": "1864a500-d4d0-44ad-9094-a68c956b0b3e", "is_auto": true, "subnet": { "ipaddr": "10.30.40.0", "netmask": "255.255.255.0" }, "mac_prefix": "90:B8:32:49", "is_always": true, "template": { "location": "1864a500-d4d0-44ad-9094-a68c956b0b3e", "wlans": ["10b5f52d-70d4-47f2-b59d-4ddfe1a6a493"] } } } }
Чтение
{ "action": "R" }
Работа с точками доступа
API: /api/cpes
Создание
Создание ТД с id 4174f9dd-648f-0785-6640-001fce06d222
{ "action": "C", "items": { "4174f9dd-648f-0785-6640-001fce06d222": { } } }
Чтение
{ "action": "R" }