- Изменено
igor Подтверждаю, пакеты обновлялись по кнопке, правда отчёт об успешном обновлении не приходил, просто писал "Команда принята" и обновлял. Исправления смогу проверить после следующего обновления... )
igor Подтверждаю, пакеты обновлялись по кнопке, правда отчёт об успешном обновлении не приходил, просто писал "Команда принята" и обновлял. Исправления смогу проверить после следующего обновления... )
igor Проверил. На версии OpenWrt 23.05.4 r2 Всё работает !!!
Исправлена ошибка в обновлённой версии автоматизации из-за которой вместо точечного обновления пакетов происходила принудительная переустановка, при обновлении групповых пакетов, этих проблем не возникало. Так же в описание добавил несколько скриншотов новой автоматизации.
Странно, никто не заметил баг. Может не пользуется никто.
Пользуемся . Спасибо за автоматизацию.
Часть автоматизации перестала работать с какой-то версии homed-automation ( возможно с версии 2.0). Почему-то shelloutput перестал формировать кнопки если не добавалять к нему символы и в остальном тоже стал через раз выводить данные. Пришлось переделать автоматизацию и вместе с тем добавить функцию удаления сообщений, что добавил уважаемый разработчик в новых версиях пакета.
igor
При этом в opkglistupgradable.txt:
Пакеты HOMEd:
Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'Остальные пакеты OpenWRT:
Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'
В вебе тоже пусто.
MuMoKpoKoDuJI Это означает, что доступных обновлений нет. Я считаю неправильным выводить информацию с длинным списком доступных пакетов в текстовом сообщении Telegram (не в виде файла), так как их может быть настолько много, что сообщение просто не отобразится.
Как можно сделать так, чтобы кнопка с обновлением не выводилась, если пакеты для обновления отсутствуют? Пока я не понимаю, в каких случаях shelloutput
возвращает значение _NULL_
.
Я предположил, что человек поймёт отсутствие обновлений, прочитав присланный файл.
Или, возможно, ваш посыл заключается в чём-то другом? Если это так, напишите, пожалуйста, развёрнуто. На основе двух скриншотов с короткими комментариями к ним я мог понять ситуацию не полностью.
igor я к тому, что зачем мне лезть в текстовый файл, чтобы узнать, что обновлений нет. При этом кнопка "обновление пакетов" доступна, что сбивает с толку.
В данной ситуации логичнее было бы убрать кнопку "обновление пакетов", если после opkg update у нас пусто.
Ни в коем случае не наезжаю, просто поделился мнением.
_NULL_
- в данном случае это отсутствие вывода, пустая строка.
warlock Это я понимаю. Я не понимаю почему иногда shelloutput не будет выводится если я его не экранирую или если не добавлю символ сразу после, например так {shelloutput} кнопок не будет, а так {shelloutput}fgsffg кнопки появятся, но с дополнительной кнопкой fgsffg, либо можно так {shelloutput}
но первая кнопка будет с обратной кавычкой и в конце появится отдельная кнопка с обратной кавычкой.
MuMoKpoKoDuJI В предыдущем сообщении я объяснил, что уже пытался придумать решение этой задачи. Однако без использования большого количества дополнительных скриптов или усложнения кода у меня это не получилось. Основная сложность заключается в том, что сообщение, формирующее кнопки, должно оставаться уникальным для корректной работы автоматизации. Эта особенность является важной и желательно её сохранить.
Я немного изменил скрипт, и теперь, возможно, он позволит реализовать ваши пожелания. Однако я не могу проверить, что произойдёт, если будут доступны пакеты для обновления, так как на всех моих устройствах они уже обновлены. Прикрепляю тестовый файл к этому сообщению.
igor может тогда наоборот, давай упростим?
homed="Пакеты HOMEd:"
other="Остальные пакеты OpenWRT:"
empty="Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'"
for pkg in $(opkg list-upgradable | awk '{print $1}' | sort); do
if [[ $pkg =~ ^homed- ]]; then
homed="$homed\n$pkg"
else
other="$other\n$pkg"
fi
done
[ "$(echo -e "$homed" | wc -w)" -le 1 ] && homed="$homed\n$empty"
[ "$(echo -e "$other" | wc -w)" -le 1 ] && other="$other\n$empty"
echo -e "$homed\n\n$other" | tee /tmp/opkglistupgradable.txt
вот это, к примеру, делает тоже самое, что обсуждаемый кусок кода, но как минимум несколько компактнее, не создает лишних файлов и скорее всего чуть быстрее твоего варианта.
вот это еще чуть быстрее
homed_pkg_count=0
other_pkg_count=0
homed="Пакеты HOMEd:";
other="Остальные пакеты OpenWRT:";
empty="Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'"
for pkg in $(opkg list-upgradable 2>/dev/null | awk '{print $1}' | sort); do
if [[ $pkg =~ ^homed- ]]; then
homed="$homed\n$pkg"
homed_pkg_count=$((homed_pkg_count+1))
else
other="$other\n$pkg"
other_pkg_count=$((other_pkg_count+1))
fi
done
[ "$homed_pkg_count" -eq 0 ] && homed="$homed\n$empty"
[ "$other_pkg_count" -eq 0 ] && other="$other\n$empty"
echo -e "$homed\n\n$other" | tee /tmp/opkglistupgradable.txt
warlock Я не совсем понял, как это решает проблему вывода shelloutput (или file contents) в часть отправки обычного текстового сообщения если у меня образуется длинная портянка из списка доступных для обновления пакетов? Да этот код компактнее, но я чуть изменил старый код, и те временные файлы помогают мне выводить нужный shelloutput для формирования нужных мне кнопок в зависимости от наличия пакетов для обновления или их отсутствия. Да он стал ещё более громоздким, но теперь кнока с обновлением не выводится. Помимо кода я убрал из автоматизации лишние shell для формирования кнопок.
Вот код с правками:
#!/bin/sh
# Создание уникальных временных файлов
ALL_PKGS=$(mktemp /tmp/opkg_all_pkgs_XXXXXX)
HOMED_TMP=$(mktemp /tmp/opkg_homed_pkgs_XXXXXX)
OTHER_TMP=$(mktemp /tmp/opkg_other_pkgs_XXXXXX)
# Получаем список всех пакетов
opkg list-upgradable | awk '{print $1}' > "$ALL_PKGS"
# Параллельная фильтрация
{
grep '^homed-' "$ALL_PKGS" > "$HOMED_TMP"
grep -v '^homed-' "$ALL_PKGS" > "$OTHER_TMP"
} & wait
# Функция для формирования вывода в файл
print_section() {
echo "$1"
if [ -s "$2" ]; then
sort "$2"
else
echo "Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'"
fi
echo
}
# Записываем данные в основной файл
(
print_section "Пакеты HOMEd:" "$HOMED_TMP"
print_section "Остальные пакеты OpenWRT:" "$OTHER_TMP"
) > /tmp/opkglistupgradable.txt
# Формируем заголовок для уведомления
if [ -s "$HOMED_TMP" ] || [ -s "$OTHER_TMP" ]; then
echo "Обновить пакеты или переустановить?" > /tmp/title2tg.txt
else
echo "Не удалось найти обновления пакетов. Вы можете переустановить нужный пакет HOMEd отдельно, либо группой." > /tmp/title2tg.txt
fi
# Вывод в терминал
if [ -s "$HOMED_TMP" ] || [ -s "$OTHER_TMP" ]; then
echo "Обновление пакетов: UpgradePackages"
fi
echo "Принудительная переустановка пакетов: ReinstallPackages"
# Удаление временных файлов
rm "$ALL_PKGS" "$HOMED_TMP" "$OTHER_TMP"
Я не совсем понял, как это решает проблему вывода shelloutput
честно, никак я понимаю, что ты пытаешься как-то обойти проблему с отправкой текста, но лучше разобраться с проблемой, чем обходить ее
99% проблем с выводом {{ shellOutput }} в телегу из-за неэкранированных спецсимволов маркдауна(можно открыть спецификацию по API и искать их в выводе скриптов, и я думаю довольно быстро найдешь суть проблемы).
можно просто запустить скрипт в консоли и попробовать его вывод через curl отправить себе в телегу, от имени бота. в случае ошибки апи пришлет 400 код, и возможно даже краткое описание ошибки
warlock Спасибо! Попробую. Но я не думаю что дело в спецсимволах маркдаун, потому как те же самые скрипты отпрвляли выводом {{ shellOutput }} нужные мне кнопки и обычные сообщения в версии homed-automation 1.6.8 , а в версии 2.0.5 уже перестали отправлять. Я смотрел эхо терминала вызывая скрипт вручную, там ничего не изменилось:
название пакета запятая пробел название пакета запятая пробел... и так далее
Вот например этот скрипт:
opkg list-installed | awk '/^homed-/ && $1 !~ /^(homed-common|homed-qt)$/ {
sub(/^homed-/, "", $1);
pkg = $1 ": " $1 " reinstall";
if (packages == "") {
packages = pkg
} else {
packages = packages ", " pkg
}
count++
if (count % 3 == 0) {
print packages;
packages = ""
}
}
END {
if (packages != "") print packages
}'
Его эхо в терминале:
automation: automation reinstall, custom: custom reinstall, web: web reinstall
zigbee: zigbee reinstall
Если пытаться отправить это автоматизацией в телеграм, поместив {{ shellOutput }} в секцию keyboard, то сообщение не дойдёт.
Если взять в обратные кавычки, то придёт это:
Если поместить {{ shellOutput }}в в секцию keyboard (можно любой символ прилепить к закрывающим фигурным скобкам) то придёт это:
Абсолютно те же самые скрипты в более ранних версиях пакета работали иначе.
Ладно пойду разбираться как курлом слать это дело. Ещё раз спасибо!