diff --git a/opentrafficshaper/plugins/configmanager.pm b/opentrafficshaper/plugins/configmanager.pm index 32418d0a1605ae0611ce71d6b86f134718513f86..4970b6663dfa7fa80277987429a44866f521c087 100644 --- a/opentrafficshaper/plugins/configmanager.pm +++ b/opentrafficshaper/plugins/configmanager.pm @@ -53,7 +53,7 @@ our (@ISA,@EXPORT,@EXPORT_OK); changePool getPools getPool - getPoolByIdentifer + getPoolByName getPoolTxInterface getPoolRxInterface getPoolTrafficClassID @@ -73,7 +73,8 @@ our (@ISA,@EXPORT,@EXPORT_OK); changePoolMember getPoolMembers getPoolMember - getPoolMembersByIP + getPoolMemberByUsernameIP + getAllPoolMembersByInterfaceGroupIP getPoolMemberMatchPriority setPoolMemberShaperState unsetPoolMemberShaperState @@ -127,7 +128,7 @@ use constant { # Mandatory pool attributes sub POOL_REQUIRED_ATTRIBUTES { qw( - Identifier + Name InterfaceGroupID ClassID TrafficLimitTx TrafficLimitRx Source @@ -147,7 +148,8 @@ sub POOL_CHANGE_ATTRIBUTES { # Pool persistent attributes sub POOL_PERSISTENT_ATTRIBUTES { qw( - Identifier + ID + Name FriendlyName InterfaceGroupID ClassID TrafficLimitTx TrafficLimitRx TrafficLimitTxBurst TrafficLimitRxBurst @@ -208,7 +210,7 @@ sub LIMIT_REQUIRED_ATTRIBUTES { # Override match attributes, one is required sub OVERRIDE_MATCH_ATTRIBUTES { qw( - PoolIdentifier Username IPAddress + PoolName Username IPAddress GroupID ) } @@ -217,7 +219,7 @@ sub OVERRIDE_MATCH_ATTRIBUTES { sub OVERRIDE_ATTRIBUTES { qw( FriendlyName - PoolIdentifier Username IPAddress GroupID + PoolName Username IPAddress GroupID ClassID TrafficLimitTx TrafficLimitRx TrafficLimitTxBurst TrafficLimitRxBurst Expires Notes @@ -245,7 +247,7 @@ sub OVERRIDE_CHANGESET_ATTRIBUTES { sub OVERRIDE_PERSISTENT_ATTRIBUTES { qw( FriendlyName - PoolIdentifier Username IPAddress GroupID + PoolName Username IPAddress GroupID ClassID TrafficLimitTx TrafficLimitRx TrafficLimitTxBurst TrafficLimitRxBurst Notes Expires Created @@ -319,7 +321,7 @@ my $interfaceIPMap = {}; # Parameters: # * FriendlyName # - Used for display purposes -# * Identifier +# * Name # - Unix timestamp when this entry expires, 0 if never # * ClassID # - Class ID @@ -338,7 +340,7 @@ my $interfaceIPMap = {}; # * Source # - This is the source of the limit, typically plugin.ModuleName my $pools = { }; -my $poolIdentifierMap = { }; +my $poolNameMap = { }; my $poolIDCounter = 1; @@ -380,8 +382,8 @@ my $poolMemberMap = { }; # OVERRIDES # # Selection criteria: -# * PoolIdentifier -# - Pool identifier +# * PoolName +# - Pool name # * Username # - Users username # * IPAddress @@ -884,7 +886,7 @@ sub _session_stop $interfaceIPMap = { }; $pools = { }; - $poolIdentifierMap = { }; + $poolNameMap = { }; $poolIDCounter = 1; $poolMembers = { }; @@ -946,7 +948,7 @@ sub _session_tick # There are no members, its safe to remove if (getPoolMembers($pid) == 0) { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] has expired, removing", - $pool->{'Identifier'}, + $pool->{'Name'}, $pid ); removePool($pid); @@ -959,16 +961,15 @@ sub _session_tick # Loop through pool change queue while (my ($pid, $pool) = each(%{$poolChangeQueue})) { - my $shaperState = getPoolShaperState($pool->{'ID'}); # Pool is newly added if ($pool->{'Status'} == CFGM_NEW) { # If the change is not yet live, we should queue it to go live - if ($shaperState == SHAPER_NOTLIVE) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] new and not live, adding to shaper", - $pool->{'Identifier'}, + if ($shaperState & SHAPER_NOTLIVE) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] new and is not live, adding to shaper", + $pool->{'Name'}, $pid ); $kernel->post('shaper' => 'pool_add' => $pid); @@ -977,8 +978,13 @@ sub _session_tick $pool->{'Status'} = CFGM_ONLINE; # Remove from queue delete($poolChangeQueue->{$pid}); + } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN state (CFGM_NEW && !SHAPER_NOTLIVE)"); + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN state '%s'", + $pool->{'Name'}, + $pid, + $shaperState + ); } # Pool is online but NOTLIVE @@ -986,16 +992,18 @@ sub _session_tick # We've transitioned more than likely from offline, any state to online # We don't care if the shaper is pending removal, we going to force re-adding now - if ($shaperState != SHAPER_LIVE) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] online and not in live state, re-queue as add", - $pool->{'Identifier'}, + if (!($shaperState & SHAPER_LIVE)) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] online and is not live, re-queue as add", + $pool->{'Name'}, $pid ); $pool->{'Status'} = CFGM_NEW; + } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN state (CFGM_ONLINE && SHAPER_LIVE)", - $pool->{'Identifier'}, - $pid + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN state '%s'", + $pool->{'Name'}, + $pid, + $shaperState ); } @@ -1004,9 +1012,9 @@ sub _session_tick } elsif ($pool->{'Status'} == CFGM_CHANGED) { # If the shaper is live we can go ahead - if ($shaperState == SHAPER_LIVE) { + if ($shaperState & SHAPER_LIVE) { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] has been modified, sending to shaper", - $pool->{'Identifier'}, + $pool->{'Name'}, $pid ); $kernel->post('shaper' => 'pool_change' => $pid); @@ -1016,18 +1024,18 @@ sub _session_tick # Remove from queue delete($poolChangeQueue->{$pid}); - } elsif ($shaperState == SHAPER_NOTLIVE) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] has been modified but not live, re-queue as add", - $pool->{'Identifier'}, + } elsif ($shaperState & SHAPER_NOTLIVE) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] has been modified and is not live, re-queue as add", + $pool->{'Name'}, $pid ); $pool->{'Status'} = CFGM_NEW; } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN state (CFGM_CHANGED && !SHAPER_LIVE && ". - "!SHAPER_NOTLIVE)", - $pool->{'Identifier'}, - $pid + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN state '%s'", + $pool->{'Name'}, + $pid, + $shaperState ); } @@ -1036,13 +1044,13 @@ sub _session_tick } elsif ($pool->{'Status'} == CFGM_OFFLINE) { # If the change is live, but should go offline, queue it - if ($shaperState == SHAPER_LIVE) { + if ($shaperState & SHAPER_LIVE) { - if ($now - $pool->{'LastUpdate'} > 30) { + if ($now - $pool->{'LastUpdate'} > TIMEOUT_EXPIRE_OFFLINE) { # If we still have pool members, we got to abort if (!getPoolMembers($pid)) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] marked offline and stale, removing from shaper", - $pool->{'Identifier'}, + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] marked offline and expired, removing from shaper", + $pool->{'Name'}, $pid ); $kernel->post('shaper' => 'pool_remove' => $pid); @@ -1050,7 +1058,7 @@ sub _session_tick } else { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] marked offline, but still has pool members, ". "aborting remove", - $pool->{'Identifier'}, + $pool->{'Name'}, $pid ); $pool->{'Status'} = CFGM_ONLINE; @@ -1065,30 +1073,25 @@ sub _session_tick my $poolMember = $poolMembers->{$pmid}; # Only remove ones online if ($poolMember->{'Status'} == CFGM_ONLINE) { - $logger->log(LOG_INFO,"[CONFIGMANAGER] Pool '%s' [%s] marked offline and fresh, removing pool ". - "member [%s]", - $pool->{'Identifier'}, + $logger->log(LOG_INFO,"[CONFIGMANAGER] Pool '%s' [%s] marked offline and not expired, removing ". + "pool member [%s]", + $pool->{'Name'}, $pid, $pmid ); removePoolMember($pmid); } } - } else { - $logger->log(LOG_INFO,"[CONFIGMANAGER] Pool '%s' [%s] marked offline and fresh, postponing", - $pool->{'Identifier'}, - $pid - ); } } - } elsif ($shaperState == SHAPER_NOTLIVE) { + } elsif ($shaperState & SHAPER_NOTLIVE) { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' [%s] marked offline and is not live, removing", - $pool->{'identifier'}, + $pool->{'Name'}, $pid ); - # Remove pool from identifier map - delete($poolIdentifierMap->{$pool->{'InterfaceGroupID'}}->{$pool->{'Identifier'}}); + # Remove pool from name map + delete($poolNameMap->{$pool->{'InterfaceGroupID'}}->{$pool->{'Name'}}); # Remove pool member mapping delete($poolMemberMap->{$pool->{'ID'}}); # Remove from queue @@ -1100,8 +1103,8 @@ sub _session_tick } } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN state '%s'", - $pool->{'Identifier'}, + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' [%s] has UNKNOWN status '%s'", + $pool->{'Name'}, $pid, $pool->{'Status'} ); @@ -1114,13 +1117,13 @@ sub _session_tick my $pool = $pools->{$poolMember->{'PoolID'}}; my $shaperState = getPoolMemberShaperState($poolMember->{'ID'}); - # Pool is newly added + # Pool member is newly added if ($poolMember->{'Status'} == CFGM_NEW) { # If the change is not yet live, we should queue it to go live - if ($shaperState == SHAPER_NOTLIVE) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] new and not live, adding to shaper", - $pool->{'Identifier'}, + if ($shaperState & SHAPER_NOTLIVE) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] new and is not live, adding to shaper", + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid ); @@ -1130,11 +1133,13 @@ sub _session_tick $poolMember->{'Status'} = CFGM_ONLINE; # Remove from queue delete($poolMemberChangeQueue->{$pmid}); + } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN state (CFGM_NEW && !SHAPER_NOTLIVE)", - $pool->{'Identifier'}, + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN state '%s'", + $pool->{'Name'}, $poolMember->{'IPAddress'}, - $pmid + $pmid, + $shaperState ); } @@ -1143,18 +1148,20 @@ sub _session_tick # We've transitioned more than likely from offline, any state to online # We don't care if the shaper is pending removal, we going to force re-adding now - if ($shaperState != SHAPER_LIVE) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] online and not in live state, re-queue as add", - $pool->{'Identifier'}, + if (!($shaperState & SHAPER_LIVE)) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] online and is not live, re-queue as add", + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid ); $poolMember->{'Status'} = CFGM_NEW; + } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN state (CFGM_ONLINE && SHAPER_LIVE)", - $pool->{'Identifier'}, + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN state '%s'", + $pool->{'Name'}, $poolMember->{'IPAddress'}, - $pmid + $pmid, + $shaperState ); } @@ -1163,9 +1170,9 @@ sub _session_tick } elsif ($poolMember->{'Status'} == CFGM_CHANGED) { # If the shaper is live we can go ahead - if ($shaperState == SHAPER_LIVE) { + if ($shaperState & SHAPER_LIVE) { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has been modified, sending to shaper", - $pool->{'Identifier'}, + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid ); @@ -1176,20 +1183,21 @@ sub _session_tick # Remove from queue delete($poolMemberChangeQueue->{$pmid}); - } elsif ($shaperState == SHAPER_NOTLIVE) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has been modified but not live, re-queue as ". + } elsif ($shaperState & SHAPER_NOTLIVE) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has been modified and is not live, re-queue as ". "add", - $pool->{'Identifier'}, + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid ); $poolMember->{'Status'} = CFGM_NEW; + } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN state (CFGM_CHANGED && ". - "!SHAPER_LIVE && !SHAPER_NOTLIVE)", - $pool->{'Identifier'}, + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN state '%s'", + $pool->{'Name'}, $poolMember->{'IPAddress'}, - $pmid + $pmid, + $shaperState ); } @@ -1198,28 +1206,29 @@ sub _session_tick } elsif ($poolMember->{'Status'} == CFGM_OFFLINE) { # If the change is live, but should go offline, queue it - if ($shaperState == SHAPER_LIVE) { + if ($shaperState & SHAPER_LIVE) { - if ($now - $poolMember->{'LastUpdate'} > 10) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] marked offline and stale, removing from ". - "shaper", - $pool->{'Identifier'}, + if ($now - $poolMember->{'LastUpdate'} > TIMEOUT_EXPIRE_OFFLINE) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] marked offline and expired, removing ". + "from shaper", + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid ); $kernel->post('shaper' => 'poolmember_remove' => $pmid); setPoolMemberShaperState($poolMember->{'ID'},SHAPER_PENDING); + } else { $logger->log(LOG_INFO,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] marked offline and fresh, postponing", - $pool->{'Identifier'}, + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid ); } - } elsif ($shaperState == SHAPER_NOTLIVE) { + } elsif ($shaperState & SHAPER_NOTLIVE) { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] marked offline and is not live, removing", - $pool->{'Identifier'}, + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid ); @@ -1236,8 +1245,8 @@ sub _session_tick } } else { - $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN state '%s'", - $pool->{'Identifier'}, + $logger->log(LOG_ERR,"[CONFIGMANAGER] Pool '%s' member '%s' [%s] has UNKNOWN status '%s'", + $pool->{'Name'}, $poolMember->{'IPAddress'}, $pmid, $poolMember->{'Status'} @@ -1728,46 +1737,46 @@ sub createPool my $now = time(); - # Now check if the identifier is valid - if (!defined($pool->{'Identifier'} = $poolData->{'Identifier'})) { - $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Cannot process pool add as Identifier is invalid"); + # Now check if the name is valid + if (!defined($pool->{'Name'} = $poolData->{'Name'})) { + $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Cannot process pool add as Name is invalid"); return; } # Check interface group ID is OK if (!defined($pool->{'InterfaceGroupID'} = isInterfaceGroupIDValid($poolData->{'InterfaceGroupID'}))) { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Cannot process pool add for '%s' as the InterfaceGroupID is invalid", - $pool->{'Identifier'} + $pool->{'Name'} ); return; } - # If we already have this identifier added, return it as the pool - if (defined(my $pool = $poolIdentifierMap->{$pool->{'InterfaceGroupID'}}->{$pool->{'Identifier'}})) { + # If we already have this name added, return it as the pool + if (defined(my $pool = $poolNameMap->{$pool->{'InterfaceGroupID'}}->{$pool->{'Name'}})) { return $pool->{'ID'}; } # Check class is OK - if (!defined($pool->{'ClassID'} = isClassIDValid($poolData->{'ClassID'}))) { + if (!defined($pool->{'ClassID'} = isTrafficClassIDValid($poolData->{'ClassID'}))) { $logger->log(LOG_NOTICE,"[CONFIGMANAGER] Cannot process pool add for '%s' as the ClassID is invalid", - $pool->{'Identifier'} + $pool->{'Name'} ); return; } # Make sure things are not attached to the default pool if (defined($config->{'default_pool'}) && $pool->{'ClassID'} eq $config->{'default_pool'}) { $logger->log(LOG_WARN,"[CONFIGMANAGER] Cannot process pool add for '%s' as the ClassID is the 'default_pool' ClassID", - $pool->{'Identifier'} + $pool->{'Name'} ); return; } # Check traffic limits if (!isNumber($pool->{'TrafficLimitTx'} = $poolData->{'TrafficLimitTx'})) { $logger->log(LOG_WARN,"[CONFIGMANAGER] Cannot process pool add for '%s' as the TrafficLimitTx is invalid", - $pool->{'Identifier'} + $pool->{'Name'} ); return; } if (!isNumber($pool->{'TrafficLimitRx'} = $poolData->{'TrafficLimitRx'})) { $logger->log(LOG_WARN,"[CONFIGMANAGER] Cannot process pool add for '%s' as the TrafficLimitRx is invalid", - $pool->{'Identifier'} + $pool->{'Name'} ); return; } @@ -1800,8 +1809,8 @@ sub createPool # Add pool $pools->{$pool->{'ID'}} = $pool; - # Link pool identifier map - $poolIdentifierMap->{$pool->{'InterfaceGroupID'}}->{$pool->{'Identifier'}} = $pool; + # Link pool name map + $poolNameMap->{$pool->{'InterfaceGroupID'}}->{$pool->{'Name'}} = $pool; # Blank our pool member mapping $poolMemberMap->{$pool->{'ID'}} = { }; @@ -1914,23 +1923,23 @@ sub getPool } -# Function to get a pool member by its identifier -sub getPoolByIdentifer +# Function to get a pool by its name +sub getPoolByName { - my ($interfaceGroupID,$identifier) = @_; + my ($interfaceGroupID,$name) = @_; # Make sure both params are defined or we get warnings - if (!defined($interfaceGroupID) || !defined($identifier)) { + if (!defined($interfaceGroupID) || !defined($name)) { return; } # Maybe it doesn't exist? - if (!defined($poolIdentifierMap->{$interfaceGroupID}) || !defined($poolIdentifierMap->{$interfaceGroupID}->{$identifier})) { + if (!defined($poolNameMap->{$interfaceGroupID}) || !defined($poolNameMap->{$interfaceGroupID}->{$name})) { return; } - return dclone($poolIdentifierMap->{$interfaceGroupID}->{$identifier}); + return dclone($poolNameMap->{$interfaceGroupID}->{$name}); } @@ -1997,9 +2006,9 @@ sub setPoolShaperState return; } - $pools->{$pid}->{'.shaper_state'} = $state; + $pools->{$pid}->{'.shaper_state'} |= $state; - return $state; + return $pools->{$pid}->{'.shaper_state'}; } @@ -2061,7 +2070,7 @@ sub isPoolReady return; } - return ($pools->{$pid}->{'Status'} == CFGM_ONLINE && $state == SHAPER_LIVE); + return ($pools->{$pid}->{'Status'} == CFGM_ONLINE && $state & SHAPER_LIVE); } @@ -2333,8 +2342,37 @@ sub getPoolMember } -# Function to return pool member ID's with a certain IP address -sub getPoolMembersByIP +# Function to return a list of pool ID's +sub getPoolMemberByUsernameIP +{ + my ($pid,$username,$ipAddress) = @_; + + + # Check pool exists first + if (!isPoolIDValid($pid)) { + return; + } + + # Check our member map is not undefined + if (!defined($poolMemberMap->{$pid})) { + return; + } + + # Loop with pool members and grab the match, there can only be one as we cannot conflict username and IP + foreach my $pmid (keys %{$poolMemberMap->{$pid}}) { + my $poolMember = $poolMemberMap->{$pid}->{$pmid}; + + if ($poolMember->{'Username'} eq $username && $poolMember->{'IPAddress'} eq $ipAddress) { + return $pmid; + } + } + + return; +} + + +# Function to return pool member ID's with a certain IP address using an interface group +sub getAllPoolMembersByInterfaceGroupIP { my ($interfaceGroupID,$ipAddress) = @_; @@ -2378,7 +2416,7 @@ sub isPoolMemberReady return; } - return ($poolMembers->{$pmid}->{'Status'} == CFGM_ONLINE && getPoolMemberShaperState($pmid) == SHAPER_LIVE); + return ($poolMembers->{$pmid}->{'Status'} == CFGM_ONLINE && getPoolMemberShaperState($pmid) & SHAPER_LIVE); } @@ -2426,9 +2464,9 @@ sub setPoolMemberShaperState return; } - $poolMembers->{$pmid}->{'.shaper_state'} = $state; + $poolMembers->{$pmid}->{'.shaper_state'} |= $state; - return $state; + return $poolMembers->{$pmid}->{'.shaper_state'}; } @@ -2529,10 +2567,10 @@ sub createLimit return; } - my $poolIdentifier = $limitData->{'Username'}; + my $poolName = $limitData->{'Username'}; my $poolData = { 'FriendlyName' => $limitData->{'IPAddress'}, - 'Identifier' => $poolIdentifier, + 'Name' => $poolName, 'InterfaceGroupID' => $limitData->{'InterfaceGroupID'}, 'ClassID' => $limitData->{'ClassID'}, 'TrafficLimitTx' => $limitData->{'TrafficLimitTx'}, @@ -2671,7 +2709,7 @@ sub removeOverride delete($pool->{'.applied_overrides'}->{$override->{'ID'}}); # If the pool is online and live, trigger a change - if ($pool->{'Status'} == CFGM_ONLINE && getPoolShaperState($pid) == SHAPER_LIVE) { + if ($pool->{'Status'} == CFGM_ONLINE && getPoolShaperState($pid) & SHAPER_LIVE) { $poolChangeQueue->{$pool->{'ID'}} = $pool; $pool->{'Status'} = CFGM_CHANGED; } @@ -2846,7 +2884,7 @@ sub _override_resolve while ((my $pid, my $pool) = each(%{$poolHash})) { # Build a candidate from the pool my $candidate = { - 'PoolIdentifier' => $pool->{'Identifier'}, + 'PoolName' => $pool->{'Name'}, }; # If we only have 1 member in the pool, add its username, IP and group @@ -2905,7 +2943,7 @@ sub _override_resolve $logger->log(LOG_DEBUG,"[CONFIGMANAGER] Override '%s' [%s] applied to pool '%s' [%s]", $override->{'FriendlyName'}, $override->{'ID'}, - $pool->{'Identifier'}, + $pool->{'Name'}, $pool->{'ID'} ); @@ -2919,7 +2957,7 @@ sub _override_resolve $logger->log(LOG_DEBUG,"[CONFIGMANAGER] Override '%s' no longer applies to pool '%s' [%s]", $override->{'ID'}, - $pool->{'Identifier'}, + $pool->{'Name'}, $pool->{'ID'} ); } @@ -2934,7 +2972,7 @@ sub _override_resolve # If there were pool changes, trigger a pool update if (keys %{$poolChanges} > 0) { # If the pool is currently online and live, trigger a change - if ($pool->{'Status'} == CFGM_ONLINE && getPoolShaperState($pid) == SHAPER_LIVE) { + if ($pool->{'Status'} == CFGM_ONLINE && getPoolShaperState($pid) & SHAPER_LIVE) { $pool->{'Status'} = CFGM_CHANGED; $poolChangeQueue->{$pool->{'ID'}} = $pool; } diff --git a/opentrafficshaper/plugins/statistics/statistics.pm b/opentrafficshaper/plugins/statistics/statistics.pm index 23e155094f8cbf287b3b36e78dc7d880665b5e7d..73ab7f5f4b7ad71558b944e898629b67d18ebd12 100644 --- a/opentrafficshaper/plugins/statistics/statistics.pm +++ b/opentrafficshaper/plugins/statistics/statistics.pm @@ -943,7 +943,7 @@ sub _getIdentifierFromPID return undef; } - return sprintf("Pool:%s",$pool->{'Identifier'}); + return sprintf("Pool:%s",$pool->{'Name'}); } diff --git a/opentrafficshaper/plugins/tc/tc.pm b/opentrafficshaper/plugins/tc/tc.pm index 21de0ca07b366e33aac9bf82f304a70eed226dea..5f99ea219a1229eda03a0a1326e00cfe0581ea52 100644 --- a/opentrafficshaper/plugins/tc/tc.pm +++ b/opentrafficshaper/plugins/tc/tc.pm @@ -35,8 +35,9 @@ use opentrafficshaper::plugins::configmanager qw( removePoolAttribute getPoolTxInterface getPoolRxInterface - getPoolShaperState setPoolShaperState + unsetPoolShaperState + getPoolShaperState getEffectivePool @@ -46,6 +47,7 @@ use opentrafficshaper::plugins::configmanager qw( removePoolMemberAttribute getPoolMemberMatchPriority setPoolMemberShaperState + unsetPoolMemberShaperState getPoolMemberShaperState getTrafficClassPriority @@ -242,7 +244,7 @@ sub _session_pool_add } $logger->log(LOG_INFO,"[TC] Add pool '%s' to interface group '%s' [%s]", - $pool->{'Identifier'}, + $pool->{'Name'}, $pool->{'InterfaceGroupID'}, $pool->{'ID'} ); @@ -300,6 +302,7 @@ sub _session_pool_add setPoolAttribute($pool->{'ID'},'shaper.live.TrafficLimitRxBurst',$trafficLimitRxBurst); # Mark as live + unsetPoolShaperState($pool->{'ID'},SHAPER_NOTLIVE|SHAPER_PENDING); setPoolShaperState($pool->{'ID'},SHAPER_LIVE); } @@ -320,16 +323,16 @@ sub _session_pool_remove } # Make sure its not NOTLIVE - if (getPoolShaperState($pid) == SHAPER_NOTLIVE) { + if (getPoolShaperState($pid) & SHAPER_NOTLIVE) { $logger->log(LOG_WARN,"[TC] Ignoring remove for pool '%s' [%s]", - $pool->{'Identifier'}, + $pool->{'Name'}, $pool->{'ID'} ); return; } $logger->log(LOG_INFO,"[TC] Removing pool '%s' [%s]", - $pool->{'Identifier'}, + $pool->{'Name'}, $pool->{'ID'} ); @@ -370,9 +373,6 @@ sub _session_pool_remove # Post changeset $kernel->post("_tc" => "queue" => $changeSet); - # Mark as not live - setPoolShaperState($pool->{'ID'},SHAPER_NOTLIVE); - # Cleanup attributes removePoolAttribute($pool->{'ID'},'tc.txclass'); removePoolAttribute($pool->{'ID'},'tc.rxclass'); @@ -382,6 +382,10 @@ sub _session_pool_remove removePoolAttribute($pool->{'ID'},'shaper.live.TrafficLimitTxBurst'); removePoolAttribute($pool->{'ID'},'shaper.live.TrafficLimitRx'); removePoolAttribute($pool->{'ID'},'shaper.live.TrafficLimitRxBurst'); + + # Mark as not live + unsetPoolShaperState($pool->{'ID'},SHAPER_LIVE|SHAPER_PENDING); + setPoolShaperState($pool->{'ID'},SHAPER_NOTLIVE); } @@ -394,7 +398,7 @@ sub _session_pool_change # Grab pool my $pool = getPool($pid); - $logger->log(LOG_INFO,"[TC] Processing changes for '%s' [%s]",$pool->{'Identifier'},$pool->{'ID'}); + $logger->log(LOG_INFO,"[TC] Processing changes for '%s' [%s]",$pool->{'Name'},$pool->{'ID'}); # Grab our effective pool my $effectivePool = getEffectivePool($pool->{'ID'}); @@ -434,7 +438,9 @@ sub _session_pool_change setPoolAttribute($pool->{'ID'},'shaper.live.TrafficLimitTxBurst',$trafficLimitTxBurst); setPoolAttribute($pool->{'ID'},'shaper.live.TrafficLimitRx',$trafficLimitRx); setPoolAttribute($pool->{'ID'},'shaper.live.TrafficLimitRxBurst',$trafficLimitRxBurst); + # Mark as live + unsetPoolShaperState($pool->{'ID'},SHAPER_NOTLIVE|SHAPER_PENDING); setPoolShaperState($pool->{'ID'},SHAPER_LIVE); } @@ -638,6 +644,7 @@ sub _session_poolmember_add $kernel->post("_tc" => "queue" => $changeSet); # Mark pool member as live + unsetPoolMemberShaperState($poolMember->{'ID'},SHAPER_NOTLIVE|SHAPER_PENDING); setPoolMemberShaperState($poolMember->{'ID'},SHAPER_LIVE); } @@ -659,12 +666,12 @@ sub _session_poolmember_remove my $pool = getPool($poolMember->{'PoolID'}); # Make sure its not NOTLIVE - if (getPoolMemberShaperState($pmid) == SHAPER_NOTLIVE) { + if (getPoolMemberShaperState($pmid) & SHAPER_NOTLIVE) { $logger->log(LOG_WARN,"[TC] Ignoring remove for pool member '%s' with IP '%s' [%s] from pool '%s'", $poolMember->{'Username'}, $poolMember->{'IPAddress'}, $poolMember->{'ID'}, - $pool->{'Identifier'} + $pool->{'Name'} ); return; } @@ -673,7 +680,7 @@ sub _session_poolmember_remove $poolMember->{'Username'}, $poolMember->{'IPAddress'}, $poolMember->{'ID'}, - $pool->{'Identifier'} + $pool->{'Name'} ); # Grab our interfaces @@ -713,12 +720,13 @@ sub _session_poolmember_remove # Post changeset $kernel->post("_tc" => "queue" => $changeSet); - # Mark as not live - setPoolMemberShaperState($poolMember->{'ID'},SHAPER_NOTLIVE); - # Cleanup attributes removePoolMemberAttribute($poolMember->{'ID'},'tc.txfilter'); removePoolMemberAttribute($poolMember->{'ID'},'tc.rxfilter'); + + # Mark as not live + unsetPoolMemberShaperState($poolMember->{'ID'},SHAPER_LIVE|SHAPER_PENDING); + setPoolMemberShaperState($poolMember->{'ID'},SHAPER_NOTLIVE); } diff --git a/opentrafficshaper/plugins/webserver/pages/limits.pm b/opentrafficshaper/plugins/webserver/pages/limits.pm index 4f3afc05bde05b8d78b7b4cad6bb1f1929f876f3..140baa6ee5d42c83a20d3212ce955d42341c7b71 100644 --- a/opentrafficshaper/plugins/webserver/pages/limits.pm +++ b/opentrafficshaper/plugins/webserver/pages/limits.pm @@ -52,13 +52,13 @@ use opentrafficshaper::utils qw( use opentrafficshaper::plugins::configmanager qw( getPools getPool - getPoolByIdentifer + getPoolByName getPoolShaperState isPoolReady getPoolMembers getPoolMember - getPoolMembersByIP + getAllPoolMembersByInterfaceGroupIP getPoolMemberShaperState isPoolMemberReady @@ -144,7 +144,7 @@ sub pool_list <tr> <th></th> <th>Friendly Name</th> - <th>Identifier</th> + <th>Name</th> <th>Expires</th> <th></th> <th>Class</th> @@ -180,10 +180,10 @@ EOF my $friendlyName = (defined($pool->{'FriendlyName'}) && $pool->{'FriendlyName'} ne "") ? $pool->{'FriendlyName'} : - $pool->{'Identifier'}; + $pool->{'Name'}; my $friendlyNameEncoded = encode_entities($friendlyName); - my $identifierEncoded = encode_entities($pool->{'Identifier'}); + my $nameEncoded = encode_entities($pool->{'Name'}); my $expiresStr = ($pool->{'Expires'} > 0) ? DateTime->from_epoch( epoch => $pool->{'Expires'} )->iso8601() : '-never-'; @@ -191,7 +191,7 @@ EOF # Display relevant icons depending on pool status my $icons = ""; - if (getPoolShaperState($pool->{'ID'}) == SHAPER_NOTLIVE || $pool->{'Status'} == CFGM_CHANGED) { + if (getPoolShaperState($pool->{'ID'}) & SHAPER_NOTLIVE || $pool->{'Status'} == CFGM_CHANGED) { $icons .= '<span class="glyphicon glyphicon-time" />'; } if ($pool->{'Status'} == CFGM_NEW) { @@ -212,7 +212,7 @@ EOF <tr> <td>$icons</td> <td>$friendlyNameEncoded</td> - <td>$identifierEncoded</td> + <td>$nameEncoded</td> <td>$expiresStr</td> <td><span class="glyphicon glyphicon-arrow-right" /></td> <td>$classStr</td> @@ -267,7 +267,7 @@ sub pool_addedit # Items for our form... my @formElements = qw( FriendlyName - Identifier + Name InterfaceGroupID ClassID TrafficLimitTx TrafficLimitTxBurst @@ -356,16 +356,16 @@ sub pool_addedit my $friendlyName = $formData->{'FriendlyName'}; # Check POST data - my $identifier; - if (!defined($identifier = isUsername($formData->{'Identifier'}))) { - push(@errors,"Identifier is not valid"); + my $name; + if (!defined($name = isUsername($formData->{'Name'}))) { + push(@errors,"Name is not valid"); } my $interfaceGroupID; if (!defined($interfaceGroupID = isInterfaceGroupIDValid($formData->{'InterfaceGroupID'}))) { push(@errors,"Interface group is not valid"); } - if ($formType ne "Edit" && getPoolByIdentifer($interfaceGroupID,$identifier)) { - push(@errors,"A pool with the same identifier already exists"); + if ($formType ne "Edit" && getPoolByName($interfaceGroupID,$name)) { + push(@errors,"A pool with the same name already exists"); } my $classID; if (!defined($classID = isTrafficClassIDValid($formData->{'ClassID'}))) { @@ -427,7 +427,7 @@ sub pool_addedit # Build pool details my $poolData = { 'FriendlyName' => $friendlyName, - 'Identifier' => $identifier, + 'Name' => $name, 'InterfaceGroupID' => $interfaceGroupID, 'ClassID' => $classID, 'TrafficLimitTx' => $trafficLimitTx, @@ -450,10 +450,10 @@ sub pool_addedit $kernel->post("configmanager" => $cEvent => $poolData); - $logger->log(LOG_INFO,"[WEBSERVER/LIMITS] Pool: %s, Identifier: %s, InterfaceGroup: %s, Class: %s, Limits: %s/%s, ". + $logger->log(LOG_INFO,"[WEBSERVER/LIMITS] Pool: %s, Name: %s, InterfaceGroup: %s, Class: %s, Limits: %s/%s, ". "Burst: %s/%s", $formType, - prettyUndef($identifier), + prettyUndef($name), prettyUndef($interfaceGroupID), prettyUndef($classID), prettyUndef($trafficLimitTx), @@ -548,11 +548,11 @@ EOF </div> </div> <div class="form-group"> - <label for="Identifier" class="col-md-2 control-label">Identifier</label> + <label for="Name" class="col-md-2 control-label">Name</label> <div class="row"> <div class="col-md-4 input-group"> - <input name="Identifier" type="text" placeholder="Identifier" class="form-control" - value="$formData->{'Identifier'}" $formNoEdit /> + <input name="Name" type="text" placeholder="Name" class="form-control" + value="$formData->{'Name'}" $formNoEdit /> <span class="input-group-addon">*</span> </div> </div> @@ -720,12 +720,12 @@ EOF # Make the pool ID safe for HTML my $encodedPID = encode_entities($queryParams->{'pid'}->{'value'}); # Make the friendly name HTML safe - my $encodedIdentifier = encode_entities($pool->{'Identifier'}); + my $encodedName = encode_entities($pool->{'Name'}); # Build our confirmation dialog $content .= <<EOF; <div class="alert alert-danger"> - Are you very sure you wish to remove pool for "$encodedIdentifier"? + Are you very sure you wish to remove pool for "$encodedName"? </div> <form role="form" method="post"> <input type="submit" class="btn btn-primary" name="confirm" value="Yes" /> @@ -782,9 +782,9 @@ EOF my $pidEscaped = encode_entities($pool->{'ID'}); my $poolFriendlyName = (defined($pool->{'FriendlyName'}) && $pool->{'FriendlyName'} ne "") ? $pool->{'FriendlyName'} : - $pool->{'Identifier'}; + $pool->{'Name'}; my $poolFriendlyNameEncoded = encode_entities($poolFriendlyName); - my $poolIdentifierEncoded = encode_entities($pool->{'Identifier'}); + my $poolNameEncoded = encode_entities($pool->{'Name'}); # Menu $customMenu = [ @@ -803,7 +803,7 @@ EOF $content .=<<EOF; <legend> <a href="pool-list"><span class="glyphicon glyphicon-circle-arrow-left"></span></a> - Pool Member List: '$poolFriendlyNameEncoded' [$poolIdentifierEncoded] + Pool Member List: '$poolFriendlyNameEncoded' [$poolNameEncoded] </legend> <table class="table"> <thead> @@ -848,7 +848,7 @@ EOF # Display relevant icons depending on pool status my $icons = ""; - if (getPoolMemberShaperState($poolMember->{'ID'}) ne SHAPER_LIVE) { + if (!(getPoolMemberShaperState($poolMember->{'ID'}) & SHAPER_LIVE)) { $icons .= '<span class="glyphicon glyphicon-time" />'; } if ($poolMember->{'Status'} == CFGM_NEW) { @@ -1042,7 +1042,7 @@ sub poolmember_addedit } if ($formType eq "Add") { - if (getPoolMembersByIP($pool->{'InterfaceGroupID'},$ipAddress)) { + if (getAllPoolMembersByInterfaceGroupIP($pool->{'InterfaceGroupID'},$ipAddress)) { push(@errors,"A pool member with the same IP address already exists"); } } elsif ($formType eq "Edit") { @@ -1803,7 +1803,7 @@ EOF my $friendlyNameEncoded = prettyUndef(encode_entities($override->{'FriendlyName'})); my $usernameEncoded = prettyUndef(encode_entities($override->{'Username'})); - my $poolIdentifierEncoded = prettyUndef(encode_entities($override->{'PoolIdentifier'})); + my $poolNameEncoded = prettyUndef(encode_entities($override->{'PoolName'})); my $ipAddress = prettyUndef($override->{'IPAddress'}); my $expiresStr = ($override->{'Expires'} > 0) ? DateTime->from_epoch( epoch => $override->{'Expires'} )->iso8601() : '-never-'; @@ -1818,7 +1818,7 @@ EOF <tr> <td></td> <td>$friendlyNameEncoded</td> - <td>$poolIdentifierEncoded</td> + <td>$poolNameEncoded</td> <td>$usernameEncoded</td> <td>$ipAddress</td> <td>$expiresStr</td> @@ -1869,7 +1869,7 @@ sub override_addedit # Items for our form... my @formElements = qw( FriendlyName - PoolIdentifier Username IPAddress + PoolName Username IPAddress ClassID TrafficLimitTx TrafficLimitTxBurst TrafficLimitRx TrafficLimitRxBurst @@ -1970,12 +1970,12 @@ sub override_addedit push(@errors,"Friendly name must be specified"); } - # Make sure we have at least a pool identifier, username or IP address - my $poolIdentifier = isUsername($formData->{'PoolIdentifier'}); + # Make sure we have at least a pool name, username or IP address + my $poolName = isUsername($formData->{'PoolName'}); my $username = isUsername($formData->{'Username'}); my $ipAddress = isIP($formData->{'IPAddress'}); - if (!defined($poolIdentifier) && !defined($username) && !defined($ipAddress)) { - push(@errors,"A pool identifier and/or IP address and/or Username must be specified"); + if (!defined($poolName) && !defined($username) && !defined($ipAddress)) { + push(@errors,"A pool name and/or IP address and/or Username must be specified"); } # If the traffic class is ticked, process it @@ -2058,7 +2058,7 @@ sub override_addedit # Build override my $overrideData = { 'FriendlyName' => $friendlyName, - 'PoolIdentifier' => $poolIdentifier, + 'PoolName' => $poolName, 'Username' => $username, 'IPAddress' => $ipAddress, # 'GroupID' => 1, @@ -2084,7 +2084,7 @@ sub override_addedit $logger->log(LOG_INFO,"[WEBSERVER/OVERRIDE/ADD] Pool: %s, User: %s, IP: %s, Group: %s, Class: %s, Limits: %s/%s, ". "Burst: %s/%s", - prettyUndef($poolIdentifier), + prettyUndef($poolName), prettyUndef($username), prettyUndef($ipAddress), "", @@ -2176,11 +2176,11 @@ EOF </div> </div> <div class="form-group"> - <label for="PoolIdentifier" class="col-md-2 control-label">Pool Identifier</label> + <label for="PoolName" class="col-md-2 control-label">Pool Name</label> <div class="row"> <div class="col-md-4"> - <input name="PoolIdentifier" type="text" placeholder="Pool Identifier To Override" class="form-control" - value="$formData->{'PoolIdentifier'}" $formNoEdit/> + <input name="PoolName" type="text" placeholder="Pool Name To Override" class="form-control" + value="$formData->{'PoolName'}" $formNoEdit/> </div> </div> </div>