bin/heat: 24h wrapping
[nethome.git] / bin / heat
index f30ffe1..bab4730 100755 (executable)
--- a/bin/heat
+++ b/bin/heat
@@ -36,9 +36,7 @@ sub logmsg($) {
 sub spawn($) {
   my($cmd)=@_;
   $cmd.=" >&2";
-  system $cmd or return 1;
-  warn "$cmd: $!";
-  return 0;
+  system $cmd and die "$cmd: $!";
 }
 my($trash,$min,$hour)=localtime;
 my $minutes=$hour*60+$min;
@@ -80,7 +78,7 @@ sub schedulenext($) {
   die "No bestnext" if !defined $bestnext;
   return [$prev,$next];
 }
-$finishline=schedulenext $minutes;
+$finishline=[schedulenext($minutes)->[1]];
 my $silent=shift if ($ARGV[0]||"") eq "-s";
 logmsg "command: ".join(" ",@ARGV) if !$silent&&@ARGV;
 sub info($) {
@@ -94,7 +92,7 @@ sub finish() {
 my $reset=readfile $resetfile if -e $resetfile;
 my($resetminutes,$resetstate);
 sub resetread() {
-  $reset=~/^0?(\d+):0?(\d+) ([01s]|reset)\n$/ or warn "Invalid $resetfile: $reset";
+  $reset=~/^0?(\d+)[:.]0?(\d+) ([01s]|reset)\n$/ or warn "Invalid $resetfile: $reset";
   $resetminutes=$1*60+$2;
   $resetstate=($3 eq "reset"?undef:$3);
 }
@@ -110,7 +108,7 @@ if (defined $reset) {
 sub finishlinereset() {
   $finishline=schedulenext $resetminutes;
   if ($finishline) {
-    splice @$finishline,1,0,$reset;
+    $finishline=[$reset,$finishline->[1]];
   } else {
     $finishline=[$reset];
   }
@@ -145,14 +143,16 @@ if (!defined $newstate) {
 die "state!={s|0|1}" if $newstate!~/^[s01]$/;
 sub setstate() {
   info "->$newstate";
+  writefile $statefile,"$newstate\n" if $state ne $newstate;
+  logmsg "$state->$newstate" if $state ne $newstate;
+  if ($newstate ne "s") {
+    my $pid=readfile "pidof -x dnf;true|";
+    die "\nchange refused: dnf running: $pid" if $pid;
+  }
   my $both={"s"=>[0,0],"0"=>[1,0],"1"=>[1,1]}->{$newstate};
-  $state eq $newstate or unlink $statefile or warn "$statefile: $!";
-  (    spawn "$usbrelay 1 ".$both->[0]
-   and spawn "$usbrelay 2 ".$both->[1])
-  or do { unlink $statefile; die "usbrelay error"; };
-  $state eq $newstate or writefile $statefile,"$newstate\n";
+  spawn "$usbrelay 1 ".$both->[0];
+  spawn "$usbrelay 2 ".$both->[1];
   info "\n";
-  logmsg "$state->$newstate" if $state ne $newstate;
 }
 my $newreset=shift;
 die "Excessive args: ".join(" ",@ARGV) if @ARGV;
@@ -160,13 +160,13 @@ if (!defined $newreset) {
   setstate;
   if (!$silent&&defined $reset) {
     unlink_resetfile;
-    $finishline=schedulenext $minutes;
+    $finishline=[schedulenext($minutes)->[1]];
   }
   finish;
 }
 $reset=$newreset;
 if ($reset=~/^\d+$/) {
-  $resetminutes=$reset+$minutes;
+  $resetminutes=($reset+$minutes)%(24*60);
   $reset=printminutes($resetminutes)." reset\n";
   setstate;
 } else {