A native tool in the running image that steps in when Enigma2 does not start, for example after a broken update. It needs neither Enigma2 nor Python.
enigma2.sh starts recovery-manager --watch next to Enigma2. Enigma2 reports
its start to /var/run/enigma2-orm.socket:
| Message | When |
|---|---|
step <name> |
every start step of eProfileWrite(), one per plugin |
ready |
the main loop runs |
quit <code> |
Enigma2 ends on purpose, e.g. restart or shutdown |
crash <signal> / crash python |
from the crash handler, just before Enigma2 ends |
When Enigma2 ends before ready without quit, crashes within a minute after
it, or reports no new step for 120 seconds while starting, enigma2.sh shows
recovery-manager --crash instead of the blue screen. It tells where the start
stopped and starts Enigma2 again after a countdown of 15 seconds unless somebody
presses a key. A later crash shows the blue screen of Enigma2 as before.
--watch returns once the socket is there and prints the pid of the watch.
After Enigma2 ended, --crash RESULT PID ends the watch, which writes its
result, and decides from it whether the menu is needed. It answers like
Enigma2: 1 halts and 2 reboots the receiver. recovery-manager --help lists
all options.
The menu stays on the left, the right side shows what the chosen entry does. UP and DOWN choose an entry, OK, RIGHT or its digit opens it on the right, whose screens go back with BACK and to the menu from their first one; digits work only in the menu. HELP chooses the language, BLUE opens Remote Support and INFO the licenses of ORM over every screen, BACK returns to it.
ORM speaks the language of Enigma2: config.osd.language, else
config.misc.locale, else the default of the brand like Enigma2. HELP chooses
another one until ORM ends. A language needs its catalog and its locale, else
ORM stays English; the output of opkg, ofgwrite and the plugins stays as it is.
recovery-manager shows the same menu on request, after init 4; while
Enigma2 runs it only says so. From a shell, the first entry ends ORM, YELLOW
reboots and RED powers off. For SSH or support, touch /etc/enigma2/.orm-once
and a restart of Enigma2 open it once instead of Enigma2.
ORM logs every message of the socket with its time to /tmp/orm.log,
the log of the previous start is kept as /tmp/orm.log.last.
Remote Support runs remotesupport start of the RemoteSupport plugin on a
pseudo terminal. The menu shows its link as a QR code and asks every question
of the command line, such as the approval of a terminal, on the TV. BACK goes
back while the session keeps running in the background: its questions appear
over every screen, the header turns yellow with the users and terminals, and
Enigma2 takes the session over when it starts. OK ends the session.
The crash log view shows the newest crash log of Enigma2 and starts at the end
of its log, which the blue screen showed before. BLUE chooses another crash log,
the newest first, YELLOW shows the messages of the last start. A crash report is sent with
crashreporter of the CrashReporter plugin, run like remotesupport: the crash log
alone or with the debug log and diagnostics, confirmed on the TV. Its tracking
number and link are shown with a QR code.
Another slot of a multiboot receiver is booted with multiboot-selector.sh of
oe-alliance/MultiBootSelectorPlugin as it is. ORM takes /tmp/multiboot-selector.sh
first, so a supporter can replace it, then the one of the image, and otherwise
loads the script of the newest release from GitHub into /tmp. Its list shows
the slots with the running one chosen at first, OK restarts the receiver into
the chosen slot.
Repair Enigma2 has the system files of Enigma2 in its first row and the plugins
below. The first row lists the .py, .pyc and .so files in
/usr/lib/enigma2/python and below its Components, Screens and Tools that
no installed package has, by the file lists in /var/lib/opkg/info; a skin or
add-on put them there, and a .py is loaded instead of the .pyc of Enigma2
next to it. It also lists the python files of the package enigma2 that are newer
than its Installed-Time in /var/lib/opkg/status, as python may overwrite a
.pyc of Enigma2 with the code of such a .py. The row is marked when such a
file is in the traceback of the crash log. OK updates the package lists, then asks every time, with both versions when
the feed has another one, and only then moves the files to
/home/root/enigma2-repair-<time> and runs
opkg install --force-reinstall --force-downgrade enigma2, since files compiled
from the foreign ones stay otherwise.
A plugin row keeps Enigma2 from loading the plugin. When Enigma2 knows the
plugin blacklists (openatv/enigma2#3925), OK goes from enabled to disabled
temporarily (/tmp/plugin_blacklist, until the receiver restarts), to disabled
permanently (/etc/enigma2/plugin_blacklist) and back to enabled; nothing is
moved, so updates and removals of the plugin keep working. Without them the
plugin is moved from /usr/lib/enigma2/python/Plugins to
/usr/lib/enigma2/python/Plugins.disabled and back. Only plugins are listed,
a broken screen, tool, converter or renderer of Enigma2 is not fixed by
disabling it. A plugin that caused problems at the last start, as start step,
in the debug log or in the traceback of the crash log, is marked and chosen at
first.
Software update works like the online update of Enigma2: the traffic light of
the feed blocks a red feed, opkg update, the list of all updates with the
installed and the new version, one confirmation, then opkg upgrade with its
output as it comes. The packages Enigma2 leaves out, like busybox, are held.
The receiver is restarted afterwards in the menu.
Reset settings moves either the file settings or all of /etc/enigma2 into
/etc/enigma2-reset-<time>, so nothing is deleted, and puts the defaults of
the image in place, but keeps the network. Enigma2 then starts with the wizard.
Only the skin keeps a copy of settings there, removes the GUI and display skin
from it and moves the user skins skin_user*.xml along, so Enigma2 starts with
its standard skin and all other settings.
Back up image saves the running slot like the image backup of Enigma2
(ImageBackup.py), without the USB recovery images, as
<medium>/images/<distro>-<version>-<box>-backup-<time>_usb.zip. The media are
the mounted, writable ones under /media with enough space, RED cancels the
backup and removes what was written.
Flash online/local flashes an image into the running slot like the
FlashManager of Enigma2: from the feed of the running distribution or others,
or a zip on the media, including the backups of ORM. Downloads are saved in
images of the medium, unzipped images of earlier flashes are removed first.
ofgwrite -n checks the image before anything is written, only then OK
flashes after a confirmation.
Long work shows a spinner with the time it runs; RED cancels it where that is safe.
The interface is drawn with LVGL, the submodule lib/lvgl, configured by
include/lv_conf.h. Both need only libc.
git submodule update --init
make CC=<cross compiler>
The version is ORM_VERSION in include/version.h; a push of a new
version to master tags and releases it as v<version>.
The fonts in src/fonts are rendered by tools/mkfonts.sh, see
tools/fonts/README.md, and the licenses of the About screen in
include/licenses.h by tools/mklicenses.py.
The texts are marked with _() and N_() for gettext. make pot collects them
into po/orm.pot and updates every po/<language>.po; make turns these into
catalogs, make install puts them into /usr/share/locale/<language>/LC_MESSAGES/orm.mo.
A new language is a new po/<language>.po, with its name in src/language.c.
On master a workflow updates po/orm.pot after every change of the sources;
the translations are made on Weblate, which merges the .po files with it.
The fonts hold Latin, modern Greek, Cyrillic, Arabic and Persian; a language written
from the right mirrors the screen.
Copyright (C) 2026 OE-Alliance Open Recovery Manager contributors
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, version 3, see LICENSE.
It contains, under their own licenses, which the About screen (INFO) shows:
- LVGL (MIT,
lib/lvgl) with the QR code generator of Project Nayuki (MIT). - The font, rendered from DejaVu Sans, and icons of Font Awesome Free
(SIL OFL 1.1), see
tools/fonts.