wireless topics

Disable HA-SSO and enable HA-SSO on cisco WLCs AIR-CT5508-K9

WLCs AIR-CT5508-K9 or AIR-CT2504-K9 have reached “End of Vulnerability/Security Support” by July 31, 2021 ( link ) but there are still should be many deployments worldwide. In some deployments AIR-CT5508-K9 may run in HA-SSO redundancy mode.

There may be a case when its needed to disable HA-SSO and enable it back (e.g. for changing VLAN number for WLC’s management interface or IP address of management interface). HA-SSO can be disabled from web interface in “Controller -> Redundancy -> Global Configuration -> SSO -> disabled” field. Related message will appear informing that standby WLC will reboot itself and disable all ports per its designed logic:

Pic 1 – Warning that standby WLC will stay with disabled all ports after disabling HA-SSO mode

After all related changes have been completed (e.g. changing VLAN number for WLC’s management interface or IP address of management interface) its needed to restore HA-SSO redundancy mode. Firstly, HA-SSO should be enabled on the primary WLC: Controller -> Redundancy -> Global Configuration -> SSO -> enabled” field, then per design it will be needed a console (or access via service port) connection to the secondary WLC. In console connection its needed enable all the ports by command

config port adminmode all enable

and reboot WLC. Without mentioned actions there will be such message after attempts for enable HA-SSO on the secondary WLC (by command “config redundancy mode sso“):

“Please enable adminmode for redundancy management interface port before enabling redundancy.”

More details are under related cisco doc link “High Availability (SSO) Deployment Guide” (with ugly unreadable screens there though)

automation, configuration, Uncategorized

Get all IP subnets (with descriptions) deployed on sites with Cisco and Aruba switches/routers

Often its needed to get all subnets which are deployed on sites.

Following java files will allow to get a table with such subnets and their description from config files of Cisco and Aruba switches/routers. These java files are using java regex to achieve such result and compiled with javac version 1.8.0_251 (for newer version of JVM these files may not work due to major changes in new versions of JMVs from oracle).

Current version of such APP does not offer GUI, operations and results are in command line of windows / linux. Usage example:

java -jar C:\temp\get_subnets_from_Cisco_v1.1.jar C:\temp\ABC\cisco* > c:\temp\ABC\cisco_networks.txt

Result example (file can be opened in excel or LibreOffice for sorting via IPs and further operation):

IP for sortIPsubnetswitchinterfaceinterface numberdescription
010.105.069.12810.105.69.128255.255.255.255Core001Loopback0 Loopback Interface for network management 
010.105.069.13010.105.69.130255.255.255.255Core002Loopback0 Loopback Interface for network management 
010.105.069.13210.105.69.132255.255.255.255Dis01Loopback0 Loopback Interface for network management 
010.105.069.13410.105.69.134255.255.255.255Dis02Loopback0 Loopback Interface for network management 
010.105.069.13610.105.69.136255.255.255.255di-03Loopback0 Loopback Interface for network management 
010.105.069.13810.105.69.138255.255.255.255di-04Loopback0 Loopback Interface for network management 
010.105.068.00210.105.68.2255.255.255.128Core001Vlan1Mgmt-VLAN 
010.105.068.00310.105.68.3255.255.255.128Core002Vlan1Mgmt-VLAN 
010.105.068.13010.105.68.130255.255.255.128Dis01Vlan1Mgmt-VLAN 
010.105.068.13110.105.68.131255.255.255.128Dis02Vlan1Mgmt-VLAN 
100.105.069.002100.105.69.2255.255.255.128di-03Vlan1Mgmt-VLAN 
100.105.069.003100.105.69.3255.255.255.128di-04Vlan1Mgmt-VLAN 
010.194.054.13010.194.54.130255.255.255.252Core001TenGigabitEthernet1/0/1 connection to WAN 
010.194.054.13410.194.54.134255.255.255.252Core002TenGigabitEthernet1/0/1 connection to WAN
010.194.054.15010.194.54.150255.255.255.252Dis01TenGigabitEthernet1/0/1 connect to Core001, Te 1/0/2 no switchport 
010.194.054.15410.194.54.154255.255.255.252Dis02TenGigabitEthernet1/0/1 connect toCore002, Te 1/0/2 no switchport 
010.105.069.19810.105.69.198255.255.255.252di-03TenGigabitEthernet1/0/1 uplink to Core001 no switchport 
010.105.069.20210.105.69.202255.255.255.252di-04TenGigabitEthernet1/0/1 uplink to Core002 no switchport 
192.168.054.149192.168.54.149255.255.255.252Core001TenGigabitEthernet1/0/2 connection to Dis01, Te1/0/1 no switchport 
192.168.054.153192.168.54.153255.255.255.252Core002TenGigabitEthernet1/0/2 connection to Dis02, Te1/0/1 no switchport 
192.168.069.197192.168.69.197255.255.255.252Core001TenGigabitEthernet1/0/3 connection to Dis05, Ge1/0/1 no switchport 
192.168.069.201192.168.69.201255.255.255.252Core002TenGigabitEthernet1/0/3 connection to Dis05, Ge1/0/1 no switchport 
010.010.194.00210.10.194.2255.255.255.0di-04Vlan100 product LL_14
010.010.194.00310.10.194.3255.255.255.0di-03Vlan100 product LL_15
010.010.195.00210.10.195.2255.255.255.128di-04Vlan101 product LL103

