| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | #!/bin/bash - | 
					
						
							|  |  |  | # shellcheck disable=SC2317 | 
					
						
							|  |  |  | #=============================================================================== | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #         FILE: do_report | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #        USAGE: ./do_report [-h] [-D] [-m] [-s] [-Y] epno path_to_shownotes.json | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  DESCRIPTION: Script to be invoked after a show has been processed to make | 
					
						
							|  |  |  | #               a Matrix report. | 
					
						
							|  |  |  | #      OPTIONS: --- | 
					
						
							|  |  |  | # REQUIREMENTS: --- | 
					
						
							|  |  |  | #         BUGS: --- | 
					
						
							|  |  |  | #        NOTES: --- | 
					
						
							|  |  |  | #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | 
					
						
							|  |  |  | #      VERSION: 0.0.8 | 
					
						
							|  |  |  | #      CREATED: 2022-09-07 15:27:29 | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | #     REVISION: 2024-06-18 20:13:46 | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | # | 
					
						
							|  |  |  | #=============================================================================== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | set -o nounset                              # Treat unset variables as an error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SCRIPT=${0##*/} | 
					
						
							|  |  |  | #DIR=${0%/*} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # shellcheck disable=SC2034 | 
					
						
							|  |  |  | VERSION="0.0.8" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STDOUT="/dev/fd/2" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Load library functions | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | LIB="$HOME/HPR/function_lib.sh" | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | [ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; } | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | # shellcheck source=/home/cendjm/HPR/function_lib.sh | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | source "$LIB" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Colour codes | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | define_colours | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | #{{{ Functions: --- _usage --- _verbose --- _silent --- | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | #===  FUNCTION  ================================================================ | 
					
						
							|  |  |  | #         NAME: _usage | 
					
						
							|  |  |  | #  DESCRIPTION: Report usage | 
					
						
							|  |  |  | #   PARAMETERS: None | 
					
						
							|  |  |  | #      RETURNS: Nothing | 
					
						
							|  |  |  | #=============================================================================== | 
					
						
							|  |  |  | _usage () { | 
					
						
							|  |  |  |     cat >$STDOUT <<-endusage | 
					
						
							|  |  |  | Usage: ./${SCRIPT} [-h] [-D] [-m] [-s] [-Y] shownumber | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Version: $VERSION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Script to create and send a Matrix message about the processing of the show | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Options: | 
					
						
							|  |  |  |   -h                    Print this help | 
					
						
							|  |  |  |   -D                    Run in debug mode where a lot more information is | 
					
						
							|  |  |  |                         reported | 
					
						
							|  |  |  |   -m                    Monochrome mode - no colours | 
					
						
							|  |  |  |   -s                    Silent mode, output less text about actions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Arguments: | 
					
						
							|  |  |  |     shownumber | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Examples | 
					
						
							|  |  |  |   ./${SCRIPT} -h | 
					
						
							|  |  |  |   ./${SCRIPT} -m 3112 | 
					
						
							|  |  |  |   ./${SCRIPT} -D 3112 | 
					
						
							|  |  |  |   ./${SCRIPT} 3112 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | endusage | 
					
						
							|  |  |  |     exit | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #===  FUNCTION  ================================================================ | 
					
						
							|  |  |  | #         NAME: _verbose | 
					
						
							|  |  |  | #  DESCRIPTION: Writes a message in verbose mode | 
					
						
							|  |  |  | #   PARAMETERS: $1      message | 
					
						
							|  |  |  | #      RETURNS: Nothing | 
					
						
							|  |  |  | #=============================================================================== | 
					
						
							|  |  |  | _verbose () { | 
					
						
							|  |  |  |     [ "$VERBOSE" -eq 0 ] && return | 
					
						
							|  |  |  |     for msg in "$@"; do | 
					
						
							|  |  |  |         printf '%s\n' "$msg" | 
					
						
							|  |  |  |     done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #===  FUNCTION  ================================================================ | 
					
						
							|  |  |  | #         NAME: _silent | 
					
						
							|  |  |  | #  DESCRIPTION: Writes a message unless in silent mode | 
					
						
							|  |  |  | #   PARAMETERS: $1      message | 
					
						
							|  |  |  | #      RETURNS: Nothing | 
					
						
							|  |  |  | #=============================================================================== | 
					
						
							|  |  |  | _silent () { | 
					
						
							|  |  |  |     [ "$SILENT" -eq 1 ] && return | 
					
						
							|  |  |  |     for msg in "$@"; do | 
					
						
							|  |  |  |         printf '%s\n' "$msg" | 
					
						
							|  |  |  |     done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #}}} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Paths to files | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | BASENAME="$HOME/HPR/Show_Submission" | 
					
						
							|  |  |  | TPL="$BASENAME/shownotes/hpr%d/%s" | 
					
						
							|  |  |  | Q2CSV="$BASENAME/query2csv" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ -e "$Q2CSV" ] || { echo "Unable to find '$Q2CSV'; aborting"; exit 1; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Option defaults | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | COLOUR=1 # use colours by default | 
					
						
							|  |  |  | SILENT=0 # not silent by default | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Process options | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | while getopts :hDmsY opt | 
					
						
							|  |  |  | do | 
					
						
							|  |  |  |     case "${opt}" in | 
					
						
							|  |  |  |         h) _usage;; | 
					
						
							|  |  |  |         D) DEBUG=1;; | 
					
						
							|  |  |  |         m) COLOUR=0;; | 
					
						
							|  |  |  |         s) SILENT=1;; | 
					
						
							|  |  |  |         ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;; | 
					
						
							|  |  |  |     esac | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | shift $((OPTIND - 1)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEBUG=${DEBUG:-0} | 
					
						
							|  |  |  | SILENT=${SILENT:-0} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Cancel colours if requested | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | if [[ $COLOUR -eq 0 ]]; then | 
					
						
							|  |  |  |     undefine_colours | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Check the argument after any options | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | if [[ $# -ne 1 ]]; then | 
					
						
							|  |  |  |     echo "$SCRIPT: ${red}Usage: $SCRIPT shownumber${reset}" | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | show="$1" | 
					
						
							|  |  |  | # json="$2" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Compute paths to show-specific files | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # shellcheck disable=SC2059 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | printf -v json "$TPL" "$show" "shownotes.json" | 
					
						
							|  |  |  | printf -v assetfile "$TPL" "$show" ".assets" | 
					
						
							|  |  |  | printf -v statusfile "$TPL" "$show" ".status" | 
					
						
							|  |  |  | _DEBUG "Path to json = $json" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Simplify checks | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | if [[ ! -e $json ]]; then | 
					
						
							|  |  |  |     echo "$SCRIPT: ${red}Unable to find $json${reset}" | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #------------------------------------------------------------------------------- | 
					
						
							|  |  |  | # Get the show details | 
					
						
							|  |  |  | #------------------------------------------------------------------------------- | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Extract JSON data and make Bash assignments which are then processed | 
					
						
							|  |  |  | # with 'eval'. | 
					
						
							|  |  |  | # Have to declare variables to avoid upsetting Shellcheck | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | declare host hostid email format | 
					
						
							|  |  |  | jqscript='host=\(.host.Host_Name) hostid=\(.host.Host_ID) ' | 
					
						
							|  |  |  | jqscript+='email=\(.host.Host_Email) format=\(.metadata.POST.shownotes_format)' | 
					
						
							|  |  |  | commands=$(jq -r "@sh \"$jqscript\"" "$json") | 
					
						
							|  |  |  | eval "${commands}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # The zero hostid needs checking | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | if [ "$hostid" -eq 0 ]; then | 
					
						
							|  |  |  |     _silent "${yellow}Checking host id 0 is valid${reset}" | 
					
						
							|  |  |  |     # Look up in database | 
					
						
							|  |  |  |     hid=$($Q2CSV "select hostid from hosts where host like '%${host}%'") | 
					
						
							|  |  |  |     # Use the host id we found if the zero id is wrong | 
					
						
							|  |  |  |     if [[ -n $hid ]]; then | 
					
						
							|  |  |  |         _silent "${yellow}Found the host name $host with id $hid${reset}" | 
					
						
							|  |  |  |         hostid=$hid | 
					
						
							|  |  |  |         newhost="" | 
					
						
							|  |  |  |         email=" (using $email)" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         newhost="new host " | 
					
						
							|  |  |  |         email=" ($email)" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |     newhost="" | 
					
						
							|  |  |  |     email="" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # If the hostid is zero the email wasn't known (so maybe a new host) and we | 
					
						
							|  |  |  | # didn't find the name in the database (so treat them as new). We only report | 
					
						
							|  |  |  | # the email if it's a known host (by name) using a new address or if it's | 
					
						
							|  |  |  | # a new host. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # if [ "$hostid" -eq 0 ]; then | 
					
						
							|  |  |  | #     newhost="new host " | 
					
						
							|  |  |  | #     email=" ($email)" | 
					
						
							|  |  |  | # else | 
					
						
							|  |  |  | #     newhost="" | 
					
						
							|  |  |  | #     email="" | 
					
						
							|  |  |  | # fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # If there are assets collect their names | 
					
						
							|  |  |  | # NOTE: now not used except as a non-blank string | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | if [[ -e $assetfile ]]; then | 
					
						
							|  |  |  |     # The sed expression confuses ShellCheck | 
					
						
							|  |  |  |     # shellcheck disable=SC2016 | 
					
						
							|  |  |  |     assets="$(sort "$assetfile" | sed -ne 'H;${x;s/\n//;s/\n/, /g;p}')" | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |     assets= | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Report the settings in debug mode | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | _DEBUG "Show number = $show" \ | 
					
						
							|  |  |  |        "Host name   = $host" \ | 
					
						
							|  |  |  |        "Host ID     = $hostid" \ | 
					
						
							|  |  |  |        "Host email  = $email" \ | 
					
						
							|  |  |  |        "Assets      = $assets" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Handle backticks in the host string (Rho`n/Roan made me do it!) | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | if grep -q -E '`' <<<"$host"; then | 
					
						
							|  |  |  |     # shellcheck disable=SC2001 disable=SC2016 | 
					
						
							|  |  |  |     host=$(sed -e 's/^\([0-9A-Za-z_`-]\+\)$/`\1`/' <<<"$host") | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Generate the message we want to send | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # shellcheck disable=SC2016 | 
					
						
							|  |  |  | printf -v message 'Processed %s from %s`%s`%s. Format is *%s*.' \ | 
					
						
							|  |  |  |     "$show" "$newhost" "$host" "$email" "$format" | 
					
						
							|  |  |  | if [[ -n $assets ]]; then | 
					
						
							|  |  |  |     # We have assets but were they sent? | 
					
						
							|  |  |  |     if grep -q -E '^assets' "$statusfile"; then | 
					
						
							|  |  |  |         message+=" Assets uploaded" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         _silent "${yellow}Note: assets were found but not uploaded${reset}" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Send it, after checking | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | echo "Will run the following command:" | 
					
						
							|  |  |  | echo "${green}matrix-commander -z -m '$message'${reset}" | 
					
						
							|  |  |  | if yes_no 'OK to proceed? %s ' 'No'; then | 
					
						
							|  |  |  |     command="matrix-commander -z -m '$message'" | 
					
						
							|  |  |  |     eval "$command" || \ | 
					
						
							|  |  |  |         { echo "Failed to invoke the command!"; exit 1; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # Change state/log what we did, but only if we actually did it | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     echo "reported" >> "$statusfile" || \ | 
					
						
							|  |  |  |         { echo "Failed to update $statusfile"; exit 1; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21:fdm=marker |