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

Пакет плагина: формат, установка, удаление

Черновик пилота; ссылки сверены после исправлений. Каждое фактическое предложение ссылается на claim id из базы. Факты уровня forum помечены «по сообщениям пользователей»; гипотезы (inference) и ослабленные верификатором утверждения (disputed) вынесены в раздел «Не проверено». Где факт наблюдался только в одной прошивке, это сказано.

Источники главы: официальный SDK (doc-sdk-plugins, версия прошивки в документе не указана), строки libduneshell.so Android-прошивки tv188b 260827_0003_r24, три плагина dune-club (globaltv, Screenshoter, widget_ext) и две темы форумов. Наблюдения на устройстве tv188b 261021_0117_r25 (уровень device, логи collect4–collect6 с тестовыми плагинами) отмечены «r25, device» и относятся только к этой прошивке.

1. Что такое пакет плагина

Установщик плагина — ZIP-архив, в корне которого лежит dune_plugin.xml, а рядом — прочие файлы плагина (SDK)1. dune_plugin.xml — единственный файл, обязательный для загрузки плагина; остальные файлы перечисляются в манифесте и могут называться как угодно (SDK)2. По SDK PHP-плагин дополнительно обязан содержать PHP-программу с функцией hd_create_plugin(), путь к которой задаётся в dune_plugin.xml (SDK)3. На tv188b r25 тестовые плагины test_plugin5 и test_plugin10 работали без hd_create_plugin(): их main.php объявляет класс-наследник DunePluginFw, и handle_user_input выполнялся (устройство r25)4. Обе стороны — в §7.

Имя плагина (dune_plugin->name) — непустой идентификатор из алфавитно-цифровых символов и -, ., _, длиной не более 64 (SDK)5; caption — подпись, которую видно в «Setup / Misc / Plugins» (SDK)6. Подробнее о манифесте — в теме plugin-manifest (глава ещё не написана).

Для примеров SDK предлагает плагины dune_plugin_demo2 (IPTV/VOD на PHP), dune_plugin_simple_presenter (digital signage) и dune_plugin_linux_code_demo (демон + HTTP API + HTML) (SDK)7.

Типичное содержимое каталога

Ниже — каталоги и файлы, которые встречаются в документации и в разобранных пакетах. Это перечень наблюдений, а не обязательная структура.

Путь в пакете Назначение Источник
dune_plugin.xml манифест, обязателен (SDK)2
PHP-программа точка входа PHP-плагина, путь — в манифесте; по SDK — с hd_create_plugin(), на tv188b r25 тестовые плагины работали без неё (§7) (устройство r25, SDK)8
translations/dune_language_<lang>.txt переводы плагина (SDK)9
bin/ исполняемые файлы плагина (SDK)10
www/ статические файлы, отдаваемые по HTTP (SDK)11
www/cgi-bin/ CGI-скрипты плагина (SDK)11
.platform.87xx/ платформенные файлы для SMP87xx (SDK)12
dune_plugin.sign, dune_plugin_signer_id.txt подпись плагина (SDK)13

Файлы переводов загружаются в глобальную таблицу переводов при старте устройства или смене языка интерфейса (SDK)9. В плагине globaltv они лежат как translations/dune_language_english.txt и dune_language_russian.txt в формате «ключ = текст» (код)14. В прошивке r24 у оболочки есть шаблоны пути %s/translations/dune_language_%s.txt и запасной …/dune_language_english.txt (код r24)15.

К ресурсам своего плагина обращаются по plugin_file://path, к ресурсам другого плагина — по plugin_file://%plugin_name%/path (SDK)16. В прошивке r24 оболочка знает схемы plugin_file:// и plugin_archive:// (код r24)17.

Исполняемые файлы и атрибуты

ZIP не хранит UNIX-атрибуты, поэтому файлы в bin/ и www/cgi-bin/ при установке делаются исполняемыми (SDK)10. Пакеты могут нести собственные бинарники: встроенный плагин shell_ext прошивки r24 содержит свои ELF curl и php-cgi в shell_ext/bin/ (код r24)18, Screenshoter — собственный ELF www/cgi-bin/php-cgi (51724 байта) со ссылками на libphp5.so и /lib/ld-linux.so.3 (код)19, а bin/curl.864x плагина widget_ext побайтно совпадает с shell_ext/bin/curl прошивки r24 (код)20. CGI-обёртки Screenshoter www/cgi-bin/do и index — shell-скрипты (код)21.

Веб-часть плагина

