gsgd 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Log::Log4perl qw(:easy);
  5. use Getopt::Long qw(GetOptions);
  6. my $log_file = "gsgd.log";
  7. sub get_log_name { return $log_file; };
  8. my $log_conf = q(
  9. log4perl.rootLogger = INFO, LOG1, screen
  10. log4perl.appender.LOG1 = Log::Log4perl::Appender::File
  11. log4perl.appender.LOG1.filename = sub { get_log_name(); }
  12. log4perl.appender.LOG1.mode = append
  13. log4perl.appender.LOG1.layout = Log::Log4perl::Layout::PatternLayout
  14. log4perl.appender.LOG1.layout.ConversionPattern = %d %p >> %m %n
  15. log4perl.appender.screen = Log::Log4perl::Appender::Screen
  16. log4perl.appender.screen.stderr = 0
  17. log4perl.appender.screen.layout = PatternLayout
  18. log4perl.appender.screen.layout.ConversionPattern = %d %p >> %m %n
  19. );
  20. Log::Log4perl::init(\$log_conf);
  21. my $logger = get_logger();
  22. my %args;
  23. GetOptions(
  24. \%args,
  25. 'gsg-cmd=s',
  26. 'comms-file=s'
  27. );
  28. my $comm_file = "talk.gsgd";
  29. my $LOCK_FILE = "lock.gsgd";
  30. my $regen_cmd;
  31. sub process_args() {
  32. if ( ! defined $args{'gsg-cmd'} || $args{'gsg-cmd'} eq "" ) {
  33. $logger->error("Must pass --gsg-cmd");
  34. exit 1;
  35. }
  36. $regen_cmd = $args{'gsg-cmd'};
  37. if ( defined $args{'comms-file'} ) {
  38. if ( ! -f $args{'comms-file'} ) {
  39. $logger->error("$args{'comms-file'} doesn't look like a regular file");
  40. exit 1;
  41. }
  42. if ( ! -w $args{'comms-file'} ) {
  43. $logger->error("$0 doesn't appear to have permission to write to $args{'comms-file'}");
  44. exit 1;
  45. }
  46. $comm_file = $args{'comms-file'};
  47. }
  48. }
  49. process_args();
  50. sub create_lock() {
  51. $logger->debug("Creating lock file while operating");
  52. open(my $fh, ">", $LOCK_FILE) or die $logger->error("Couldn't create $LOCK_FILE");
  53. print $fh "";
  54. close $fh;
  55. }
  56. sub remove_lock() {
  57. $logger->debug("Removing lock file, not operating");
  58. unlink($LOCK_FILE) or die $logger->error("Couldn't unlink $LOCK_FILE");
  59. }
  60. sub check_lock() {
  61. if ( -f $LOCK_FILE ) {
  62. $logger->info("Found lock file");
  63. sleeper(5);
  64. if ( -f $LOCK_FILE ) {
  65. die $logger->error("$LOCK_FILE still exists even after waiting, why?");
  66. }
  67. }
  68. }
  69. sub remove_instruction($) {
  70. my $instruction_to_remove = shift;
  71. $logger->debug("Removing $instruction_to_remove instruction");
  72. $logger->debug("Opening $comm_file for writing");
  73. open(my $fh, ">", $comm_file);
  74. my @lines = $fh;
  75. foreach my $line ( @lines ) {
  76. # This is bad TODO
  77. print $fh "$line\n" unless ( $line =~ m/$instruction_to_remove/ || $line =~ m/GLOB/);
  78. }
  79. $logger->debug("Closing $comm_file");
  80. close $fh;
  81. }
  82. sub regen() {
  83. $logger->info("Regening site");
  84. system("$regen_cmd") == 0
  85. or die $logger->error("Failed to exec $regen_cmd !");
  86. check_lock();
  87. create_lock();
  88. remove_instruction("Regen");
  89. remove_lock();
  90. }
  91. sub gsgd_exit() {
  92. check_lock();
  93. create_lock();
  94. remove_instruction("Exit");
  95. remove_lock();
  96. exit 0;
  97. }
  98. sub sleeper($) {
  99. my $sleep_time = shift;
  100. $logger->debug("Sleeping $sleep_time seconds");
  101. sleep $sleep_time;
  102. }
  103. sub open_comms() {
  104. $logger->debug("Opening $comm_file for reading");
  105. open(my $fh, "<", $comm_file) or die $logger->error("Could not open $comm_file for reading");
  106. my @instructions = <$fh>;
  107. $logger->debug("Closing $comm_file");
  108. close $fh;
  109. foreach my $line ( @instructions ) {
  110. chomp $line;
  111. if ( $line =~ m/^Regen$/ ) {
  112. $logger->info("Got $line instruction");
  113. regen();
  114. } elsif ( $line =~ m/^Exit$/ ) {
  115. $logger->info("Got $line instruction");
  116. gsgd_exit();
  117. } else {
  118. $logger->error("Unrecognized instruction $line");
  119. }
  120. }
  121. }
  122. $logger->info("Starting");
  123. while() {
  124. sleeper(1);
  125. open_comms();
  126. }