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