#!/bin/bash - #=============================================================================== # # FILE: do_upload # # USAGE: ./do_upload [files...] # # DESCRIPTION: Uploads the processed HTML back to the HPR server. Also # capable of uploading supplementary files such as a missed # audio file, pictures, etc. # # There are two main types of uploads: # 1) Extracted and edited show notes to go back to the server as # HTML. Possiblly altered 'shotnotes.txt' as a means of # fixing errors in the title, summary or tags. # 2) Assets collected by 'parse_JSON' and possibly changed by # 'do_pictures' if there are pictures provided and referenced # in the notes. Any archives will have had files extracted so # that there is much less to do on the server. # # Assets are sent to a directory under '~hpr/www/eps/' named # 'hprNNNN'. This is created here and files copied with 'rsync'. # There is a local directory in the show directory which is # called 'uploads'. Unless the host has provided archives to be # downloaded with their show we will not send such files to the # server. We ask that such files be enclosed in an archive when # sent - so we never extract the archives we have extracted from # the sent archives! # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: 2021-03-15: Added code to place the "assets" in the final # directory on the server. This will be 'www/eps/hprNNNN/'. # AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com # VERSION: 0.1.2 # CREATED: 2017-03-06 19:11:51 # REVISION: 2023-06-14 23:12:04 # #=============================================================================== set -o nounset # Treat unset variables as an error SCRIPT=${0##*/} # DIR=${0%/*} VERSION="0.1.2" STDOUT="/dev/fd/2" # # Load library functions # LIB="$HOME/bin/function_lib.sh" [ -e "$LIB" ] || { echo "$SCRIPT: ${red}Unable to source functions${reset}"; exit 1; } # shellcheck source=/home/cendjm/bin/function_lib.sh source "$LIB" # # Colour codes # define_colours # {{{ --- Functions: usage, dryrun --- #=== FUNCTION ================================================================ # NAME: _usage # DESCRIPTION: Report usage # PARAMETERS: None # RETURNS: Nothing #=============================================================================== _usage () { cat >$STDOUT <<-endusage Usage: ./${SCRIPT} [-h] [-a] [-d] [-D] shownumber [file1 file2...] Version: $VERSION Uploads the processed HTML back to the HPR server. Also capable of uploading supplementary files such as a missed audio file. Options: -h Print this help -a Send any assets to the show sub-directory on the HPR server -d Select dry run mode -D Select debug mode (works the same; more output) Arguments: shownumber list of files to be uploaded in addition Examples ./${SCRIPT} -h ./${SCRIPT} -d 3099 ./${SCRIPT} -d 3123 otherfile1.txt otherfile2.dat endusage exit } #=== FUNCTION ================================================================ # NAME: _dryrun # DESCRIPTION: Output a dry run message # PARAMETERS: List of messages # RETURNS: Nothing #=============================================================================== _dryrun () { for msg in "$@"; do printf 'Dry run: %s\n' "$msg" done } #=== FUNCTION ================================================================ # NAME: trimpath # DESCRIPTION: Trim a file path to its last few components for display # PARAMETERS: $1 - path to trim # $2 - number of elements to retain # RETURNS: Trimmed path #=============================================================================== # trimpath () { # local path=${1:?Usage: mpath path elements} # local elements=${2:?Usage: mpath path elements} # local -a arr1 arr2 # # # Split the path # # IFS='/' arr1=($path) # IFS='/' mapfile -d'/' -t arr1 <<<"$path" # # if [[ ${#arr1[@]} -gt $elements ]]; then # # Put the last elements in another array # # arr2=(${arr1[@]: -$elements}) # mapfile -t arr2 < <(printf '%s\n' "${arr1[@]: -$elements}") # # # return the second array interleaved with '/' # echo "${arr2[*]/#/}" # else # echo "$path" # fi # } # }}} #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # Option defaults # ASSETUPLOAD=0 DEBUG=0 DRYRUN=0 # # Process options # while getopts :ahdD opt do case "${opt}" in a) ASSETUPLOAD=1;; h) _usage;; d) DRYRUN=1;; D) DEBUG=1;; ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;; esac done shift $((OPTIND - 1)) # # Check there's at least one argument after removing any options. Abort if not # if [[ $# -eq 0 ]]; then echo "Missing argument(s)" _usage fi # # Paths to files # # 2021-02-12 Not using the .format file any more BASEDIR="$HOME/HPR/Show_Submission" LOCAL_UPLOAD="$BASEDIR/upload" SHOWDIR="$BASEDIR/shownotes/hpr${1}" FROM="$SHOWDIR/hpr${1}.html" # FORMAT="$SHOWDIR/.format" ORIGIN="$SHOWDIR/.origin" UPLOADED="$SHOWDIR/.uploaded" STATUSFILE="$SHOWDIR/.status" # If there are HTML errors REPORT="$SHOWDIR/errors.txt" # For differences # 2021-02-12 $RE removed since we find differences for all formats RAWNOTES="$SHOWDIR/hpr${1}.orig" PROCESSED="$SHOWDIR/hpr${1}.out" # RE='plain_text|markdown_standard|Markdown_GitHub|Markdown_Pandoc|restructured_text|txt2tags' DIFFFILE="$SHOWDIR/hpr${1}.diff" # PORT=22074 PORT=22 # # Asset locations for upload # # If there are supplementary files # SUPPDIR="$SHOWDIR/hpr${1}" TARFILE="$SHOWDIR/hpr${1}.tgz" PICLIST="$SHOWDIR/.pictures" ASSETLIST="$SHOWDIR/.assets" # Where any "assets" (pictures, scripts, etc) come from and will go on the server LOCAL_ASSETDIR="$SHOWDIR/uploads" REMOTE_ASSETDIR="www/eps/hpr${1}" CMDTPL='ssh hpr@hackerpublicradio.org -p %d %s' # Use to build the rsync command, assuming the tunnel is open: # rsync -a -e 'ssh -p 22' $SHOWDIR/hpr3656/ hpr@hpr:www/eps/hpr3656/ # RSYNCTPL="rsync -a -e 'ssh -p %d' %s hpr@hpr:www/eps/%s" # Did the following by hand for uploading # ssh -p $PORT hpr@hpr 'mkdir ~/www/eps/hpr3685' # scp -P $PORT shownotes/hpr3685/Budget_sample_2022-9-9.ods hpr@hpr:www/eps/hpr3685/ EXTRA=0 # # Is there a marker to indicate the show has already been uploaded? This # isn't an error, but a warning is in order. # if [[ -e $UPLOADED ]]; then echo "$SCRIPT: ${yellow}Warning - the notes have already been uploaded${reset}" fi # # Check we actually have a file to upload # if [[ ! -e $FROM ]]; then echo "$SCRIPT: ${red}File not found: ${FROM}${reset}" exit 1 fi # # If there's an error report then add it to the list of supplementary files # (which may be none) # if [[ -e $REPORT ]]; then _DEBUG "Error report being added" set -- "$@" "${REPORT##*/}" fi # # Deal with the raw notes extracted by 'parse_shownotes' and saved in # hprXXXX.orig and the edited notes in hprXXXX.out # # 2021-02-12 Now using the same code for all formats # # if [[ -e $RAWNOTES && -e $PROCESSED ]]; then # FMT="$(cat "$FORMAT")" # if [[ $FMT =~ $RE ]]; then # diff "$RAWNOTES" "$PROCESSED" > "$DIFFFILE" # if [[ -s $DIFFFILE ]]; then # set -- "$@" "${DIFFFILE##*/}" # else # echo "$SCRIPT: ${red}No differences found${reset}" # fi # fi # fi if [[ -e $RAWNOTES && -e $PROCESSED ]]; then _DEBUG "Differences being determined:" "$RAWNOTES vs $PROCESSED" diff "$RAWNOTES" "$PROCESSED" > "$DIFFFILE" if [[ -s $DIFFFILE ]]; then _DEBUG "Differences found" set -- "$@" "${DIFFFILE##*/}" else _DEBUG "Differences file is empty" echo "$SCRIPT: ${red}No differences found${reset}" fi fi # # If there's a picture list and a tarfile has been made add the latter to the # upload list # TODO: Not needed in next iteration # if [[ -e $PICLIST && -e $TARFILE ]]; then _DEBUG "Tar file being added" set -- "$@" "${TARFILE##*/}" fi # # Check any supplementary files in the argument list (added by the user or # this script) # if [[ $# -gt 1 ]]; then EXTRA=1 shift # Delete argument 1, the show number for arg; do if [[ ! -e "$SHOWDIR/$arg" ]]; then echo "$SCRIPT: ${red}File missing: $SHOWDIR/$arg${reset}" echo "Can't continue" exit 1 fi done echo "$SCRIPT: ${blue}Number of supplementary files to upload: $#${reset}" fi # # Check we have a record of where the files are to go # if [[ ! -e $ORIGIN ]]; then echo "$SCRIPT: ${red}Unable to find the .origin file${reset}" echo "(This holds the directory on the server where the files are to be sent)" exit fi # # Check there's a local copy of the upload directory. If not, then the rsync # run has deleted it because the directory on the server has been deleted. # This implies the show has been processed on the server. # upload_dir="$(cat "$ORIGIN")" _DEBUG "upload_dir = $upload_dir" if [[ ! -e "$LOCAL_UPLOAD/$upload_dir" ]]; then echo "$SCRIPT: ${red}The upload directory seems to have been deleted${reset}" echo "(This happens after the show is processed on the server)" exit fi # # Upload the processed show notes # if [[ $DRYRUN -eq 0 ]]; then echo "Copying $FROM to upload/$upload_dir/shownotes.html on the HPR server" scp -P $PORT "$FROM" "hpr@hackerpublicradio.org:upload/$upload_dir/shownotes.html" RES=$? if [[ $RES -eq 0 ]]; then echo "$SCRIPT: ${green}Uploaded successfully${reset}" touch "$UPLOADED" else echo "$SCRIPT: ${red}Oops! Something went wrong!${reset}" echo "$SCRIPT: Aborting now" exit 1 fi else _dryrun "would have copied $FROM to the server" fi # # Handle supplementary files if there are any. The remaining arguments are # these file names without any path information. Variable 'EXTRA' is # true/false if there are/are not extra arguments. If there are we have # already deleted the first argument and we've checked the existence of the # file(s). # if [[ $EXTRA -eq 1 ]]; then _DEBUG "Uploading supplementary files" for arg; do FROM="$SHOWDIR/$arg" if [[ $DRYRUN -eq 0 ]]; then echo "Copying $FROM to upload/$upload_dir/$arg on the HPR server" scp -P $PORT "$FROM" "hpr@hackerpublicradio.org:upload/$upload_dir/$arg" RES=$? if [[ $RES -eq 0 ]]; then echo "$SCRIPT: ${green}Uploaded ${arg} successfully${reset}" else echo "$SCRIPT: ${red}Oops! Something went wrong with ${arg}!${reset}" echo "$SCRIPT: Aborting now" exit 1 fi else _dryrun "would have copied $FROM to the server" fi done fi # # Update the status file # if [[ $DRYRUN -eq 0 ]]; then echo "uploaded" >> "$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