X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=bin%2Fheat;h=0c81139f0dca37514f8963b85713aed012f60bbe;hb=fd54c889a3161d959fb5adadedaa882f69324e5c;hp=4748edcbaebbbdf6f02996ed064862ba11cc07d0;hpb=547aa30e0870b2b9e34c22080ac40e318803c13c;p=nethome.git diff --git a/bin/heat b/bin/heat index 4748edc..0c81139 100755 --- 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; @@ -46,18 +44,23 @@ if (($ARGV[0]||"")=~/^[@]0?(\d+):0?(\d+)$/) { $minutes=$1*60+$2; shift; } -my $schedule=readfile $schedulefile; my $finishline; my %schedule; -while ($schedule=~s/^(0?(\d+):0?(\d+)) ([01s])\n//) { - my $tm=$2*60+$3; - warn "$schedulefile set twice for: $1" if defined $schedule{$tm}; - $schedule{$tm-24*60}="$1 $4\n"; - $schedule{$tm }="$1 $4\n"; - $schedule{$tm+24*60}="$1 $4\n"; -} -warn "$schedulefile garbage: $schedule" if $schedule ne ""; +my $schedule; +if (-e $schedulefile) { + $schedule=readfile $schedulefile; + while ($schedule=~s/^(0?(\d+):0?(\d+)) ([01s])\n//) { + my $tm=$2*60+$3; + warn "$schedulefile set twice for: $1" if defined $schedule{$tm}; + $schedule{$tm-24*60}="$1 $4\n"; + $schedule{$tm }="$1 $4\n"; + $schedule{$tm+24*60}="$1 $4\n"; + } + warn "$schedulefile garbage: $schedule" if $schedule ne ""; + warn "Empty $schedulefile" if !%schedule; +} sub schedulenext($) { + return undef if !%schedule; my($now)=@_; my($bestprev,$prev,$bestnext,$next); for my $found (keys(%schedule)) { @@ -75,7 +78,8 @@ sub schedulenext($) { die "No bestnext" if !defined $bestnext; return [$prev,$next]; } -$finishline=schedulenext $minutes; +$finishline=schedulenext($minutes); +$finishline=[$finishline->[1]] if $finishline; my $silent=shift if ($ARGV[0]||"") eq "-s"; logmsg "command: ".join(" ",@ARGV) if !$silent&&@ARGV; sub info($) { @@ -89,7 +93,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); } @@ -104,7 +108,11 @@ if (defined $reset) { } sub finishlinereset() { $finishline=schedulenext $resetminutes; - splice @$finishline,1,0,$reset; + if ($finishline) { + $finishline=[$reset,$finishline->[1]]; + } else { + $finishline=[$reset]; + } } finishlinereset if defined $reset; my $state=readfile $statefile; @@ -120,11 +128,14 @@ sub printminutes($) { return sprintf "%02d:%02d",int($m/60),$m%60; } if ($silent) { - if (!defined $newstate&&!defined $reset) { - my $prev=schedulenext($minutes)->[0]; - if ($prev=~m{^@[ printminutes $minutes ] (.)\n$}) { - $newstate=$1; - logmsg "scheduled: $prev"; + if (!defined $newstate&&!defined $reset&&%schedule) { + my $prev=schedulenext($minutes); + if ($prev) { + my $prev=$prev->[0]; + if ($prev=~m{ (.)\n$}) { + $newstate=$1; + logmsg "scheduled: $prev"; + } } } $newstate=$state if !defined $newstate; @@ -136,14 +147,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 "\n".printminutes($minutes)." change $state".($state eq $newstate?"":"->$newstate")." 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; @@ -151,13 +164,14 @@ if (!defined $newreset) { setstate; if (!$silent&&defined $reset) { unlink_resetfile; - $finishline=schedulenext $minutes; + $finishline=schedulenext($minutes); + $finishline=[$finishline->[1]] if $finishline; } finish; } $reset=$newreset; if ($reset=~/^\d+$/) { - $resetminutes=$reset+$minutes; + $resetminutes=($reset+$minutes)%(24*60); $reset=printminutes($resetminutes)." reset\n"; setstate; } else {