Statistiky
Jan ' Kozo ' Vajda
jvajda na somi.sk
Pátek Září 1 19:28:12 CEST 2000
:> Pekny den,
podobne ..
:> mel bych nasledujici problem: Potreboval bych na Unixovem (konkretne
:> na Solarisu) vymyslet nejak statistiky navstevnosti. Jedna se o
:> studentsky server.
:-{))
:> Taky byla moznost, kdybych nejak mohl ziskat binarni last a nejaky
:> program si uz zpatlat. Ja vim, ze to uz binarne je samo o sobe ve wtmp,
:> ale nekde jsem cetl, ze se v tech datech vyskytuji chyby, ze to nejde
:> primo cist a vypisovat jako to dela last. Co je v tom za trik?
solaris ma aj prikaz last .. z heno sa da kadeco .. ja som si pre vlastne
ucely robil nieco v perle a mozno Vam to pomoze .. pribalim to na koniec ..
:> Fajn by byl nejaky software, ktery by podobnou prezentaci, klidne
:> interaktivni, uz delal sam. Taky bych byl vdecny za nejake informace,
:> pokud s tim mate nekdo zkusenosti primo na Solarisu. Treba jsou na to
:> nejake sys utility, ktere jsem jeste neobjevil.
ako vstup je pouzity prikaz last v solarise ..
:> Uplne idealni by byl program, ktery by umel presne to, co potrebuju, tedy na
:> pozadani a zadani loginname by vypsal: Vy jste tu byl za posledni semestr
:> tolikrat, stravil tu tolik a tolik casu, z toho pet minut mimo vyucovaci
:> hodinu.
toto vie spravit nieco podobne .. myslim, ze si to lahko rozsirite pre svoje
potreby ..
( ma to prepinac -h :-{)) )
nie je to napisane uplne cisto .. ale zase pisal som to na rychlo a pre
vlastne potreby ..
-- start vlozeneho kodu --
#!/usr/bin/perl
# scitavanie casov z last logu
# (c) Kozo <Jan.Vajda na alert.sk>
# Mon Dec 6 22:00:05 CET 1999
### nacitanie command line options
use Getopt::Long;
### modul na formatovanie casu
use POSIX;
### prikaz ktory vracia last ( s pripadnymi parametrami )
### nie ze by bolo z coho vyberat, ale ak nahodou
$LASTCMD = "/bin/last";
### nacitanie command line options
GetOptions("month=s" => \$LASTMONTH, ### ktory mesiac sa ma pocitat
"user=s" => \$USERNAME, ### nejaky specialny username ?
"full" => \$FULL, ### spracovat cely log ( inak aktualny mesiac )
"debug" => \$DEBUG, ### pomocne vypisy
"help" => \$HELP,
);
if ( $HELP ) {
print_help();
exit;
}
### username musi byt malymi pismenami
$USERNAME = "\L$USERNAME";
### ktory mesiac sa ma pocitat
### default je aktualny mesiac
### prve pismeno je velke
$LASTMONTH = "\u$LASTMONTH" || strftime("%b",localtime(time));
open(LOG, "$LASTCMD |") || die "Can't open pipe: $!\n";
while (defined($line = <LOG>)) {
### najdeme prvy riadok daneho mesiaca
next if ( $line !~ /$LASTMONTH/ && !$IN && !$FULL);
### uz som vo vnutri
$IN = 1;
### prebehnem cely dany mesiac
last if ( $line !~ /$LASTMONTH/ && !$FULL);
next if ( $line !~ /^$USERNAME\s+/ && $USERNAME );
($login,$date,$utime) = ( $line =~ /^\s*(\S+).*?(\S+\s+\S+\s+\d+\s+\d+:\d+).*?\((.*?)\)$/);
next unless $utime;
print "$login => $utime ($date)\n" if ( $DEBUG );
add_time($login, $utime);
}
close(LOG);
print <<EOM;
Pouzivatel | Spotrebovany cas
----------------------------------
EOM
foreach ( sort {$USER{$b} <=> $USER{$a}} keys %USER ) {
printf(" %-12s | %s\n",$_,FormTime($USER{$_}));
}
print <<EOM;
----------------------------------
EOM
### subroutines :-{))
sub print_help () {
print <<EOM;
Program na scitavanie casov z last logu.
Creation date: Mon Dec 6 23:07:29 CET 1999
(c) Kozo <Jan.Vajda\@alert.sk>
usage: $0 <options>
options:
-m, --month=<name> Mesiac, ktory sa ma pocitat
-u, --user=<uname> Uzivatel, ktory sa ma spocitat
-f, --full Spracovat cely log
-d, --debug Vypisovat pomocne vypisy
-h, --help Tento help
EOM
}
sub add_time ($$) {
my $login = shift;
my $time = shift;
my $Dd=0;
my $Dh=0;
my $Dm=0;
my $day=0;
my $hour=0;
my $min=0;
($null,$Dd,$Dh,$Dm) = ($time =~ /((\d+)\+)?(\d\d):(\d\d)/ );
$USER{$login} += $Dd*60*24 + $Dh*60 + $Dm;
}
sub FormTime ($) {
my $min = shift;
$hour = ($tmp=int($min/60));
$min -= $tmp*60;
$day = ($tmp=int($hour/24));
$hour -= $tmp*24;
return(sprintf("%2.2d:%2.2d:%2.2d",$day,$hour,$min));
}
-- koniec vlozeneho kodu --
K O Z O
===================================
Look At Your Young Man Fighting
Look At Your Woman Crying
Look At Your Young Man Dying
The Way They've Always Done Before
Další informace o konferenci Linux