375 lines
8.3 KiB
Perl
375 lines
8.3 KiB
Perl
|
#!/usr/bin/perl
|
||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||
|
# http://www.hlxcommunity.com
|
||
|
#
|
||
|
# HLstatsX Community Edition is a continuation of
|
||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||
|
# http://ovrsized.neo-soft.org/
|
||
|
#
|
||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||
|
# http://www.hlstatsx.com/
|
||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||
|
#
|
||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||
|
# http://sourceforge.net/projects/hlstats/
|
||
|
# Copyright (C) 2001 Simon Garner
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or
|
||
|
# modify it under the terms of the GNU General Public License
|
||
|
# as published by the Free Software Foundation; either version 2
|
||
|
# of the License, or (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program; if not, write to the Free Software
|
||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
#
|
||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||
|
|
||
|
|
||
|
##
|
||
|
## Settings
|
||
|
##
|
||
|
|
||
|
# $opt_configfile - Absolute path and filename of configuration file.
|
||
|
$opt_configfile = "./hlstats.conf";
|
||
|
|
||
|
# $opt_libdir - Directory to look in for local required files
|
||
|
# (our *.plib, *.pm files).
|
||
|
$opt_libdir = "./";
|
||
|
|
||
|
|
||
|
##
|
||
|
##
|
||
|
################################################################################
|
||
|
## No need to edit below this line
|
||
|
##
|
||
|
|
||
|
|
||
|
use Getopt::Long;
|
||
|
use IO::Socket;
|
||
|
use DBI;
|
||
|
|
||
|
require "$opt_libdir/ConfigReaderSimple.pm";
|
||
|
do "$opt_libdir/HLstats.plib";
|
||
|
|
||
|
$|=1;
|
||
|
Getopt::Long::Configure ("bundling");
|
||
|
|
||
|
|
||
|
##
|
||
|
## Functions
|
||
|
##
|
||
|
|
||
|
|
||
|
sub is_number ($) { ( $_[0] ^ $_[0] ) eq '0' }
|
||
|
|
||
|
|
||
|
#
|
||
|
# void printEvent (int code, string description)
|
||
|
#
|
||
|
# Logs event information to stdout.
|
||
|
#
|
||
|
|
||
|
sub printEvent
|
||
|
{
|
||
|
my ($code, $description, $update_timestamp) = @_;
|
||
|
|
||
|
if ($g_debug > 0)
|
||
|
{
|
||
|
if ($update_timestamp > 0)
|
||
|
{
|
||
|
my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time());
|
||
|
my $timestamp = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
|
||
|
} else {
|
||
|
my $timestamp = $ev_timestamp;
|
||
|
}
|
||
|
print localtime(time) . "" unless ($timestamp);
|
||
|
if (is_number($code))
|
||
|
{
|
||
|
printf("%s: %21s - E%03d: %s\n", $timestamp, $s_addr, $code, $description);
|
||
|
} else {
|
||
|
printf("%s: %21s - %s: %s\n", $timestamp, $s_addr, $code, $description);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
##
|
||
|
## MAIN
|
||
|
##
|
||
|
|
||
|
# Options
|
||
|
|
||
|
$opt_help = 0;
|
||
|
$opt_version = 0;
|
||
|
$opt_regroup = 0;
|
||
|
|
||
|
$db_host = "localhost";
|
||
|
$db_user = "";
|
||
|
$db_pass = "";
|
||
|
$db_name = "hlstats";
|
||
|
|
||
|
$g_dns_timeout = 5;
|
||
|
$g_debug = 0;
|
||
|
|
||
|
# Usage message
|
||
|
|
||
|
$usage = <<EOT
|
||
|
Usage: hlstats-resolve.pl [OPTION]...
|
||
|
Resolve player IP addresses to hostnames.
|
||
|
|
||
|
-h, --help display this help and exit
|
||
|
-v, --version output version information and exit
|
||
|
-d, --debug enable debugging output (-dd for more)
|
||
|
-n, --nodebug disables above; reduces debug level
|
||
|
--db-host=HOST database ip:port
|
||
|
--db-name=DATABASE database name
|
||
|
--db-password=PASSWORD database password (WARNING: specifying the
|
||
|
password on the command line is insecure.
|
||
|
Use the configuration file instead.)
|
||
|
--db-username=USERNAME database username
|
||
|
--dns-timeout=SEC timeout DNS queries after SEC seconds [$g_dns_timeout]
|
||
|
-r, --regroup only re-group hostnames--don't resolve any IPs
|
||
|
|
||
|
Long options can be abbreviated, where such abbreviation is not ambiguous.
|
||
|
|
||
|
Most options can be specified in the configuration file:
|
||
|
$opt_configfile
|
||
|
Note: Options set on the command line take precedence over options set in the
|
||
|
configuration file.
|
||
|
|
||
|
HLstats: http://www.hlstats.org
|
||
|
EOT
|
||
|
;
|
||
|
|
||
|
# Read Config File
|
||
|
|
||
|
if ($opt_configfile && -r $opt_configfile)
|
||
|
{
|
||
|
$conf = ConfigReaderSimple->new($opt_configfile);
|
||
|
$conf->parse();
|
||
|
|
||
|
%directives = (
|
||
|
"DBHost", "db_host",
|
||
|
"DBUsername", "db_user",
|
||
|
"DBPassword", "db_pass",
|
||
|
"DBName", "db_name",
|
||
|
"DNSTimeout", "g_dns_timeout",
|
||
|
"DebugLevel", "g_debug"
|
||
|
);
|
||
|
|
||
|
&doConf($conf, %directives);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print "-- Warning: unable to open configuration file '$opt_configfile'\n";
|
||
|
}
|
||
|
|
||
|
# Read Command Line Arguments
|
||
|
|
||
|
GetOptions(
|
||
|
"help|h" => \$opt_help,
|
||
|
"version|v" => \$opt_version,
|
||
|
"debug|d+" => \$g_debug,
|
||
|
"nodebug|n+" => \$g_nodebug,
|
||
|
"db-host=s" => \$db_host,
|
||
|
"db-name=s" => \$db_name,
|
||
|
"db-password=s" => \$db_pass,
|
||
|
"db-username=s" => \$db_user,
|
||
|
"dns-timeout=i" => \$g_dns_timeout,
|
||
|
"regroup|r" => \$opt_regroup
|
||
|
) or die($usage);
|
||
|
|
||
|
if ($opt_help)
|
||
|
{
|
||
|
print $usage;
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
if ($opt_version)
|
||
|
{
|
||
|
print "hlstats-resolve.pl (HLstats) $g_version\n"
|
||
|
. "Real-time player and clan rankings and statistics for Half-Life\n\n"
|
||
|
. "Copyright (C) 2001 Simon Garner\n"
|
||
|
. "This is free software; see the source for copying conditions. There is NO\n"
|
||
|
. "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
$g_debug -= $g_nodebug;
|
||
|
$g_debug = 0 if ($g_debug < 0);
|
||
|
|
||
|
if ($g_debug >= 2)
|
||
|
{
|
||
|
$opt_quiet = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$opt_quiet = 1; # quiet name resolution
|
||
|
}
|
||
|
|
||
|
$g_dns_resolveip = 1;
|
||
|
|
||
|
|
||
|
# Startup
|
||
|
|
||
|
print "++ HLstats Resolve $g_version starting...\n\n";
|
||
|
|
||
|
# Connect to the database
|
||
|
|
||
|
print "-- Connecting to MySQL database '$db_name' on '$db_host' as user '$db_user' ... ";
|
||
|
|
||
|
$db_conn = DBI->connect(
|
||
|
"DBI:mysql:$db_name:$db_host",
|
||
|
$db_user, $db_pass
|
||
|
) or die ("Can't connect to MySQL database '$db_name' on '$db_host'\n" .
|
||
|
"$DBI::errstr\n");
|
||
|
|
||
|
print "connected OK\n";
|
||
|
|
||
|
# Print configuration
|
||
|
|
||
|
print "-- DNS timeout is $g_dns_timeout seconds. Debug level is $g_debug.\n";
|
||
|
|
||
|
|
||
|
# Main data routine
|
||
|
|
||
|
if ($opt_regroup)
|
||
|
{
|
||
|
my $result = &doQuery("
|
||
|
SELECT
|
||
|
id,
|
||
|
hostname
|
||
|
FROM
|
||
|
hlstats_Events_Connects
|
||
|
WHERE
|
||
|
hostname != ''
|
||
|
");
|
||
|
|
||
|
my $total = $result->rows;
|
||
|
|
||
|
if ($total > 0) {
|
||
|
print "\n++ Re-grouping hosts (total $total hostnames) ... ";
|
||
|
|
||
|
my $resultHG = &queryHostGroups();
|
||
|
|
||
|
if ($g_debug > 0)
|
||
|
{
|
||
|
print "\n\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " ";
|
||
|
}
|
||
|
|
||
|
my $p = 1;
|
||
|
while( my($id, $hostname) = $result->fetchrow_array )
|
||
|
{
|
||
|
my $percent = ($p / $total) * 100;
|
||
|
|
||
|
my $hostgroup = &getHostGroup($hostname, $resultHG);
|
||
|
|
||
|
&execNonQuery("
|
||
|
UPDATE
|
||
|
hlstats_Events_Connects
|
||
|
SET
|
||
|
hostgroup='" . "eSQL($hostgroup) . "'
|
||
|
WHERE
|
||
|
id=$id
|
||
|
");
|
||
|
|
||
|
if ($g_debug > 0)
|
||
|
{
|
||
|
printf("-> (%3d%%) %50s = %s\n", $percent, $hostname, $hostgroup);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("\b\b\b\b%3d%%", $percent);
|
||
|
}
|
||
|
|
||
|
$p++;
|
||
|
}
|
||
|
|
||
|
print "\n" unless ($g_debug > 0);
|
||
|
} else {
|
||
|
print "\n++ No Connects found!\n";
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
my $result = &doQuery("
|
||
|
SELECT
|
||
|
DISTINCT ipAddress,
|
||
|
hostname
|
||
|
FROM
|
||
|
hlstats_Events_Connects
|
||
|
");
|
||
|
|
||
|
my $total = $result->rows;
|
||
|
if ($total > 0) {
|
||
|
print "\n++ Resolving IPs and re-grouping hosts (total $total connects) ... ";
|
||
|
|
||
|
my $resultHG = &queryHostGroups();
|
||
|
|
||
|
if ($g_debug > 0)
|
||
|
{
|
||
|
print "\n\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print " ";
|
||
|
}
|
||
|
|
||
|
my $p = 1;
|
||
|
while( my($ipAddress, $hostname) = $result->fetchrow_array )
|
||
|
{
|
||
|
my $percent = ($p / $total) * 100;
|
||
|
|
||
|
if ($hostname eq "")
|
||
|
{
|
||
|
$hostname = &resolveIp($ipAddress, $opt_quiet);
|
||
|
}
|
||
|
|
||
|
my $hostgroup = &getHostGroup($hostname, $resultHG);
|
||
|
|
||
|
&execNonQuery("
|
||
|
UPDATE
|
||
|
hlstats_Events_Connects
|
||
|
SET
|
||
|
hostname='$hostname',
|
||
|
hostgroup='" . "eSQL($hostgroup) . "'
|
||
|
WHERE
|
||
|
ipAddress='$ipAddress'
|
||
|
");
|
||
|
|
||
|
if ($g_debug > 0)
|
||
|
{
|
||
|
printf("-> (%3d%%) %15s = %50s = %s\n", $percent, $ipAddress, $hostname, $hostgroup);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("\b\b\b\b%3d%%", $percent);
|
||
|
}
|
||
|
|
||
|
$p++;
|
||
|
}
|
||
|
|
||
|
print "\n" unless ($g_debug > 0);
|
||
|
} else {
|
||
|
print "\n++ No Connects found!\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
print "\n++ Operation complete.\n";
|
||
|
exit(0);
|