bin/heat: +log
[nethome.git] / bin / heat
index a3ac277..4748edc 100755 (executable)
--- a/bin/heat
+++ b/bin/heat
@@ -2,6 +2,12 @@
 # * * * * * nice -n20 /root/bin/heat -s
 use strict;
 use warnings;
+my $schedulefile="/root/heat.schedule";
+my $statefile="/root/heat.state";
+my $resetfile="/root/heat.reset";
+my $usbrelay="/root/bin/usbrelay";
+my $logfile="/var/log/heat.log";
+require POSIX;
 $|=1;
 sub readfile($) {
   my($fname)=@_;
@@ -15,13 +21,18 @@ sub readfile($) {
   close F or die "read-close $fname: $!";
   return $F;
 }
-sub writefile {
-  my($fname,$content)=@_;
+sub writefile($$;$) {
+  my($fname,$content,$mode)=@_;
   local *F;
-  open F,">$fname" or die "$fname: $!";
+  open F,($mode||">").$fname or die "$fname: $!";
   print F $content or die "write $fname: $!";
   close F or die "write-close $fname: $!";
 }
+sub logmsg($) {
+  my($s)=@_;
+  chomp $s;
+  writefile $logfile,POSIX::strftime("%Y-%m-%dT%H:%M:%S",localtime)." $s\n",">>";
+}
 sub spawn($) {
   my($cmd)=@_;
   $cmd.=" >&2";
@@ -35,10 +46,6 @@ if (($ARGV[0]||"")=~/^[@]0?(\d+):0?(\d+)$/) {
   $minutes=$1*60+$2;
   shift;
 }
-my $schedulefile="/root/heat.schedule";
-my $statefile="/root/heat.state";
-my $resetfile="/root/heat.reset";
-my $usbrelay="/root/bin/usbrelay";
 my $schedule=readfile $schedulefile;
 my $finishline;
 my %schedule;
@@ -70,6 +77,7 @@ sub schedulenext($) {
 }
 $finishline=schedulenext $minutes;
 my $silent=shift if ($ARGV[0]||"") eq "-s";
+logmsg "command: ".join(" ",@ARGV) if !$silent&&@ARGV;
 sub info($) {
   my($s)=@_;
   print $s if !$silent;
@@ -85,12 +93,14 @@ sub resetread() {
   $resetminutes=$1*60+$2;
   $resetstate=($3 eq "reset"?undef:$3);
 }
+sub unlink_resetfile() {
+  unlink $resetfile or die "$resetfile: $!";
+  logmsg "remove reset: $reset";
+  $reset=$resetminutes=undef;
+}
 if (defined $reset) {
   resetread;
-  if ($resetminutes==$minutes) {
-    unlink $resetfile or die "$resetfile: $!";
-    $reset=$resetminutes=undef;
-  }
+  unlink_resetfile if $resetminutes==$minutes;
 }
 sub finishlinereset() {
   $finishline=schedulenext $resetminutes;
@@ -101,7 +111,10 @@ my $state=readfile $statefile;
 chomp $state;
 info $state;
 my $newstate=shift;
-$newstate=$resetstate if !defined $newstate&&defined $resetstate&&!defined $resetminutes;
+if (!defined $newstate&&defined $resetstate&&!defined $resetminutes) {
+  $newstate=$resetstate;
+  logmsg "reset: $newstate";
+}
 sub printminutes($) {
   my($m)=@_;
   return sprintf "%02d:%02d",int($m/60),$m%60;
@@ -109,7 +122,10 @@ sub printminutes($) {
 if ($silent) {
   if (!defined $newstate&&!defined $reset) {
     my $prev=schedulenext($minutes)->[0];
-    $newstate=$prev if $prev=~s{^@[ printminutes $minutes ] (.)\n$}{$1} or $prev=undef;
+    if ($prev=~m{^@[ printminutes $minutes ] (.)\n$}) {
+      $newstate=$1;
+      logmsg "scheduled: $prev";
+    }
   }
   $newstate=$state if !defined $newstate;
 }
@@ -127,13 +143,14 @@ sub setstate() {
   or do { unlink $statefile; die "usbrelay error"; };
   $state eq $newstate or writefile $statefile,"$newstate\n";
   info "\n";
+  logmsg "$state->$newstate" if $state ne $newstate;
 }
 my $newreset=shift;
 die "Excessive args: ".join(" ",@ARGV) if @ARGV;
 if (!defined $newreset) {
   setstate;
   if (!$silent&&defined $reset) {
-    unlink $resetfile or die "$resetfile: $!";
+    unlink_resetfile;
     $finishline=schedulenext $minutes;
   }
   finish;
@@ -144,10 +161,12 @@ if ($reset=~/^\d+$/) {
   $reset=printminutes($resetminutes)." reset\n";
   setstate;
 } else {
-  $reset.=" $newstate\n";
+  $reset.=" reset\n";
   resetread;
+  $reset=printminutes($resetminutes)." $newstate\n";
   info "\n";
 }
 writefile $resetfile,$reset;
+logmsg "new reset: $reset";
 finishlinereset;
 finish;