package OCF::FingerInfo; $VERSION = 0.01; sub new { my $class = shift; my $data = shift; return bless [map((tr/\0//d,$_)[1], unpack("a16a64a64NNa32a128a16", $data))], $class; } sub name { $_[0][0] } sub real_name { $_[0][1] } sub host { $_[0][2] } sub login_time { $_[0][3] } sub idle_time { $_[0][4] } sub ttyname { $_[0][5] } sub ttyloc { $_[0][6] } sub what { $_[0][7] } sub host_short { my $self = shift; my $h = $self->host; $h =~ s/\..*//; return $h; } sub idle_nice { my $self = shift; my $t = $self->idle_time; if ($t < 60) { return ""; } elsif ($t < 3600) { return int($t / 60); } elsif ($t < 86400) { my $min = int($t / 60); return sprintf("%d:%02d", int($min / 60), ($min % 60)); } elsif ($t < 604800) { return int($t / 86400) . " day"; } else { return int($t / 604800) . " wk"; } } sub writeable { return $_[0]->ttyname =~ /\*/ ? "*" : ""; } sub ttyname_nice { my $self = shift; my $n = $self->ttyname; $n =~ s[pts/][]; $n =~ tr/*//d; return $n; } @months = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); @days = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); sub login_time_nice { my $self = shift; my $t = $self->login_time; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($t); my $now = time; if ($now - $t < 604800) { return sprintf("%s %d:%02d", $days[$wday], $hour, $min); } else { return sprintf("%s %2d", $months[$mon], $mday); } } sub hostdata { my $class = shift; if ((stat("/tmp/spool"))[4] == 1782) { open(DATA, "new($buf); } close DATA; return @ret; } sub hostdata_real { grep($_->real_name !~ /Host (is down|has no users)/, $_[0]->hostdata); } sub hostdata_fake { grep($_->real_name =~ /Host (is down|has no users)/, $_[0]->hostdata); } sub finger_noargs { format STDOUT = @<<<<<<< @<<<<<<<<<<<<<<<<<<< @>>>>@@<< @<<<<<<<<<< @<<<<<<<< @<<<<<<<<<<<<<<<< $d->name, $d->real_name, $d->idle_nice, $d->writeable, $d->ttyname_nice, $d->host_short, $d->login_time_nice, $d->ttyloc . print <name cmp $b->name} OCF::FingerInfo->hostdata_real) { write; } }