forked from HPR/hpr-tools
		
	
		
			
				
	
	
		
			291 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash -
 | |
| #===============================================================================
 | |
| #
 | |
| #         FILE: delete_ia_item
 | |
| #
 | |
| #        USAGE: ./delete_ia_item episode
 | |
| #
 | |
| #  DESCRIPTION: Deletes an uploaded item on the IA. The item (identifier)
 | |
| #               can't be deleted entirely but it can be stripped of contents
 | |
| #               and metadata and left in a 'Reserved' state so the slot can be
 | |
| #               reused.
 | |
| #
 | |
| #      OPTIONS: ---
 | |
| # REQUIREMENTS: ---
 | |
| #         BUGS: ---
 | |
| #        NOTES: ---
 | |
| #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
 | |
| #      VERSION: 0.0.3
 | |
| #      CREATED: 2022-05-08 19:40:37
 | |
| #     REVISION: 2022-08-14 23:09:51
 | |
| #
 | |
| #===============================================================================
 | |
| 
 | |
| set -o nounset                              # Treat unset variables as an error
 | |
| 
 | |
| VERSION="0.0.3"
 | |
| 
 | |
| SCRIPT=${0##*/}
 | |
| # DIR=${0%/*}
 | |
| 
 | |
| STDOUT="/dev/fd/2"
 | |
| 
 | |
| #
 | |
| # Load library functions
 | |
| #
 | |
| LIB="$HOME/bin/function_lib.sh"
 | |
| [ -e "$LIB" ] || { echo "Unable to source functions"; exit 1; }
 | |
| # shellcheck source=function_lib.sh
 | |
| source "$LIB"
 | |
| 
 | |
| #
 | |
| # Colour codes
 | |
| #
 | |
| define_colours
 | |
| 
 | |
| #
 | |
| # 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
 | |
| 
 | |
| #===  FUNCTION  ================================================================
 | |
| #         NAME: _DEBUG
 | |
| #  DESCRIPTION: Writes messages if in DEBUG mode
 | |
| #   PARAMETERS: List of messages
 | |
| #      RETURNS: Nothing
 | |
| #===============================================================================
 | |
| _DEBUG () {
 | |
|     [ "$DEBUG" == 0 ] && return
 | |
|     for msg in "$@"; do
 | |
|         printf 'D> %s\n' "$msg"
 | |
|     done
 | |
| }
 | |
| 
 | |
| #===  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] [-d {0|1}] episode
 | |
| 
 | |
| Deletes an uploaded item on the IA. The item (identifier) can't be deleted
 | |
| entirely but it can be stripped of contents and metadata and left in
 | |
| a 'Reserved' state so the slot can be reused.
 | |
| 
 | |
| Options:
 | |
|   -h                    Print this help
 | |
|   -d 0|1                Dry run: -d 1 (the default) runs the script in dry-run
 | |
|                         mode where nothing is moved but the actions that
 | |
|                         will be taken are reported; -d 0 turns off dry-run
 | |
|                         mode and the actions will be carried out.
 | |
| 
 | |
| Arguments:
 | |
|    episode              Defines the episode (IA identifier) to be deleted from
 | |
|                         archive.org. These identifiers are in the format
 | |
|                         'hprNNNN' where 'NNNN' is a number with leading
 | |
|                         zeroes, and 'hpr' is mandatory.
 | |
| 
 | |
|                         The script attempts to reformat incorrect identifiers
 | |
|                         before giving up. The missing 'hpr' is added, and
 | |
|                         missing leading zeroes are inserted. Thus '42' and
 | |
|                         'hpr42' become 'hpr0042'.
 | |
| 
 | |
| Environment variables:
 | |
|   delete_ia_item_DEBUG  If set to a non-zero value then the debugging
 | |
|                         statements in the script are executed. Otherwise if
 | |
|                         set to zero, or if the variable is absent no debug
 | |
|                         information is produced.  The variable can be set
 | |
|                         using the 'export' command or on the same line as the
 | |
|                         command calling the script.  See the example below.
 | |
| 
 | |
| Examples
 | |
|     ./delete_ia_item 3594        # Run in (default) dry-run mode
 | |
|     ./delete_ia_item -d1 3594    # Run in (explicit) dry-run mode
 | |
|     ./delete_ia_item -d0 3594    # Live mode
 | |
| 
 | |
|     delete_ia_item_DEBUG=1 ./delete_ia_item 3594
 | |
|                                  # Run in dry-run mode with debugging enabled
 | |
| 
 | |
| endusage
 | |
|     exit "$res"
 | |
| }
 | |
