wmcli: CLI платформы Wimark One
Страница перенесена в Confluence
Использование wmcli
wmcli - это Wimark CLI - command line interface к платформе Wimark One. Данное ПО предназначено для управления конфигурацией (объектами) с помощью команд без необходимости ручной конфигурации
Репозитория (с собранными файлами для использования) расположен на https://github.com/wimark/wmcli
Работа с wmcli
Конфигурация
Для успешного запуска программы необходимо указать адрес базы данных MongoDB и брокера MQTT. Это можно сделать как через конфигурационный yaml файл (config.yml/config.yaml), так и через переменные окружения.
Также есть возможность сделать "красивый" (pretty) вывод данных с отступами и использовать для вывода ключи формата базы данных, а не внутренних структур платформы.
Список всех настроек:
WMCLI_MONGO_ADDR=127.0.0.1:27001
WMCLI_MQTT_ADDR=tcp://127.0.0.1:1883
PRETTY_PRINT=false
USE_DB_OUTPUT=false
$ cat config.yaml
mongo_addr: '127.0.0.1:27001'
mqtt_addr: 'tcp://127.0.0.1:1883'
pretty_print: false
db_output: false
Использование
wmcli может работать как в интерактивном режиме с автодополнением, так и в неинтерактивном режиме. В основе лежат три базовые команды операций:
-
read
- чтение из базы данных объектов в коллекции / всей коллекции, с возможностью фильтрации по полям -
set
- выставление параметров (создание, в случае отсутствия) объекта в коллекции через запрос по MQTT -
delete
- удаление объекта из коллекции по MQTT
Доступны 5 коллекций:
-
wlan
- конфигурации Wi-Fi сетей -
radius
- конфигурации RADIUS -
cpe
- точки доступа на платформе, имеется специальный ключFromTemplate
для применения шаблона -
cpe_model
- модели точек доступа, только для чтения -
cpe_template
- шаблоны заполнения точек доступа, запись производится напрямую в базу данных
Структура получается следующая: wmcli [операция] [коллекция] <uuid объекта> <поле (чтение, удаление)/поле=значение (запись)>...
В интерактивном режиме новый uuid объекта генерируется в автодополнение. В неинтерактивном режиме можно воспользоваться uuidgen (e2fsprogs/uuid-runtime, должно быть почти в любом дистрибутиве из коробки).
Примеры использования:
Вывести все объекты в коллекции wlan
> wmcli read wlan
# Вывести поле Name у всех объектов в коллекции wlan
> wmcli read wlan Name
# Вывести все данные объекта [uuid] в коллекции wlan
> wmcli read wlan [uuid]
# Вывести поле Name у объекта [uuid] в коллекции wlan
> wmcli read wlan [uuid] Name
# Вывести поля Name, Description, SSID у объектов [uuid1] и [uuid2] в коллекции wlan
> wmcli read wlan [uuid1] [uuid2] Name Description SSID
# Создать или обновить данные объекта [uuid] с полями name и ssid в коллекции wlan
> wmcli set wlan [uuid] Name="Test" SSID="Test_Wifi"
> ...
# Создать новый объект [uuid] в коллекции wlan
> wmcli set wlan [uuid]
> ...
# Удалить объект [uuid] из коллекции wlan
> wmcli delete wlan [uuid]
> ...
В интерактивном режиме в автодополнении присутствуют подсказки типа данных поля, их три:
-
string
- заполняется с кавычками:Field="..."
-
int
- заполняется без кавычек:Field=42
-
bool
- может бытьtrue
илиfalse
, без кавычек:Field=true
Также, некоторые поля помечены как [RO]
. Такие поля доступны только для чтения.
Существуют поля, которые заканчиваются на .#
- это массивы. Для добавления элементов в массив нужно просто повторить заполнение такого поля, например:
set ... Field.#="one" Field.#="two"
read ...
Field.#=["one", "two"]
Также есть поля, внутри которых встречается .*
- это словари, этим символом помечаются поля в автодополнении в интерактивном режиме. Чтобы задать свое имя ключа, нужно заменить *
на название ключа, например, Field.*.Name=...
-> Field.Key.Name=...
Алгоритм работы
Создание нового WLAN объекта
Здесь создается объект wlan с минимальным набором необходимых полей.
wmcli set wlan 570beb53-5efb-4c0b-927e-0bf6e4e2b42f Name="RTK_TEST_WLAN" SSID="RTK_TEST" Security.wpa2personal.WPACommon.Suites.#="aes" Security.wpa2personal.PSK="12345678" Tunneling=true PeerAddress="10.10.10.10" Proto="gretap"
Создание нового Radius объекта
Тоже самое с объектом radius'а
wmcli set radius fdef05f6-5cf7-4750-b5d7-39677af38d2e Name="RTK_RADIUS_TEST" Hostname="rtk.radius.ru" Acc_port="1813" Auth_port="1812" Is_local=true DaePort="3799" Secret="rtksecret"
Назначение Radius объекта WLAN'у
Здесь в ранее созданном объекте wlan обновляется поле RadiusAcctServers.#
, которое является массивом, и в который добавляется первым элементом UUID объекта radius из прошлого шага.
wmcli set wlan 570beb53-5efb-4c0b-927e-0bf6e4e2b42f RadiusAcctServers.#="fdef05f6-5cf7-4750-b5d7-39677af38d2e"
Создание шаблона для точки с вписанным WLAN объектом
Просто создается объект cpe_template с необходимыми для точки полями.
wmcli set cpe_template ebd7b67e-e8ae-45ce-bba7-7cfa7ede05bd mac_prefix="C0:A6:6D:00:32:20" name="TestRTK" description="ADDRESS" template.cpe_config_template.wifi.radio0.require_mode="false" template.cpe_config_template.wifi.*.country="RU" template.cpe_config_template.wifi.radio0.bandmode="11a" template.cpe_config_template.wifi.radio0.bandwidth="HT20" template.cpe_config_template.wifi.radio0.power.range.#=0 template.cpe_config_template.wifi.radio0.power.range.#=10 template.cpe_config_template.wifi.radio0.frequency="2.4" template.cpe_config_template.wifi.radio0.require_mode="false" template.cpe_config_template.wifi.*.country="RU" template.cpe_config_template.wifi.radio1.bandmode="11g" template.cpe_config_template.wifi.radio1.bandwidth="HT20" template.cpe_config_template.wifi.radio1.power.range.#=0 template.cpe_config_template.wifi.radio1.power.range.#=10 template.cpe_config_template.wifi.radio1.frequency="5" template.cpe_config_template.wifi.radio0.wlans.#="570beb53-5efb-4c0b-927e-0bf6e4e2b42f" template.cpe_config_template.wifi.radio1.wlans.#="570beb53-5efb-4c0b-927e-0bf6e4e2b42f"
"Отлов" точки по MAC адресу, для получения ее UUID
Здесь используется скрипт, код которого будет представлен ниже, и на базе которого можно получить представление о том как работает wmcli в скриптинге. В нем получается список всех точек доступа из коллекции cpe с фильтрацией по полю State[RO].Network.MACAddr, в котором указан MAC адрес точки. Затем он приводится в удобный для парсинга вид, и по нему проходится grep с поиском нужного адреса из аргумента к скрипту.
./id_by_mac.sh C0:A6:6D:00:32:20
Применение шаблона на UUID точки
Здесь в техническое поле пойманной точки вносится UUID шаблона, созданного ранее. После этого формируется запрос с обновлением полей точки по данным из шаблона.
wmcli set cpe bcaad286-14fa-9cf1-f8bd-c0a66d003220 FromTemplate="ebd7b67e-e8ae-45ce-bba7-7cfa7ede05bd"
Скрипт для получения UUID точек по их MAC адресу
#!/bin/bash
# export needed variables
export WMCLI_MQTT_ADDR=tcp://127.0.0.1:1883
export WMCLI_MONGO_ADDR=127.0.0.1:57017
export WMCLI_PRETTY_PRINT=false
BIN=./wmcli
cpe_id_mac_list() {
# filter output by macaddr
CPE_ID_MAC=$($BIN read cpe State[RO].Network.MACAddr)
# split output for id:mac pairs
# replace double newline separator with tab
CPE_ID_MAC=${CPE_ID_MAC//$'\n'$'\n'/$'\t'}
# filter output by tab ifs
oifs=$IFS
IFS=$'\t'
CPE_ID_MAC=$(for i in $CPE_ID_MAC
do
i=${i//"id="/}
i=${i//"State.VLAN.MACAddr="/}
echo ${i//$'\n'/' '}
done
)
# restore ifs
IFS=$oifs
echo "$CPE_ID_MAC"
}
get_id_by_mac() {
cpe_id_mac_list | grep $1 | cut -d' ' -f1
}
get_id_by_mac $1