Страница 1 из 2
Еще один глюк скриптов Роутер-ОС ?
Добавлено: 30 ноя 2020, 20:10
Sertik
Рассмотрим на примерах работу /tool fetch с получением данных с удаленного ресурса, завернутую в обработчик ошибок.
В первом примере получаем данные "по-старинке" - с выгрузкой в файл и чтением оттуда
Всё работает как надо.
Код: Выделить всё
:global FuncSunriseNew1 do={
:do {
/tool fetch url="https://api.sunrise-sunset.org/json?lat=$1&lng=$2" mode=https keep-result=yes dst-path="sr.txt"} on-error={:return "ERROR"}
:delay 2s;
:local srise [/file get sr.txt contents]
/file remove sr.txt
:log info [:len $srise]
:return $srise}
:log warning [$FuncSunriseNew1 "56.5312" "38.5209"]
Второй пример - более "новая" модель использования /fetch без выгрузки в файл, а с получением данных сразу в переменную (чтобы не "портить" флеш-память):
Код: Выделить всё
:global FuncSunriseNew2 do={
:do { :local srise [/tool fetch url=("https://api.sunrise-sunset.org/json\?lat=$1&lng=$2") mode=https as-value output=user]
} on-error={:local srise; :return "ERROR"}
:log info [:len $srise]
:return ($srise->"data")}
:log warning [$FuncSunriseNew2 "56.5312" "38.5209"]
И что-же - фиг Вам называется. Хоть ресурс нормально отдает данные - ничего в переменную srise не попадает, её длина равна нулю.
Если же использовать FuncSunriseNew2 без обертки в обработчик ошибок:
Код: Выделить всё
:global FuncSunriseNew2 do={
:local srise [/tool fetch url=("https://api.sunrise-sunset.org/json\?lat=$1&lng=$2") mode=https as-value output=user]
:log info [:len $srise]
:return ($srise->"data")}
:log warning [$FuncSunriseNew2 "56.5312" "38.5209"]
то работает нормально.
В чём проблема ? Что не так ? Какого ... as-value вариант /tool fetch так себя ведёт ? Опять ошибка Микротиковских разрабов или я не прав ?
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 30 ноя 2020, 22:26
Sertik
Если эта ошибка подтвердиться, то получается с одной стороны - использовать as-value, конечно правильно с точки зрения экономии флеш-памяти (не надо перезаписывать). Но, тогда, использовать as-value вариант придется без обработчика ошибок и при возникновении таковой (например, при недоступности запрашиваемого ресурса) скрипт остановится и вылетит ...
Просьба проверить и отписаться какие будут мнения.
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 01 дек 2020, 08:23
pepelxl
Трудно говорить о поведении fetch, документации на него не много.
Однако в целом напомню, что заворачивать в обработчик ошибок избыточно. Fetch возвращает массив в котором одним из аргументов является status; надо дожидаться ->finished. Если глюканет сам fetch то скрипт остановится; для исключения этого случая на офф форуме рекомендуют сначала создавать запрос с keep-result для проверки связи с сервером.
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 02 дек 2020, 01:32
Sertik
Да, но если проверять возможен ли /fetch as-value сначала дав /fetch c keep-result то будет запись на флеш, тогда смысл какой ?
Получается пока, что старый метод с keep-result и записью на флеш надежнее ? При нём обработка ошибок нормально работает и если происходит ошибка в /fetch скрипт не вылетает.
Не знаю, у меня ежедневно по многу раз в роутерах флеш перезаписывается около 5 лет уже. Пока все живые.
Хотелось бы, конечно, нормально работать с as-value, но пока Микротиковцы ошибку не исправят даже не знаю ....
Косяков по скриптам за ними уже много набралось:
1. выполнение N+1 раз при повторном вызове функций
2. глюк в gmt-offset
3. ненормальная работа обработчика ошибок при /fetch as-value
4. глюки при объявлении массивов методами :local array [{}]
Думаю, если вспомнить - ещё наберется. Надо собрать всё и накатать им. Всё же не только им новые модели роутеров выпускать ... Как ни крути, дьявол в мелочах ... Хотят держать марку - пусть работают ...
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 02 дек 2020, 10:38
podarok66
Мне кажется, что проблемы с флеш немного раздуты в сети. Равно как и с SSD. Всё же у большинства юзеров SSD живут достаточно долго, чтобы можно было говорить об их надёжности и оправданности применения в повседневной практике. С флеш та же картинка. У каждого из нас живут и работают в окружении десятки устройств Микротик (я имею ввиду активно "админящих" пользователей нашего форума). И дохлые по причине именно флеша - явление редкое.
Не буду утверждать наверняка, но предположу, что есть как процент брака от производителя (как без этого), так и процент поломок от "большого ума" (десяток или более скриптов с периодом сработки в пару секунда и все пишут на флеш).
Давайте будем честны сами с собой. Часто мы хотим чего-то идеального, максимально точного в результатах. Контроль всего, что только в голову придёт. Это одна из причин кучи ненужных записей в многострадальную память. Юношеский максимализм своего рода. А как говорит один наш модератор - "нужен инженерный поход". Пишем то, что действительно необходимо, а от всего остального отказываемся в стандартном режиме работы (дебагинг - отдельная тема, это стандартным режимом не назовёшь). Либо пишем всё, до чего можем дотянутся и с максимальной подробностью, но держим в запасе железку на замену и реально понимаем риск такой эксплуатации.
Сомневаюсь, что при разумном использовании то же fetch быстро убьет флешку. Ну а после 5 лет эксплуатации мы же понимаем, что железка отработала свои деньги и не раз

Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 02 дек 2020, 11:04
pepelxl
Мне кажется, что проблемы с флеш немного раздуты в сети.
Раздуты, но сама идея выкладывать на форум не есть хорошо. Понятно что автор понимает что делает скрипт и запуская его раз в сутки не уложит флеш. Но кто-то заскочит на форум возьмёт кусок, и запустит раз в секунду. Долго проживут флешки со средней продолжительностью в 100к записей? И вопрос тут не к аборигену который скопировал код, а к культуре человека, который его выложил.
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 02 дек 2020, 13:18
Sertik
И вопрос тут не к аборигену который скопировал код, а к культуре человека, который его выложил.
Так так ... Подкоп ?

