Перейти к содержанию

Вопрос

Опубликовано

Накопилось некоторое количество вопросов по интерфейсу /rci, и так как пока не готов мануал по rci, буду задавать вопросы здесь в отдельном треде и надеюсь на помощь сообщества:

Создаю правило в МСЭ через веб морду и смотрю как формируется JSON, например интерфейс OpenVPN0, на котором не было ни одного правила в первых строках удаляет вроде бы не существующий access-list

[{"access-list":
	{
    	"acl":"_WEBADMIN_OpenVPN0",
     	"no":true
    }
 },
 {
 	"access-list":
    	[{"permit":
       		{"source":"0.0.0.0",
... далее понятно

И ответ подтверждает удаление "message": "_WEBADMIN_OpenVPN0" access list removed."

Вопрос, это необходимая процедура перед началом создания первого правила на интерфейсе, сначала удалить, а потом он автоматически создастся при первом же permit/deny правиле?

И второй вопрос, можно ли одним JSON запросом сформировать сразу все правила (у меня их около 18) на все интерфейсы и тем же запросом сказать {"system":{"configuration":{"save":true}}} ?

Рекомендуемые сообщения

  • 0
Опубликовано
  В 11.09.2018 в 07:55, dvg_lab сказал:

Накопилось некоторое количество вопросов по интерфейсу /rci, и так как пока не готов мануал по rci, буду задавать вопросы здесь в отдельном треде и надеюсь на помощь сообщества:

Создаю правило в МСЭ через веб морду и смотрю как формируется JSON, например интерфейс OpenVPN0, на котором не было ни одного правила в первых строках удаляет вроде бы не существующий access-list

[{"access-list":
	{
    	"acl":"_WEBADMIN_OpenVPN0",
     	"no":true
    }
 },
 {
 	"access-list":
    	[{"permit":
       		{"source":"0.0.0.0",
... далее понятно

И ответ подтверждает удаление "message": "_WEBADMIN_OpenVPN0" access list removed."

Вопрос, это необходимая процедура перед началом создания первого правила на интерфейсе, сначала удалить, а потом он автоматически создастся при первом же permit/deny правиле?

И второй вопрос, можно ли одним JSON запросом сформировать сразу все правила (у меня их около 18) на все интерфейсы и тем же запросом сказать {"system":{"configuration":{"save":true}}} ?

Показать  

1. Нет, эта процедура скоро станет необязательной. Как раз сейчас способ сохранения правил переделывается. Это запрос удаляет цепочку ACL целиком.

2. При сохранении правила цепочка будет создана автоматически. Чтобы сохранить несколько правил -- отсылайте правила массивом, в каждом элементе -- запрос для отдельного интерфейса с массивами в permit и deny

Точную форму запроса можно найти, экспериментируя в Web CLI: my.keenetic.net/a (вкладка REST)

  • 0
Опубликовано

Спасибо огромное, а за ссылку на /a отдельное спасибо, не знал, а теперь все гораздо проще!

По новому способу хранения правил, значит перед тем как отправлять правила в /rci нужно будет еще и версию release проверять, подскажите с какой версии поменяется алгоритм хранения?

 

  • 0
Опубликовано
  В 11.09.2018 в 09:53, dvg_lab сказал:

Спасибо огромное, а за ссылку на /a отдельное спасибо, не знал, а теперь все гораздо проще!

По новому способу хранения правил, значит перед тем как отправлять правила в /rci нужно будет еще и версию release проверять, подскажите с какой версии поменяется алгоритм хранения?

 

Показать  

Изменения попадут в 2.14. При создании списка с нуля (или удалении первой командой) -- ничего не поменяется.

  • 0
Опубликовано
  В 11.09.2018 в 10:10, eralde сказал:

Изменения попадут в 2.14. При создании списка с нуля (или удалении первой командой) -- ничего не поменяется.

Показать  

А как происходит процедура, когда правило надо втиснуть меж других правил? ...удаляется хвост вписывается правило и добавляется хвост из правил?

  • 0
Опубликовано
  В 11.09.2018 в 11:18, MDP сказал:

А как происходит процедура, когда правило надо втиснуть меж других правил? ...удаляется хвост вписывается правило и добавляется хвост из правил?

Показать  

Прямо сейчас -- удаляем все, сохраняем новый список целиком

  • 0
Опубликовано
  В 11.09.2018 в 11:47, eralde сказал:

Прямо сейчас -- удаляем все, сохраняем новый список целиком

Показать  

Это приводит к проблемам у некоторых пользователей, поэтому и переработали механизм сохранения.

  • 0
Опубликовано

Запихиваю вот такой JSON

  Показать контент

Правила попадают на свои интерфейсы и отображаются в веб интерфейсе, все нормально, но они все в состоянии "Выключено", несмотря на параметр "disable":"False"

Вроде никакого специфичного запроса на включение больше не отлавливается.

Что нужно сделать чтобы они заенаблились? 

  • 0
Опубликовано
  В 12.09.2018 в 09:53, dvg_lab сказал:

Запихиваю вот такой JSON

  Показать контент

Правила попадают на свои интерфейсы и отображаются в веб интерфейсе, все нормально, но они все в состоянии "Выключено", несмотря на параметр "disable":"False"

Вроде никакого специфичного запроса на включение больше не отлавливается.

Что нужно сделать чтобы они заенаблились? 

Показать  

Попробуйте 

"disable": false
  • 0
Опубликовано
  В 12.09.2018 в 09:58, eralde сказал:

аналогично с schedule

true/false -- не строковые константы, а зарезервированные значения для булевого типа

Показать  

Все получилось, спасибо, на perl если кто столкнётся булев тип в хеше устанавливается так {"disable" => \0} и потом функция JSON->new->utf8->encode() обрабатывает это корректно в false, а true это соотв \1.

  • 0
Опубликовано (изменено)

Запрашиваю POST'ом /rci/components/list 

и не пойму почему, но иногда, (чаще после какого-то значительного простоя ,  минут 20 по ощущениям), между GET/POST запросами роутер отвечает кодом 200 и таким контентом:

'_content' => '{                                                                                                
  "continued": true                                                                                                              
}',

При этом следующий такой же запрос уже отвечает по полной форме. Это куда копать? 

 

И еще вопрос, подскажите как в JSON переводится команды "no ip nat" и "ip static Home ISP", чего-то не могу подобрать правильный формат.

Изменено пользователем dvg_lab
  • 0
Опубликовано
  В 12.09.2018 в 15:38, dvg_lab сказал:

Запрашиваю POST'ом /rci/components/list 

и не пойму почему, но иногда, (чаще после какого-то значительного простоя ,  минут 20 по ощущениям), между GET/POST запросами роутер отвечает кодом 200 и таким контентом:

'_content' => '{                                                                                                
  "continued": true                                                                                                              
}',

При этом следующий такой же запрос уже отвечает по полной форме. Это куда копать? .

Показать  

Есть ряд команд, которые работают долго, поэтому возвращают такой статус если еще не могут выдать ответ. Для них после первого POST-запроса нужно продолжать посылать GET-запросы на тот же ресурс (URL) пока не будет получен ответ без признака continued -- это и будут нужные вам данные.

 

  В 12.09.2018 в 15:38, dvg_lab сказал:

И еще вопрос, подскажите как в JSON переводится команды "no ip nat" и "ip static Home ISP", чего-то не могу подобрать правильный формат.

Показать  

 В такой форме:

{ip: {nat: {no: true}}}

должно сработать.

 

Во втором случае проще всего посмотреть, что отвечает роутер по GET-запросу rci/ip/static если такое правило создать в CLI (или через веб-интерфейс)

Вот такой POST-запрос на адрес rci/ создает нужное правило:

{
    "ip": {
        "static": {
            "interface": "Home",
            "to-interface": "ISP"
        }
    }
}

 

  • 0
Опубликовано

Спасибо огромное еще раз! По continued так и сделал, закциклил до нужного ответа. 

С ip static все получилось, намедни правда применил хак, отправил POST к /rci с таким запросом {"parse":"ip static Home ISP"} и это сработало, подсмотрел в /a на вкладке Parse ))

После того как увидел спросил сам себя - А что так можно было?... ))

Вобщем теперь роутер настраивается перловым скриптом за 5 минут, следующий этап прикрутить к нему веб морду и отдать в эксплуатацию.

 

ЗЫЖ Чем лучше сохошный кинетик для кровавого энтерпрайза, чем тот же ZyWall или Cisco  810 и даже RV320, а тем что кинетик можно купить в первом попавшемся магазине. Натравить на него конфигурилку, заббикс и вот тебе корп. VPN сеть для розничных точек. Раньше мне приходилось билдить прошивки для Асусов (RT-N16 и иже с ними), вкорячивать OpenVPN, обвязку и тд, и дохли те асусы словно мухи, ну а теперь красота. Одна печаль 8-портовую Ultra II похоронили, не найти уж в магазинах, успели только 10шт отхватить.

  • 0
Опубликовано (изменено)

Подскажите пожалуйста как в rci правильно передать одной командой:

interface WifiMaster0/WifiStation0 down
interface WifiMaster0/WifiStation0 authentication wpa-psk ***
interface WifiMaster0/WifiStation0 ssid ***
interface WifiMaster0/WifiStation0 description ***
interface WifiMaster0/WifiStation0 up

 

Изменено пользователем Илья Ганжин
  • 0
Опубликовано
  В 22.12.2023 в 17:34, Илья Ганжин сказал:

Подскажите пожалуйста как в rci правильно передать одной командой:

interface WifiMaster0/WifiStation0 down
interface WifiMaster0/WifiStation0 authentication wpa-psk ***
interface WifiMaster0/WifiStation0 ssid ***
interface WifiMaster0/WifiStation0 description ***
interface WifiMaster0/WifiStation0 up

 

Показать  

Можно передавать массив команд parse:

[
    {
        "parse": "interface WifiMaster0/WifiStation0 down"
    },
    {
        "parse": "interface WifiMaster0/WifiStation0 authentication wpa-psk 12345678"
    },
    {
        "parse": "interface WifiMaster0/WifiStation0 ssid ***"
    },
    {
        "parse": "interface WifiMaster0/WifiStation0 description ***"
    },
    {
        "parse": "interface WifiMaster0/WifiStation0 up"
    }
]

 

Можно передать массив объектов:

[
    {
        "interface": {
            "WifiMaster0/WifiStation0": {
                "up": false
            }
        }
    },
    {
        "interface": {
            "WifiMaster0/WifiStation0": {
                "authentication": {
                    "wpa-psk": {
                        "psk": "12345678"
                    }
                }
            }
        }
    },
    {
        "interface": {
            "WifiMaster0/WifiStation0": {
                "ssid": "***"
            }
        }
    },
    {
        "interface": {
            "WifiMaster0/WifiStation0": {
                "description": "***"
            }
        }
    },
    {
        "interface": {
            "WifiMaster0/WifiStation0": {
                "up": true
            }
        }
    }
]

 

  • 0
Опубликовано (изменено)

Спасибо, я пробовал вчера первый вариант, но мне какую то ошибку выдавало

Я сделал двумя скриптами

shell_command:
  keenetic_w91: bash /opt/var/lib/homeassistant/91.sh
  keenetic_w95: bash /opt/var/lib/homeassistant/95.sh

Изменено пользователем Илья Ганжин
  • 0
Опубликовано
  В 23.12.2023 в 10:19, eralde сказал:

Можно передавать массив команд parse:

Показать  

Вот так почему то не работает, не подключается к сети

rest_command:
  keenetic_91:
    url: http://192.168.10.1:81/rci
    method: POST
    payload: '[{"parse": "interface WifiMaster0/WifiStation0 down"},{"parse": "interface WifiMaster0/WifiStation0 authentication wpa-psk ***"},{"parse": "interface WifiMaster0/WifiStation0 ssid idnet-91"},{"parse": "interface WifiMaster0/WifiStation0 description idnet-91"},{"parse": "interface WifiMaster0/WifiStation0 up"}]'

  • 0
Опубликовано
  В 23.12.2023 в 16:59, Илья Ганжин сказал:

Вот так почему то не работает, не подключается к сети

rest_command:
  keenetic_91:
    url: http://192.168.10.1:81/rci
    method: POST
    payload: '[{"parse": "interface WifiMaster0/WifiStation0 down"},{"parse": "interface WifiMaster0/WifiStation0 authentication wpa-psk ***"},{"parse": "interface WifiMaster0/WifiStation0 ssid idnet-91"},{"parse": "interface WifiMaster0/WifiStation0 description idnet-91"},{"parse": "interface WifiMaster0/WifiStation0 up"}]'

Показать  

Не хватает слэша после rci: http://192.168.10.1:81/rci/

  • 0
Опубликовано

Добрый день, подскажите, пожалуйста, а как сечас послать POST или parse через скрипт?
раньше я делал так:

#!/bin/sh
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin:/opt/sbin

curl --header "Content-Type: application/json" \
  --request POST \
  --data '
{
    "system": {
        "configuration": {
            "save": true
        }
    }
}' \
http://127.0.0.1:79/rci

Сейчас этот код выдает ошибку

Core::Scgi::Session: unsupported method "POST" for "/rci".

 

  • 0
Опубликовано
  В 30.01.2024 в 12:27, phntms сказал:

Добрый день, подскажите, пожалуйста, а как сечас послать POST или parse через скрипт?
раньше я делал так:

#!/bin/sh
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin:/opt/sbin

curl --header "Content-Type: application/json" \
  --request POST \
  --data '
{
    "system": {
        "configuration": {
            "save": true
        }
    }
}' \
http://127.0.0.1:79/rci

Сейчас этот код выдает ошибку

Core::Scgi::Session: unsupported method "POST" for "/rci".

 

Показать  

Попробуйте добавить слэш в конце (/rci/)

  • 0
Опубликовано
  В 30.01.2024 в 12:32, eralde сказал:

Попробуйте добавить слэш в конце (/rci/)

Показать  

уже лучше :)
 

~ # /opt/etc/script.sh
<html>
<head>
</head>
<body>
<h1>400: Bad Request</h1>
</body>
</html>~ #
Core::Scgi::ThreadPool: unable to parse JSON (http/rci).
Core::Scgi::Tools: bad request: invalid payload.
Core::Scgi::ThreadPool: unable to parse JSON (http/rci).
Core::Scgi::Tools: bad request: invalid payload.

 

  • 0
Опубликовано
  В 30.01.2024 в 12:39, phntms сказал:

уже лучше :)
 

Показать  

Что-то с экранированием, наверное. У меня однострочный вариант работает:

/ # echo $SHELL
/bin/ash
/ # curl --header "Content-Type: application/json" --request POST --data '{"system": {"configuration": {"save": true}}}' http://127.0.0.1:79/rci/
{
  "system": {
    "configuration": {
      "save": {
        "status": [
          {
            "status": "message",
            "code": "8912996",
            "ident": "Core::System::StartupConfig",
            "message": "saving (http/rci)."
          }
        ]
      }
    }
  }
}/ #

 

  • 0
Опубликовано

Спасибо. Да, curl отрабатывает как надо. Буду разбираться в чем проблема.

~ # curl --header "Content-Type: application/json" --request POST --data '{"syst
em": {"configuration": {"save": true}}}' http://127.0.0.1:79/rci/
{
  "system": {
    "configuration": {
      "save": {
        "status": [
          {
            "status": "message",
            "code": "8912996",
            "ident": "Core::System::StartupConfig",
            "message": "saving (http/rci)."
          }
        ]
      }
    }
  }

 

  • 0
Опубликовано

@eralde возможно ли с помощью GET-запроса выключить/включить определенный интерфейс?

С помощью POST-запроса все получается, но интересно, реализуемо ли это через GET.

Пробовал "конструкцию" вида: 
http://192.168.1.1/rci/interface?name=WifiMaster0/AccessPoint1&up=false
Но, судя по всему, или что-то упустил, или делаю не так - система просто отвечает текущей конфигурацией этого интерфейса в JSON формате:

  Показать контент
  • 0
Опубликовано
  В 30.01.2024 в 15:40, dimon27254 сказал:

@eralde возможно ли с помощью GET-запроса выключить/включить определенный интерфейс?

С помощью POST-запроса все получается, но интересно, реализуемо ли это через GET.

Пробовал "конструкцию" вида: 
http://192.168.1.1/rci/interface?name=WifiMaster0/AccessPoint1&up=false
Но, судя по всему, или что-то упустил, или делаю не так - система просто отвечает текущей конфигурацией этого интерфейса в JSON формате:

  Показать контент
Показать  

Нет, GET-запросы работают только на чтение конфигурации или текущего статуса.

Для того, чтобы поменять что-то в конфигурации, придется использовать POST-запрос.

  • 0
Опубликовано
  В 23.05.2024 в 04:54, Илья Ганжин сказал:

Подскажите где можно получить информацию о наличии обновлений прошивки?

Показать  

Запрашивайте components list (<IP_или_доменное_имя_Кинетика>/rci/components/list). Эта команда запускает фоновый процесс, запрашивающий данные у сервера обновлений, поэтому первым отправляете POST-запрос, а дальше опрашиваете тот же URL GETом, пока не получите в ответе что-то кроме {"continued": true}. В финальном JSON с набором компонентов будет что-то такое:
 

image.png

Если версии отличаются, значит обновление есть (на моем скриншоте данные для случая, когда обновления нет).

В первом POST-запросе можно передать (необязательный) параметр sandbox -- канал обновления прошивки (stable/preview/drаft), тогда вернутся данные для запрошенного канала. Без параметра вернутся данные для выбранного на устройстве канала обновления.

  • 0
Опубликовано
  В 23.05.2024 в 07:50, eralde сказал:

 

Показать  

components check-update вроде бы тоже показывает наличие обновлений, но я что то не пойму как выполнить эту команду, http://192.168.10.1:81/rci/show/components/check-update не работает

  • 0
Опубликовано
  В 27.05.2024 в 06:25, Илья Ганжин сказал:

components check-update вроде бы тоже показывает наличие обновлений, но я что то не пойму как выполнить эту команду, http://192.168.10.1:81/rci/show/components/check-update не работает

Показать  

Слово show в URL не нужно, эта команда работает аналогично components list: сначала нужен POST-запрос, затем периодические GET-запросы до ответа с данными

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.