| 
 | |
| #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| #
 | |
| # Configure depending whether local or on borg
 | |
| #
 | |
| case $HOSTNAME in
 | |
|     hprvps|marvin|borg)
 | |
|         BASEDIR="$HOME/IA" ;;
 | |
|     i7-desktop)
 | |
|         BASEDIR="$HOME/HPR/IA" ;;
 | |
|     *)
 | |
|         echo "Wrong host!"; exit 1 ;;
 | |
| esac
 | |
| 
 | |
| cd "$BASEDIR" || { echo "Can't cd to $BASEDIR"; exit 1; }
 | |
| 
 | |
| #
 | |
| # Directories and files
 | |
| #
 | |
| LOGS="$BASEDIR/logs"
 | |
| LOGFILE="$LOGS/$SCRIPT.log"
 | |
| 
 | |
| #
 | |
| # Debug mode. Invoke it with: 'delete_ia_item_DEBUG=1 ./tidy_uploaded'
 | |
| #
 | |
| DEBUGVAR="${SCRIPT}_DEBUG"
 | |
| DEBUG="${!DEBUGVAR:-0}"
 | |
| [[ $DEBUG -eq 1 ]] && echo "Debug mode"
 | |
| 
 | |
| #
 | |
| # File of processed shows
 | |
| #
 | |
| PROCFILE="$BASEDIR/.${SCRIPT}.dat"
 | |
| [ -e "$PROCFILE" ] || touch "$PROCFILE"
 | |
| 
 | |
| #
 | |
| # Prerequisites
 | |
| #
 | |
| jq=$(command -v jq)
 | |
| [ -z "$jq" ] && { echo "Needs the 'jq' JSON filter"; exit 1; }
 | |
| ia=$(command -v ia)
 | |
| [ -z "$ia" ] && { echo "Needs the 'ia' Internet Archive script"; exit 1; }
 | |
| 
 | |
| #
 | |
| # Process options
 | |
| #
 | |
| while getopts :d:h opt
 | |
| do
 | |
|     case "${opt}" in
 | |
|         d) DRYRUN=$OPTARG;;
 | |
|         h) _usage 0;;
 | |
|         *) echo "** Unknown option"
 | |
|            _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"
 | |
| 
 | |
| #
 | |
| # Should have only one argument
 | |
| #
 | |
