summaryrefslogtreecommitdiffstats
path: root/meta-phosphor/recipes-phosphor/initrdscripts/files/obmc-update.sh
diff options
context:
space:
mode:
authorBrad Bishop <bradleyb@fuzziesquirrel.com>2018-08-31 06:25:51 -0400
committerBrad Bishop <bradleyb@fuzziesquirrel.com>2018-09-06 07:44:12 -0400
commitff075f6ee795a590b244d70a90cc312ba1f2d83d (patch)
treea617790bdbfdeef960665ba0242e1f0c93e5301a /meta-phosphor/recipes-phosphor/initrdscripts/files/obmc-update.sh
parent3e4da38c127bb7e7641adc2fc41f4c33744cb918 (diff)
downloadtalos-openbmc-ff075f6ee795a590b244d70a90cc312ba1f2d83d.tar.gz
talos-openbmc-ff075f6ee795a590b244d70a90cc312ba1f2d83d.zip
meta-phosphor: Move layer content from common/
Adopt a more conventional directory hierarchy. meta-phosphor is still a _long_ way from suitable for hosting on yoctoproject.org but things like this don't help. (From meta-phosphor rev: 471cfcefa74b8c7ceb704cb670e6d915cf27c63b) Change-Id: I3f106b2f6cdc6cec734be28a6090800546f362eb Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'meta-phosphor/recipes-phosphor/initrdscripts/files/obmc-update.sh')
-rwxr-xr-xmeta-phosphor/recipes-phosphor/initrdscripts/files/obmc-update.sh274
1 files changed, 274 insertions, 0 deletions
diff --git a/meta-phosphor/recipes-phosphor/initrdscripts/files/obmc-update.sh b/meta-phosphor/recipes-phosphor/initrdscripts/files/obmc-update.sh
new file mode 100755
index 000000000..278cd41d7
--- /dev/null
+++ b/meta-phosphor/recipes-phosphor/initrdscripts/files/obmc-update.sh
@@ -0,0 +1,274 @@
+#!/bin/sh
+
+echo update: "$@"
+
+echoerr() {
+ echo 1>&2 "ERROR: $@"
+}
+
+cd /
+if ! test -r /proc/mounts || ! test -f /proc/mounts
+then
+ mkdir -p /proc
+ mount -t proc proc proc
+fi
+if ! test -d /sys/class
+then
+ mkdir -p /sys
+ mount -t sysfs sys sys
+fi
+if ! test -c /dev/null
+then
+ mkdir -p /dev
+ mount -t devtmpfs dev dev
+fi
+
+# mtd number N with mtd name Name can be mounted via mtdN, or mtd:Name
+# (with a mtd aware fs) or by /dev/mtdblockN (with a mtd or block fs).
+mtdismounted() {
+ m=${1##mtd}
+ if grep -s "mtdblock$m " /proc/mounts || grep -s "mtd$m " /proc/mounts
+ then
+ return 0
+ fi
+ n=$(cat /sys/class/mtd/mtd$m/name)
+ if test -n "$n" && grep -s "mtd:$n " /proc/mounts
+ then
+ return 0
+ fi
+ return 1
+}
+
+# Detect child partitions when the whole flash is to be updated.
+# Ignore mtdNro and mtdblockN names in the class subsystem directory.
+childmtds() {
+ for m in /sys/class/mtd/$1/mtd*
+ do
+ m=${m##*/}
+ if test "${m%ro}" = "${m#mtdblock}"
+ then
+ echo $m
+ fi
+ done
+}
+
+toobig() {
+ if test $(stat -L -c "%s" "$1") -gt $(cat /sys/class/mtd/"$2"/size)
+ then
+ return 0
+ fi
+ return 1
+}
+
+findmtd() {
+ m=$(grep -xl "$1" /sys/class/mtd/*/name)
+ m=${m%/name}
+ m=${m##*/}
+ echo $m
+}
+
+blkid_fs_type() {
+ # Emulate util-linux's `blkid -s TYPE -o value $1`
+ # Example busybox blkid output:
+ # # blkid /dev/mtdblock5
+ # /dev/mtdblock5: TYPE="squashfs"
+ # Process output to extract TYPE value "squashfs".
+ blkid $1 | sed -e 's/^.*TYPE="//' -e 's/".*$//'
+}
+
+probe_fs_type() {
+ fst=$(blkid_fs_type $1)
+ echo ${fst:=jffs2}
+}
+
+rwfs=$(findmtd rwfs)
+
+rwdev=/dev/mtdblock${rwfs#mtd}
+rwopts=rw
+rorwopts=ro${rwopts#rw}
+
+rwdir=/run/initramfs/rw
+upper=$rwdir/cow
+save=/run/save/${upper##*/}
+
+mounted=
+doflash=y
+doclean=
+dosave=y
+dorestore=y
+toram=
+checksize=y
+checkmount=y
+
+whitelist=/run/initramfs/whitelist
+image=/run/initramfs/image-
+imglist=
+
+while test "$1" != "${1#-}"
+do
+ case "$1" in
+ --help)
+ cat <<HERE
+Usage: $0 [options] -- Write images in /run/initramfs to flash (/dev/mtd*)
+ --help Show this message
+ --no-flash Don't attempt to write images to flash
+ --ignore-size Don't compare image size to mtd device size
+ --ignore-mount Don't check if destination is mounted
+ --save-files Copy whitelisted files to save directory in RAM
+ --no-save-files Don't copy whitelisted files to save directory
+ --copy-files Copy files from save directory to rwfs mountpoint
+ --restore-files Restore files from save directory to rwfs layer
+ --no-restore-files Don't restore saved files from ram to rwfs layer
+ --clean-saved-files Delete saved whitelisted files from RAM
+ --no-clean-saved-files Retain saved whitelisted files in RAM
+HERE
+
+ exit 0 ;;
+
+ --no-clean-saved-files)
+ doclean=
+ shift ;;
+ --clean-saved-files)
+ doclean=y
+ shift ;;
+ --no-save-files)
+ dosave=
+ shift ;;
+ --save-files)
+ dosave=y
+ shift ;;
+ --no-restore-files)
+ dorestore=
+ shift ;;
+ --restore-files)
+ dorestore=y
+ shift ;;
+ --no-flash)
+ doflash=
+ shift ;;
+ --ignore-size)
+ checksize=
+ shift ;;
+ --ignore-mount)
+ checkmount=
+ doflash=
+ shift ;;
+ --copy-files)
+ toram=y
+ shift ;;
+ *)
+ echoerr "Unknown option $1. Try $0 --help."
+ exit 1 ;;
+ esac
+done
+
+if test "x$dosave" = xy
+then
+ if test ! -d $upper -a -n "$rwfs"
+ then
+ mkdir -p $rwdir
+ mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts
+ mounted=$rwdir
+ fi
+
+ while read f
+ do
+ # Entries shall start with /, no trailing /.. or embedded /../
+ if test "/${f#/}" != "$f" -o "${f%/..}" != "${f#*/../}"
+ then
+ echo 1>&2 "WARNING: Skipping bad whitelist entry $f."
+ continue
+ fi
+ if ! test -e "$upper/$f"
+ then
+ continue
+ fi
+ d="$save/$f"
+ while test "${d%/}" != "${d%/.}"
+ do
+ d="${d%/.}"
+ d="${d%/}"
+ done
+ mkdir -p "${d%/*}"
+ cp -rp "$upper/$f" "${d%/*}/"
+ done < $whitelist
+
+ if test -n "$mounted"
+ then
+ umount $mounted
+ fi
+fi
+
+imglist=$(echo $image*)
+if test "$imglist" = "$image*" -a ! -e "$imglist"
+then
+ # shell didn't expand the wildcard, so no files exist
+ echo "No images found to update."
+ imglist=
+fi
+
+for f in $imglist
+do
+ m=$(findmtd ${f#$image})
+ if test -z "$m"
+ then
+ echoerr "Unable to find mtd partition for ${f##*/}."
+ exit 1
+ fi
+ if test -n "$checksize" && toobig "$f" "$m"
+ then
+ echoerr "Image ${f##*/} too big for $m."
+ exit 1
+ fi
+ for s in $m $(childmtds $m)
+ do
+ if test -n "$checkmount" && mtdismounted $s
+ then
+ echoerr "Device $s is mounted, ${f##*/} is busy."
+ exit 1
+ fi
+ done
+done
+
+if test -n "$doflash"
+then
+ for f in $imglist
+ do
+ if test ! -s $f
+ then
+ echo "Skipping empty update of ${f#$image}."
+ rm $f
+ continue
+ fi
+ m=$(findmtd ${f#$image})
+ echo "Updating ${f#$image}..."
+ flashcp -v $f /dev/$m && rm $f
+ done
+fi
+
+if test -d $save -a "x$toram" = xy
+then
+ mkdir -p $upper
+ cp -rp $save/. $upper/
+fi
+
+if test -d $save -a "x$dorestore" = xy
+then
+ odir=$rwdir
+ rwdir=/run/rw
+ upper=$rwdir${upper#$odir}
+
+ mkdir -p $rwdir
+ mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts
+ mkdir -p $upper
+ cp -rp $save/. $upper/
+ umount $rwdir
+ rmdir $rwdir
+fi
+
+if test "x$doclean" = xy
+then
+ rm -rf $save
+fi
+
+exit
OpenPOWER on IntegriCloud