123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
#!/bin/bash
#
# Systemeinstellungen und Updates speichern
declare -a bdev
declare -a bserial
declare -a bfsname
declare -a bmodel
# Root-Rechte?
#if [ "$(id -u)" -ne 0 ]; then
# gksu $0
# exit $?
#fi
ZTITLE="--title=Einstellungen permanent speichern"
if [ -e /cdrom/settings.squashfs ]; then
if grep -q "^/dev/sd[a-z][0-9]* /cdrom" /proc/mounts; then
# System läuft vom USB-Stick
zenity "${ZTITLE}" --error --text="Die Systemeinstellungen wurden schon einmal gespeichert. Sie müssen die Datei settings.squashfs unter einem anderen Betriebssystem (z.B. Ubuntu Live, Knoppix oder auch Windows) vom USB-Laufwerk löschen, bevor Sie die Einstellungen und Updates erneut speichern können."
else
zenity "${ZTITLE}" --error --text="Die Systemeinstellungen wurden schon einmal gespeichert. Sie müssen das Original-Image erneut auf eine DVD brennen, um die Einstellungen und Updates wieder speichern zu können."
fi
exit 0
fi
for sysblock in /sys/block/sd*; do
if [ ! -e "${sysblock}" ]; then
continue
fi
dev="/dev/${sysblock##*/}"
if grep -q "^${dev}[0-9]* /cdrom" /proc/mounts; then
continue
fi
if grep -q "^${dev}[0-9]* /home" /proc/mounts; then
continue
fi
if [ -b "${dev}" ]; then
# Nur USB-Geräte sind zugelassen
# Device-Path von hinten her aufrollen, bis das USB-Device-Verzeichnis
# mit den Angaben zu Hersteller/Modell/Seriennummer erreicht ist
curpath=/sys/block/$(readlink "${sysblock}")
while [ "${curpath}" ]; do
if [ -e "${curpath}/uevent" ]; then
if grep -q DEVTYPE=usb_device "${curpath}/uevent"; then
break
fi
fi
curpath=${curpath%/*}
done
if [ "${curpath}" ]; then
[ -r ${curpath}/manufacturer ] && read vendor < ${curpath}/manufacturer ||
[ -r ${curpath}/product ] && read model < ${curpath}/product || model=""
[ -r ${curpath}/serial ] && read serial < ${curpath}/serial
for p in ${sysblock}/sd*; do
if [ -e "${p}" ]; then
volname=$(sudo /sbin/blkid -o udev -s LABEL /dev/${p##*/} 2>/dev/null | grep ^ID_FS_LABEL=)
bfsname[${#bdev[*]}]=${volname#ID_FS_LABEL=}
bmodel[${#bdev[*]}]=${model}
bserial[${#bdev[*]}]=${serial}
bdev[${#bdev[*]}]=/dev/${p##*/}
fi
done
fi
fi
done
bdevnum=""
if grep -q "^/dev/sd[a-z][0-9]* /cdrom" /proc/mounts; then
# System läuft vom USB-Stick -- kein zweiter Stick nötig.
bdev[0]=$(grep "^/dev/sd[a-z][0-9]* /cdrom" /proc/mounts)
bdev[0]=${bdev[0]%% *}
bserial[0]=""
bdevnum=0
zenity "${ZTITLE}" --info --text="Beachten Sie, dass ein etwaiger Hardware-Schreibschutz des USB-Laufwerks deaktiviert sein muss, da die Daten sonst nicht gespeichert werden können."
elif grep -q "^/dev/sd[a-z][0-9]* /home" /proc/mounts; then
# Es ist bereits ein Homestick eingebunden -- kein zweiter Stick nötig.
bdev[0]=$(grep "^/dev/sd[a-z][0-9]* /home" /proc/mounts)
bdev[0]=${bdev[0]%% *}
bserial[0]=""
bdevnum=0
zenity "${ZTITLE}" --info --text="Verwende das USB-Laufwerk zum Speichern der Benutzerdaten als temporären Speicher."
elif [ -e /.setup-homestick ]; then
# Es wurde schon ein USB-Stick für das persistent home ausgewählt -- den können
# wir auch als temporären Speicher nehmen
STICKDEV=""
SERIAL=""
for ((i=0; i<${#SETUP[*]}; i++)) {
case "${SETUP[$i]}" in
STICKDEV=*)
STICKDEV=${SETUP[$i]#STICKDEV=}
;;
SERIAL=*)
SERIAL=${SETUP[$i]#SERIAL=}
;;
esac
}
if [ "${STICKDEV}" -a -e "${STICKDEV}" ]; then
bdev[0]=${STICKDEV}
bserial[0]=${SERIAL}
bdevnum=0
zenity "${ZTITLE}" --info --text="Verwende das zukünftige Home-USB-Laufwerk als temporären Speicher."
fi
fi
if [ "$bdevnum" ]; then
:
elif [ "${#bdev[*]}" -eq 0 ]; then
zenity "${ZTITLE}" --error --text="Derzeit ist kein USB-Laufwerk angeschlossen, um die Daten zwischenzuspeichern. Bitte schließen Sie ein USB-Laufwerk an und starten Sie das Programm erneut."
exit 1
elif [ "${#bdev[*]}" -eq 1 ]; then
zenity "${ZTITLE}" --question --text="Möchten Sie das derzeit angeschlossene USB-Laufwerk ${bdev[0]} als Zwischenspeicher für das Update verwenden?" || exit 1
bdevnum=0
else
# Auswahlmenü
Menu=""
IFS=$'\t' # Damit Zenity Menüeinträge mit Leerzeichen korrekt anzeigt
for ((i=0; i<${#bdev[*]}; i++)) {
Menu="${Menu}${Menu:+$'\t'}FALSE"$'\t'"${i}"$'\t'"${bdev[$i]}"$'\t'"${bfsname[$i]:--}"$'\t'"${bmodel[$i]:--}"
}
while [ -z "${bdevnum}" ]; do
bdevnum=$(zenity "${ZTITLE}" --list --radiolist \
--text="Wählen Sie das USB-Laufwerk aus, auf dem Ihre Daten gespeichert werden sollen." \
--column "" --column "Nr" --column "Gerätename" --column "Laufwerksname" --column "USB-Stick" \
${Menu}) || exit 1
done
fi
if [ "${bdevnum}" -a "${bdev[$bdevnum]}" ]; then
echo -e "STICKDEV=${bdev[$bdevnum]}\nSERIAL=${bserial[$bdevnum]}" | sudo tee /.setup-savesettings >/dev/null 2>/dev/null
zenity "${ZTITLE}" --info --text="Die Einstellungen werden erst beim Herunterfahren von c't Bankix gespeichert. Bitte entfernen Sie das USB-Laufwerk bis dahin nicht."
# Icon aus dem Launcher entfernen
favorites=$(gsettings get com.canonical.Unity.Launcher favorites)
if [ "${favorites}" ]; then
favorites=${favorites/\'ctbankix-savesettings.desktop\'}
favorites=${favorites/, ,/,}
favorites=${favorites/, ]/ ]}
favorites=${favorites/,]/ ]}
gsettings set com.canonical.Unity.Launcher favorites "${favorites}"
killall unity-2d-shell >/dev/null 2>/dev/null
sleep 1
nohup unity-2d-shell >/dev/null 2>/dev/null &
fi
else
zenity "${ZTITLE}" --error --text="Fehler bei der Laufwerksauswahl, bitte versuchen Sie es erneut."
exit 1
fi