https://git.spwbk.site/swatson/gsgd/raw/master/gsgd
___________________________________
#!/usr/bin/perl

use strict;
use warnings;
use Log::Log4perl qw(:easy);
use Getopt::Long qw(GetOptions);

my $log_file = "gsgd.log";
sub get_log_name { return $log_file; };
my $log_conf = q(
       log4perl.rootLogger              = INFO, LOG1, screen
       log4perl.appender.LOG1           = Log::Log4perl::Appender::File
       log4perl.appender.LOG1.filename  = sub { get_log_name(); }
       log4perl.appender.LOG1.mode      = append
       log4perl.appender.LOG1.layout    = Log::Log4perl::Layout::PatternLayout
       log4perl.appender.LOG1.layout.ConversionPattern = %d %p >> %m %n

       log4perl.appender.screen = Log::Log4perl::Appender::Screen
       log4perl.appender.screen.stderr = 0
       log4perl.appender.screen.layout = PatternLayout
       log4perl.appender.screen.layout.ConversionPattern = %d %p >> %m %n
);

Log::Log4perl::init(\$log_conf);
my $logger = get_logger();

my %args;
GetOptions(
       \%args,
       'gsg-cmd=s',
       'comms-file=s'
);

my $comm_file = "talk.gsgd";
my $LOCK_FILE = "lock.gsgd";
my $regen_cmd;

sub process_args() {

       if ( ! defined $args{'gsg-cmd'} || $args{'gsg-cmd'} eq "" ) {
               $logger->error("Must pass --gsg-cmd");
               exit 1;
       }

       $regen_cmd = $args{'gsg-cmd'};

       if ( defined $args{'comms-file'} ) {
               if ( ! -f $args{'comms-file'} ) {
                       $logger->error("$args{'comms-file'} doesn't look like a regular file");
                       exit 1;
               }

               if ( ! -w $args{'comms-file'} ) {
                       $logger->error("$0 doesn't appear to have permission to write to $args{'comms-file'}");
                       exit 1;
               }

               $comm_file = $args{'comms-file'};
       }

}

process_args();

sub create_lock() {

       $logger->debug("Creating lock file while operating");
       open(my $fh, ">", $LOCK_FILE) or die $logger->error("Couldn't create $LOCK_FILE");
       print $fh "";
       close $fh;

}

sub remove_lock() {

       $logger->debug("Removing lock file, not operating");
       unlink($LOCK_FILE) or die $logger->error("Couldn't unlink $LOCK_FILE");

}

sub check_lock() {

       if ( -f $LOCK_FILE ) {
               $logger->info("Found lock file");
               sleeper(5);
               if ( -f $LOCK_FILE ) {
                       die $logger->error("$LOCK_FILE still exists even after waiting, why?");
               }
       }

}


sub remove_instruction($) {

       my $instruction_to_remove = shift;

       $logger->debug("Removing $instruction_to_remove instruction");
       $logger->debug("Opening $comm_file for writing");
       open(my $fh, ">", $comm_file);
       my @lines = $fh;
       foreach my $line ( @lines ) {
               # This is bad TODO
               print $fh "$line\n" unless ( $line =~ m/$instruction_to_remove/ || $line =~ m/GLOB/);
       }
       $logger->debug("Closing $comm_file");
       close $fh;

}

sub regen() {

       $logger->info("Regening site");
       system("$regen_cmd") == 0
               or die $logger->error("Failed to exec $regen_cmd !");
       check_lock();
       create_lock();
       remove_instruction("Regen");
       remove_lock();

}

sub gsgd_exit() {

       check_lock();
       create_lock();
       remove_instruction("Exit");
       remove_lock();
       exit 0;

}

sub sleeper($) {

       my $sleep_time = shift;
       $logger->debug("Sleeping $sleep_time seconds");
       sleep $sleep_time;

}

sub open_comms() {

       $logger->debug("Opening $comm_file for reading");
       open(my $fh, "<", $comm_file) or die $logger->error("Could not open $comm_file for reading");
       my @instructions = <$fh>;
       $logger->debug("Closing $comm_file");
       close $fh;

       foreach my $line ( @instructions ) {
               chomp $line;
               if ( $line =~ m/^Regen$/ ) {
                       $logger->info("Got $line instruction");
                       regen();
               } elsif ( $line =~ m/^Exit$/ ) {
                       $logger->info("Got $line instruction");
                       gsgd_exit();
               } else {
                       $logger->error("Unrecognized instruction $line");
               }
       }

}

$logger->info("Starting");
while() {

       sleeper(1);
       open_comms();

}