#!/bin/bash - #=============================================================================== # # FILE: delete_uploaded # # USAGE: ./delete_uploaded [-h] [-v] [-d {0|1}] # # DESCRIPTION: Deletes HPR audio and other show-related files on the VPS # after their shows have been uploaded to the Internet Archive # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: Was 'delete_uploaded_new' while in development. Now replaces # the original 'delete_uploaded'. # AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com # VERSION: 0.1.4 # CREATED: 2017-08-12 12:32:13 # REVISION: 2022-03-30 10:57:23 # #=============================================================================== set -o nounset # Treat unset variables as an error VERSION="0.1.4" SCRIPT=${0##*/} #DIR=${0%/*} STDOUT="/dev/fd/2" # # Make temporary files and set traps to delete them # TMP1=$(mktemp) || { echo "$SCRIPT: creation of temporary file failed!"; exit 1; } trap 'cleanup_temp $TMP1' SIGHUP SIGINT SIGPIPE SIGTERM EXIT # # Configure depending whether local or on the VPS # case $HOSTNAME in hprvps|marvin|borg) UPLOADS="/var/IA/uploads" ;; i7-desktop) UPLOADS="$HOME/HPR/IA/uploads" ;; *) echo "Wrong host!"; exit 1 ;; esac #=== FUNCTION ================================================================ # NAME: cleanup_temp # DESCRIPTION: Cleanup temporary files in case of a keyboard interrupt # (SIGINT) or a termination signal (SIGTERM) and at script # exit # PARAMETERS: * - names of temporary files to delete # RETURNS: Nothing #=============================================================================== function cleanup_temp { for tmp in "$@"; do [ -e "$tmp" ] && rm --force "$tmp" done exit 0 } #=== FUNCTION ================================================================ # NAME: is_empty # DESCRIPTION: Check whether a directory is empty # PARAMETERS: $1 Directory to test # RETURNS: True if empty, otherwise false #=============================================================================== is_empty() { test -z "$(find "$1" -mindepth 1 -printf X -quit)" } #=== FUNCTION ================================================================ # NAME: _usage # DESCRIPTION: Report usage # PARAMETERS: 1 [optional] exit value # RETURNS: Nothing #=============================================================================== _usage () { local -i res="${1:-0}" cat >$STDOUT <<-endusage ${SCRIPT} - version: ${VERSION} Usage: ./${SCRIPT} [-h] [-v] [-d {0|1}] Deletes HPR audio and other show-related files on the VPS after their shows have been uploaded to the Internet Archive. Options: -h Print this help -v Run in verbose mode where more information is reported -d 0|1 Dry run: -d 1 (the default) runs the script in dry-run mode where nothing is deleted but the actions that will be taken are reported; -d 0 turns off dry-run mode and the actions will be carried out. endusage exit "$res" } #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # Process options # while getopts :d:hv opt do case "${opt}" in d) DRYRUN=$OPTARG;; h) _usage 0;; v) VERBOSE=1;; *) _usage 1;; esac done shift $((OPTIND - 1)) DRYRUN=${DRYRUN:-1} if [[ $DRYRUN -ne 0 && $DRYRUN -ne 1 ]]; then echo "** Use '-d 0' or '-d 1'" _usage 1 fi [[ $DRYRUN -eq 1 ]] && echo "Dry run mode" VERBOSE=${VERBOSE:-0} # # Should have no arguments # if [[ $# != 0 ]]; then echo "** ${SCRIPT} takes no arguments" _usage 1 fi # # Declarations # #re="^hpr[0-9]{4}" declare -a dirs lastitem= while read -r path; do # # Extract the path relative to $UPLOADS and the IA item name from the # returned path # relpath="${path#"$UPLOADS"/}" item="${relpath:0:7}" [ $VERBOSE -eq 1 ] && echo "Found $path" # # Record all directories from the 'find'. Note that this means the # directory must begin with "^hpr[0-9]{4}", which may give a problem if # there's a directory that doesn't conform # if [[ -d $path ]]; then dirs+=("$path") fi # # Detect that the item prefix has changed. If it has we're processing # a new IA identifier, so work on this one # if [[ $item != "$lastitem" ]]; then lastitem=$item [ $VERBOSE -eq 1 ] && echo "Checking IA for $lastitem" if ia list "$lastitem" > "$TMP1"; then # # Scan the returned list to see if any files we have are online. # Delete when there's a match. # while read -r file; do if [[ -e "$UPLOADS/$file" ]]; then # # A file on the IA exists in the upload area. Delete the # local one if we're not in dry-run mode, otherwise just # report the deletion we would do. # if [[ $DRYRUN -eq 0 ]]; then rm -f "$UPLOADS/$file" echo "Deleted $UPLOADS/$file" else echo "Would delete $UPLOADS/$file" fi fi done < "$TMP1" else # # End the outer 'while' loop because we hit an item not on the IA. # We rely on the list being sorted for this to be sensible # [ $VERBOSE -eq 1 ] && echo "Item not found on IA: $lastitem" break fi else # # Ignore all but the first file belonging to an IA identifier # [ $VERBOSE -eq 1 ] && echo "Skipped $path" continue fi done < <(find "$UPLOADS" -regextype posix-extended -regex '.*hpr[0-9]{4}.*' | sort) # # Clean up any empty directories # for dir in "${dirs[@]}"; do if is_empty "$dir"; then if [[ $DRYRUN -eq 0 ]]; then rmdir "$dir" echo "Deleted $dir" else echo "Would delete $dir" fi fi done exit # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21