forked from HPR/hpr-tools
		
	
		
			
				
	
	
		
			277 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash -
 | |
| #===============================================================================
 | |
| #
 | |
| #         FILE: check_week
 | |
| #
 | |
| #        USAGE: ./check_week -h -i -v [week_number]
 | |
| #
 | |
| #  DESCRIPTION: Checks the upcoming week, or any week, to ensure there are shows
 | |
| #               on the IA for that period. It mainly makes sense to look into
 | |
| #               the future, but you can look backwards in the same year if
 | |
| #               required.
 | |
| #
 | |
| #      OPTIONS: ---
 | |
| # REQUIREMENTS: ---
 | |
| #         BUGS: ---
 | |
| #        NOTES: ---
 | |
| #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
 | |
| #      VERSION: 0.0.2
 | |
| #      CREATED: 2022-01-27 10:45:41
 | |
| #     REVISION: 2022-02-25 22:22:19
 | |
| #
 | |
| #===============================================================================
 | |
| 
 | |
| set -o nounset                              # Treat unset variables as an error
 | |
| 
 | |
| SCRIPT=${0##*/}
 | |
| # DIR=${0%/*}
 | |
| VERSION="0.0.2"
 | |
| 
 | |
| STDOUT="/dev/fd/2"
 | |
| 
 | |
| #
 | |
| # Select the appropriate working directory
 | |
| #
 | |
| case $(hostname) in
 | |
|     i7-desktop)
 | |
|         BASEDIR="$HOME/HPR/InternetArchive"
 | |
|         ;;
 | |
|     hprvps|marvin|borg)
 | |
|         BASEDIR="$HOME/IA"
 | |
|         ;;
 | |
|     *)
 | |
|         echo "Wrong host!"
 | |
|         exit 1
 | |
|         ;;
 | |
| esac
 | |
| 
 | |
| cd "$BASEDIR" || exit 1
 | |
| 
 | |
| #
 | |
| # Load library functions
 | |
| #
 | |
| LIB="$HOME/bin/function_lib.sh"
 | |
| [ -e "$LIB" ] || { echo "Unable to source functions"; exit 1; }
 | |
| # shellcheck source=/home/cendjm/bin/function_lib.sh
 | |
| source "$LIB"
 | |
| 
 | |
| #
 | |
| # Colour codes
 | |
| #
 | |
| define_colours
 | |
| 
 | |
| #===  FUNCTION  ================================================================
 | |
| #         NAME: _open_tunnel
 | |
| #  DESCRIPTION: Opens the SSH tunnel to the HPR server if necessary
 | |
| #   PARAMETERS: 
 | |
| #      RETURNS: 
 | |
| #===============================================================================
 | |
| _open_tunnel () {
 | |
|     local open_tunnel="${1}"
 | |
| 
 | |
|     if [[ $(pgrep -u "$USER" -f 'ssh.*hpr@hackerpublicradio.org' -c) -eq 0 ]]; then
 | |
|         $open_tunnel || { echo "Failed to open SSH tunnel"; exit 1; }
 | |
|     fi
 | |
| }
 | |
| 
 | |
| #===  FUNCTION  ================================================================
 | |
| #         NAME: _DEBUG
 | |
| #  DESCRIPTION: Writes a message 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: Reports usage; always exits the script after doing so
 | |
| #   PARAMETERS: 1 - the integer to pass to the 'exit' command
 | |
| #      RETURNS: Nothing
 | |
| #===============================================================================
 | |
| _usage () {
 | |
|     local -i result=${1:-0}
 | |
| 
 | |
|     cat >$STDOUT <<-endusage
 | |
| ${SCRIPT} - version: ${VERSION}
 | |
| 
 | |
| Usage: ./${SCRIPT} [-h] [week_no]
 | |
| 
 | |
| Checks a future week to ensure all the shows are on the Internet Archive.
 | |
| 
 | |
| Options:
 | |
|     -h                  Print this help
 | |
|     -v                  Enable verbose mode where a little more information is
 | |
|                         output. Mainly the dates relating to the chosen week
 | |
|                         number.
 | |
|     -i                  Ignore shows missing from the database during the
 | |
|                         chosen week. Normally the script does not proceed if
 | |
|                         there are fewer than 5 shows in a week.
 | |
| 
 | |
| Arguments:
 | |
|     week_no             (optional, default current week) the week number to be
 | |
|                         examined. This is a number in the range 1..52.
 | |
|                         Anything else is illegal.
 | |
| 
 | |
| Environment variables
 | |
|     check_week_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
 | |
|     ./check_week        # Check the current week
 | |
|     ./check_week -i     # Check the current week ignoring missing shows
 | |
|     ./check_week 6      # Check week 6 of the current year
 | |
| 
 | |
|     check_week_DEBUG=1 ./check_week     # Run with debugging enabled
 | |
| 
 | |
| endusage
 | |
|     exit "$result"
 | |
| }
 | |
| 
 | |
| #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| #
 | |
