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