Постараюсь быть культурным, но образованности не хватает
Если чего накопаете совместно или по отдельности про обработку ошибок с /fetch as-value - дайте знать ...
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 03 дек 2020, 14:33
podarok66
pepelxl писал(а): ↑02 дек 2020, 11:04
Раздуты, но сама идея выкладывать на форум не есть хорошо. Понятно что автор понимает что делает скрипт и запуская его раз в сутки не уложит флеш. Но кто-то заскочит на форум возьмёт кусок, и запустит раз в секунду. Долго проживут флешки со средней продолжительностью в 100к записей? И вопрос тут не к аборигену который скопировал код, а к культуре человека, который его выложил.
Простите, но не согласен от слова совсем. Ни один скриптописатель не должен рассчитывать на использование его скрипта ненадлежащим образом. Ведь и лопатой можно копать, а можно из неё пытаться сделать экскаватор. Во втором случае лопатка вполне ожидаемо сломается. Если кто-то собирается насиловать флеш подобными экспериментами, он сам себе Злобный Буратино. Ну или ему очень надо и он должен быть готов к укороченному сроку эксплуатации.
А Sertik просто делится своими наработками, как и вы. И уж пытаться обвиноватить кого либо из вас более чем странно. Я вам всем бесконечно благодарен за ваш труд, с удовольствием и гордостью читаю всю ветку и признаюсь, что это любимая моя часть форума.
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 03 дек 2020, 14:43
Sertik
От одной только благодарности нашего padarok66 я готов писать скрипты с ещё большим энтузиазмом.

Профессионализма и знаний не хватает ...
Re: Еще один глюк скриптов Роутер-ОС ?
Добавлено: 11 дек 2020, 11:50
Sertik
:global FuncSunriseNew2 do={
:do { :local srise [/tool fetch url=("
https://api.sunrise-sunset.org/json\?lat=$1&lng=$2") mode=https as-value output=user]
} on-error={:local srise; :return "ERROR"}
:log info [:len $srise]
:return ($srise->"data")}
:log warning [$FuncSunriseNew2 "56.5312" "38.5209"]
Оказалось это не глюк РОС.
Просто внутри :do {} on-error={} нужно использовать определение и присваивание только глобальным переменным иначе (при локальных) за пределами об этой переменной скрипт уже ничего не знает:
:global FuncSunriseNew2 do={
:do { :global srise [/tool fetch url=("
https://api.sunrise-sunset.org/json\?lat=$1&lng=$2") mode=https as-value output=user]
} on-error={:return "ERROR"}
:global srise; :return ($srise->"data")}
:log info [$FuncSunriseNew2 "56.5312" "38.5209"]
Вот так работает нормально.