• Изменено

igor Подтверждаю, пакеты обновлялись по кнопке, правда отчёт об успешном обновлении не приходил, просто писал "Команда принята" и обновлял. Исправления смогу проверить после следующего обновления... )

    igor Проверил. На версии OpenWrt 23.05.4 r2 Всё работает !!!

    • igor оценил это.
    7 дней спустя
    • Изменено

    Исправлена ошибка в обновлённой версии автоматизации из-за которой вместо точечного обновления пакетов происходила принудительная переустановка, при обновлении групповых пакетов, этих проблем не возникало. Так же в описание добавил несколько скриншотов новой автоматизации.
    Странно, никто не заметил баг. Может не пользуется никто.

      • Изменено

      Пользуемся . Спасибо за автоматизацию.

      • igor оценил это.
      19 дней спустя

      Часть автоматизации перестала работать с какой-то версии homed-automation ( возможно с версии 2.0). Почему-то shelloutput перестал формировать кнопки если не добавалять к нему символы и в остальном тоже стал через раз выводить данные. Пришлось переделать автоматизацию и вместе с тем добавить функцию удаления сообщений, что добавил уважаемый разработчик в новых версиях пакета.

        igor Image description
        При этом в opkglistupgradable.txt:

        Пакеты HOMEd:
        Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'

        Остальные пакеты OpenWRT:
        Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'

        В вебе тоже пусто.

        • igor ответили на это сообщение.

          MuMoKpoKoDuJI Это означает, что доступных обновлений нет. Я считаю неправильным выводить информацию с длинным списком доступных пакетов в текстовом сообщении Telegram (не в виде файла), так как их может быть настолько много, что сообщение просто не отобразится.
          Как можно сделать так, чтобы кнопка с обновлением не выводилась, если пакеты для обновления отсутствуют? Пока я не понимаю, в каких случаях shelloutput возвращает значение _NULL_.
          Я предположил, что человек поймёт отсутствие обновлений, прочитав присланный файл.
          Или, возможно, ваш посыл заключается в чём-то другом? Если это так, напишите, пожалуйста, развёрнуто. На основе двух скриншотов с короткими комментариями к ним я мог понять ситуацию не полностью.

            igor я к тому, что зачем мне лезть в текстовый файл, чтобы узнать, что обновлений нет. При этом кнопка "обновление пакетов" доступна, что сбивает с толку.
            В данной ситуации логичнее было бы убрать кнопку "обновление пакетов", если после opkg update у нас пусто.
            Ни в коем случае не наезжаю, просто поделился мнением.

            • igor ответили на это сообщение.
              • Изменено

              _NULL_ - в данном случае это отсутствие вывода, пустая строка.

              • igor ответили на это сообщение.

                warlock Это я понимаю. Я не понимаю почему иногда shelloutput не будет выводится если я его не экранирую или если не добавлю символ сразу после, например так {shelloutput} кнопок не будет, а так {shelloutput}fgsffg кнопки появятся, но с дополнительной кнопкой fgsffg, либо можно так {shelloutput} но первая кнопка будет с обратной кавычкой и в конце появится отдельная кнопка с обратной кавычкой.

                  MuMoKpoKoDuJI В предыдущем сообщении я объяснил, что уже пытался придумать решение этой задачи. Однако без использования большого количества дополнительных скриптов или усложнения кода у меня это не получилось. Основная сложность заключается в том, что сообщение, формирующее кнопки, должно оставаться уникальным для корректной работы автоматизации. Эта особенность является важной и желательно её сохранить.
                  Я немного изменил скрипт, и теперь, возможно, он позволит реализовать ваши пожелания. Однако я не могу проверить, что произойдёт, если будут доступны пакеты для обновления, так как на всех моих устройствах они уже обновлены. Прикрепляю тестовый файл к этому сообщению.

                  upgradefromtgtest-205test.json
                  45kB
                  • warlock ответили на это сообщение.
                    • Изменено

                    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

                    вот это, к примеру, делает тоже самое, что обсуждаемый кусок кода, но как минимум несколько компактнее, не создает лишних файлов и скорее всего чуть быстрее твоего варианта.

                    • igor ответили на это сообщение.

                      warlock Я бы с удовольствием, если б умел писать скрипты. Весьма сложно мне всё это даётся. Если есть предложения я готов внести нужные правки, уверен автоматизация довольно кривенькая, но как уж смог...

                      • warlock ответили на это сообщение.

                        вот это еще чуть быстрее🙂

                        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

                          igor давай я попробую разобраться в том, что у тебя есть... может еще какие мысли придут🙂

                          • igor оценил это.

                          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 код, и возможно даже краткое описание ошибки🙂

                            • igor ответили на это сообщение.

                              как курлом слать сообщения в телегу можно посмотреть тут

                                • Изменено

                                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, то сообщение не дойдёт.
                                Если взять в обратные кавычки, то придёт это:

                                Image description!

                                Если поместить {{ shellOutput }}в в секцию keyboard (можно любой символ прилепить к закрывающим фигурным скобкам) то придёт это:

                                Image description!

                                Абсолютно те же самые скрипты в более ранних версиях пакета работали иначе.
                                Ладно пойду разбираться как курлом слать это дело. Ещё раз спасибо!

                                  5 дней спустя

                                  warlock Всё таки дело было в маркдаун. Не сразу я понял что перенос каретки последним символом так влияет на автоматизацию. Спасибо!