333 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			333 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/bin/bash - | ||
|  | #=============================================================================== | ||
|  | # | ||
|  | #         FILE: make_tsu_blank | ||
|  | # | ||
|  | #        USAGE: ./make_tsu_blank [-h] [-D] start count | ||
|  | # | ||
|  | #  DESCRIPTION: Make a template for generating a tag and summary update email. | ||
|  | # | ||
|  | #      OPTIONS: --- | ||
|  | # REQUIREMENTS: --- | ||
|  | #         BUGS: --- | ||
|  | #        NOTES: Now obsolete but retained for reference purposes | ||
|  | #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | ||
|  | #      VERSION: 0.0.8 | ||
|  | #      CREATED: 2016-05-28 16:21:22 | ||
|  | #     REVISION: 2021-06-23 13:03:31 | ||
|  | # | ||
|  | #=============================================================================== | ||
|  | 
 | ||
|  | set -o nounset                              # Treat unset variables as an error | ||
|  | 
 | ||
|  | SCRIPT=${0##*/} | ||
|  | 
 | ||
|  | VERSION="0.0.8" | ||
|  | 
 | ||
|  | STDOUT="/dev/fd/2" | ||
|  | 
 | ||
|  | # | ||
|  | # Load library functions | ||
|  | # | ||
|  | LIB="$HOME/bin/function_lib.sh" | ||
|  | [ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; } | ||
|  | # shellcheck source=/home/cendjm/bin/function_lib.sh | ||
|  | source "$LIB" | ||
|  | 
 | ||
|  | # | ||
|  | # Colour codes | ||
|  | # | ||
|  | define_colours | ||
|  | 
 | ||
|  | # | ||
|  | # We need the SSH tunnel (The script to test this and to open it, open_tunnel, | ||
|  | # are in ~/bin. This needs to be set up if running this stuff somewhere else) | ||
|  | # | ||
|  | if ! tunnel_is_open; then | ||
|  |     echo "$SCRIPT: ${red}The SSH tunnel must be open to do this${reset}" | ||
|  |     exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: _usage | ||
|  | #  DESCRIPTION: Report usage | ||
|  | #   PARAMETERS: None | ||
|  | #      RETURNS: Nothing | ||
|  | #=============================================================================== | ||
|  | _usage () { | ||
|  |     cat >$STDOUT <<-endusage | ||
|  | Usage: ./${SCRIPT} [-h] [-d] [-D] start count | ||
|  | 
 | ||
|  | Version: $VERSION | ||
|  | 
 | ||
|  | Generates a file of tag and summary updates for shows in the given range which | ||
|  | can be edited and submitted to tags@hackerpublicradio.org in order to update | ||
|  | the relevant shows. | ||
|  | 
 | ||
|  | Options: | ||
|  |   -h                    Print this help | ||
|  |   -D                    Select debug mode (works the same; more output) | ||
|  | 
 | ||
|  | Arguments: | ||
|  |     start               starting show number | ||
|  |     count               number of shows (shouldn't exceed 20) | ||
|  | 
 | ||
|  | Examples | ||
|  |   ./${SCRIPT} -h | ||
|  |   ./${SCRIPT} -D 700 10 | ||
|  | 
 | ||
|  | endusage | ||
|  |     exit | ||
|  | } | ||
|  | 
 | ||
|  | #===  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 | ||
|  | } | ||
|  | 
 | ||
|  | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|  | 
 | ||
|  | # | ||
|  | # Option defaults | ||
|  | # | ||
|  | DEBUG=0 | ||
|  | 
 | ||
|  | # | ||
|  | # Process options | ||
|  | # | ||
|  | while getopts :hdD opt | ||
|  | do | ||
|  |     case "${opt}" in | ||
|  |         h) _usage;; | ||
|  |         D) DEBUG=1;; | ||
|  |         ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;; | ||
|  |     esac | ||
|  | done | ||
|  | shift $((OPTIND - 1)) | ||
|  | 
 | ||
|  | # | ||
|  | # Directories and files | ||
|  | # | ||
|  | BASEDIR="$HOME/HPR/Database" | ||
|  | TSU="$BASEDIR/tsu" | ||
|  | 
 | ||
|  | PREFIX="tag_summary_updates_" | ||
|  | GENERATOR="$BASEDIR/query2tt2" | ||
|  | LIVECFG="$BASEDIR/.hpr_livedb.cfg" | ||
|  | TEMPLATE="$BASEDIR/query2tt2_taglist.tpl" | ||
|  | 
 | ||
