forked from HPR/hpr-tools
		
	
		
			
	
	
		
			225 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			225 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/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 | ||
|  | 
 |