#!/usr/bin/env perl #=============================================================================== # # FILE: check_reservations # # USAGE: ./check_reservations # # DESCRIPTION: Interrogate the 'reservations' table in the live HPR database # through an SSH tunnel. The result is used to look at and # report the state of processing on the local system. # # The original version of this script ran a remote command on # the VPS, but was very vulnerable to VPS and tunnel failure. # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com # VERSION: 0.0.8 # CREATED: 2019-01-07 12:29:06 # REVISION: 2023-07-01 23:04:16 # #=============================================================================== use strict; use warnings; use utf8; use feature qw{ postderef say signatures state }; no warnings qw{ experimental::postderef experimental::signatures }; use Carp; use Getopt::Long; use Config::General; use DBI; # # Version number (manually incremented) # our $VERSION = '0.0.8'; # # Script and directory names # ( my $PROG = $0 ) =~ s|.*/||mx; ( my $DIR = $0 ) =~ s|/?[^/]*$||mx; $DIR = '.' unless $DIR; #------------------------------------------------------------------------------- # Declarations #------------------------------------------------------------------------------- # # Constants and other declarations # my $basedir = "$ENV{HOME}/HPR/Show_Submission"; my $cache = "$basedir/shownotes"; my $configfile = "$basedir/.hpr_db.cfg"; my $reserved = '9999'; my ( $dbh, $sth1, $h1 ); my ( $show, @res); my $count = 0; # # Interpretations of the new status values in the database # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # The sequence seems to be: # 1. User selects a free slot (request.php), status becomes # REQUEST_UNVERIFIED, verified is 0, no email address recorded yet, IP # address recorded # 2. User enters the email address to receive the link to the form and presses # 'Next'. An email is sent with the link and status changes to # REQUEST_EMAIL_SENT, now the email address is filled out but verified # is 0 still. # 3. User clicks the link in the email they received which takes them to the # form, now the state becomes EMAIL_LINK_CLICKED and verified is 1. We see # this as 'pending', the first status we take account of since we exclude # all records in the 'reservations' table where verified is 0. # 4. The user completes the form and hits the 'Send' button. When all files # have been uploaded the status changes to SHOW_SUBMITTED. # # 2022-04-07 New values added: # # 5. METADATA_PROCESSED signals that the processing of notes and related # things is complete # 6. MEDIA_TRANSCODED indicates that Ken has done the transcoding and posted # the show. # 7. UPLOADED_TO_IA indicates that the IA upload has been done (by me usually) # 8. UPLOADED_TO_RSYNC_NET final step shows that the files (audio & assets) # have been archived/backed up # # 2023-07-02 New value added for reserve shows # # 9. RESERVE_SHOW_SUBMITTED indication that a reserve show has been uploaded # and stashed away ready for adding to a slot at a later time. # # I don't think there's a way of knowing what has happened between # EMAIL_LINK_CLICKED and SHOW_SUBMITTED. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # my %status = ( REQUEST_UNVERIFIED => 'unverified', # shouldn't be returned REQUEST_EMAIL_SENT => 'email sent', # been sent the email with a link EMAIL_LINK_CLICKED => 'pending', # filling in the form/sending the show RESERVE_SHOW_SUBMITTED => 'reserved show', # reserve show received SHOW_SUBMITTED => 'uploaded', # all done METADATA_PROCESSED => 'metadata processed', # notes processed, etc SHOW_POSTED => 'in the database', # awaiting audio transcoding MEDIA_TRANSCODED => 'transcoded', # audio transcoded UPLOADED_TO_IA => 'uploaded to IA', # uploaded to IA UPLOADED_TO_RSYNC_NET => 'archived', # archived on rsync.net ); # # Enable Unicode mode # binmode STDOUT, ":encoding(UTF-8)"; binmode STDERR, ":encoding(UTF-8)"; #------------------------------------------------------------------------------- # Options and arguments #------------------------------------------------------------------------------- # # Process options # my %options; Options( \%options ); # # Default help # Usage() if ( $options{'help'} ); # # Collect options # my $cfgfile = ( defined( $options{config} ) ? $options{config} : $configfile ); # # Sanity checks # die "Unable to find $cfgfile\n" unless ( -e $cfgfile ); #------------------------------------------------------------------------------- # Configuration file - load data #------------------------------------------------------------------------------- my $conf = Config::General->new( -ConfigFile => $cfgfile, -InterPolateVars => 1, -ExtendedAccess => 1, ); my %config = $conf->getall(); #------------------------------------------------------------------------------- # Connect to the database #------------------------------------------------------------------------------- my $dbhost = $config{database}->{host} // '127.0.0.1'; my $dbport = $config{database}->{port} // 3306; my $dbname = $config{database}->{name}; my $dbuser = $config{database}->{user}; my $dbpwd = $config{database}->{password}; $dbh = DBI->connect( "dbi:mysql:host=$dbhost;port=$dbport;database=$dbname", $dbuser, $dbpwd, { AutoCommit => 1 } ) or croak $DBI::errstr; # # Enable client-side UTF8 # $dbh->{mysql_enable_utf8} = 1; # # Set the local timezone to UTC for this connection # $dbh->do("set time_zone = '+00:00'") or carp $dbh->errstr; # # Query the reservations table for shows which are more or less kosher. # 2023-07-01 the episode number 9999 is currently a marker that the show is # for the reserve queue, so we omit it # $sth1 = $dbh->prepare( q{SELECT * FROM reservations WHERE ep_num > 0 ORDER BY timestamp}); $sth1->execute(); if ( $dbh->err ) { carp $dbh->errstr; } # # Collect details of all the verified reservations found, with an # interpretation of their state and the email of the sender. For each show # look at its local state and report it. # while ( $h1 = $sth1->fetchrow_hashref() ) { $show = $h1->{ep_num}; if ($show == $reserved) { push(@res,$h1); next; } $count++; my @atts; push( @atts, "+dir" ) if ( -e "$cache/hpr${show}" ); push( @atts, "+shownotes" ) if ( -s "$cache/hpr${show}/shownotes.txt" ); push( @atts, "+processed" ) if ( -e "$cache/hpr${show}/hpr${show}.html" ); push( @atts, "+uploaded" ) if ( -e "$cache/hpr${show}/.uploaded" ); printf "[%02d] %04d: %-18s (%s) %s\n", $count, $show, ( exists( $status{ $h1->{status} } ) ? $status{ $h1->{status} } : 'unknown' ), $h1->{email}, join( "; ", @atts ); } # # If for some reason there aren't any reservations tell the caller # say "No show reservations" if ( $count == 0 ); if (@res) { say " "; say "Reserve queue entries"; $count = 0; for my $r (@res) { $count++; printf "[%02d] %-24s %s (%s)\n", $count, ( exists( $status{ $r->{status} } ) ? $status{ $r->{status} } : 'unknown' ), $r->{timestamp}, $r->{email}; } } exit; #=== FUNCTION ================================================================ # NAME: Usage # PURPOSE: Display a usage message and exit # PARAMETERS: None # RETURNS: To command line level with exit value 1 # DESCRIPTION: Builds the usage message using global values # THROWS: no exceptions # COMMENTS: none # SEE ALSO: n/a #=============================================================================== sub Usage { print STDERR <