| if [[ $# != 1 ]]; then
 | |
|     echo "${red}${SCRIPT} takes one argument${reset}"
 | |
|     _usage 1
 | |
| fi
 | |
| 
 | |
| #
 | |
| # Collect the argument and clean and validate it, forcing leading zeroes if
 | |
| # needed
 | |
| #
 | |
| item="${1:-}"
 | |
| item="${item,,}"
 | |
| item="${item## }"
 | |
| item="${item%% }"
 | |
| if [[ $item =~ ^(hpr)?([0-9]{1,4})$ ]]; then
 | |
|     printf -v item 'hpr%04i' "${BASH_REMATCH[2]}"
 | |
| else
 | |
|     echo "${red}Invalid episode specification: '$item'${reset}"
 | |
|     echo "${yellow}Use hprNNNN format with leading zeroes${reset}"
 | |
|     _usage 1
 | |
| fi
 | |
| 
 | |
| _DEBUG "Dry run:     $DRYRUN"
 | |
| _DEBUG "Item chosen: $item"
 | |
| 
 | |
| #
 | |
| # Check the item exists on the IA and if it does collect metadata and parse
 | |
| # out the items we need.
 | |
| #
 | |
| _DEBUG "Testing IA for existence of $item"
 | |
| if ia list "$item" > /dev/null 2>&1; then
 | |
|     ia metadata "$item" > "$TMP1"
 | |
| 
 | |
|     # This one's an array but we want a CSV list.
 | |
|     # TODO: Not sure this works with tags containing spaces
 | |
|     # shellcheck disable=SC2046
 | |
|     subject="$(jq -r '.metadata.subject | @csv' "$TMP1")"
 | |
|     subject="${subject//\"\"\"/\"}"
 | |
| 
 | |
|     creator="$(jq -r '.metadata.creator' "$TMP1")"
 | |
| 
 | |
|     date="$(jq -r '.metadata.date' "$TMP1")"
 | |
| 
 | |
|     _DEBUG "subject:     $subject"
 | |
|     _DEBUG "creator:     $creator"
 | |
|     _DEBUG "date:        $date"
 | |
| else
 | |
|     echo "${red}The requested item '$item' is not on archive.org${reset}"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| #
 | |
| # Either pretend to do stuff in dry-run mode or do it for real, but with
 | |
| # confirmation first.
 | |
| #
 | |
| if [[ $DRYRUN -eq 1 ]]; then
 | |
|     echo "${yellow}Would have deleted item $item${reset}"
 | |
|     echo "Commands:"
 | |
|     echo "${blue}ia delete $item --all --no-backup${reset}"
 | |
|     echo "${blue}ia metadata $item --modify=title:\"Reserved\"${reset}"
 | |
|     echo "${blue}ia metadata $item --modify=description:\"Reserved\"${reset}"
 | |
|     echo "${blue}ia metadata $item --remove=creator:\"$creator\"${reset}"
 | |
|     echo "${blue}ia metadata $item --remove=date:$date${reset}"
 | |
|     echo "${blue}ia metadata $item --remove=subject:'$subject'${reset}"
 | |
|     echo
 | |
|     echo "${blue}Would have removed any cache entry found${reset}"
 | |
| else
 | |
|     echo "${red}About to delete item $item.${reset}"
 | |
|     if yes_no "OK to continue? %s " "N"; then
 | |
|         # Not yet tested. Can't be until we have a need! Note that the quoted
 | |
|         # items will not be shown as such using this form of 'echo'.
 | |
|         # echo "Commands are being displayed, not run, until testing is complete"
 | |
|         #
 | |
|         # Now tested, and looking good
 | |
|         #
 | |
|         ia delete "$item" --all --no-backup
 | |
|         ia metadata "$item" --modify=title:"Reserved"
 | |
|         ia metadata "$item" --modify=description:"Reserved"
 | |
|         ia metadata "$item" --remove=creator:"$creator"
 | |
|         ia metadata "$item" --remove=date:"$date"
 | |
|         ia metadata "$item" --remove=subject:"$(printf "'%s'" "$subject")"
 | |
| 
 | |
|         #
 | |
|         # Ensure the show is not marked as "processed" in the cache. We need
 | |
|         # 'grep' to determine if there's anything to do since 'sed' can't do
 | |
|         # this apparently.
 | |
|         #
 | |
|         if grep -q -E '^'"$item"'$' "$PROCFILE"; then
 | |
|             sed -i -e '/^'"$item"'$/d' "$PROCFILE"
 | |
|             echo "${yellow}$item removed from cache${reset}"
 | |
|         else
 | |
|             echo "${yellow}$item not found in cache${reset}"
 | |
|         fi
 | |
| 
 | |
|         #
 | |
|         # Log this item
 | |
|         #
 | |
|         echo "$(date +%Y%m%d%H%M%S) deleted $item" >> "$LOGFILE"
 | |
|     else
 | |
|         echo "${red}Item not deleted. Aborting.${reset}"
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21
 |