mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 09:39:00 +00:00
9bbaa6f2c0
Empty trailing fields get lost when the lines are split and merged again
at colons, resulting in unparsable entries. Only use the split fields for
matching against the other file, but emit the original line unchanged
to fix the issue.
Fixes: de7ca7dafa
("base-files: merge /etc/passwd et al at sysupgrade config restore")
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
55 lines
1.5 KiB
Plaintext
55 lines
1.5 KiB
Plaintext
# Copyright (C) 2006 OpenWrt.org
|
|
# Copyright (C) 2010 Vertical Communications
|
|
|
|
missing_lines() {
|
|
local file1 file2 line
|
|
file1="$1"
|
|
file2="$2"
|
|
oIFS="$IFS"
|
|
IFS=":"
|
|
while read line; do
|
|
set -- $line
|
|
grep -q "^$1:" "$file2" || echo "$line"
|
|
done < "$file1"
|
|
IFS="$oIFS"
|
|
}
|
|
|
|
# Rootfs mount options can be passed by declaring in the kernel
|
|
# cmdline as much options as needed prefixed with "rootfs_mount_options."
|
|
#
|
|
# Example:
|
|
# rootfs_mount_options.compress_algorithm=zstd rootfs_mount_options.noinline_data
|
|
#
|
|
compose_rootfs_mount_options() {
|
|
local mount_options
|
|
local cmdlinevar
|
|
|
|
for cmdlinevar in $(cat /proc/cmdline); do
|
|
if [ "$cmdlinevar" != "${cmdlinevar#rootfs_mount_options\.}" ]; then
|
|
append mount_options "${cmdlinevar#rootfs_mount_options\.}"
|
|
fi
|
|
done
|
|
|
|
echo $mount_options
|
|
}
|
|
|
|
do_mount_root() {
|
|
mount_root start "$(compose_rootfs_mount_options)"
|
|
boot_run_hook preinit_mount_root
|
|
[ -f /sysupgrade.tgz -o -f /tmp/sysupgrade.tar ] && {
|
|
echo "- config restore -"
|
|
cp /etc/passwd /etc/group /etc/shadow /tmp
|
|
cd /
|
|
[ -f /sysupgrade.tgz ] && tar xzf /sysupgrade.tgz
|
|
[ -f /tmp/sysupgrade.tar ] && tar xf /tmp/sysupgrade.tar
|
|
missing_lines /tmp/passwd /etc/passwd >> /etc/passwd
|
|
missing_lines /tmp/group /etc/group >> /etc/group
|
|
missing_lines /tmp/shadow /etc/shadow >> /etc/shadow
|
|
rm /tmp/passwd /tmp/group /tmp/shadow
|
|
# Prevent configuration corruption on a power loss
|
|
sync
|
|
}
|
|
}
|
|
|
|
[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root
|