. lib/constants_installer  # FILENAME_PRESEED_CFG, PATH_PRESEED_CFG
 . lib/expect_n_args
 . lib/get_mountable_device_path
+. lib/path_tmp_timestamped
+. lib/trapp
 
 expect_n_args 1 1 'DEVICE (e.g. "sdb")' $@
 abort_if_not_user root
 abort_if_command_unknown parted 
 abort_if_command_unknown rsync
 abort_if_command_unknown wget 
-PATH_STICK="$(get_mountable_device_path $1)"
-
+PATH_DEV="$(get_mountable_device_path $1)"
 PATH_MNT_ISO=/mnt/iso
+
+PATH_PROCESSING="$(path_tmp_timestamped make_writable_installer)"
+RM_PROCESSING="rm -rf ${PATH_PROCESSING}"
+echo "Setting up processing directory at ${PATH_PROCESSING} …"
+mkdir "${PATH_PROCESSING}"
+trapp "${RM_PROCESSING}"
+cd "${PATH_PROCESSING}"
+
 FILENAME_ISO="debian-${INSTALLER_VERSION}-amd64-netinst.iso"
-echo "Retrieving ${FILENAME_ISO}."
+echo "Retrieving ${FILENAME_ISO} …"
 URL_ISO="https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/${FILENAME_ISO}"
-PATH_ISO="/tmp/${FILENAME_ISO}"
-wget --output-document "${PATH_ISO}" "${URL_ISO}"
+wget --quiet --output-document "${FILENAME_ISO}" "${URL_ISO}"
 
-echo "Preparing partition/filesystem on ${PATH_STICK}."
-parted --script "${PATH_STICK}" mklabel msdos
-parted --script "${PATH_STICK}" mkpart primary fat32 0% 100%
-PATH_PARTITION="${PATH_STICK}1"
-mkfs.vfat "${PATH_PARTITION}" 
+echo "Preparing partition/filesystem on ${PATH_DEV} …"
+parted --script "${PATH_DEV}" mklabel msdos
+parted --script "${PATH_DEV}" mkpart primary fat32 0% 100%
+PATH_PARTITION="${PATH_DEV}1"
+mkfs.vfat "${PATH_PARTITION}" > /dev/null 
 
