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
|