base-files: board_detect: make resilient against power-cuts

If board_detect is interrupted by cutting power on first boot,
board.json might only be half-way written and the file will not be
written again correctly on subsequent boots.

Write to a temporary file first, then rename. Since a rename on the same
file system is an atomic operation, it ensures that either
/etc/board.json does not exist or that the complete file exists.

Signed-off-by: Andreas Gnau <andreas.gnau@iopsys.eu>
Link: https://github.com/openwrt/openwrt/pull/20831
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
Andreas Gnau 2025-10-08 23:00:44 +02:00 committed by Hauke Mehrtens
parent cac609aca8
commit 26ba9b609b

View file

@ -1,14 +1,22 @@
#!/bin/sh
CFG=$1
REAL_CFG=$1
[ -n "$CFG" ] || CFG=/etc/board.json
[ -n "$REAL_CFG" ] || REAL_CFG=/etc/board.json
if [ -d "/etc/board.d/" ] && [ ! -s "$CFG" ]; then
if [ -d "/etc/board.d/" ] && [ ! -s "$REAL_CFG" ]; then
# Use temp file to prevent incomplete file on power-cut, CFG is used by the sourced script to read/write the file
CFG="$(dirname "$REAL_CFG")/.$(basename "$REAL_CFG").tmp"
rm -f "$CFG" || exit
for a in $(ls /etc/board.d/*); do
[ -s "$a" ] || continue
(. "$a")
done
fi
[ -s "$CFG" ] || return 1
if [ -s "$CFG" ]; then
mv "$CFG" "$REAL_CFG" || exit
else
rm -f "$CFG"
exit 1
fi