Restoring (old) config backups and

Henrique de Moraes Holschuh henrique at nic.br
Mon Jul 20 13:32:34 EDT 2020


Hello,

I am bringing the topic here because I am pretty sure it is something 
that affects any downstream firmware that focus on regular users...

We'd like to know if anyone has specific thoughts on the issue, or has 
implemented/is testing/considered solutions to the issues I describe in 
this email...


TL;DR: users do a backup, and sometime later restore after several 
sysupgrades, which ends up being a simple reboot (no uci-defaults or any 
other specific post-processing) into outdated config from the PoV of the 
current firmware, and things go bad.



OpenWRT has a config backup functionality, tied to sysupgrade, and 
exposed through LuCI.  So far, so good.  This is very valuable 
functionality, and users make use of it for several reasons, so it is 
not something anyone would like to take away [downstream] even if it is 
causing trouble.


The problems we've observed with the backup *restore* functionality are:

* It is applied with a simple reboot, and _apparently_, it has no hooks 
or other way to ensure system sanity before (or after) the backup restore.

Which would be fine if the following point was never true:

* End users are likely to use the backup-restore facility across 
sysupgrade (i.e. use older backups).



Some possible root causes of the issues created on backup restoration:

1. /etc/uci-defaults is not "reset" like a sysupgrade would.  When the 
backup is "outdated" from the PoV of current packages in the running 
firmware image, it can cause issues ranging from minor, to severe.

2. Account information is not properly sanitized/recreated (/etc/passwd, 
shadow, group).  Thus, system accounts that were meant to be used by 
packages might be missing or have incorrect contents.   This is a 
consequence of (1), thus not a "root cause", but I find it relevant 
enough to mention it explicitly.

If things fail to start because of missing system users, it is bad. 
When they *don't* fail to start and instead run as root, it is arguably 
*worse*.


Some possible solutions:

* It is not too hard to bake a firmware image uuid, randomly generated 
at build-time, add it to the backup tarball, and use it to detect the 
fact that we (re-)booted into a new environment that should go through 
/etc/uci-defaults processing as if it had been through a sysupgrade.

This requires /etc/uci-defaults scripts that can handle being run when 
the changes they need to apply are already in place, which is *already* 
a best-practice, but still...

Alternatively, or perhaps additionally to uci-defaults, it could run 
package-provided scripts from a directory on restore (pre-reboot, 
after-reboot).

* If uci-defaults handling is impossible, at the very least fish out the 
system user handling and other key points that are already in place, and 
somehow arrange to have them run as a post-backup-restore functionality.


Any thoughts on this?  I am certainly to have overlooked a lot of stuff, 
especially if it is present only on master.  Also, handling of an 
uci-defaults "reset" (so that they'd run again) in 
non-initramfs/overlayfs based system is likely to pose some challenges 
depending on how it is implemented...

-- 
Henrique de Moraes Holschuh



More information about the openwrt-devel mailing list