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: setup-savesettings
Submitted on June 24, 2016 at 02:04 AM

Section 1 (Bash)

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