-echo "Mounting ${PATH_MNT_ISO} and ${PATH_MNT_STICK}."
-mkdir -p "${PATH_MNT_ISO}" "${PATH_MNT_STICK}"
-mount "${PATH_PARTITION}" "${PATH_MNT_STICK}"
-mount -o loop "${PATH_ISO}" "${PATH_MNT_ISO}"
-do_umounts() {
+PATH_MNT_DEV='/mnt/'$(basename "${PATH_PARTITION}")
+echo -n "Mounting ${PATH_MNT_ISO} and ${PATH_MNT_DEV} …"
+mkdir -p "${PATH_MNT_ISO}" "${PATH_MNT_DEV}"
+do_umount() {
+    echo "Unmounting $1 …"
     set +e
-    echo "Unmounting ${PATH_MNT_ISO}"
-    umount "${PATH_MNT_ISO}"
-    echo "Unmounting ${PATH_MNT_STICK}"
-    umount "${PATH_MNT_STICK}"
+    umount "$1"
     set -e
 }
-trap do_umounts EXIT INT TERM
+mount "${PATH_PARTITION}" "${PATH_MNT_DEV}"
+trapp "${RM_PROCESSING}; do_umount ${PATH_MNT_DEV}"
+mount -o loop "${FILENAME_ISO}" "${PATH_MNT_ISO}" 2>&1 | sed 's|mount: /mnt/iso: WARNING: source write-protected, mounted read-only.||'
+trapp "${RM_PROCESSING}; do_umount ${PATH_MNT_DEV}; do_umount ${PATH_MNT_ISO}"
 
-echo "Copying contents of ${PATH_MNT_ISO} to ${PATH_MNT_STICK}/."
-PATH_RSYNC_ERRORS=/tmp/rsync_errors
+echo "Copying contents of ${PATH_MNT_ISO} to ${PATH_MNT_DEV}/ …"
+FILENAME_RSYNC_ERRORS="rsync_errors"
 set +e
-rsync -a "${PATH_MNT_ISO}/" "${PATH_MNT_STICK}/" 2> "${PATH_RSYNC_ERRORS}"
+rsync -a "${PATH_MNT_ISO}/" "${PATH_MNT_DEV}/" 2> "${FILENAME_RSYNC_ERRORS}"
 RESULT=$?
 set -e
 if [ "${RESULT}" != "0" ]; then
-    echo 'rsync errors:'
-    cat "${PATH_RSYNC_ERRORS}"
-    echo 'rsync encountered errors, see above – continue? (Y/N)'
-    rm "${PATH_RSYNC_ERRORS}"
+    echo 'RSYNC ERRORS:'
+    cat "${FILENAME_RSYNC_ERRORS}"
+    echo '\nrsync encountered errors, see above – continue? (Y/N)'
     read ANSWER
     FIRST_CHAR=$(echo "${ANSWER}" | cut -c1)
     if ! [ "${FIRST_CHAR}" = 'y' -o "${FIRST_CHAR}" = 'Y' ]; then
     fi
 fi
 
-echo "Installing preseed file."
-cp "${PATH_PRESEED_CFG}" "${PATH_MNT_STICK}/"
-sed --in-place 's/ --- / --- preseed\/file=\/cdrom\/'"${FILENAME_PRESEED_CFG}"' /g' "${PATH_MNT_STICK}/boot/grub/grub.cfg"
+echo "Installing preseed file …"
+cp "${PATH_PRESEED_CFG}" "${PATH_MNT_DEV}/"
+sed --in-place 's/ --- / --- preseed\/file=\/cdrom\/'"${FILENAME_PRESEED_CFG}"' /g' "${PATH_MNT_DEV}/boot/grub/grub.cfg"
 
-rm "${PATH_ISO}"
 echo "Done!"
 
 . lib/abort_if_offline
 . lib/expect_n_args
 . lib/path_tmp_timestamped
+. lib/trapp
 
 PATH_LOGS_LOCAL="${HOME}/chatlogs/catgirl"
 PATH_DECRYPTION_KEY_ENCRYPTED="${HOME}/.ssh/id_rsa"
 SERVER="$1"
 
 PATH_PROCESSING="$(path_tmp_timestamped pull_catgirl_logs)"
-ON_TRAP_RM_PROCESSING="rm -rf ${PATH_PROCESSING}"
-ON_TRAP="${ON_TRAP_RM_PROCESSING}"
+RM_PROCESSING="rm -rf ${PATH_PROCESSING}"
 echo "Setting up processing directory at ${PATH_PROCESSING} …"
 mkdir "${PATH_PROCESSING}"
-trap "${ON_TRAP}" EXIT INT TERM
+trapp "${RM_PROCESSING}"
 cd "${PATH_PROCESSING}"
 
 # Highly questionable acrobatics to work around "age" not supporting ssh-agent.
 # (NB: not using lib/retry_until here cuz ssh-keygen returns non-workable exit codes)
 echo -n 'Enter key decryption password: '
 stty -echo
-ON_TRAP="${ON_TRAP}; stty echo"
-trap "${ON_TRAP}" EXIT INT TERM
+trapp "${RM_PROCESSING}; stty echo"
 read SSHPASS
 stty echo
-ON_TRAP="${ON_TRAP_RM_PROCESSING}"
-trap "${ON_TRAP}" EXIT INT TERM
+trapp "${RM_PROCESSING}"
 echo ''
 echo "\n\n" | ssh-keygen -q -P "${SSHPASS}" -p -f "${PATH_DECRYPTION_KEY}" > /dev/null