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