https://github.com/Andriy2048/Andriy2048

network components, network design, wifi design, wireless topics

“Warehouse Wi-Fi Design: Tips for Design and Deployment” from Aruba

This video provides good design hints from Aruba for wifi deployment in warehouses.

It consists of following points:

– usage of outdoor access points is preferable compared to indoor access points (due to outdoor access points are designed to work in wider range of temperatures and better protected from dust/sunshine/water, easier to install, indoor access points in most cases are designed to work on ceilings 3-6 meters)

– usage of slightly directional antennas for access points mounted on high ceilings (~15 meters or more)

– type of certain access point should be chosen per such initial conditions as : ceiling high (e.g. one type for mounting high up to 10 meter, another one if for 15 meters)

– length of aisles between racks define amount of access points per one aisle (recommended numbers are in video)

– preferable position of access points in warehouse is on ceiling (in real life may be some exceptions): arguments are in the video

– Aruba also uses Ekahau for predictive survey ( in video they show modeling in Ekahau how signal spread and how signal quality depends on high of access point mounting and on racks high of a warehouse)

– example of big warehouse with 3 types of environments (racks and ceiling high) inside and how access points are placed

automation, configuration, scripting, Uncategorized, wireless topics

Perl script for bulk update of radius server settings on Cisco WLCs

The task, which one may encounter, is to update radius authentication or accounting server settings on Cisco local wireless controllers (WLC) due to either IP of  radius authentication or accounting server is changed (e.g. old servers were scrapped, new ones deployed) or shared secret is changed or should be updated due to other reasons. Shown below script can do such tasks for Cisco WLCs as in my case such changes had to be done on ~60 local WLCs (with manual work such change would be quite stressful, prone to errors and took quite a lot of time).

Initial data and assumptions are:

1) per Cisco WLCs command line, there are no command options to reset shared secret for radius authentication or accounting server:

config radius acct

Pic.1 – Command line options of radius server on Cisco WLC command line

So if someone needs to update shared secret for radius authentication or accounting server, per Cisco’s design it is needed to delete related radius from WLC’s config and then to add it with new password (similar procedure if it is the case of changed IP of radius authentication or accounting server).

2) script below is using Net::SSH::Expect package. If someone uses Debian Linux or its derivatives, I would recommend to install such Perl package as .deb package (I will create separate topic about that), as CPAN or other ways of installation Perl modules sometimes hadn’t worked per my experience.

3) IP addresses of all WLCs, which should go through the change of radius authentication/accounting server, are stored in a separate text file (one IP per one line) which is passed as an argument to the script. For example, if presented script in your case is called “change_wlc_ALL_rad_acc_settings1_0_0.pl” then command to run the script will look following way (in such case file with WLCs IPs is “all_WLCs.txt” is located in the same folder with the script):

command line

Pic.2 – Example of running the provided script

4) script will automatically search defined by you SSIDs which are utilizing related radius authentication or accounting server. For this example script expects that such SSID names contain ABC, KLM, XYZ strings for identification them by regex.