|  | # | ||
|  | # Sanity checks | ||
|  | # | ||
|  | [ -d "$BASEDIR" ] || { echo "Unable to find directory $BASEDIR"; exit 1; } | ||
|  | [ -d "$TSU" ] || { echo "Unable to find directory $TSU"; exit 1; } | ||
|  | 
 | ||
|  | for item in $GENERATOR $LIVECFG $TEMPLATE; do | ||
|  |     [ -e "$item" ] || { | ||
|  |         echo "Unable to find component: $item" | ||
|  |         exit 1 | ||
|  |     } | ||
|  | done | ||
|  | 
 | ||
|  | # | ||
|  | # Maximum number of shows to scan. This is advisory since we might want to | ||
|  | # scan 40 and only get 3 which need work! | ||
|  | # | ||
|  | LIMIT=20 | ||
|  | 
 | ||
|  | # | ||
|  | # Check arguments | ||
|  | # | ||
|  | if [[ $# -ne 2 ]]; then | ||
|  |     _usage | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Validate arguments and make the END variable | ||
|  | # | ||
|  | START="$1" | ||
|  | COUNT="$2" | ||
|  | 
 | ||
|  | RE='^[0-9]+$' | ||
|  | if ! [[ $START =~ $RE ]]; then | ||
|  |     echo "${red}Invalid starting value: $1${reset}" | ||
|  |     exit 1 | ||
|  | fi | ||
|  | if ! [[ $COUNT =~ $RE ]]; then | ||
|  |     echo "${red}Invalid count value: $2${reset}" | ||
|  |     exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Deal with leading zeroes if any by forcing such numbers to base 10 | ||
|  | # | ||
|  | START=$((10#$START)) | ||
|  | COUNT=$((10#$COUNT)) | ||
|  | ((END = START + COUNT - 1)) | ||
|  | 
 | ||
|  | _DEBUG "Start: $START" "Count: $COUNT" "End: $END" | ||
|  | 
 | ||
|  | # | ||
|  | # Argument sanity checks | ||
|  | # | ||
|  | if [[ $COUNT -gt $LIMIT ]]; then | ||
|  |     echo "${yellow}Range: $START..$END ($COUNT)${reset}" | ||
|  |     echo "${yellow}You are asking for a count greater than 20.${reset}" | ||
|  |     echo "${red}Beware! This could be unmanageable!${reset}" | ||
|  |     if ! yes_no 'Are you sure you want this? %s ' 'N'; then | ||
|  |         echo "${red}Request ignored. Please try again.${reset}" | ||
|  |         exit | ||
|  |     fi | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Generate the output file path | ||
|  | # | ||
|  | printf -v OUTFILE "%s/%s%04d-%04d.txt" "$TSU" "$PREFIX"  "$START" "$END" | ||
|  | 
 | ||
|  | _DEBUG "Output: $OUTFILE" | ||
|  | 
 | ||
|  | # | ||
|  | # Does the output file exist? If so, can we detect any work having been done | ||
|  | # to it? | ||
|  | # | ||
|  | overwrite=0 | ||
|  | if [[ -e $OUTFILE ]]; then | ||
|  |     if [[ -s $OUTFILE ]]; then | ||
|  |         echo "${yellow}${OUTFILE/$HOME/\~} already exists.${reset}" | ||
|  |         if grep -E -q "^(summary|tags): ?\w+" "$OUTFILE"; then | ||
|  |             echo -n "${yellow}** Work has been done on this file" | ||
|  |             missing=$(grep -E -c "^(summary|tags): *$" "$OUTFILE") | ||
|  |             if ((missing)); then | ||
|  |                 echo " (there are still tags/summaries to be added).${reset}" | ||
|  |             else | ||
|  |                 echo ".${reset}" | ||
|  |             fi | ||
|  |         else | ||
|  |             echo "${yellow}This file has not had tags or summaries added.${reset}" | ||
|  |         fi | ||
|  | 
 | ||
|  |         if ! yes_no 'Are you sure you want to replace it? %s ' 'N'; then | ||
|  |             echo "${red}File not overwritten${reset}" | ||
|  |             exit | ||
|  |         else | ||
|  |             overwrite=1 | ||
|  |         fi | ||
|  |     else | ||
|  |         # | ||
|  |         # This shouldn't happen. An empty file caused by a failed query or | ||
|  |         # because there's nothing to do should be cleared away immediately | ||
|  |         # rather than here where the file has been left hanging around. | ||
|  |         # | ||
|  |         echo "${yellow}${OUTFILE/$HOME/\~} exists but is empty. Deleting it.${reset}" | ||
|  |         rm -f "$OUTFILE" | ||
|  |     fi | ||
|  | fi | ||
|  | 
 | ||
|  | _DEBUG "Overwrite: $overwrite" | ||
|  | 
 | ||
|  | # | ||
|  | # If we're overwriting no collision check otherwise check check check! | ||
|  | # | ||
|  | if [[ $overwrite -eq 0 ]]; then | ||
|  |     # | ||
|  |     # Check for collisions. | ||
|  |     # | ||
|  |     # Look for individual files already created, taking the FROM and TO values | ||
|  |     # from their names. Look to see if the range START-END is in the range FROM-TO | ||
|  |     # or the other way round. Print all collisions. Any found mean the script | ||
|  |     # can't continue. | ||
|  |     # | ||
|  |     # Note that we have to force numbers to base 10 in case they have leading | ||
|  |     # zeroes (and will therefore be treated as octal). | ||
|  |     # | ||
|  |     collisions=0 | ||
|  |     FILERE="${PREFIX}([0-9]{4})-([0-9]{4})\\.txt$" | ||
|  |     for f in "$TSU"/"${PREFIX}"*; do | ||
|  |         if [[ $f =~ $FILERE ]]; then | ||
|  |             FROM="${BASH_REMATCH[1]}" | ||
|  |             FROM=$((10#$FROM)) | ||
|  |             TO="${BASH_REMATCH[2]}" | ||
|  |             TO=$((10#$TO)) | ||
|  |             if [[ (( $START -ge $FROM && $START -le $TO ) ||\ | ||
|  |                 ( $END -ge $FROM && $END -le $TO )) || \ | ||
|  |                 (( $FROM -ge $START && $FROM -le $END ) ||\ | ||
|  |                 ( $TO -ge $START && $TO -le $END )) ]]; then | ||
|  |                 printf \ | ||
|  |                     '%sCollision: range %04d-%04d overlaps the range %04d-%04d (in '%s')%s\n' \ | ||
|  |                     "${red}" "$START" "$END" "$FROM" "$TO" "${f##*/}" "${reset}" | ||
|  |                 ((collisions++)) | ||
|  |             fi | ||
|  |         fi | ||
|  |     done | ||
|  | 
 | ||
|  |     if [[ $collisions -gt 0 ]]; then | ||
|  |         echo "${red}Found $collisions collisions; aborting${reset}" | ||
|  |         exit 1 | ||
|  |     fi | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Define the SQL. | ||
|  | # 2021-06-20: Now we make a simpler query and rely on a script and template to | ||
|  | # format everything. | ||
|  | # | ||
|  | SQL=$(cat <<ENDSQL | ||
|  | SELECT | ||
|  |     id, summary, tags | ||
|  | FROM eps | ||
|  | WHERE id BETWEEN $START AND $END | ||
|  | AND (length(summary) = 0 OR length(tags) = 0) | ||
|  | ORDER BY id | ||
|  | ENDSQL | ||
|  | ) | ||
|  | 
 | ||
|  | _DEBUG "----" "$SQL" "----" | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # Run MySQL with the query. | ||
|  | # 2021-06-20: The script below does all we want using the predefined template | ||
|  | # | ||
|  | $GENERATOR -config="$LIVECFG" -template="$TEMPLATE" "$SQL" > "$OUTFILE" | ||
|  | RES=$? | ||
|  | 
 | ||
|  | # | ||
|  | # Die if the query failed, and clear up the empty output file if found | ||
|  | # | ||
|  | [ $RES -eq 0 ] || { | ||
|  |     echo "${red}Query failed; aborting${reset}" | ||
|  |     if [[ -e $OUTFILE && ! -s $OUTFILE ]]; then | ||
|  |         rm -f "$OUTFILE" | ||
|  |     fi | ||
|  |     exit 1 | ||
|  | } | ||
|  | 
 | ||
|  | # | ||
|  | # An empty file could be "successfully" created. If so we delete it | ||
|  | # | ||
|  | if [[ -s $OUTFILE ]]; then | ||
|  |     # | ||
|  |     # Report the file created. | ||
|  |     # | ||
|  |     # 2021-06-20: The original sed call is not needed any more because the | ||
|  |     # script we ran made the file in the form we want. | ||
|  |     # | ||
|  |     echo "${green}Output is in ${OUTFILE/$HOME/\~}${reset}" | ||
|  | else | ||
|  |     rm -f "$OUTFILE" | ||
|  |     echo "${yellow}No episodes need work in that range${reset}" | ||
|  | fi | ||
|  | 
 | ||
|  | exit | ||
|  | 
 | ||
|  | # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21 |