| # Debug mode. Invoke it with: 'check_week_DEBUG=1 ./check_week'
 | |
| #
 | |
| DEBUGVAR="${SCRIPT}_DEBUG"
 | |
| DEBUG="${!DEBUGVAR:-0}"
 | |
| 
 | |
| #
 | |
| # Process options
 | |
| #
 | |
| while getopts hiv opt
 | |
| do
 | |
|     case "${opt}" in
 | |
|         h) _usage 1;;
 | |
|         i) IGNORE=1;;
 | |
|         v) VERBOSE=1;;
 | |
|         *) _usage 1;;
 | |
|     esac
 | |
| done
 | |
| shift $((OPTIND - 1))
 | |
| 
 | |
| IGNORE=${IGNORE:-0}
 | |
| VERBOSE=${VERBOSE:-0}
 | |
| 
 | |
| #
 | |
| # Check arguments
 | |
| #
 | |
| if [[ $# -gt 1 ]]; then
 | |
|     _usage 1
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| #
 | |
| # Default missing any week number and validate what's found. Take care that
 | |
| # numbers with leading zeroes are by default taken to be octal! We coerce to
 | |
| # base 10 just in case.
 | |
| #
 | |
| weekno="${1:-"$(date +%V)"}"
 | |
| weekno=$((10#$weekno))
 | |
| if [[ ! $weekno =~ ^[0-9]{1,2}$ ]]; then
 | |
|     echo "Invalid week number: $weekno"
 | |
|     exit 1
 | |
| fi
 | |
| if [[ $weekno -lt 1 || $weekno -gt 52 ]]; then
 | |
|     echo "Invalid week number: $weekno"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| #
 | |
| # Check dependencies
 | |
| #
 | |
| OTUNNEL=$(command -v open_tunnel)
 | |
| if [[ -z $OTUNNEL ]]; then
 | |
|     echo "Can't find the script 'open_tunnel'"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| QUERYTOOL=$(command -v query2csv)
 | |
| if [[ -z $QUERYTOOL ]]; then
 | |
|     echo "Can't find the tool query2csv"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| #
 | |
| # Open the SSH tunnel if it's not already open
 | |
| #
 | |
| _open_tunnel "$OTUNNEL"
 | |
| 
 | |
| #
 | |
| # Gather and compute date information. Week numbers may start with a zero so
 | |
| # we have to coerce them into base 10 from what will be presumed to be octal.
 | |
| #
 | |
| curweek="$((10#$(date +%V)))"
 | |
| curdow="$(date +%u)"
 | |
| woffset=$((weekno - curweek))
 | |
| offset="$((woffset * 7 - curdow + 1)) days"
 | |
| weekstart="$(date -d "$offset" +%F)"
 | |
| weekfinish="$(date -d "$weekstart + 4 days" +%F)"
 | |
| 
 | |
| _DEBUG "Current week number: $curweek"
 | |
| _DEBUG "Current day number: $curdow"
 | |
| _DEBUG "Argument: $weekno"
 | |
| _DEBUG "Week offset: $woffset"
 | |
| _DEBUG "Day offset: $offset"
 | |
| _DEBUG "Start of chosen week: $weekstart"
 | |
| _DEBUG "End of chosen week: $weekfinish"
 | |
| 
 | |
| #
 | |
| # Report what's happening in verbose mode
 | |
| #
 | |
| [ $VERBOSE -eq 1 ] && printf 'Processing week %s (%s to %s)\n' \
 | |
|     "$weekno" "$weekstart" "$weekfinish"
 | |
| 
 | |
| #
 | |
| # Make SQL
 | |
| #
 | |
| sql="select id from eps where date between '$weekstart' and '$weekfinish' order by id"
 | |
| 
 | |
| _DEBUG "SQL: $sql"
 | |
| 
 | |
| #
 | |
| # Collect the shows
 | |
| #
 | |
| declare -a shows
 | |
| mapfile -t shows < <(query2csv "$sql")
 | |
| 
 | |
| _DEBUG "shows: ${shows[*]}"
 | |
| 
 | |
| #
 | |
| # Check we have enough shows, either exiting if not or continuing to check
 | |
| # those we have.
 | |
| #
 | |
| if [[ ${#shows[*]} -ne 5 ]]; then
 | |
|     echo "${red}Didn't find the expected number of shows for this week${reset}"
 | |
|     if [[ $IGNORE -eq 0 ]]; then
 | |
|         exit 1
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| #
 | |
| # Check the shows are on the IA
 | |
| #
 | |
| for show in "${shows[@]/#/hpr}"; do
 | |
|     if ia list "$show" > /dev/null 2>&1; then
 | |
|         echo "${green}$show has been uploaded${reset}"
 | |
|     else
 | |
|         echo "${red}$show has not been uploaded${reset}"
 | |
|     fi
 | |
| done
 | |
| 
 | |
| #
 | |
| # All done
 | |
| #
 | |
| exit
 | |
| 
 | |
| # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21
 | |
| 
 |