diff options
Diffstat (limited to 'package/cfgfs/src/fwcf.sh')
-rw-r--r-- | package/cfgfs/src/fwcf.sh | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/package/cfgfs/src/fwcf.sh b/package/cfgfs/src/fwcf.sh index ea8452850..8954c3645 100644 --- a/package/cfgfs/src/fwcf.sh +++ b/package/cfgfs/src/fwcf.sh @@ -1,7 +1,7 @@ #!/bin/sh # Copyright (c) 2006-2007 # Thorsten Glaser <tg@mirbsd.de> -# Copyright (c) 2009-2017 +# Copyright (c) 2009-2024 # Waldemar Brodkorb <wbx@openadk.org> # # Provided that these terms and disclaimer and all copyright notices @@ -43,7 +43,7 @@ export PATH=/bin:/sbin:/usr/bin:/usr/sbin wd=$(pwd) cd / -what='Configuration Filesystem Utility (cfgfs), Version 1.10' +what='Configuration Filesystem Utility (cfgfs), Version 1.12' who=$(id -u) if [ $who -ne 0 ]; then @@ -56,7 +56,7 @@ usage() { $what Usage: { halt | poweroff | reboot } [-Ffn] [-d delay] - cfgfs { commit | erase | setup | status | dump | restore } [flags] + cfgfs { commit | erase | setup | status | diff | dump | restore } [flags] EOF exit 1 } @@ -101,7 +101,7 @@ if [[ $me != cfgfs ]]; then fi case $1 in -(commit|erase|setup|status|dump|restore) ;; +(commit|erase|setup|status|diff|dump|restore) ;; (*) cat >&2 <<EOF $what Syntax: @@ -109,6 +109,7 @@ Syntax: $0 erase $0 setup [-N] $0 status [-rq] + $0 diff [<diff options>] $0 { dump | restore } [<filename>] EOF exit 1 ;; @@ -132,12 +133,25 @@ echo $rootdisk|grep mmcblk >/dev/null 2>&1 if [ $? -ne 0 ]; then rootdisk=${rootdisk%[1-9]} fi -part=$(fdisk -l $rootdisk 2>/dev/null|grep '^/dev'|tail -1|awk '{ print $1 }') +# find last partition with an 88 id +part=$(fdisk -l $rootdisk 2>/dev/null|awk '{if ($2=="*") { print $1" "$9} else {print $1" "$8}}'|grep '^/dev.*88.*'|tail -1|awk '{ print $1 }') if [ -f .cfgfs ]; then . /.cfgfs fi if [ -z $part ]; then - part=$(fdisk -l /dev/sda 2>/dev/null|grep '^/dev'|tail -1|awk '{ print $1 }') + part=$(fdisk -l /dev/sda 2>/dev/null|awk '{if ($2=="*") { print $1" "$9} else {print $1" "$8}}'|grep '^/dev.*88.*'|tail -1|awk '{ print $1 }') + # find GPT partition + if [ -z $part ]; then + partnum=$(gdisk -l $rootdisk 2>/dev/null|fgrep "cfgfs"|awk '{ print $1 }') + if [ ! -z $partnum ]; then + echo $rootdisk|grep mmcblk >/dev/null 2>&1 + if [ $? -eq 0 ]; then + part=${rootdisk}p${partnum} + else + part=${rootdisk}${partnum} + fi + fi + fi if [ -z $part ]; then # otherwise search for MTD device with name cfgfs part=/dev/mtd$(fgrep '"cfgfs"' /proc/mtd 2>/dev/null | sed 's/^mtd\([^:]*\):.*$/\1/')ro @@ -434,5 +448,42 @@ if test $1 = restore; then exit 0 fi +if test $1 = diff; then + if test ! -e /tmp/.cfgfs; then + cat >&2 <<-EOF + cfgfs: error: not yet initialised + explanation: "cfgfs setup" was not yet run + EOF + [[ $1 = -f ]] || exit 11 + fi + shift + tempd=/tmp/.cfgfs/temp + mount -t tmpfs none $tempd + (cd /tmp/.cfgfs/root; tar cf - .) | (cd $tempd; tar xpf - 2>/dev/null) + x=$(dd if="$part" bs=4 count=1 2>/dev/null) + [[ "$x" = "FWCF" ]] && cfgfs.helper -U $tempd <"$part" + + if test -e $tempd/.cfgfs_deleted; then + while IFS= read -r file; do + rm -f "$tempd/$file" + done <$tempd/.cfgfs_deleted + rm -f $tempd/.cfgfs_deleted + fi + (cd /etc; find . -type f; \ + cd $tempd; find . -type f \ + ) | grep -v -e '^./.cfgfs' -e '^./.rnd$' | sort -u | while read f; do + f=${f#./} + if [ ! -e "/etc/$f" ]; then + echo "Deleted: /etc/$f" + elif [ ! -e "$tempd/$f" ]; then + echo "New: /etc/$f" + else + diff "$@" "$tempd/$f" "/etc/$f" + fi + done + umount $tempd + exit 0 +fi + echo 'cfgfs: cannot be reached...' exit 255 |