my $USER="adsl_303141";
my $USERNAME="Jan Kratochvil";
my $PASSWORD=&_priv_postget("uzivatel.gtsnovera.cz.pwd");
-my $IFDEV="ppp0";
+my $IFDEV="eth0";
my $SECS=4;
-my $RX_THRESHOLD=200000; # 226085
-my $TX_THRESHOLD=200000; # 291251
+my $RX_THRESHOLD=210000; # 226085
+my $TX_THRESHOLD=210000; # 291251
my $STABILIZE_OFF=1;
my $STABILIZE_ON=4*60;
my $INPUT_IDLE=10*60;
change($what);
}
-# CPU0 CPU1
-# 1: 107040 111123 Phys-irq i8042
-# 6: 3 0 Phys-irq floppy
-sub input()
+use User::Utmp;
+
+# Users respected for the 'idle' state (see $IdleMax):
+my @ValidUsers=qw(root lace jkratoch);
+
+sub useridle()
{
- my $fname="/proc/interrupts";
- local *F;
- open F,$fname or die "open \"$fname\": $!";
- <F> or die "header \"$fname\"";;
- my $r=0;
- while (<F>) {
- chomp;
- my @f=split;
- last if $f[0]=~/^[A-Z]{3}:$/; # NMI/LOC/ERR/MIS
- $f[0]=~/^\s*\d+:$/ or die $f[0];
- next if $f[$#f] ne "i8042";
- for (1..$#f-2) {
- $_=$f[$_];
- /^\d+$/ or die $_;
- $r+=$_;
- }
+ my %valid_users=map(($_=>1),@ValidUsers);
+ my($idlebest,$linebest);
+ for my $utmp (User::Utmp::getut()) {
+ local $_;
+ next if defined($_=$utmp->{"ut_type"}) && $_!=&User::Utmp::USER_PROCESS();
+ next if defined($_=$utmp->{"ut_user"}) && !$valid_users{$_};
+ my $line="/dev/".$utmp->{"ut_line"};
+ my $atime=(stat $line)[8];
+ my $what="user \"".($utmp->{"ut_user"} || "<local>")."\", line \"$line\"";
+ warn "Unable to stat $what" and next if !$atime;
+ my $idle=time()-$atime;
+ warn "atime in future for $what" and next if $idle<0;
+ next if defined $idlebest && $idlebest<=$idle;
+ $idlebest=$idle;
+ $linebest=$line;
}
- close F or die "open \"$fname\": $!";
- return $r;
+ return !wantarray() ? $idlebest : ($idlebest,$linebest);
}
-my $input=input();
-my $input_last=time()+0;
sub input_idle()
{
- my $input_now=input();
- my $diff=$input_now-$input;
- die $diff if $diff<0;
- my $time_now=time()+0;
- if ($diff) {
- $input=$input_now;
- $input_last=$time_now;
- }
- my $time_diff=$time_now-$input_last;
- return $time_diff>$INPUT_IDLE;
+ return useridle() > $INPUT_IDLE;
}
sub mplayer_running()
open F,"/proc/net/unix" or die;
my %unix;
<F>;
+ local $_;
while (<F>) {
/^(?:\S+\s+){6}(\d+)\s/ or die;
$unix{$1}=1;
$on_now=0 if ($rx-$rx_last) > $RX_THRESHOLD;
$on_now=0 if ($tx-$tx_last) > $TX_THRESHOLD;
}
+ my $print=$on_now;
my $input_idle=input_idle();
my $mplayer_running=mplayer_running() if $input_idle;
$on_now=1 if $input_idle && !$mplayer_running;
$rx_last=$rx;
$tx_last=$tx;
push @history,$on_now;
- my $print=$on_now;
- $print=($on_now ? "." : "v") if $input_idle;
+ $print=($print ? "." : "v") if $input_idle;
$print="M" if $mplayer_running;
$print="*" if $ignore_read;
print($print);
- history(1,($input_idle && !$mplayer_running ? 0 : $STABILIZE_ON));
+ history(1,(($input_idle && !$mplayer_running) ? 0 : $STABILIZE_ON));
history(0,$STABILIZE_OFF);
$ignore_read=$ignore_write;
$ignore_write=0;