5) “your_username” and “your_password” to authorise on WLCs should be replaced by yours

6) per Cisco’s design, to delete related radius authentication or accounting server it is firstly needed to disable all related SSIDs, which are using it, and delete related radius server from setting of such SSIDs. Script below expects that SSIDs “ABC”, “KLM” and  “XYZ” are using related radius server, so script will search these IDs of such SSIDs to remove related radius server from their settings.

7) script expects that radius accounting server in such example has IP 10.20.30.40 and will search it via regex to identify its ID for further changes with WLC’s  commands

8) script assumes that radius accounting ID on Cisco WLC should be 17 and it is using “acc_shared_secret” shared secret

9) to document all logging output (forchecking that all is executed as expected), tee command can be used, e.g.

@debian:~/scripts# ./change_wlc_ALL_rad_acc_settings1_0_0.pl all_WLCs.txt | tee /tmp/log_changes.log

this will save all output to /tmp/log_changes.log (and will show on console as well)

10) in script there are no correct mechanism to catch error due to unavailability of a certain WLC in a list, where it tries to establish SSH, or authentication problem to access SSH. In these two cases scrip will finish itself with error (such drawback to be improved)

Script itself is following :

#!/usr/bin/perl
#script to update radius acc servers on local WLCs


use Net::SSH::Expect;

my $filename = $ARGV[0];

if (open(my $fh, '<:encoding(UTF-8)', $filename)) {
while ( <$fh> ) {
chomp;
@fields = split(' ', $_);

my $ssh = Net::SSH::Expect->new (
host => $host1,
raw_pty => 1
);
print ("Getting into WLC $host1...n");
$ssh->run_ssh() or print "SSH process couldn't start: $!";
$ssh->waitfor('Are you sure you want to continue connecting (yes/no)?', 10) or print "n key already imported n";
$ssh->send("yesn");
$ssh->waitfor('User:', 20) or die "prompt 'User' not found after 20 second";
$ssh->send(" ");
$ssh->send("your_username");
$ssh->waitfor('Password:', 7) or print "prompt 'Password' not found after 7 second";
$ssh->send("your_password");
$ssh->waitfor('(Cisco Controller)', 7) or print "prompt 'Cisco Controller' not found";
print ($ssh->exec("config paging disable"));

#------search and identify WLAN ID of ABC------#
print ("Checking ABC WLAN id numbern");
$ssh_session =$ssh->exec("show wlan summary");
print ($$ssh_session);

#cutting line with related WLAN information:
($matching) = $ssh_session=~ /([^n]*ABC+)/is;
print ("n$matching");

my $ABC_wlan_id;
$matching =~ m/(d+)/g;
if ($matching ne "") {

$ABC_wlan_id=$1;
}
else {
$ABC_wlan_id=0;
}

print ("nn print ABC id= $ABC_wlan_id n");

#--search and identify WLAN ID of KLM--#

print ("Checking KLM WLAN id numbern");
$ssh_session =$ssh->exec("show wlan summary");
print ($$ssh_session);

#cutting line with related WLAN information:
($matching) = $ssh_session=~ /([^n]*KLM+)/is;
print ("n$matching");

my $KLM_wlan_id;
$matching =~ m/(d+)/g;
if ($matching ne "") {

$KLM_wlan_id=$1;
}
else {
$KLM_wlan_id=0;

}

print ("nn print KLM id= $KLM_wlan_id n");

#---search and identify WLAN ID of XYZ---#

print ("Checking XYZ WLAN id numbern");
#print ($ssh->exec("show wlan summary"));
$ssh_session =$ssh->exec("show wlan summary");
print ($$ssh_session);

#cutting line with related WLAN information:

($matching) = $ssh_session=~ /([^n]*XYZ+)/is;
print ("n$matching");

my $XYZ_wlan_id;
$matching =~ m/(d+)/g;
if ($matching ne "") {

#print ("n matching parameter= $matchingn");
$XYZ_wlan_id=$1;

}
else {
$XYZ_wlan_id=0;
}

print ("nn print XYZ id= $XYZ_wlan_id n");

#---------acc radius part----------#

$ssh_session =$ssh->exec("show radius summary");
print ($$ssh_session);
($matching) = $ssh_session=~ /([^n]*10.20.30.40+)/is;
print ("n$matching");
$matching =~ m/(d+)/g;
my $rad_id100;
if ($matching ne "") {
$rad_id100=$1;
}
else {
$rad_id100=0
}
print ("nn radius accounting id= $rad_id100 n");

#---apply related commands for changes---#
print("n disabling mentioned WLAN ABC");
print ($ssh->exec("config wlan disable $ABC_wlan_idn"));

print("n disabling mentioned WLAN KLM ");
print ($ssh->exec("config wlan disable $KLM _wlan_idn"));

print("n disabling mentioned WLAN XYZ ");
print ($ssh->exec("config wlan disable $XYZ _wlan_idn"));

print("n deleting acc radius server under ABC, SSID ID= $ABC_wlan_idn");
print ($ssh->exec("config wlan radius_server acct delete $ABC_wlan_id all"));
print("n deleting acc radius server under KLM, SSID ID= $KLM_wlan_idn");
print ($ssh->exec("config wlan radius_server acct delete $KLM_wlan_id all"));
print("n deleting acc radius server under XYZ, SSID ID= $XYZ_wlan_idn");
print ($ssh->exec("config wlan radius_server acct delete $XYZ_wlan_id all"));
print ("n radius acc ID is $rad_id100 n");
print("n deleting acc radius server under radius settings on WLC n");
print ($ssh->exec("config radius acc delete $rad_id100"));

# create radius acc server and enable WLANs

print("n adding acc radius server (with id=17) under radius settings on WLC n");
print ($ssh->exec("config radius acct add 17 10.20.30.40 1813 ascii acc_shared_secret"));
print ($ssh->exec("config radius acct network 17 enable"));
print ($ssh->exec("config radius acct disable 17"));
print ($ssh->exec("config radius acct retransmit-timeout 17 5"));
print ($ssh->exec("config radius acct enable 17"));

print("n adding acc radius server under ABC, SSID ID= $ABC_wlan_id n");
print ($ssh->exec("config wlan radius_server acct add $ABC_wlan_id 17"));
print ($ssh->exec("config wlan enable $ABC_wlan_id"));

print("n adding acc radius server under KLM, SSID ID= $KLM_wlan_id n");
print ($ssh->exec("config wlan radius_server acct add $KLM_wlan_id 17"));
print ($ssh->exec("config wlan enable $KLM_wlan_id"));

print("n adding acc radius server under XYZ, SSID ID= $XYZ_wlan_id n");
print ($ssh->exec("config wlan radius_server acct add $XYZ_wlan_id 17"));
print ($ssh->exec("config wlan enable $XYZ_wlan_id"));
print("n saving configuration file to flash memory n");
print ($ssh->exec("save config"));
print ($ssh->exec("y"));

}
} else {
warn "Could not open file '$filename' $!";
}

