123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
#!/bin/bash
#
# Nach Setup-Datei für c't Bankix Update suchen
Message () {
/bin/plymouth message --text="$1"
echo "$1"
}
Error () {
/bin/plymouth message --text="$2"
/bin/plymouth message --text="Datenspeicherung fehlgeschlagen."
echo "$2"
sleep 30
exit $1
}
SETUP_FILE=/.setup-savesettings
if [ ! -e ${SETUP_FILE} ]; then
Message "Keine Systemeinstellungen zu sichern."
exit 0
fi
# Setup-Datei einlesen
read -d "" -a SETUP < ${SETUP_FILE}
Message "Systemeinstellungen und Updates speichern:"
# Parameter STICKDEV und SERIAL extrahieren
STICKDEV=""
SERIAL=""
for ((i=0; i<${#SETUP[*]}; i++)) {
case "${SETUP[$i]}" in
STICKDEV=*)
STICKDEV=${SETUP[$i]#STICKDEV=}
;;
SERIAL=*)
SERIAL=${SETUP[$i]#SERIAL=}
;;
esac
}
# Zur Sicherheit nochmal Device und Seriennummer überprüfen
[ "${STICKDEV}" -a -b "${STICKDEV}" ] || Error 1 "USB-Laufwerk nicht auffindbar."
# Device-Path von hinten her aufrollen, bis das USB-Device-Verzeichnis
# mit den Angaben zur Seriennummer erreicht ist
if [ "${SERIAL}" ]; then
devname=${STICKDEV##*/}
devname=${devname%%[0-9]}
curpath=/sys/block/$(readlink "/sys/block/${devname}")
while [ "${curpath}" ]; do
if [ -e "${curpath}/uevent" ]; then
if grep -q DEVTYPE=usb_device "${curpath}/uevent"; then
break
fi
fi
curpath=${curpath%/*}
done
[ "${curpath}" -a -e "${curpath}/serial" ] || Error 1 "Unbekanntes USB-Laufwerk."
read serno < ${curpath}/serial
[ "${SERIAL}" == "${serno}" ] || Error 1 "Falsches USB-Laufwerk oder Laufwerk wurde entfernt."
fi
SQDIR=""
if grep -q "^/dev/sd[a-z][0-9]* /cdrom" /proc/mounts; then
# System läuft vom USB-Stick, also auch die Einstellungen hier speichern
Message " USB-Laufwerk beschreibbar einbinden..."
SQDIR=/cdrom
MEDIA="disk"
mount -o remount,rw ${SQDIR} ## >/dev/null 2>/dev/null || Error 1 "Konnte USB-Laufwerk nicht beschreibbar einbinden -- evtl. Hardware-Schreibschutz aktiv?"
else
Message " USB-Laufwerk als Zwischenspeicher einbinden..."
SQDIR=/mnt/ctbankix
MEDIA="cd"
umount -f ${STICKDEV} >/dev/null 2>/dev/null
mount -o rw ${STICKDEV} ${SQDIR%/*} >/dev/null 2>/dev/null || Error 1 "Konnte USB-Laufwerk nicht einbinden."
mkdir -p ${SQDIR}
fi
COW=/cow
EXCLUDES=${SQDIR}/excludes
# Ausnahmenliste erstellen und aufräumen
Message " Dateien zusammenstellen..."
apt-get clean
# User-Home sichern, allerdings Histroy und Caches auslassen
echo ".setup-savesettings" >> ${EXCLUDES}
echo ".setup-homestick" >> ${EXCLUDES}
echo "etc/mtab" >> ${EXCLUDES}
echo "home/ctbankix/.bash_history" >> ${EXCLUDES}
echo "boot/*" >> ${EXCLUDES}
echo "media/*" >> ${EXCLUDES}
echo "var/log/*" >> ${EXCLUDES}
echo "var/cache/apt/archives/*" >> ${EXCLUDES}
echo "tmp/*" >> ${EXCLUDES}
cd ${COW}
# relative Pfade für Wildcard-Excludes
find . -name '*.wh.*' | cut -b 3- >> ${EXCLUDES} # Gelöschte Dateien im COW
cd -
[ -e "${EXCLUDES}" ] || Error 1 "Dateiliste nicht auffindbar."
# Squashfs bauen
Message " Dateiarchiv packen..."
rm -f ${SQDIR}/settings.squashfs
mksquashfs ${COW} ${SQDIR}/settings.squashfs -ef ${EXCLUDES} -wildcards >/dev/null 2>/dev/null || Error 1 "Konnte Dateien nicht zusammenpacken, ggf. ist nicht genug Platz auf dem USB-Laufwerk."
rm -f ${EXCLUDES} 2>/dev/null
sync
if [ "${MEDIA}" = "cd" ]; then
# echo "2. Session bauen"
cd ${SQDIR%/*}
Message " DVD untersuchen..."
TRACKPOS=$(cdrskin --drive_not_o_excl dev=/dev/cdrom -msinfo 2>/dev/null)
[ "$TRACKPOS" ] || Error 1 "Abgeschlossene DVD: Die c't-Bankix-DVD darf nicht abgeschlossen sein, damit das Update als 2. Session gespeichert werden kann."
# LENGTH=$(genisoimage -print-size -quiet -J -R -C ${TRACKPOS} -dev /dev/cdrom ctbankix 2>/dev/null)
# [ "$LENGTH" ] || Error 1 "Fehler beim Einbinden des Original-Images."
#
# # Prüfen, ob noch genug Platz ist:
# DATASIZE=$(du -B 2048 ${SQDIR}/settings.squashfs)
# DATASIZE=${DATASIZE%%$'\t'*}
# DISKCAP=$(cdrskin --drive_not_o_excl dev=/dev/cdrom -atip 2>/dev/null | grep "ATIP start of lead out:")
# DISKCAP=${DISKCAP#*: }
# DISKCAP=${DISKCAP%% *}
# if [ -z "${DISKCAP}" ]; then
# Message " Speicherplatz der CD nicht bestimmbar, versuche trotzdem zu brennen..."
# elif [ ${DISKCAP} -le $((${TRACKPOS#*,} + ${DATASIZE})) ]; then
# Error 1 "CD zu klein, um die Systemeinstellungen und Updates zu speichern. Bitte laden Sie sich eine aktualisierte Version von c't Bankix herunter oder installieren Sie c't Bankix auf einem USB-Laufwerk."
# fi
Message " Update als 2. Session auf DVD brennen..."
genisoimage -quiet -J -R -C ${TRACKPOS} -dev /dev/cdrom ctbankix 2>/dev/null | \
cdrskin --drive_not_o_excl -waiti -tao dev=/dev/cdrom tsize=${LENGTH}s speed=4 driveropts=burnproof - >/dev/null 2>/dev/null || Error 1 "Fehler beim Brennen der 2. Session."
cd -
umount -f ${SQDIR%/*} >/dev/null 2>/dev/null
elif [ "${MEDIA}" = "disk" ]; then
mount -o remount,ro ${SQDIR}
fi
Message "Fertig."
sleep 2