forked from HPR/hpr-tools
		
	Moved project directories and files to an empty local repo
This commit is contained in:
		
							
								
								
									
										306
									
								
								Show_Submission/check_reservations
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										306
									
								
								Show_Submission/check_reservations
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| #!/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 <<EOD; | ||||
| $PROG v$VERSION | ||||
|  | ||||
| Usage: $PROG [options] | ||||
|  | ||||
| Scans the HPR database table 'reservations' and reports what new shows are | ||||
| indicated there and what state they are in. | ||||
|  | ||||
| Options: | ||||
|  | ||||
|     -help               Display this information | ||||
|     -config=FILE        This option allows an alternative configuration file | ||||
|                         to be used. This file defines the location of the | ||||
|                         database, its port, its name and the username and | ||||
|                         password to be used to access it. This feature was | ||||
|                         added to allow the script to access alternative | ||||
|                         databases or the live database over an SSH tunnel. | ||||
|  | ||||
|                         If the option is omitted the default file is used: | ||||
|                         .hpr_db.cfg | ||||
|  | ||||
| EOD | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| #===  FUNCTION  ================================================================ | ||||
| #         NAME: Options | ||||
| #      PURPOSE: Processes command-line options | ||||
| #   PARAMETERS: $optref     Hash reference to hold the options | ||||
| #      RETURNS: Undef | ||||
| #  DESCRIPTION: | ||||
| #       THROWS: no exceptions | ||||
| #     COMMENTS: none | ||||
| #     SEE ALSO: n/a | ||||
| #=============================================================================== | ||||
| sub Options { | ||||
|     my ($optref) = @_; | ||||
|  | ||||
|     my @options = ( "help", "config=s", ); | ||||
|  | ||||
|     Usage() if ( !GetOptions( $optref, @options ) ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| # vim: syntax=perl:ts=8:sw=4:et:ai:tw=100:fo=tcrqn21:fdm=marker | ||||
|  | ||||
		Reference in New Issue
	
	Block a user