life, Uncategorized

statistical data of coronavirus (COVID-19)

I searched and haven’t found data which is organized in the table shown day-to-day comparison. Almost all resources put information in pretty ugly way e.g. “today A cases confirmed, B deaths C recovered …” then on the next day they rewrite such information by new day data.

Till the end of epidemy it is expected still 2-6 weeks (different experts, different expectations). Here is analytical data which I started to organize sense February 11:

 

cov_data

Based on such data following conclusions can be made (on 2020-Feb-16):
1) amount of confirmed cases is still not decreasing, epidemy is not over (14886 cases detected on 2020-Feb13 they explain by ‘new applied way of detection’)
2) delta of recovered people is still not stable, but promising
3) delta of deaths is various: not possible to conclude that they’ve got a treatment which efficiently helps with recovery.

 

Data by 2020-February-23

virus data 2020-02-23

Based on such data following conclusions can be made (on 2020-Feb-23):

1) amount of confirmed cases in China compared to previous day steadily decreases (see “Delta to previous day” column)

2) “confirmed cases outside China”: main contributor at this moment is a city Daegu (大邱) 300km from Seoul

3) amount of day-to-day recovered is almost constant and around 2000, which is much more compared to all days before February 18

4) mentioned trends show that virus outbreak will be ended soon (I expect during coming week several governments will lift quarantine restrictions)

Reports with data from the World Health Organization are here:

https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports

 

Further updates and data will follow on coming days.