Wimark One: API
Между веб интерфейсом платформы и бекендом у нас 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", // обязательный -- тип запроса - create|read|update|delete
"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 объектов, удовлетворяющих запросу.
Запрос ниже нацелен на получения первых 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
}
}
}