Surprise! We've been running on hardware provided by BuyVM for a few months and wanted to show them a little appreciation.
Running a paste site comes with unique challenges, ones that aren't always obvious and hard to control. As such, BuyVM offered us a home where we could worry less about the hosting side of things and focus on maintaining a clean and useful service! Go check them out and show them some love!
Description: ctbankix-savesettings
Submitted on June 24, 2016 at 01:05 AM

Section 1 (Bash)

#!/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