Встроенный HTTP-сервер отдаёт $install_dir_path/www/* по адресу http://<STB>/plugins/<plugin_name>/* и исполняет CGI из www/cgi-bin/* по адресу http://<STB>/cgi-bin/plugins/<plugin_name>/* (SDK)11. Начиная с 120531_2200_beta эти файлы доступны не только локально, но и из локальной сети (SDK)22. В прошивке r24 у libduneshell.so есть пути /tmp/www/plugins, /tmp/www/cgi-bin/plugins, /firmware/bin/run_plugin_cgi, /tmp/www/cgi-bin/run_plugin_cgi рядом с сообщениями [populate_plugins] (код r24)23. Там же CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), поэтому PHP-обработчик плагин должен вызвать сам (код r24)24. На tv188b r24 (device) загрузчик создаёт для каждого файла <plugin>/www/cgi-bin одноимённую символическую ссылку в /tmp/www/cgi-bin/plugins/<plugin>/ на run_plugin_cgi, а /tmp/www/plugins/<plugin> — ссылку на каталог www плагина (устройство r24)25. Веб-интерфейс Screenshoter ссылается на свои css и картинки по адресу /plugins/<plugin_name>/ (SDK)26.

На tv188b r25 (device):

  • www/index.txt отдаётся по http://<IP>/plugins/<p>/index.txt с HTTP 200 (устройство r25)27, а http://<IP>/cgi-bin/plugins/<p>/env.sh?kbp5=1 исполняет www/cgi-bin/env.sh с QUERY_STRING (устройство r25)28; оба отвечают и клиенту из локальной сети (устройство r25)29;
  • CGI получает PLUGIN_NAME=<p>, а PLUGIN_CGI_DIR и SCRIPT_FILENAME — реальные пути $FS_PREFIX/flashdata/plugins/<p>/www/cgi-bin… (устройство r25)30; $0 — абсолютный SCRIPT_FILENAME, cwd — PLUGIN_CGI_DIR (устройство r25)31;
  • CGI работает под uid 0 (root) с контекстом u:r:shell:s0 (устройство r25)32, сервер — busybox httpd/1.35.0 (устройство r25)33;
  • URL каталога плагина без «/» в конце даёт 302, со «/» — 404 (устройство r25)34; «/» после имени файла — 404 (устройство r25)35; …/<скрипт>/extra?x=1 вызывает скрипт с PATH_INFO=/extra (устройство r25)36.

Системные PHP-файлы

В каталоге php/ прошивки tv188b 260827_0003_r24 ни один файл не подключает bootstrap.php, dune_api.php, dune_config.php или dune_plugin_fw.php (require_once встречается только внутри dunelib); пути этих файлов и dune_plugin.php вместе с шаблоном require ('%s'); присутствуют в строках php_server (libxxx_php_server.so) (код r24)37.

В той же прошивке DuneSystem::$properties используется в dune_config.php и dunelib/utils.php (ключи few_buttons_remote_type, plugin_name), но класс DuneSystem в каталоге php/ не определён; шаблон class DuneSystem { public static $properties = array( есть в строках php_server (код r24)38.

Неустановленный порядок загрузки рассмотрен в guide/unverified.md.

2. Платформенные варианты (.platform.*)

Возможности фреймворка PHP-плагинов и механизма плагинов (манифест, www/, www/cgi-bin) на SMP87xx поддерживаются так же, как на SMP86xx (SDK)39, а на Android — так же, как на SMP87xx (SDK)40.

Платформенные файлы для SMP87xx (ARM) кладутся в .platform.87xx/ в корне плагина, а основная копия (bin/, www/cgi-bin/) предназначена для SMP86xx (MIPS) (SDK)12. При установке на SMP86xx содержимое .platform.87xx удаляется, на SMP87xx — переносится в корень каталога установки (SDK)41.

Для Android текст SDK буквально говорит обратное ожидаемому: содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень (SDK)42. См. «Расхождения» ниже.

В прошивке r24 у установщика есть строки %s/.platform.android, %s/.platform.%s, android-arm-api19, .platform. и [plugin_installer] applying %s (код r24)43.

На устройстве tv188b 261021_0117_r25 (r25, device) штатный установщик ZIP сделал не то, что буквально написано в SDK. Он применил к корню плагина сначала .platform.android, затем поверх — .platform.android-arm-api19 (устройство r25)44. .platform.87xx и .platform.foo он не применил и удалил все четыре каталога .platform.* до копирования (устройство r25)45. Файл в bin/ после установки стал исполняемым, а файлы в корне плагина — нет (устройство r25)46. Это наблюдение одной прошивки; для r24 и других версий порядок остаётся невыясненным (см. «Расхождения»).

3. Установка

Из ZIP-файла

Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства (SDK)47; PHP-плагины хранятся во флеш-памяти и исполняются на устройстве (SDK)48. Для ручной установки обычно нужно активированное «Flash memory storage» или «System storage»; если не активно ни то ни другое, устройство предложит активировать Flash memory storage (SDK)49.

По сообщениям пользователей, Screenshoter распространяется как dune_plugin_Screenshoter.zip и ставится выбором ZIP в файловом браузере с флешки, а архив 7z не подходит (форум)50.

Если плагин с тем же именем уже установлен вручную, система предлагает перезаписать его или отменить установку; встроенные в прошивку плагины, по SDK, перезаписать нельзя (SDK)51 (см. «Расхождения»).

Как это выглядит в прошивке r24

В libduneshell.so прошивки tv188b 260827_0003_r24 есть строки установщика: временный каталог /tmp/plugin_tmp, файл %s/__plugin__.zip, команда cd %s%s && ls -la __plugin__.zip && unzip __plugin__.zip && rm -f __plugin__.zip, сообщения «md5 does not match» и «suitable storage not found; cancelled» (код r24)52. Установщик сверяет name в манифесте с ожидаемым: есть сообщение «declared plugin name is '%s', real is '%s'» (код r24)53. Есть и сообщения о запретах: «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «signature verification failed» и др. (код r24)54. Есть сообщения об отсутствующем и неразбираемом манифесте (%s/dune_plugin.xml) (код r24)55.

Связную картину установки (скачивание, распаковка, копирование) из этих строк восстановить можно только как гипотезу — см. «Не проверено».

Как это выглядит на устройстве r25

Наблюдения на tv188b r25 (device, одна прошивка):

  • ZIP, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/<p>; рядом появились …/flashdata/plugins_archive/<p>, …/flashdata/plugins_data/<p> и /tmp/plugins/<p> (устройство r25)56.
  • Перед распаковкой установщик выполняет rm -rf '/tmp/plugin_tmp' и mkdir, распаковывает архив unzip в $FS_PREFIX/tmp/plugin_tmp и копирует каталог в /flashdata/plugins/<p>, удалив прежний (устройство r25)57.
  • После установки оболочка пишет «reloading plugin», регистрирует плагин и «Done.» в том же процессе приложения, без его перезапуска (устройство r25)58.
  • Если name в dune_plugin.xml не равен имени каталога, в shell.log пишется «invalid plugin manifest …: name '' is not equal to directory name '<каталог>'» (устройство r25)59, и плагин не регистрируется ни под одним из имён (устройство r25)60.
  • Регистрируются плагины типов php, plain и internal.internal (устройство r25)61. Плагин plain без params/program (только dune_plugin.xml и bin/) тоже регистрируется (устройство r25)62.
  • Точки входа без icon_url в разделе «Приложения» не появились (устройство r25)63. Без icon_url у всех точек входа launch_capable в installed_plugins.xml был 0; с icon_url — 1 и category applications (устройство r25)64. В SDK icon_url описан среди параметров отображения точки входа — см. «Не проверено».

Оболочка r24 экспортирует функции разбора URL установщика, деинсталлятора и запуска плагина (playlist_is_plugin_installer_url, playlist_parse_plugin_uninstaller_url и др.) (код r24)65. Плагин globaltv удаляет другие плагины действием launch_media_url с URL plugin_uninstaller://<имя> (код)66.

Подключение без установки: dune_plugins

Плагины можно подключить без установки через папку dune_plugins в корне «main»-накопителя: каждая подпапка — данные одного плагина (SDK)67. «Main» — накопитель, который единственный подключён сейчас или был единственным при включении плеера (SDK)68. Механизм предназначен в основном для разработки; чтобы применить изменения, нужно дважды нажать POWER (standby и включение) (SDK)69. На Android пользовательские накопители монтируются с noexec, что мешает механизму dune_plugins (SDK)70. Что SDK пишет о развёртывании на Android через adb push в /flashdata/plugins, верификатор ослабил — см. «Не проверено».

Без установщика: adb push (наблюдение r25)

На tv188b r25 (device) плагин разворачивается без установщика. Каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после am force-stop com.dunehd.app оболочка регистрирует плагин (устройство r25)71. SELinux-метка такого каталога совпала с меткой соседнего плагина, chcon не понадобился (устройство r25)72. Каталога /flashdata в корне ФС нет, хотя оболочка в shell.log называет каталог плагинов /flashdata/plugins (устройство r25)73.

Чего ждать после adb push на r25:

  • перечитывание по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00) новый плагин не подхватило, а после am force-stop он зарегистрировался (устройство r25)74; после am force-stop приложение поднимается само за 1–2 с (устройство r25)75;
  • удалённые rm -rf плагины в одном прогоне остались в installed_plugins.xml до am force-stop (устройство r25)76, в другом — исчезли после перечитывания (устройство r25)77; логи расходятся, claims связаны conflicts_with;
  • boot такой плагин получает при ближайшем старте приложения, а не при загрузке системы (устройство r25)78;
  • install не выполняется (устройство r25)79, а update не выполняется и при смене version_index на месте (устройство r25)80.

Действия плагина при установке

SDK позволяет плагину выполнять действия на системные события (global_actions): boot, install, update и uninstall (SDK)81; событие boot_end доступно с прошивки 130917_b9 (SDK)82, gui_start — с 130914_b8 (SDK)83. Глобальным действием может быть любое стандартное GUI-действие плагина или plugin_system, запускающее исполняемый файл из состава плагина (SDK)84; для boot поддерживается только plugin_system (SDK)85. Примеры из пакетов: в globaltv глобальные действия install и update оба ведут на plugin_handle_user_input с entry_id=install (код)86, обработчик при этом запускает через system() скрипт <install_dir_path>/bin/install.sh (код)87, а тот чистит кэш и создаёт флаг обновления EPF (код)88. В widget_ext global_actions/uninstall вызывает bin/uninstall.sh синхронно, без «&» (код)89.

На tv188b r25 (device):

  • при одном старте приложения действия выполнились в порядке boot, boot_end, gui_start (устройство r25)90;
  • boot и boot_end при следующих стартах приложения не повторяются («boot action already executed») (устройство r25)91; факт выполнения отмечают файлы /tmp/run/<плагин>_plugin_boot_action_executed.flag и …_boot_end_action_executed.flag (устройство r25)92;
  • gui_start выполняется при каждом старте приложения (устройство r25)93;
  • plugin_system с относительным путём bin/ga.sh boot оболочка запускает как sh <абсолютный путь каталога плагина>/bin/ga.sh boot (устройство r25)94; скрипт работает под uid 1000 (system), cwd /, с FS_PREFIX=/data/data/com.dunehd.app (устройство r25)95.

4. Где лежат плагины на устройстве

В libduneshell.so прошивки r24 подряд идут строки каталогов плагинов: /flashdata/plugins, /tmp/mnt/D/dune_plugins, /fconfig/plugins, /firmware/plugins, /firmware_ext/plugins (код r24)96. Порядок обхода и приоритет из строк r24 не следуют (см. «Не проверено»). На tv188b r25 (device) при каждой из пяти загрузок плагинов в shell.log — «Loading plugins from '/flashdata/plugins'», затем «… '/firmware_ext/plugins'», других каталогов в этих строках нет (устройство r25)97. Там же плагины загружались повторно без перезапуска процесса приложения (устройство r25)98.

На r25 (device) каталоги данных плагинов — /data/data/com.dunehd.app/flashdata/plugins_data/<p>, в том числе у встроенных; в …/config/plugins_data есть только bluray (устройство r25)99. После регистрации появляются ссылка /tmp/www/plugins/<p> на каталог www плагина (устройство r25)100 и каталог /tmp/www/cgi-bin/plugins/<p> со ссылками на run_plugin_cgi для каждого файла www/cgi-bin (устройство r25)101.

В образе этой прошивки 13 встроенных плагинов лежат в /system/dunehd/firmware_ext/plugins/ (код r24)102, а на устройстве они ожидаются по пути /data/data/com.dunehd.app/firmware_ext/plugins/ (код r24)103. По сообщениям пользователей, в Dune 301 (150721_0136_B9) предустановленные плагины лежат в firmware_ext и удаляются только модификацией прошивки (форум)104.

Список установленных плагинов оболочка r24 ведёт в /tmp/run/installed_plugins.xml (код r24)105. Шаблон записи содержит поля name, caption, path, version_index, version_id, patch_index, version, launch_capable, delete_capable, category, logo_url и др. (код r24)106. Этот файл читают и сами плагины: встроенные PHP-плагины r24 (shell_ext, android_apps, dunestore) (код r24)107, а globaltv берёт из него имена установленных плагинов (код)108. На r25 (device) запись плагина из flashdata содержит name, caption, path (полный, с $FS_PREFIX), version_index, version и launch_capable; полей version_id, patch_index и delete_capable в записях тестовых плагинов нет (устройство r25)109.

5. Подпись

Встроенные в розничную прошивку и распространяемые через Dune Store плагины подписаны Dune HD; подписанный плагин содержит dune_plugin.sign и dune_plugin_signer_id.txt (SDK)13. Допустимые signer ID — com.dune-hd и customer ID кастомной прошивки (с 150326_r10) (SDK)110. Для подписанного плагина система проверяет подпись и отказывается его использовать при несовпадении подписи или недопустимом signer ID (SDK)111. Кастомные (операторские) прошивки могут разрешать только подписанные плагины (SDK)112. Собственная подпись (с 150326_r10) делается DSA-ключами 2048 и утилитой plugin_sign.x86, а публичный ключ кладётся в прошивку как /firmware/config/plugin_key.pem (SDK)113.

В прошивке r24 у libduneshell.so есть строки [plugin_signer]: dune_plugin.sign, dune_plugin_signer_id.txt, signer_id com.dune-hd, ключ /firmware/config/plugin_key.pem или /config/plugin_key.pem, DSA-проверка (код r24)114; назначение файлов dune_plugin.sign (подпись) и dune_plugin_signer_id.txt (signer ID) — как в SDK (SDK r24)115. Подписаны 6 из 13 встроенных плагинов r24 (код r24)116. Плагин globaltv содержит dune_plugin.sign (48 байт) и dune_plugin_signer_id.txt со значением com.dune-hd (код)117.

Политику установки в r24 задаёт файл plugin_config.xml (/config/ или /firmware/config/) с именами allow_install, signed, allow_delete, allow_replace, same_signer_id, default_embedded, default_external (код r24)118. Какие из запретов установщика действуют по умолчанию, из строк не следует (см. «Не проверено»).

6. Удаление

Все установленные плагины перечислены в «Setup / Misc / Plugins», где вручную установленные можно удалить (ENTER → Delete) (SDK)119. Программно плагин удаляется URL plugin_uninstaller://<имя> (пример — globaltv) (код)66. Встроенные плагины прошивки 301, по сообщениям пользователей, убираются только модификацией прошивки (форум)104.

7. Расхождения

hd_create_plugin() в PHP-программе

Сторона Утверждение
SDK PHP-плагин обязан содержать программу с hd_create_plugin(), путь к ней — в dune_plugin.xml (SDK)3
Устройство tv188b r25 (device) тестовые плагины test_plugin5 и test_plugin10 без hd_create_plugin(), с классом-наследником DunePluginFw, работали: handle_user_input выполнялся (устройство r25)4

Стороны связаны conflicts_with. Наблюдение относится к одной прошивке; как устроена PHP-программа без этой функции — в guide/quick-start.md.

.platform.* на Android

Сторона Утверждение
SDK, буквально на Android .platform.android удаляется, .platform.87xx переносится в корень (SDK)42
Устройство tv188b r25 (device) установщик применил к корню .platform.android, затем .platform.android-arm-api19 (устройство r25)44; .platform.87xx не применил и удалил все .platform.* (устройство r25)45

Стороны связаны conflicts_with. Наблюдение относится к одной прошивке: libduneshell.so r24 и r25 — разные файлы, поэтому для r24 и других версий порядок по-прежнему не установлен. Гипотеза аналитика о том же поведении — в «Не проверено».

Замена встроенного плагина

Сторона Утверждение
SDK встроенные в прошивку плагины перезаписать нельзя (SDK)51
Строки r24 у установщика есть сообщение «replace hard-coded plugin '%s' not allowed» (код r24)54
Устройство tv188b r25 (device) при двух копиях dunemdb_supplier_youtube в логе — «prefer_new_builtin (41 vs 34)» и сразу «dup …: replacing»; version_index копии в firmware_ext/plugins — 41, в flashdata/plugins — 34 (устройство r25)120

SDK говорит об установщике, а строки r24 и лог r25 — о загрузчике (populate_plugins). Гипотезы по строкам r24 (загрузчик может заменить встроенный плагин; предпочтение по числам или тегу; «конфликт») связаны с SDK conflicts_with и собраны в «Не проверено». Ветка, в которой встроенный плагин заменяется внешним, на r25 не наблюдалась: в логе есть только случай выше (устройство r25)120.

Допустимые signer ID

Расхождение снято. SDK допускает com.dune-hd и customer ID кастомной прошивки (SDK)110. Прежняя гипотеза о «единственном signer_id com.dune-hd» отозвана; новая гипотеза по строкам r24 согласуется с SDK и приведена в «Не проверено».

Перечитывание плагинов и icon_url

Утверждения SDK о перечитывании плагинов по IP Control и о параметрах точки входа верификатор ослабил, а лог r25 им противоречит (новый плагин не подхвачен без перезапуска приложения (устройство r25)121; точка входа без icon_url не видна (устройство r25)63). Пары — в «Не проверено».

8. Не проверено

Здесь три вида утверждений. Большинство — гипотезы (inference, в том числе подтверждённые верификатором как рассуждение). Два утверждения SDK уровня doc верификатор ослабил до disputed ((SDK)122). Одно утверждение SDK уровня doc ((SDK)123) осталось unverified: верификатор трижды вынес вердикт weakened, потому что его буквальный путь на tv188b r25 не работает. Опираться на эти утверждения нельзя без проверки; подробности — в verification каждого claim и в столбце «Что мешает».

Claim Суть Что мешает
(вывод r24)124 пакет скачивается по URL во временный каталог как __plugin__.zip, распаковывается unzip, может сверяться по md5, затем копируется или переименовывается в <хранилище>/plugins/<name> вывод из строк; верификатор признал его обоснованным (verified), на устройстве не проверен
(вывод r24)125 установщик может отказать в установке неподписанного плагина, в замене плагина с другим signer_id и «hard-coded» плагина; что действует по умолчанию — неизвестно вывод из строк; верификатор подтвердил (verified), SDK: запрет неподписанных — настройка кастомных прошивок
(вывод r24)126 загрузчик r24 обходит пять каталогов плагинов disputed: что обходятся все пять и что /tmp/mnt/D — «main»-накопитель, из строк не доказать; на r25 в логе только /flashdata/plugins и /firmware_ext/plugins (устройство r25)97
(вывод r24)127 установщик применяет подходящий .platform.<платформа> и удаляет остальные только строки r24; на r25 так и было (устройство r25)128, но бинарник оболочки другой
(вывод)129 задумано по аналогии с SMP87xx: на Android .platform.android переносится в корень, .platform.87xx удаляется inference; на r25 подтверждено наблюдением (устройство r25)44, для r24 и других прошивок — нет
(SDK)123 на Android плагины во флеш-памяти лежат в /flashdata/plugins/<plugin_name>, их можно развернуть adb push и chmod -R +x doc, unverified: на r25 буквальный путь не работает — /flashdata в корне ФС нет (устройство r25)73, плагины лежат в $FS_PREFIX/flashdata/plugins (устройство r25)71; связаны conflicts_with
(SDK)130 перечитать плагины без перезапуска оболочки: ANGLE/ROTATE, Refresh или IP Control cmd=main_screen + cmd=ir_code&ir_code=B24DBF00 disputed: на r25 новый плагин после такого перечитывания не появился (устройство r25)121; связаны conflicts_with
(SDK)131 параметры отображения точки входа: icon_url, icon_margins, icon_fit_scale_factor и др. disputed: на r25 точка входа без icon_url в «Приложениях» не видна (устройство r25)63; связаны related
(вывод r24)132 boot и boot_end выполняются один раз за время работы системы, флаг в /tmp/run disputed для r24; на r25 повтора при перезапуске приложения нет (устройство r25)91, флаги — (устройство r25)92
(вывод r24)133 name сравнивается с именем каталога; отказ ли это, не установлено на r25 — отказ в регистрации (устройство r25)134; для r24 не проверено
(вывод r24)135 загрузчик при двух плагинах с одним name может заменить встроенный плагин другим, а встроенный скрыть inference, disputed; связан conflicts_with с SDK (SDK)51; на r25 эта ветка не наблюдалась
(вывод r24)136 при дубликате загрузчик может предпочесть встроенный (prefer_new_builtin) по числам (вероятно, version_index) или по тегу; есть принудительная замена inference, disputed: на r25 «41 vs 34» совпадает с version_index копий (устройство r25)120, ветки по тегу и force override не выполнялись
(вывод r24)137 при «конфликте» остаётся ранее загруженный плагин условие конфликта не установлено
(вывод r24)138 нерабочие бинарники плагина (bin/php-cgi и др.) заменяются ссылками на /firmware/bin в r24 /firmware/bin/php-cgi отсутствует
(вывод r24)139 после копирования установщик снимает флаг скрытия и перезагружает плагин порядок выведен из соседства строк (исправлением понижено с code до inference)
(вывод r24)140 подпись считается по DSA по обычным файлам каталога плагина, нерегулярные пропускаются порядок файлов и исключение dune_plugin.sign не установлены
(вывод r24)141 ключ проверки подписи ищется в /firmware/config/plugin_key.pem и /config/plugin_key.pem роль /config/plugin_key.pem и приоритет не установлены; в образе r24 ключа нет
(вывод r24)142 signer_id сравнивается с требуемым и может быть отклонён как не разрешённый условие «unsupported signer_id» не установлено
(вывод r24)143 www плагина публикуется в /tmp/www/plugins/<плагин>, для файлов www/cgi-bin создаются «cgi links» что ссылки указывают на run_plugin_cgi, из строк r24 не следует; на r25 указывают (устройство r25)101
(вывод)144 php-cgi Screenshoter — сборка PHP 5 под ARM с системной libphp5.so e_machine не извлечён (верификатор подтвердил вывод)
(вывод)145 HTTP-сервер отдаёт файлы www/ и по симлинкам (галерея снимков Screenshoter) для Screenshoter не проверено; на r25 httpd отдал файл через симлинк из www тестового плагина на каталог SMB (устройство r25)146

Пробелы

Чего не хватает для связного раздела:

  • Нет фактов о размере пакета, ограничениях на число файлов и о поведении при нехватке места (кроме строки «suitable storage not found»).
  • Нет прямого описания update: что происходит с данными плагина (data_dir_path) при переустановке и удалении.
  • Нет данных по Sigma-прошивкам (SMP86xx/87xx): все строки установщика — из одной Android-прошивки r24.
  • Порядок поиска каталогов плагинов и приоритет между ними для r24 не установлен; для r25 есть только лог (§4).

  1. doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина ↩

  2. doc-sdk-plugins.c025 · doc · any-documented; прошивка — · dune_plugin.xml — единственный файл, обязательный для загрузки плагина; остальные файлы указываются в манифесте и могут называться как угодно ↩↩

  3. doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml ↩↩

  4. fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовые PHP-плагины test_plugin5 и test_plugin10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся. ↩↩

  5. doc-sdk-plugins.c028 · doc · any-documented; прошивка — · dune_plugin->name — идентификатор плагина: непустой, только алфавитно-цифровые символы и '-', '.', '_', длина не более 64 ↩

  6. doc-sdk-plugins.c029 · doc · any-documented; прошивка — · dune_plugin->caption — подпись плагина, показываемая в Setup / Misc / Plugins ↩

  7. doc-sdk-plugins.c011 · doc · any-documented; прошивка — · SDK предлагает примеры плагинов: dune_plugin_demo2 (IPTV/VOD на PHP, в т.ч. с рекламой), dune_plugin_simple_presenter (digital signage), dune_plugin_linux_code_demo (демон + HTTP API + HTML) ↩

    • doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml
    • fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовые PHP-плагины test_plugin5 и test_plugin10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся.

    ↩

  8. doc-sdk-plugins.c027 · doc · any-documented; прошивка — · Файлы translations/dune_language_.txt плагина загружаются в глобальную таблицу переводов при старте устройства или смене языка интерфейса ↩↩

  9. doc-sdk-plugins.c092 · doc · any-documented; прошивка — · Файлы в bin/ и www/cgi-bin/ плагина при установке становятся исполняемыми (ZIP не хранит UNIX-атрибуты) ↩↩

  10. doc-sdk-plugins.c095 · doc · any-documented; прошивка — · Встроенный HTTP-сервер отдаёт $install_dir_path/www/* по http:///plugins//* и исполняет CGI из www/cgi-bin/* по http:///cgi-bin/plugins//* ↩↩↩

  11. doc-sdk-plugins.c132 · doc · sigma-smp86xx, sigma-smp87xx; прошивка — · Платформенные файлы для SMP87xx (ARM) кладутся в .platform.87xx/ в корне плагина; основная копия (bin/, www/cgi-bin/) — для SMP86xx (MIPS) ↩↩

  12. doc-sdk-plugins.c115 · doc · any-documented; прошивка — · Встроенные в розничную прошивку и распространяемые через Dune Store плагины подписаны Dune HD; подписанный плагин содержит dune_plugin.sign и dune_plugin_signer_id.txt ↩↩

  13. plg-dc-globaltv.c118 · code · unknown; прошивка — · Переводы плагина лежат в translations/dune_language_english.txt и dune_language_russian.txt в формате «ключ = текст». ↩

  14. fw-tv188b-260827-0003-r24--plugin-loader.c060 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · external_plugin.c: libduneshell.so содержит шаблоны переводов плагина %s/translations/dune_language_%s.txt и запасной %s/translations/dune_language_english.txt ↩

  15. doc-sdk-plugins.c083 · doc · any-documented; прошивка — · plugin_file://path обращается к ресурсам текущего плагина, plugin_file://%plugin_name%/path — к ресурсам указанного плагина ↩

  16. fw-tv188b-260827-0003-r24--plugin-loader.c061 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит URL-схемы plugin_file:// (вида plugin_file://%shell_ext%/icons/…) и plugin_archive://, с сообщениями об ошибке «plugin not found», «plugin is hard-coded» ↩

  17. fw-tv188b-260827-0003-r24.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенный плагин shell_ext несёт собственные ELF curl и php-cgi в shell_ext/bin/ ↩

  18. plg-dc-screenshoter.c057 · code · unknown; прошивка — · Пакет несёт собственный ELF www/cgi-bin/php-cgi (51724 байта); в его строках есть libphp5.so, /lib/ld-linux.so.3 и секции .ARM.exidx ↩

  19. plg-dc-widget-ext.c068 · code · unknown; прошивка — · bin/curl.864x плагина побайтно совпадает (sha256 917d95cf…611a, 85377 байт) с shell_ext/bin/curl встроенного плагина прошивки tv188b 260827_0003_r24 ↩

  20. plg-dc-screenshoter.c051 · code · unknown; прошивка — · CGI-обёртки www/cgi-bin/do и index — shell-скрипты с шапкой «@author: Andrii Kopyniak», ctime 17.09.2012 ↩

  21. doc-sdk-plugins.c096 · doc · any-documented; прошивка — · Файлы www/ и CGI из www/cgi-bin/ плагина доступны по HTTP не только локально, но и из локальной сети ↩

  22. fw-tv188b-260827-0003-r24--http-api.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит пути /tmp/www/plugins, /tmp/www/cgi-bin/plugins, /firmware/bin/run_plugin_cgi, /tmp/www/cgi-bin/run_plugin_cgi, %s/www и %s/www/cgi-bin рядом с сообщениями [populate_plugins] ↩

  23. fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам ↩

  24. fw-tv188b-260827-0003-r24--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для каждого файла в /www/cgi-bin загрузчик создаёт в /tmp/www/cgi-bin/plugins// одноимённую символическую ссылку на run_plugin_cgi, а /tmp/www/plugins/ — ссылку на каталог www плагина. ↩

  25. plg-dc-screenshoter.c087 · doc · unknown; прошивка — · Каталог www/ установленного плагина отдаётся HTTP-сервером устройства по адресу /plugins//; веб-интерфейс плагина ссылается на свои css и картинки по этому адресу ↩

  26. fw-tv188b-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http:///plugins/

    /index.txt: HTTP 200, Content-type: text/plain, Accept-Ranges: bytes, тело — содержимое файла. ↩

  27. fw-tv188b-261021-0117-r25.c155 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос http:///cgi-bin/plugins/test_plugin5/env.sh?kbp5=1 выполнил скрипт www/cgi-bin/env.sh плагина: его вывод вернулся с HTTP 200, QUERY_STRING=kbp5=1 и REQUEST_URI переданы скрипту. ↩

  28. fw-tv188b-261021-0117-r25.c156 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статика www и CGI плагина отвечают на запросы с другого хоста локальной сети: CGI видит REMOTE_ADDR=[::ffff:<адрес в LAN>] при HTTP_HOST=<адрес в LAN> (IP плеера), файл www/index.txt отдаётся тому же клиенту с HTTP 200. ↩

  29. fw-tv188b-261021-0117-r25.c149 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина, вызванный через http:///cgi-bin/plugins/

    /<файл>, получает PLUGIN_NAME=

    , а PLUGIN_CGI_DIR и SCRIPT_FILENAME — реальные пути $FS_PREFIX/flashdata/plugins/

    /www/cgi-bin и …/www/cgi-bin/<файл>, а не /tmp/www/plugins/

    /… ↩

  30. fw-tv188b-261021-0117-r25.c150 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина запускается с $0, равным абсолютному SCRIPT_FILENAME ($FS_PREFIX/flashdata/plugins/

    /www/cgi-bin/<файл>), и текущим каталогом PLUGIN_CGI_DIR ($FS_PREFIX/flashdata/plugins/

    /www/cgi-bin). ↩

  31. fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. ↩

  32. fw-tv188b-261021-0117-r25.c153 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении CGI плагина SERVER_SOFTWARE=busybox httpd/1.35.0 и GATEWAY_INTERFACE=CGI/1.1. ↩

  33. fw-tv188b-261021-0117-r25.c160 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd на URL каталога плагина без «/» в конце (/plugins/

    , /cgi-bin/plugins/

    ) отвечает 302 с Location на тот же путь со «/», а на URL со «/» (/plugins/

    /, /cgi-bin/plugins/

    /) — 404 Not Found. ↩

  34. fw-tv188b-261021-0117-r25.c161 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 «/» после имени файла плагина даёт 404 Not Found и для CGI (/cgi-bin/plugins/

    /ping.sh/), и для статики (/plugins/

    /index.txt/), хотя без «/» оба отвечают 200. ↩

  35. fw-tv188b-261021-0117-r25.c162 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина по URL /cgi-bin/plugins/

    /<скрипт>/extra?x=1 вызывается (HTTP 200) с SCRIPT_NAME=/cgi-bin/plugins/

    /<скрипт>, PATH_INFO=/extra и QUERY_STRING=x=1; SCRIPT_FILENAME — путь самого скрипта …/www/cgi-bin/<скрипт>. ↩

  36. fw-tv188b-260827-0003-r24--php-framework.c006 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Ни один файл каталога php/ не подключает bootstrap.php, dune_api.php, dune_config.php или dune_plugin_fw.php (require_once есть только внутри dunelib); пути этих файлов (и dune_plugin.php) вместе с шаблоном «require ('%s');» есть в строках php_server (libxxx_php_server.so) ↩

  37. fw-tv188b-260827-0003-r24--php-framework.c031 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс DuneSystem со статическим массивом $properties используется в dune_config.php и dunelib/utils.php (ключи few_buttons_remote_type, plugin_name), но ни в одном файле каталога php/ не определён; шаблон его определения «class DuneSystem { public static $properties = array(» есть в строках php_server (libxxx_php_server.so) ↩

  38. doc-sdk-plugins.c128 · doc · sigma-smp86xx, sigma-smp87xx; прошивка — · Все возможности фреймворка PHP-плагинов и механизма плагинов (манифест, www/, www/cgi-bin) поддерживаются на SMP87xx так же, как на SMP86xx ↩

  39. doc-sdk-plugins.c134 · doc · sigma-smp87xx, android; прошивка — · Все возможности фреймворка PHP-плагинов и механизма плагинов поддерживаются на Android так же, как на Sigma (SMP87xx) ↩

  40. doc-sdk-plugins.c133 · doc · sigma-smp86xx, sigma-smp87xx; прошивка — · При установке на SMP86xx содержимое .platform.87xx удаляется, на SMP87xx — переносится в корень каталога установки плагина ↩

  41. doc-sdk-plugins.c137 · doc · android; прошивка — · Текст документа буквально говорит: при установке на Android содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень ↩↩

  42. fw-tv188b-260827-0003-r24--plugin-loader.c045 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки установщика «%s/.platform.android», «%s/.platform.%s», «android-arm-api19», «.platform.» и «[plugin_installer] applying %s» ↩

  43. fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.». ↩↩↩

  44. fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt. ↩↩

  45. fw-tv188b-261021-0117-r25.c216 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP файл bin/marker.txt, который в ZIP имел права -rw-r--r--, получил -rwxr-xr-x, а dune_plugin.xml и only_android.txt в корне плагина остались -rw-r--r--. ↩

  46. doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства ↩

  47. doc-sdk-plugins.c014 · doc · any-documented; прошивка — · PHP-плагины хранятся во флеш-памяти устройства и исполняются на устройстве ↩

  48. doc-sdk-plugins.c019 · doc · any-documented; прошивка — · Для ручной установки плагинов обычно требуется активированное «Flash memory storage» или «System storage»; если ни то ни другое не активно, устройство предложит активировать Flash memory storage ↩

  49. thr-hdtv-19055.c023 · forum · Dune HD TV-175L SmartBox 4K, unknown; прошивка — · Плагин Screenshoter распространяется как ZIP-файл dune_plugin_Screenshoter.zip и ставится выбором ZIP в файловом браузере Dune с флешки (архив 7z не подходит) ↩

  50. doc-sdk-plugins.c018 · doc · any-documented; прошивка — · При установке плагина с тем же именем, что у уже установленного вручную, предлагается перезаписать или отменить; встроенные в прошивку плагины перезаписать нельзя ↩↩↩

  51. fw-tv188b-260827-0003-r24--plugin-loader.c043 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки установщика: /tmp/plugin_tmp, %s/plugin.zip, команду «cd %s%s && ls -la plugin.zip && unzip plugin.zip && rm -f plugin.zip», «md5 does not match», «suitable storage not found; cancelled» ↩

  52. fw-tv188b-260827-0003-r24--plugin-loader.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик сверяет name в манифесте с ожидаемым: есть сообщение «declared plugin name is '%s', real is '%s'» и ключ plugin_installer_error_name_changed__1 ↩

  53. fw-tv188b-260827-0003-r24--plugin-loader.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения установщика плагинов о запретах: «install not allowed for plugin», «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed» ↩↩

  54. fw-tv188b-260827-0003-r24--plugin-loader.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь-шаблон «%s/dune_plugin.xml» и сообщения об отсутствующем и неразбираемом манифесте (ключи plugin_installer_error_missing_manifest, plugin_installer_error_invalid_manifest) ↩

  55. fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_test_plugin5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/test_plugin5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/test_plugin5_plat, …/flashdata/plugins_data/test_plugin5_plat и /tmp/plugins/test_plugin5_plat. ↩

  56. fw-tv188b-261021-0117-r25.c217 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP перед распаковкой выполняет rm -rf '/tmp/plugin_tmp' и mkdir, затем распаковывает архив командой «unzip '' -d /data/data/com.dunehd.app/tmp/plugin_tmp» и копирует оттуда каталог в /flashdata/plugins/

    , предварительно удаляя прежний (FS_remove_recursively_if_exists). ↩

  57. fw-tv188b-261021-0117-r25.c218 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP оболочка пишет «[plugin_installer] reloading plugin», регистрирует плагин («Plugin 'test_plugin5_plat' of type 'plain' is registered») и «[plugin_installer] Done.» в том же процессе приложения (pid 19586), без перезапуска приложения. ↩

  58. fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'». ↩

  59. fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (test_plugin5_other) не равен имени каталога (test_plugin5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. ↩

  60. fw-tv188b-261021-0117-r25.c220 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка регистрирует плагины типов php, plain и internal.internal (dune_internal): «Plugin '

    ' of type '<тип>' is registered». ↩

  61. fw-tv188b-261021-0117-r25.c221 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин с type plain без params/program (тестовые плагины-поставщики test_plugin5_sup и test_plugin6_sup: в каталоге только dune_plugin.xml и bin/) регистрируется; его запись в /tmp/run/installed_plugins.xml — launch_capable 0 и movie_suppliers со значением params/movie_suppliers. ↩

  62. fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина test_plugin5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. ↩↩↩

  63. fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина test_plugin5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. ↩

  64. fw-tv188b-260827-0003-r24--plugin-loader.c049 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит экспортируемые имена playlist_is_plugin_installer_url, playlist_is_plugin_uninstaller_url, playlist_is_plugin_launcher_url, playlist_parse_installer_url, playlist_parse_plugin_launcher_url, playlist_parse_plugin_uninstaller_url и is_valid_plugin_name_seg ↩

  65. plg-dc-globaltv.c029 · code · unknown; прошивка — · При установке в стране CN плагин, если установлен tv_app_supplier_globaltv, удаляет его (и сам globaltv) действиями launch_media_url с URL plugin_uninstaller://<имя>. ↩↩

  66. doc-sdk-plugins.c021 · doc · any-documented; прошивка — · Плагины можно подключить без установки через папку dune_plugins в корне «main»-накопителя: каждая подпапка — данные одного плагина (dune_plugin.xml и др.) ↩

  67. doc-sdk-plugins.c022 · doc · any-documented; прошивка — · Накопитель считается «main», если он единственный подключён сейчас или был единственным при включении плеера ↩

  68. doc-sdk-plugins.c023 · doc · any-documented; прошивка — · Механизм dune_plugins предназначен в основном для разработки; чтобы применить изменения в папке, нужно дважды нажать POWER (уход в standby и включение) ↩

  69. doc-sdk-plugins.c136 · doc · android; прошивка — · На Android пользовательские накопители монтируются с noexec, что мешает механизму dune_plugins ↩

  70. fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

    ' of type '' is registered»). ↩↩

  71. fw-tv188b-261021-0117-r25.c208 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push под adb root в /data/data/com.dunehd.app/flashdata/plugins и переданные chown system:system, имеют SELinux-метку u:object_r:system_app_data_file:s0 — такую же, как у каталога соседнего плагина (Bazinga3); chcon не понадобился. ↩

  72. fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/test_plugin5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/test_plugin5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. ↩↩

    • fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк test_plugin5, ни «Loading plugins from», ни populate_plugins, а test_plugin5 нет в /tmp/run/installed_plugins.xml. test_plugin5 и test_plugin5_sup зарегистрировались после am force-stop com.dunehd.app.
    • fw-tv188b-261021-0117-r25.c233 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app новый процесс приложения заново регистрирует плагины: в shell.log 35 строк «Plugin '

      ' of type '' is registered», в том числе для test_plugin6 и test_plugin6_sup, положенных adb push перед этим.

    ↩

  73. fw-tv188b-261021-0117-r25.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app приложение Dune поднимается само (новый pid) за 1–2 с, без am start. ↩

  74. fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c test_plugin6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app. ↩

  75. fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов тестовых плагинов test_plugin5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с test_plugin5 (grep -c = 0). ↩

  76. fw-tv188b-261021-0117-r25.c076 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, положенный через adb push без перезагрузки, получил boot при ближайшем старте приложения Dune (после am force-stop), а не при загрузке системы; флага test_plugin5_plugin_boot_action_executed.flag до этого не было. ↩

  77. fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от test_plugin5 и test_plugin6_sup нет, тогда как boot, boot_end и gui_start test_plugin5 выполнились. ↩

  78. fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh. ↩

  79. doc-sdk-plugins.c143 · doc · any-documented; прошивка — · Global plugin actions поддерживают системные события boot, install, update и uninstall ↩

  80. doc-sdk-plugins.c144 · doc · any-documented; прошивка — · Событие boot_end (в самом конце холодной загрузки) доступно с прошивки 130917_b9 ↩

  81. doc-sdk-plugins.c145 · doc · any-documented; прошивка — · Событие gui_start (при старте родного GUI Dune) доступно с прошивки 130914_b8 ↩

  82. doc-sdk-plugins.c147 · doc · any-documented; прошивка — · Глобальным действием может быть любое стандартное GUI-действие плагина или plugin_system, запускающее исполняемый файл из состава плагина (в примере — через run_string) ↩

  83. doc-sdk-plugins.c146 · doc · any-documented; прошивка — · Для события boot поддерживается только действие plugin_system ↩

  84. plg-dc-globaltv.c011 · code · unknown; прошивка — · Глобальные действия install и update в манифесте оба ведут на plugin_handle_user_input с entry_id=install. ↩

  85. plg-dc-globaltv.c028 · code · unknown; прошивка — · При entry_id=install обработчик запускает через system() скрипт /bin/install.sh, где install_dir_path берётся из DuneSystem::$properties. ↩

  86. plg-dc-globaltv.c027 · code · unknown; прошивка — · Скрипт bin/install.sh удаляет tv_cache_*.json из $FS_PREFIX/flashdata/plugins_data/globaltv, файлы tv_timestamp и fav_timestamp из $FS_PREFIX/flashdata/plugins_epfs/globaltv и создаёт флаг $FS_PREFIX/tmp/plugins/globaltv/update_epfs_if_needed_flag. ↩

  87. plg-dc-widget-ext.c006 · code · unknown; прошивка — · global_actions/uninstall вызывает bin/uninstall.sh без «&», в отличие от остальных global_actions ↩

  88. fw-tv188b-261021-0117-r25.c078 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при одном старте приложения global_actions плагина test_plugin5 выполнились по порядку boot (10:24:27.28), boot_end (10:24:27.62), gui_start (10:24:29.49; время shell.log). ↩

  89. fw-tv188b-261021-0117-r25.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при следующих стартах приложения (после am force-stop и после restart_gui) boot и boot_end плагина test_plugin5 не выполнялись повторно — в shell.log «[plugin] test_plugin5: boot action already executed» и «[plugin] test_plugin5: GUI boot action already executed». ↩↩

  90. fw-tv188b-261021-0117-r25.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после первого выполнения boot и boot_end плагина test_plugin5 в /tmp/run появились файлы test_plugin5_plugin_boot_action_executed.flag и test_plugin5_plugin_boot_end_action_executed.flag размером 1 байт (владелец system). ↩↩

  91. fw-tv188b-261021-0117-r25.c079 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 gui_start плагина test_plugin5 выполнялся при каждом старте приложения Dune в прогоне — 13:24:29, 13:35:32, 13:40:55 (после am force-stop) и 13:45:18 (после restart_gui); строки «already executed» для него нет. ↩

  92. fw-tv188b-261021-0117-r25.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action plugin_system с run_string «bin/ga.sh boot» (путь относительно каталога плагина) оболочка исполняет как «Running system(sh /data/data/com.dunehd.app/flashdata/plugins/test_plugin5/bin/ga.sh boot)» — с префиксом sh и абсолютным путём каталога плагина. ↩

  93. fw-tv188b-261021-0117-r25.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 скрипт global_action plugin_system (boot, boot_end, gui_start) работает под uid 1000(system) с SELinux-контекстом u:r:system_app:s0, текущим каталогом / и переменной окружения FS_PREFIX=/data/data/com.dunehd.app; $0 — абсолютный путь скрипта. ↩

  94. fw-tv188b-260827-0003-r24--plugin-loader.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В libduneshell.so подряд идут строки каталогов плагинов: /flashdata/plugins, /tmp/mnt/D/dune_plugins, /fconfig/plugins, /firmware/plugins, /firmware_ext/plugins ↩

  95. fw-tv188b-261021-0117-r25.c225 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при каждой из пяти загрузок плагинов в снимке shell.log оболочка пишет «=====> Loading plugins from '/flashdata/plugins'», а затем «… '/firmware_ext/plugins'»; других каталогов в строках «Loading plugins from» нет. ↩↩

  96. fw-tv188b-261021-0117-r25.c226 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в одном процессе приложения (pid 1630) «Loading plugins from '/flashdata/plugins'» выводилось трижды — 2026-10-20 22:42:42, 2026-10-22 22:50:36 и 22:55:47 (время shell.log), то есть плагины загружались повторно без перезапуска процесса. ↩

  97. fw-tv188b-261021-0117-r25.c231 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги данных плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins_data/

    , в том числе для встроенных из firmware_ext (widget, radiotime, s928x_dvfel и др.) и dune_internal; в /data/data/com.dunehd.app/config/plugins_data есть только bluray. Других каталогов plugins_data поиск по ФС не нашёл, кроме тех же путей через /data/user/0 и /data_mirror. ↩

  98. fw-tv188b-261021-0117-r25.c142 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после регистрации плагина из $FS_PREFIX/flashdata/plugins появляется /tmp/www/plugins/

    — символическая ссылка (владелец system) на каталог www плагина, например test_plugin5 -> /data/data/com.dunehd.app/flashdata/plugins/test_plugin5/www. ↩

  99. fw-tv188b-261021-0117-r25.c143 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/www/cgi-bin/plugins/

    — обычный каталог (владелец system), в котором для каждого файла www/cgi-bin плагина лежит одноимённая символическая ссылка на /data/data/com.dunehd.app/firmware/bin/run_plugin_cgi (test_plugin5: env.sh, run.php; test_plugin6: cm, cm.php, php.ini, ping.sh, rt, rt.php; так же у встроенного shell_ext). ↩↩

  100. fw-tv188b-260827-0003-r24.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В прошивке 13 встроенных плагинов в /system/dunehd/firmware_ext/plugins/ (у каждого dune_plugin.xml): android_apps, bluray, bt_setup, dunemdb_supplier_generic, dunemdb_supplier_rutube, dunemdb_supplier_youtube, dunestore, ext_epg, kartina_tv_launcher, ktv_start, radiotime, shell_ext, widget ↩

  101. fw-tv188b-260827-0003-r24.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные плагины на устройстве ожидаются по пути /data/data/com.dunehd.app/firmware_ext/plugins/ (пример: путь run_widget.sh плагина widget) ↩

  102. thr-mydune-108.c011 · forum · hdtv_301, unknown; прошивка 150721_0136_B9 · В прошивке Dune 301 предустановленные плагины лежат в firmware_ext, и их можно удалить, модифицировав прошивку ↩↩

  103. fw-tv188b-260827-0003-r24.c032 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь /tmp/run/installed_plugins.xml и имя функции parse_installed_plugins_xml() ↩

  104. fw-tv188b-260827-0003-r24--plugin-loader.c028 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит шаблон записи installed_plugins.xml: / с полями name, caption, path, version_index, version_id, patch_index, version, launch_capable, delete_capable (литерал 0), tv_epf_capable (1), movie_supplier_disable_capable (1), category, logo_url ↩

  105. fw-tv188b-260827-0003-r24--plugin-loader.c077 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные PHP-плагины прошивки (shell_ext, android_apps, dunestore) читают /tmp/run/installed_plugins.xml как перечень установленных плагинов ↩

  106. plg-dc-globaltv.c030 · code · unknown; прошивка — · Список установленных плагинов плагин читает из XML-файла /tmp/run/installed_plugins.xml (элементы name дочерних узлов). ↩

  107. fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

    ). Полей version_id, patch_index и delete_capable в записях тестовых плагинов нет. ↩

  108. doc-sdk-plugins.c116 · doc · any-documented; прошивка — · Допустимые signer ID: «com.dune-hd» (только Dune HD) и customer ID кастомной прошивки (с 150326_r10) ↩↩

  109. doc-sdk-plugins.c117 · doc · any-documented; прошивка — · Для подписанного плагина система проверяет подпись и отказывается его использовать при несовпадении подписи или недопустимом signer ID ↩

  110. doc-sdk-plugins.c118 · doc · any-documented; прошивка — · Кастомные (операторские) прошивки могут быть настроены разрешать только подписанные плагины ↩

  111. doc-sdk-plugins.c119 · doc · any-documented; прошивка — · Собственная подпись (150326_r10+): DSA-ключи 2048 через openssl, подпись утилитой plugin_sign.x86

    , публичный ключ кладётся в прошивку как /firmware/config/plugin_key.pem ↩

  112. fw-tv188b-260827-0003-r24--plugin-loader.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки [plugin_signer]: файлы dune_plugin.sign и dune_plugin_signer_id.txt, signer_id com.dune-hd, ключ /firmware/config/plugin_key.pem или /config/plugin_key.pem, DSA-проверку ↩

  113. fw-tv188b-260827-0003-r24--plugin-loader.c085 · doc · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Подпись плагина хранится в файле dune_plugin.sign, signer ID — в dune_plugin_signer_id.txt; оба имени есть в strings r24 ↩

  114. fw-tv188b-260827-0003-r24--plugin-loader.c052 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Во встроенных плагинах прошивки 6 из 13 (android_apps, dunemdb_supplier_generic, dunestore, ktv_start, shell_ext, widget) имеют dune_plugin.sign и dune_plugin_signer_id.txt ↩

  115. plg-dc-globaltv.c026 · code · unknown; прошивка — · Пакет содержит файл подписи dune_plugin.sign (бинарный, 48 байт) и dune_plugin_signer_id.txt со значением com.dune-hd. ↩

  116. fw-tv188b-260827-0003-r24--plugin-loader.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит пути /config/plugin_config.xml и /firmware/config/plugin_config.xml, функцию parse_plugin_config() и имена allow_install, signed, allow_delete, allow_replace, same_signer_id, default_embedded, default_external ↩

  117. doc-sdk-plugins.c020 · doc · any-documented; прошивка — · Все установленные плагины перечислены в меню «Setup / Misc / Plugins», где вручную установленные можно удалить (ENTER → Delete) ↩

  118. fw-tv188b-261021-0117-r25.c224 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при загрузке плагинов shell.log содержит «plugin D: (dunemdb_supplier_youtube) prefer_new_builtin (41 vs 34)» и сразу за ним «[populate_plugins] dup dunemdb_supplier_youtube: replacing»; version_index копии в $FS_PREFIX/firmware_ext/plugins — 41, в $FS_PREFIX/flashdata/plugins — 34. ↩↩↩

  119. fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк test_plugin5, ни «Loading plugins from», ни populate_plugins, а test_plugin5 нет в /tmp/run/installed_plugins.xml. test_plugin5 и test_plugin5_sup зарегистрировались после am force-stop com.dunehd.app. ↩↩

    • doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00
    • doc-sdk-plugins.c035 · doc, disputed · any-documented; прошивка — · Параметры отображения точки входа: icon_url, icon_margins и icon_fit_scale_factor (120606+), badge_icon_url (120901+), override_default_badge (141005_b9+) — аналоги свойств ViewItemParams

    ↩

  120. doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. ↩↩

  121. fw-tv188b-260827-0003-r24--plugin-loader.c044 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пакет плагина для установщика — ZIP-архив: он скачивается по URL во временный каталог как plugin.zip, распаковывается unzip, может сверяться по md5; затем каталог копируется или переименовывается в <хранилище>/plugins/ ↩

  122. fw-tv188b-260827-0003-r24--plugin-loader.c042 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик может отказать в установке неподписанного плагина, в замене плагина с другим signer_id и в замене «hard-coded» плагина; что из этого действует по умолчанию (без plugin_config.xml), из строк не следует ↩

  123. fw-tv188b-260827-0003-r24--plugin-loader.c004 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Загрузчик (populate_plugins) сканирует каталоги /flashdata/plugins, /tmp/mnt/D/dune_plugins, /fconfig/plugins, /firmware/plugins, /firmware_ext/plugins; порядок обхода и приоритет между ними из строк не следуют ↩

  124. fw-tv188b-260827-0003-r24--plugin-loader.c046 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пакет плагина может содержать платформенные варианты в подкаталогах .platform.<платформа> (например .platform.android, .platform.android-arm-api19); установщик применяет вариант(ы) к корню и удаляет остальные; какие именно варианты и в каком порядке — по строкам r24 не установлено. ↩

    • fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.».
    • fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt.

    ↩

  125. doc-sdk-plugins.c138 · inference · android; прошивка — · Вероятно, задумано по аналогии с SMP87xx: на Android содержимое .platform.android переносится в корень, а .platform.87xx удаляется ↩

  126. doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00 ↩

  127. doc-sdk-plugins.c035 · doc, disputed · any-documented; прошивка — · Параметры отображения точки входа: icon_url, icon_margins и icon_fit_scale_factor (120606+), badge_icon_url (120901+), override_default_badge (141005_b9+) — аналоги свойств ViewItemParams ↩

  128. fw-tv188b-260827-0003-r24--plugin-loader.c055 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Действия плагина на загрузку (boot и boot_end/GUI boot) выполняются один раз, пока в /tmp/run существует флаг выполнения; флаг ставится при выполнении. Момент первого выполнения для нового плагина (загрузка системы или ближайший старт оболочки) и очистка флага при перезагрузке не установлены. ↩

  129. fw-tv188b-260827-0003-r24--plugin-loader.c068 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При разборе манифеста name сравнивается с именем каталога плагина; вероятный этап отказа — populate_plugins (строка 10497 «invalid plugin manifest from …»); отказ установщика не установлен. ↩

    • fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'».
    • fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (test_plugin5_other) не равен имени каталога (test_plugin5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем.

    ↩

  130. fw-tv188b-260827-0003-r24--plugin-loader.c072 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При двух плагинах с одним name загрузчик (populate_plugins) может заменить встроенный плагин другим, а встроенный скрыть ↩

  131. fw-tv188b-260827-0003-r24--plugin-loader.c073 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При дубликате загрузчик может предпочесть встроенный плагин (prefer_new_builtin) по сравнению двух чисел (вероятно, version_index) или по тегу; есть и принудительная замена встроенного (force override builtin) ↩

  132. fw-tv188b-260827-0003-r24--plugin-loader.c074 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если загрузчик определяет дубликат как конфликт, остаётся ранее загруженный плагин; условие конфликта не установлено ↩

  133. fw-tv188b-260827-0003-r24--plugin-loader.c047 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки установщика %s/bin/php-cgi, %s/www/cgi-bin/php-cgi, /firmware/bin/%s и сообщения «non-working binary detected», «created symlink(%s -> %s)»; вероятно, нерабочий бинарник плагина заменяется ссылкой на /firmware/bin/<имя>; связь %s/bin/php-cgi с этой заменой не установлена, а /firmware/bin/php-cgi в этой прошивке нет ↩

  134. fw-tv188b-260827-0003-r24--plugin-loader.c048 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик, вероятно, в конце установки снимает флаг скрытия с плагина и перезагружает его: сообщения «removing hidden flag from plugin», «reloading plugin», «Done.» есть в libduneshell.so; порядок действий выведен из порядка строк ↩

  135. fw-tv188b-260827-0003-r24--plugin-loader.c084 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Подпись плагина считается по DSA по обычным файлам каталога плагина; нерегулярные файлы пропускаются ↩

  136. fw-tv188b-260827-0003-r24--plugin-loader.c086 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Загрузчик r24 ищет открытый ключ проверки подписи в /firmware/config/plugin_key.pem и /config/plugin_key.pem; путь /firmware/config совпадает с SDK для кастомного signer ID, роль /config/plugin_key.pem и приоритет не установлены ↩

  137. fw-tv188b-260827-0003-r24--plugin-loader.c087 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверка signer_id в r24 сравнивает требуемый signer_id с фактическим и может отклонить signer_id как не разрешённый; это согласуется с SDK (допустимы «com.dune-hd» и customer ID кастомной прошивки); при каком условии выдаётся «unsupported signer_id», не установлено ↩

  138. fw-tv188b-260827-0003-r24--http-api.c016 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При заполнении плагинов оболочка, вероятно, делает симлинк /tmp/www/cgi-bin/run_plugin_cgi → /firmware/bin/run_plugin_cgi, публикует <плагин>/www в /tmp/www/plugins/<плагин> и создаёт «cgi links» для файлов www/cgi-bin в /tmp/www/cgi-bin/plugins/; что они указывают на run_plugin_cgi, из строк не следует ↩

  139. plg-dc-screenshoter.c058 · inference · unknown; прошивка — · php-cgi пакета — сборка PHP 5 под ARM, использующая системную libphp5.so (в пакете её нет) ↩

  140. plg-dc-screenshoter.c088 · inference · unknown; прошивка — · HTTP-сервер устройства, вероятно, отдаёт файлы и по симлинкам www/dss и www/sdss, которые плагин создаёт на каталоги снимков: на этом строится галерея ↩

  141. fw-tv188b-261021-0117-r25.c163 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd отдаёт файлы через символическую ссылку из www плагина на каталог вне плагина: ссылка www/media -> /tmp/mnt/smb/5/surround sound test (каталог SMB-ресурса), GET /plugins/test_plugin6/media/<файл>.mkv с Range вернул 206, HEAD — 200 с Content-Length файла. ↩