Между веб интерфейсом платформы и бекендом 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"
}
  • No labels