From 3d0974f3f8e988f4a11d2e8be7ee4ebea551a3b9 Mon Sep 17 00:00:00 2001
From: Nigel Kukard <nkukard@lbsd.net>
Date: Sat, 6 Jul 2013 18:03:30 +0000
Subject: [PATCH] Clean up old expired users in config manager

---
 opentrafficshaper/plugins/configmanager.pm | 38 ++++++++++++++++++++--
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/opentrafficshaper/plugins/configmanager.pm b/opentrafficshaper/plugins/configmanager.pm
index ff4eb58..54d2683 100644
--- a/opentrafficshaper/plugins/configmanager.pm
+++ b/opentrafficshaper/plugins/configmanager.pm
@@ -40,7 +40,14 @@ our (@ISA,@EXPORT,@EXPORT_OK);
 
 use constant {
 	VERSION => '0.0.1',
+
+	# After how long does a user get removed if he's offline
 	TIMEOUT_EXPIRE_OFFLINE => 300,
+
+	# After how long do we check users which have not been updated
+	TIMEOUT_EXPIRE_OLD => 7200,
+
+	# How often our config check ticks
 	TICK_PERIOD => 5,
 };
 
@@ -172,7 +179,10 @@ sub session_tick {
 	my $now = time();
 
 
-	# Loop with changes
+	#
+	# LOOP WITH CHANGES
+	#
+
 	foreach my $uid (keys %{$changeQueue}) {
 		# Global user
 		my $guser = $users->{$uid};
@@ -317,6 +327,28 @@ sub session_tick {
 	}
 
 
+	#
+	# CHECK OUT CONNECTED USERS
+	#
+	foreach my $uid (keys %{$changeQueue}) {
+		# Global user
+		my $guser = $users->{$uid};
+
+		# Check for expired users
+		if ($now - $guser->{'LastUpdate'} > TIMEOUT_EXPIRE_OLD) {
+			# Looks like this user has expired?
+			# TODO: Check stats to make sure they 0
+			my $cuser = {
+				'Username' => 'Username',
+				'Status' => 'offline',
+				'LastUpdate' => $guser->{'LastUpdate'},
+			};
+			# Add to change queue
+			$changeQueue->{$uid} = $cuser;
+		}
+	}
+
+
 	# Reset tick
 	$kernel->delay(tick => 5);
 };
@@ -408,8 +440,8 @@ sub processChanges
 
 	# Loop through what can change
 	foreach my $item ('GroupID','ClassID','TrafficLimitTx','TrafficLimitRx','TrafficLimitTxBurst','TrafficLimitRxBurst') {
-		# Check if its changed...
-		if ($orig->{$item} ne $new->{$item}) {
+		# Check if its first set, if it is, check if its changed
+		if (defined($new->{$item}) && $orig->{$item} ne $new->{$item}) {
 			# If so record it & make the change
 			$res->{$item} = $orig->{$item} = $new->{$item};
 		}
-- 
GitLab