From 44d833e77760558ba9e81cb5d4701e774143e1fb Mon Sep 17 00:00:00 2001
From: Robert Anderson <randerson@lbsd.net>
Date: Fri, 5 Mar 2010 12:23:09 +0000
Subject: [PATCH] * Added event timezone configuration option

---
 INSTALL                                           |  2 +-
 smradius/config.pm                                | 12 ++++++++++--
 smradius/modules/accounting/mod_accounting_sql.pm |  6 +++---
 smradius/modules/system/mod_config_sql_topups.pm  |  2 +-
 smradiusd                                         |  9 +++++++--
 smradiusd.conf                                    |  3 +++
 6 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/INSTALL b/INSTALL
index 6f561395..e5123734 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Installing SMRadius.
 - Net::Server >= 0.96
 - Config::IniFiles (Debian based: libconfig-inifiles-perl, RPM based: perl-Config-IniFiles)
 - Cache::FastMmap (Debian based: libcache-fastmmap-perl, RPM based: perl-Cache-FastMmap)
-- DateTime
+- DateTime (requires: perl-Class-Singleton)
 - TimeDate
 - Crypt::DES
 - Crytpt::RC4
diff --git a/smradius/config.pm b/smradius/config.pm
index 03230842..25d374f8 100644
--- a/smradius/config.pm
+++ b/smradius/config.pm
@@ -50,18 +50,26 @@ sub Init
 	# Setup configuration
 	$config = $server->{'inifile'};
 
+	# Setup database config
 	my $db;
 	$db->{'DSN'} = $config->{'database'}{'dsn'};
 	$db->{'Username'} = $config->{'database'}{'username'};
 	$db->{'Password'} = $config->{'database'}{'password'};
 	$db->{'enabled'} = 0;
-
 	# Check we have all the config we need
 	if (!defined($db->{'DSN'})) {
 		$server->log(LOG_NOTICE,"smradius/config.pm: No 'DSN' defined in config file for 'database'");
 	}
-
 	$server->{'smradius'}{'database'} = $db;
+
+	# Setup event timezone config
+	if (defined($config->{'server'}{'event_timezone'})) {
+		$server->{'smradius'}{'event_timezone'} = $config->{'server'}{'event_timezone'};
+	} else {
+		$server->{'smradius'}{'event_timezone'} = "GMT";
+	}
+		
+	$server->log(LOG_NOTICE,"smradius/config.pm: Using timezone '".$server->{'smradius'}{'event_timezone'}."'");
 }
 
 
diff --git a/smradius/modules/accounting/mod_accounting_sql.pm b/smradius/modules/accounting/mod_accounting_sql.pm
index 92933cff..e8b3e02f 100644
--- a/smradius/modules/accounting/mod_accounting_sql.pm
+++ b/smradius/modules/accounting/mod_accounting_sql.pm
@@ -321,7 +321,7 @@ sub getUsage
 	$template->{'user'} = $user;
 
 	# Current PeriodKey
-	my $now = DateTime->now;
+	my $now = DateTime->now->set_time_zone($server->{'smradius'}->{'event_timezone'});
 	$template->{'query'}->{'PeriodKey'} = $now->strftime("%Y-%m");
 
 	# Replace template entries
@@ -409,7 +409,7 @@ sub acct_log
 	$template->{'user'} = $user;
 
 	# Current PeriodKey
-	my $now = DateTime->now;
+	my $now = DateTime->now->set_time_zone($server->{'smradius'}->{'event_timezone'});
 	my $periodKey = $now->strftime("%Y-%m");
 
 	# For our queries
@@ -711,7 +711,7 @@ sub cleanup
 	my ($server) = @_;
 
 	# The datetime now..
-	my $now = DateTime->now;
+	my $now = DateTime->now->set_time_zone($server->{'smradius'}->{'event_timezone'});
 
 	# If this is a new year
 	my ($prevYear,$prevMonth);
diff --git a/smradius/modules/system/mod_config_sql_topups.pm b/smradius/modules/system/mod_config_sql_topups.pm
index ee48eebe..90a5fd77 100644
--- a/smradius/modules/system/mod_config_sql_topups.pm
+++ b/smradius/modules/system/mod_config_sql_topups.pm
@@ -298,7 +298,7 @@ sub cleanup
 	DBFreeRes($sth);
 
 	# The datetime now
-	my $now = DateTime->now;
+	my $now = DateTime->now->set_time_zone($server->{'smradius'}->{'event_timezone'});
 	# Make datetime
 	my $thisMonth = DateTime->new( year => $now->year, month => $now->month, day => 1 );
 
diff --git a/smradiusd b/smradiusd
index d5c6ca90..a5d5bf5e 100755
--- a/smradiusd
+++ b/smradiusd
@@ -133,7 +133,7 @@ sub configure {
 			'min_spare_servers',
 			'max_spare_servers',
 			'max_servers',
-			'max_requests',
+			'max_requests'
 	);
 	foreach my $param (@server_params) {
 		$server->{$param} = $config{'server'}{$param} if (defined($config{'server'}{$param}));
@@ -501,7 +501,12 @@ sub process_request {
 	$user->{'_Internal'} = {
 		'Timestamp-Unix' => defined($pkt->rawattr('Event-Timestamp')) ? $pkt->rawattr('Event-Timestamp') : time()
 	};
-	my $eventTimestamp = DateTime->from_epoch( epoch => $user->{'_Internal'}->{'Timestamp-Unix'} );
+	# VERY IMPORTANT!!!!!!
+	# Timestamp AND Timestamp-Unix are in the CONVERTED timezone (event_timezone)
+	my $eventTimestamp = DateTime->from_epoch(
+			epoch => $user->{'_Internal'}->{'Timestamp-Unix'},
+			time_zone => $self->{'smradius'}->{'event_timezone'} 
+	);
 	$user->{'_Internal'}->{'Timestamp'} = $eventTimestamp->strftime('%Y-%m-%d %H:%M:%S');
 
 	# Set username
diff --git a/smradiusd.conf b/smradiusd.conf
index 482bc978..056bf047 100644
--- a/smradiusd.conf
+++ b/smradiusd.conf
@@ -68,6 +68,9 @@
 #cidr_allow=0.0.0.0/0
 #cidr_deny=
 
+# Event timestamp timezone, in "Continent/City" format
+# Defaults to "GMT"
+event_timezone=GMT
 
 
 [database]
-- 
GitLab