hlstatsx/scripts/HLStatsFTP/hlstats-ftp.pl

236 lines
8.0 KiB
Perl

#!/usr/bin/perl
################################################################################################################
# hlstats-ftp.pl
################################################################################################################
# Feed HLstatsX with log data via FTP
# (w) 2009 by Woody (http://woodystree.net)
################################################################################################################
use strict;
use Getopt::Long;
use Net::FTP;
use constant VERSION => "0.42";
use constant USAGE => <<EOT
Feed HLstatsX with log data via FTP.
Usage:
hlstats-ftp.pl --help
hlstats-ftp.pl --version
hlstats-ftp.pl --gs-ip=<IP> --gs-port=<PORT> [--ftp-ip=<IP>] --ftp-usr=<USR> --ftp-pwd=<PWD> --ftp-dir=<DIR> [--quiet]
Options:
--help display this help and exit
--version output version information and exit
--gs-ip=IP game server IP address
--gs-port=PORT game server port
--ftp-ip=IP ftp log server IP address, if different from
game server IP address (--gs-ip)
--ftp-usr=USR ftp log server user name
--ftp-pwd=PWD ftp log server password
--ftp-dir=DIR ftp log server directory
--quiet quiet operation, i.e. no output
(w)2009 by Woody (http://woodystree.net)
EOT
;
################################################################################################################
# define output subroutine
################################################################################################################
sub output {
if (!(our $opt_quiet)) {
my $text = shift;
print $text;
}
}
################################################################################################################
# get & parse command line options
################################################################################################################
my $opt_help; my $opt_version; my $gs_ip; my $gs_port; my $ftp_ip; my $ftp_usr; my $ftp_pwd; my $ftp_dir; our $opt_quiet;
GetOptions(
"help" => \$opt_help,
"version" => \$opt_version,
"gs-ip=s" => \$gs_ip,
"gs-port=i" => \$gs_port,
"ftp-ip=s" => \$ftp_ip,
"ftp-usr=s" => \$ftp_usr,
"ftp-pwd=s" => \$ftp_pwd,
"ftp-dir=s" => \$ftp_dir,
"quiet" => \$opt_quiet
) or die(USAGE);
if ($opt_help) {
print USAGE;
exit(0);
}
if ($opt_version) {
print "\nhlstats-ftp.pl - Version " . VERSION . "\n";
print "Feed HLstatsX with log data via FTP.\n";
print "(w)2009 by Woody (http://woodystree.net)\n\n";
exit(0);
}
if (!(defined $gs_ip) && !(defined $gs_port) && !(defined $ftp_usr) && !(defined $ftp_pwd) && !(defined $ftp_dir)) {
die(USAGE);
}
if (!(defined $ftp_ip)) {
$ftp_ip = $gs_ip;
}
################################################################################################################
# OK, lets go...
################################################################################################################
output("\nStarting hlstats-ftp.pl for IP $gs_ip, Port $gs_port...\n\n");
################################################################################################################
# create tmp directory
################################################################################################################
output(" - creating tmp directory... ");
my $tmp_dir = "hlstats-ftp-$gs_ip-$gs_port.tmp";
if (-e $tmp_dir) {
if (!(-w $tmp_dir)) {
die "Writing to tmp directory is not possible.";
}
} else {
mkdir($tmp_dir, 0775) || die "Make tmp directory \"$tmp_dir\" failed: $!";
}
output("OK.\n");
################################################################################################################
# get last mtime info, if any
################################################################################################################
output(" - getting last mtime info... ");
my $last_mtime_filename = "hlstats-ftp-$gs_ip-$gs_port.last";
my $last_mtime = 0;
if (-e $last_mtime_filename) {
open(LASTMTIME, "<$last_mtime_filename") || die "Open file \"$last_mtime_filename\" failed: $!";
$last_mtime = <LASTMTIME>;
close(LASTMTIME);
output("OK: last mtime $last_mtime.\n");
} else {
output("none: using default 0.\n");
}
################################################################################################################
# establish ftp connection
################################################################################################################
output(" - establishing FTP connection... ");
my $ftp = Net::FTP->new($ftp_ip) || die "FTP connect to \"$ftp_ip\" failed: $!";
$ftp->login($ftp_usr,$ftp_pwd) || die "FTP login for user \"$ftp_usr\" failed: $!";
$ftp->binary() || die "FTP binary mode failed: $!";
$ftp->cwd($ftp_dir) || die "FTP chdir to \"$ftp_dir\" failed: $!";
output("OK.\n");
################################################################################################################
# get complete list of log files
################################################################################################################
output(" - getting complete list of log files... ");
my @files = $ftp->ls("-t *.log"); # get list of log files sorted by mtime
$#files = $#files - 1; # skip last file, i.e. the latest file, which is possibly still in use by the game server
output("OK.\n");
################################################################################################################
# transfer log files to tmp directory, if todo
################################################################################################################
output(" + transfering log files, if todo:\n");
my @todo_files = ();
my @todo_mtimes = ();
foreach my $file (@files) {
output(" - \"$file\" ");
my $mtime = $ftp->mdtm($file) || die "FTP mtdm failed: $!";
output("(mtime $mtime): ");
if ($mtime > $last_mtime) {
output("transferring... ");
$ftp->get($file, "$tmp_dir/$file") || die "FTP get with \"$file\" failed: $!";
push(@todo_files, $file);
push(@todo_mtimes, $mtime);
output("OK.\n");
} else {
output("skipping.\n");
}
}
################################################################################################################
# close ftp connection
################################################################################################################
output(" - closing FTP connection... ");
$ftp->close() || die "FTP close failed: $!";
output("OK.\n");
################################################################################################################
# process log files in tmp directory
################################################################################################################
output(" + parsing log files:\n");
for (my $i = 0; $i <= $#todo_files; $i++) {
my $progress = "(" . ($i+1) . "/" . ($#todo_files+1) . ")";
output(" - \"" . $todo_files[$i] . "\" " . $progress . ": parsing... ");
system("./hlstats.pl --stdin --server-ip $gs_ip --server-port $gs_port < $tmp_dir/" . $todo_files[$i] . " > /dev/null");
output("updating last mtime...");
open(LASTMTIME, ">$last_mtime_filename") || die "Open file \"$last_mtime_filename\" failed: $!";
print LASTMTIME $todo_mtimes[$i];
close(LASTMTIME);
output("OK.\n");
}
################################################################################################################
# delete tmp log files and directory
################################################################################################################
output(" - delete tmp log files and directory... ");
foreach my $file (<$tmp_dir/*>) {
unlink($file) || die "Delete tmp log files failed: $!";
}
rmdir($tmp_dir) || die "Delete tmp directory failed: $!";
output("OK.\n");
################################################################################################################
# the end
################################################################################################################
output("\nSo Long, and Thanks for all the Fish.\n\n");