Dateiname: /usr/local/httpd/htdocs/admin/samba-logger.cgi.
#!/usr/bin/perl
# samba-logger.cgi
# 2002/03/20
# leichte änderung: 2004/07/19 für debian
# Andreas Dangel <a.dangel@gmx.de>
use CGI;
#########################################################
################## MAIN PROGRAM #########################
#########################################################
$q = new CGI;
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print " <title>samba-logger</title>\n";
print "</head>\n";
print "<body>\n";
print "<h1>samba-logger</h1>\n";
$url = $q->url();
print "<p>\n";
print "<a href=\"$url\">samba-logger.cgi</a>\n";
print "<p>\n";
if (defined($q->param('logfile'))) {
$logfile = $q->param('logfile');
@loglines = &openLogfile($logfile);
&analyze_loglines(\@loglines);
} else {
@SambaLogfiles = &getSambaLogfiles();
print "<form method=\"post\">\n";
foreach(@SambaLogfiles) {
print "<input type=\"radio\" name=\"logfile\" value=\"$_\">$_<br>\n";
}
print "<input type=\"submit\" name=\"submit\">\n";
print "</form>\n";
}
print "<p>\n";
print "<a href=\"$url\">samba-logger.cgi</a>\n";
print "<p>\n";
print "<hr>\n";
print "2002/03/20 - Andreas Dangel\n";
print "</body>\n";
print "</html>";
#print @SambaLogfiles;
#open(LOGFILE, "zcat $SambaLogfiles[1] |");
#@lines = <LOGFILE>;
#close(LOGFILE);
#print @lines;
#########################################################
#########################################################
sub getSambaLogfiles {
@array = glob("/var/log/samba/log.smb*");
my @array2 = grep(!/smbd/, @array);
return @array2;
}
sub openLogfile {
$file = shift;
if ( $file =~ s/\.gz// ) {
open(FHANDLE, "zcat $file |");
} else {
open(FHANDLE, "$file");
}
@lines = <FHANDLE>;
close(FHANDLE);
return @lines;
}
sub analyze_loglines {
$samba_lines = shift;
@input = @$samba_lines;
#print @input;
$zeilen = @input;
@data = ();
%logins = {};
for ($i = 0; $i < $zeilen; $i++) {
$zeile1 = $input[$i];
$i++;
$zeile2 = $input[$i];
if ($zeile1 =~ m/smbd\/service\.c\:make\_connection\(/) {
if ($zeile2 =~ m/connect\ to\ service\ netlogon\ as\ user\ /) {
$zeile1 =~ s/smbd\/service\.c\:make\_connection\(//;
$zeile2 =~ s/connect\ to\ service\ netlogon\ as\ user\ //;
$datum = substr($zeile1, 0, 24);
$datum = substr($datum, 1, 19);
#chomp($datum = `date -d \"$datum\" +\%s`);
$adresse = substr($zeile2, index($zeile2, "("));
$adresse = substr($adresse, 1, index($adresse, ")")-1);
$rechner = substr($zeile2, 2, index($zeile2, "(")-3);
#$adresse .= " ($rechner)";
#$adresse = substr($zeile2, 2, 23);
#$login = substr($zeile2, 25);
#$login = substr($login, 0, index($login, "("));
$login = substr($zeile2, index($zeile2, ")")+1);
$login = substr($login, 0, index($login, "("));
$logins{$adresse} = ["$adresse ($rechner)", $datum, $login];
}
}
elsif ($zeile1 =~ m/smbd\/service\.c\:close\_cnum\(/) {
if ($zeile2 =~ m/closed\ connection\ to\ service\ pub/) {
$zeile1 =~ s/smbd\/service\.c\:close\_cnum\(//;
$zeile2 =~ s/closed\ connection\ to\ service\ pub//;
$datum = substr($zeile1, 0, 24);
$datum = substr($datum, 1, 19);
#chomp($datum = `date -d \"$datum\" +\%s`);
#$adresse = substr($zeile2, 2, 23);
$adresse = substr($zeile2, index($zeile2, "("));
$adresse = substr($adresse, 1, index($adresse, ")")-1);
if (exists($logins{$adresse})) {
$ref = $logins{$adresse};
push(@$ref, $datum);
delete($logins{$adresse});
push(@data, $ref);
}
}
} else {
$i--;
}
}
&sort(\@data);
&output(\@data);
}
sub sort {
$ref = shift;
@data = @$ref;
$lines = @data;
#print STDERR "$lines\n";
for ($i = 0; $i < $lines - 1; $i++) {
#printf STDERR "%d of %d (%.1f%%)\r", $i, $lines-1, 100*$i/($lines-1);
for ($k = 0; $k < $lines -1; $k++) {
$ref_a = $data[$k];
$ref_b = $data[$k + 1];
$time_a = @$ref_a[1];
#chomp($time_a = `date -d \"$time_a\" +%s`);
$time_b = @$ref_b[1];
#chomp($time_b = `date -d \"$time_b\" +%s`);
if ($time_a gt $time_b) {
#print "$time_a $time_b\n";
$data[$k] = $ref_b;
$data[$k + 1] = $ref_a;
}
}
#exit;
}
}
sub output {
$ref = shift;
@data = @$ref;
print "<table border=1>\n";
print "<tr><th>Anmeldung</th><th>Benutzer</th><th>IP-Adresse</th>
<th>Abmeldung</th></tr>\n";
foreach (@data) {
$ref = $_;
$newline = "<tr><td>" . @$ref[1] . "</td>";
$newline .= "<td>" . @$ref[2] . "</td>";
$newline .= "<td>" . @$ref[0] . "</td>";
$newline .= "<td>" . @$ref[3] . "</td></tr>";
print $newline;
}
print "</table>\n";
}