123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #!/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();
- }
|