SNMP with Python

Installing modules

In order to get started with using SNMP in Python you will need to install some modules. This will allow you to use code that others have written to perform some of the low level tasked needed.

Pip is a package installer for python that is installed when you install python. If you followed my previous post and installed python3, to install modules for python3 you will need to use pip3. Using pip to install a module is super easy. All you need to do is type “pip3 install <module name>”

So, for SNMP you will need to install the pysnmp module

pip3 install pysnmp

AP group validate using SNMP

With that installed, let’s get started. We’ll go ahead and create a script that uses SNMP to get the AP names and AP groups of all the APs on a cisco controller, create a dictionary, save the dictionary as a json file, and then check to see if the AP group is correct based on the AP name.

For this example we are going to say that APs are named in the format of AP[building abbreviation]-[3 digit AP number]. For example, APBA-010 is AP 10 in Building A.

Let’s make it so we can give the script a list of controller ip addresses.

from pysnmp.entity.rfc3413.oneliner import cmdgen

Here we are adding the shebang line to define the location of the interpreter (Python3) then we are telling this script to use the previously installed module

Next, we will define an object called ‘cmdGen’ that we will use to perform the SNMP walks with.

cmdGen = cmdgen.CommandGenerator()


Python uses functions for any blocks of reusable code. So, let’s started with creating the main function. This will be where the script logically starts when ran.

To create a function in python you define the name and then pass any data (parameters). Since main is where the script is starting, we will not need to pass any data. You will also need to put these 2 lines at the bottom of the script. This is what will call the main function.

def main():

if __name__ == '__main__':

Every part of the code that is inside of this function will need to be indented. Indentation is very important with python and can be a bit of a pain. I usually use tabs to indent as it’s easy to just hit the tab key then hitting the space ‘x’ amount of times.

The first thing we will do in main() is create an empty dictionary object called aplist and create a list called wlclist that will be the ip address of the controller. You could add multiple controllers in the list by separating the strings with a comma.

aplist = {}


Hopefully you remembered to indent those with a tab. Sublime will usually do this for you the best that it can but you should always be aware of the indentation.

We are going to use a for loop to go through all the controllers in the wlclist and call a function (that hasn’t been created yet) passing the function the wlc object. This function is going to return a dictionary of the APs on that controller. We will add that response to the aplist dictionary we created. Let’s call this function controller_snmp.

for wlc in wlclist:


I usually create other functions above the main function, so add def controller_snmp(wlc): above main. In this functions we will create another empty aplist dictionary and create a dictionary called oidlist.


Dictionaries are unordered collections of key:value pairs. For this dictionary we are going to set the keys to the unique oids that we will walk and the values will be set to a string describing what we expect from the oid. We will also create a string with the snmp community string that is configured on the controller.

def controller_snmp(ip,host):
     aplist = {}
     oidlist = {'': 'apmac',
      '' : 'apgroup',
      '' : 'apname'}

Now were going to perform the snmpwalk on each of the oids. There is some error checking in here that I am not going to go into the details on.

for oid in oidlist:
              errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.bulkCmd(
                      cmdgen.UdpTransportTarget((ip, 161)),0,25,
              # Check for errors and print out results
              if errorIndication:
                      if errorStatus:
                             print('%s at %s' % (
                                    errorIndex and varBinds[int(errorIndex)-1] or '?'
                             for varBindTableRow in varBindTable:
                                    for name, val in varBindTableRow:

ok now we are looking into a dictionary (varBindTableRow) where the key (name) is the full oid and the value (val) is the response.

If you are unfamiliar with SNMP walk you should play with it some, but for each AP you are going to have a line like this = STRING: “Building A”

As you can see the for this AP we have the full oid and the ap group that the AP is in. If you remove the oid we passed when we did the walk you are left with . This is the decimal value of the radio mac address of the AP.

Wait what? OK lets step through this, if you take each digit between the periods and convert them from decimal to hex you will end up with 50:2F:A8:51:6E:20. This is the base radio mac address of that AP.

So lets simplify this with python. First lets get just the portion of the oid for the radio mac address. We will take the “name” object and replace the oid we have defined(with an added period) with a blank. This will make the idx string object equal to the decimal value of the radio mac

idx = str(name).replace(oid+".", " ")

Now lets convert that to hex, since we will be doing this a lot we will use a separate function called idxToMac.

mac = idxToMac(idx)

This function will split the idx string by the periods into a list of the digits called ‘elements’, create an empty string ‘n’. Then iterate through the ‘elements’ converting to hex, removing the 0x in front, and making sure it formats to 2 hex characters. Then adds that to the string ‘n’. The function then returns the string ‘n’ back.

So, for our above example after running the string ‘mac’ would equal 502FA8516E20

def idxToMac(idx):
      elements = idx.split(".")
      count = 0
      n = ''
      for b in elements:
            octn = hex(int(b))
            mac = str(octn).replace("0x", "").zfill(2)
            n+= mac
      return n

We are now going to build our aplist dictionary. This dictionary is going to use the radio mac address of the APs as the key and the value will be….

Another dictionary.

This dictionary’s key is going to be the value of the oidlist dictionary that is currently being ran. For example if the apgroup oid is the one that is being walked then the key is going to be ‘apgroup’. The Value of this key is going to be the value that is returned from the oid.

So to do this we will check to see if the radio mac key is in the aplist dictionary, if not we will need to create the radio mac dictionary. Then we will set the key and value of the dictionary.

if mac in aplist:

All that’s left to do in controller_snmp function is to return the aplist. Make sure the indentation is correct. It should be just 1 intent in.

return aplist

Ok back to the main function. After we have gone through all the controllers we will create a dictionary “grouplist” were the key is the part of the AP name and the value is the AP group it should be in.

grouplist = {
            'BA':'Building A',
            'BB':'Bulding B'}

Now we will iterate through the APs and validate the ap groups.

for ap in aplist:
      for group in grouplist:
            if group in aplist[ap]['apname']:
                  if grouplist[group] not in aplist[ap]['apgroup']:
                        print("AP {0} is in {1} group and should be in {2} group".format(aplist[ap]['apname'],aplist[ap]['apgroup'],grouplist[group]))

Any AP that is found not to be in the correct group will be printed on the screen like the following.

AP APBA-001 is in Building B group and should be in Building A group

So putting this all together, if you’ve been following along you should have a script that looks like this.

Screen Shot 2019-05-29 at 3.04.25 PM


Getting Started with Python

Its been awhile since I’ve had a chance to update this page, but I wanted to continue with my “working faster” series. I’ve been using Python over the last few years to automate processes in my role as a Wireless network engineer. Some examples of things I have done with python are; configuring AP ports on switches; building AP config from a list of AP names and mac addresses; building controller config from a template and adding in variables; blasting config changes to multiple controllers; auditing AP config using SNMP and validating APs are named correctly, in the correct AP group based on name, in the correct flexconnect group, on the correct controller; and many other things. As mentioned I’ve used Python for SNMP but have also used if for entering CLI command, working with APIs and so much more.

As Python is a valuable tool to use as a network engineer, as it can speed up so many day to day tasks I figured it would be good to touch on it in this series. To get started I will walk through getting Python3 installed on a Mac and working with Sublime Text 3. If you haven’t dived into Python3 I hope to provide an easy transition so you can get your feet a little wet.

These are some great resources that I followed when installing Python3. So the information I provide below can also be found there.

Installing Python3 on mac –

adding Python3 to Sublime –

Installing Python3

The first thing you will need to do is add GCC support. This is included in Xcode so if you already have that you can skip this part. If not install Command Line Tools. This does require an Apple account.

Once that is installed then you will need to install Homebrew. Open a terminal windows and paste the following line. This will go through what Homebrew will be changing and require you to accept the change before it starts.

ruby -e "$(curl -fsSL"

Once Homebrew is installed you will want to change were the Homebrew directory is installed. Paste the following command into

export PATH="/usr/local/opt/python/libexec/bin:$PATH"

Now that Python3 can be installed and in the right place, enter the following command to install Python3.

brew install python

Once that finishes installing you can validate that its installed by running this and it should return something like Python 3.7.2.

python3 --version

Adding Python3 to Sublime text 3

First thing you will need to location python3 is installed. Running this command will give you the location. Copy that.

$ which python3

Screen Shot 2019-03-11 at 5.31.59 PM

Then in Sublime select tools/Build System and select New Build System…

this will open a new window in sublime text. Replace the text in that window with this, making sure the path for Python3 is correct.

"cmd": ["/usr/local/bin/python3", "$file"]
, "selector": "source.python"
, "file_regex": "file \"(...*?)\", line ([0-9]+)"

Save that and name it Python3.sublime-build

Once you have that saved go back to Tools/Build System and you will see the newly create Python3 under Python. Select that. Open a new window and paste the following code.

import sys

Then press command+b to build it and a window on the bottom should pop up and display something like this. Confirming Python3 is working in Sublime.

3.7.2 (default, Feb 12 2019, 08:15:36)
[Clang 10.0.0 (clang-1000.11.45.5)]
[Finished in 0.1s]

Sublime Modules

As I mentioned the main modules I use are “Compare Side-by-Side”, “text pastry”, “select by regex”, and “Sort lines by selection”. Figured I should go into what they can do.

Compare Side-by-Side has a unique way of using it, which I will cover in a second, but to use the other ones you press shift+cmd+p to open the command palette and type in the name of the module. OR (the way I do it) create a short cut key to launch the module. To do this follow the instruction in my previous blog to edit the user key bindings, assign the keys you would like to use, and then add the command with the name of the function that shows in the command palette with _ in the place of spaces. like this { “keys”: [“ctrl+alt+a”], “command”: “select_by_regex_all”}. Once you save you key bindings your shortcut will show up in the command palette.

Compare Side-by-Side

This module will let you select two tabs that are open and will compare them with each other.

To do this right client on the Tab you want to compare the active tab with and select “Compare with active tab”. These 2 tabs will open a separate copy in a new window color coating all the differences from each other and will give you a brief count of the differences.Screen Shot 2018-04-05 at 10.10.56 PM.png

Unfortunately you can’t edit the files in this window, you will need to switch back to the original windows to edit in those tabs, but you can quickly jump through the differences on each of the files using shift+option+Up/Down. The bookmark function also works in this few so a lot of times I will bookmark the differences and copy all the bookmarked lines into a separate file.

Sort lines by Selection

As I mentioned last time you can make a column/vertical selection. With this module you can sort the lines by the column you have highlighted. This works just like sorting by a column in excel but can be done right in the text editor. This will also only sort the lines that have a selection.

Text Pastry

I use text pastry when I need to make a list of something numbered. If I needed to create a list of 200 APs I could type in AP- then open Text Pastry Command and put ” range 1 200 1 3″. Text Pastry would create 200 lines with AP-XXX (001-200).


When using text pastry “range” the first number is the starting number, the second is the ending number, the third is the increment number, and the forth is the number of digits for that number. You can also add “each=3” at the end and it will repeat each number 3 times.

select by regex

This is the module that I use the most, by far! If you are not familiar with regex, it is a super powerful tool, and being able to search text using regex will boost your productivity. I promise. Similar to text pastry, when using select by regex a command bar will pop up on the bottom. This is where you can put in the regular expresion you want to search for in the file.

here are some basic regex characters that you can use to build these searches:

\d – any number [0-9]
\w – any ASCII letter, digit, or _
\s – any white space
. – any character except line break
$ – end of line
\D, \W, and \S – one character that is not what the lowercase is. example \D is a character that is not a number.

There are also some regex characters for repeating characters:

+ – one or more (I use this to select to the end of the word)
{3} – three times
{2,4} – two to four times
{3,} – three or more times
* – zero or more times

Putting this together:

So lets say you’re looking at a log file and you want to select all the APs that are mentioned in the log. In this example APs are named like AP-SiteName-# (AP-Patio-001). typing AP-\w+-\d{3} in the regex command line, which will highlight all the AP names in the file. (Note the -‘s are actual -‘s in the AP name) Pressing enter will select all of them and allow you to copy/paste, change (by just typing), or by pressing right will add a curser after each instance of any AP name. More on this later.

Screen Shot 2018-04-23 at 10.45.43 PM.png

A powerful character combination with regex is ‘.*’ This allows you to select all characters before, after, or between searches. So lets say you want to select any line with an AP name in it. Using the same AP naming convention as above, just do .*AP-\w+-\d{3}.* Now the entire lines are selected. (Notice in the screen shot the lower lines off window on the right being selected as well) Screen Shot 2018-04-23 at 10.51.31 PM.png

Lets cover the .* “in between”. This means adding 2 different searches that the lines needs to contain to be a match. Remember that they search terms need to be in the correct order they will show up in the line as well. Using the same Log and AP naming format searching for .*Radio.*AP-\w+-\d{3}.* will select the radio events that I have in the log allowing me to pull those out and go through just those. Screen Shot 2018-04-23 at 10.58.23 PM.png

One of the other cool features of search by regex is that if you have a portion of the file selected it will only search within that selection. So if there is some text you want to change in just a portion of the file you can select that area and then use regex to make the selection and make the needed changes.

A lot of times I use search by regex to remove lines as well. For example if I’m searching for APs that are statically channeled and powered I will use .*AP-\w+-\d{3}.*\*.*\*.* (Note the \* searches for an actual * in the line) then once the lines are highlighted hit enter and then delete those lines. Now I have a list of APs that are statically set. Screen Shot 2018-04-23 at 11.15.28 PM.png

Regex is fun to play with and gives great joy when you are able to pull out the needed info quickly. Here are a couple other strings that I use frequently to give more examples of things you can do.

.*\d*[13579]$ – selects all lines that end in an odd number. I use this when I need to upgrade or reboot APs and want to stagger the reboot some. With a list of APs I can quickly select them all, press shift+cmd+l to add a cursor to each line, hit left to go to the beginning of the AP names and type the command to reload the AP building all the lines I need to reload the APs. Then using this search I can select the odd APs, cut them and then paste into the controller leaving just the evens in the text file. You can get more granular with this if you need. For example if you wanted to select the evens in the 20’s at a specific site you might do the following. – .*AP-Patio-02.*\d*[02468]$

((.*\n){1,5}) – this puts a cursor on every 5th line! Just make sure to press left to deselect all the lines. Obviously changing the 5 to a different number will change the number of lines.

\s$ – selects all the white space at the end of lines. Nice for clean up!


Well there you go. A quick dive into the Modules that I use frequently. Thanks for reading.

Sublime – Macros and key binding


Macros are one of those things that I typically forget to use. Its something that I used to use with Notepad++ a ton and when I first switched to Sublime I used them frequently. But as I got used to using the multiline editing that I wrote about last time I forget about macros some. I do have some saved that I still use when the times comes though.

Macros gives you the ability to record what you type and how you move the cursor and allows you to play that back on multiple lines. Lets say for example, you have a list of 50 APs that you need to move to another controller. Put you cursor at the beginning of the line of the first AP and under tools select ‘record macro’ or press ctrl+Q, type the needed config and then move the cursor to the beginning of the next line. The select ‘Stop recording macro’ or press ctrl+Q again. Now you can press shift+ctrl+Q to playback the macro for each line.

Screen Shot 2018-04-10 at 9.58.32 PM.png

If you have a macro that you use frequently, after recording it you can save the macro then under tools/macros/users it will list all your saved macros allowing for easy playback.

Don’t forget that you can use the multiline editing to put a cursor at the beginning of every line and then playback a macro to make the changes to all lines at once!

These saved macros are located in /Library/Application Support/Sublime Text 3/Packages.

Key Binding

Sublime text allows you to open and edit the file will all of the shortcut keys and also add user defined shortcut keys. I would recommend against editing the default list but if you want to assign a different set of keys its fairly easy to do. To open this file, under Sublime Text/ Preferences select ‘key bindings’. This will open a new window with a 2 columns layout. On the left you will have the list of Default key bindings and on the right any User defined key bindings that you have added.

To add a key binding, inside of the []s add a line like the following:

{“keys”: [“shift+ctrl+alt+p”], “command”: “run_macro_file”, “args”: {“file”: “res://Packages/User/primary-base.sublime-macro”}}

this will create a shortcut key to run the macro I saved as primary-base.

Screen Shot 2018-04-10 at 10.07.03 PM.png

Sublime Text 3 – a network engineers best friend

Sublime text is my go to app. In my opinion it can be a network engineers best friend. I use this program for all kinds of text editing: taking notes, building configs, validation of changes, scripting, text sorting, scrubbing logs, and so much more. It is always open and I’m almost always copying, manipulating, and pasting in and out of it.

Sublime text 3 can be downloaded here and can be tried for free. There is a cost of $80 to continue using after the trial period. Some of the guys I work with use Atom which I believe is free, but I like to argue with them that I can run circles around them with Sublime 🙂 not sure if that is true…

Installing Modules

One of the features I like about Sublime is installing modules. Some of the modules I use are “Compare Side-by-Side”, “text pastry”, “select by regex”, and “Sort lines by selection”.Well get into these a little later but to install modules you need to install Package control. This page shows how to do that. Once Package control is installed you can press shift+cmd+p to open the command palette type in “install package”, and select “Command Package: Install Package”. Screen Shot 2018-03-12 at 10.29.11 PM.pngThis will open a new window where you can type in the name of the module you want installed and select it for installation.Screen Shot 2018-03-12 at 9.09.53 PM.png

For now, we will cover some of the things that are native to sublime text and get into the modules later.

Multiline editing

One of the main things I love about Sublime is being able to set the cursor to every line of a selection, allowing you to type on every line at once. For example, lets say you have a list of APs and you need to move them to a different controller.

Screen Shot 2018-03-12 at 10.00.31 PM.pngtyping on multiple lines at once

Select the list of APs, press shift+cmd+l and bam, you have a cursor at the end of each line. Then cmd+← to take the cursors to the beginning of each line and type in “config ap primary-base controller2” move the cursor to the end of the lines and add the IP address. Done.

Changing case of text

Or lets say you have a list of Mac addresses and they are in the wrong format… Select them, shift+cmd+l and then you can easily add :’s, -’s, or .’s where needed. Now lets say these Mac addresses are all CAPs and you want them lower case. Select them all (cmd+a) then press cmd+k then cmd+l. This will make all letters in the selection lower case. You can make the letters in the section capitalized by pressing cmd+k then cmd+u.

Permute Unique Lines

Now lets say you have a list of APs  that consists of duplicates and you want just a list of unique APs. Under edit on the menu bar select Permute lines/ Unique.Screen Shot 2018-03-12 at 9.35.14 PM.png

Column/vertical selection

One of the other cool features of Sublime is being able to make a selection “column” in a text file. Lets say you have an output of a controller and you want to select all the Mac addresses that show up in the list. By holding the option key you can click and drag a selection box selecting just the text inside of the area you aqdragged. Screen Shot 2018-03-12 at 9.49.51 PM.png


Screen Shot 2018-03-12 at 10.06.26 PM.png

Using bookmarks you can make reviewing and comparing files a little easier. To bookmark a line press cmd+F2, this will add a little flag to the left of the line. This is helpful when the file is thousands of lines long and you know you want to go back to change something. Pressing F2 will move the cursor to the next bookmark and shift+F2 will go to the previous bookmark. You can also select all bookmarked lines to copy and paste them.

Multifile search

If you have multiple files open in Sublime you can run a Find or Find and Replace across

Screen Shot 2018-03-12 at 10.14.45 PM.png

the files that are open. Shift+Cmd+f will bring up a box on the bottom where you can search across all files that are open. You can also add a folder in the “where” section. Select the the icon to the right on the “where” section and click add folder. Once you have a folder selection and the find filled in (and replace if wanted) Sublime will do all the heavy lifting searching for the string in all the files and just open a new text file listing any files in that folder that have a match and lists out the surrounding lines of the match

Screen Shot 2018-03-12 at 10.24.28 PM.pngScreen Shot 2018-03-12 at 10.23.25 PM.png

There’s just so much to this Program. I will cover some more native features and get into the modules some next time.

Thanks for reading.

Ekahau – Toggling Views

Two weeks ago I was at WLPC in Phoenix. This was my 2nd year going to WLPC and it was awesome! I’ve been fortunate enough to attend a boot camp prior to the conference each year. Last year I took Peter’s CWAP class. I highly recommend this class if you haven’t taken it. Even if you already have your CWAP cert it would be well worth it! This year I took the ECSE class. Ferney was great! He kept the information flowing and we had a fun time.

I’ve been using Ekahau for a little bit over a year. Definitely not an expert by any means, and not a daily user, but have used it pretty frequently.

Screen Shot 2018-03-05 at 9.49.18 PM.png

While sitting in class I was looking at the list of shortcut keys and decided to write a short list of things that I wish were on there. Some of the things that I had on my list were toggling the different options in the view menu. When reviewing a survey I tend to hid the walk paths right after giving them a quick glance, when designing I tend to hide the walls after they are all in place, and before building reports from a survey I usually hide the APs. So after dinner one night I decided to see if I could add some TouchBar toggles for these using applescripts and BetterTouchTools.

I figured I would share these applescripts so others can use these too, or tweak them to work for some of the other view options.

So in BetterTouchTools you can set TouchBar shortcuts (or even keyboard shortcuts if you don’t have a TouchBar) that will only work if you are in a specific app. In my last blog  post I wrote about how to create the TouchBar for specific apps and how to have an AppleScript run as an action so head back there if needed.

btt - applescript.png

Once you have this window open  you can enter the applescript you want to run with the trigger. You can even test right from this window by selecting the “Run Script” button

Screen Shot 2018-03-05 at 5.44.37 PM

For the most part, you can use this and just change the menu item you want to toggle. This example would be used to toggle the “Survey” option in the view list.

activate application "Ekahau Site Survey"
tell application "System Events"
	tell process "Ekahau Site Survey"
		tell menu bar 1
			click menu item "Surveys" of menu "View" of menu bar item "View"
		end tell
	end tell
end tell

by simply changing the one line to following you can use the script to toggle the Walls

click menu item "Walls" of menu "View" of menu bar item "View"

Something to remember is that the sub options require you to put 6 spaces before the name. Like this one that toggles the AP names.

click menu item "      Names" of menu "View" of menu bar item "View" 

If a view option has sub sections, when you click on it will automatically check (or uncheck) all the sub sections. For example, when turning Access Points back on most of the time I go back and de select the Names. So I wanted to automate that process with the applescript toggle. So came up with the following and it works super fast!

activate application "Ekahau Site Survey"
tell application "System Events"
	tell process "Ekahau Site Survey"
		tell menu bar 1
			click menu item "Access Points" of menu "View" of menu bar item "View"
			set APsOn to (value of attribute "AXMenuItemMarkChar" of menu item "Access Points" of menu "View" of menu bar item "View") is "✓"
			if APsOn then
				set NamesOn to (value of attribute "AXMenuItemMarkChar" of menu item "      Names" of menu "View" of menu bar item "View") is "✓"
				if NamesOn then
					click menu item "      Names" of menu "View" of menu bar item "View"
				end if
			end if
		end tell
	end tell
end tell

Walking through this with you, the script toggles “Access Points” then checks if there is a ✓ by it. If there is a ✓ then it checks if Names has a ✓ by it. If so it will toggle Names so they don’t show.

Playing around I have also added toggles for refreshing the visualization.

activate application "Ekahau Site Survey"
tell application "System Events"
	tell process "Ekahau Site Survey"
		click checkbox 1 of window 1
	end tell
end tell

and toggling the Frequency monitor overlay

activate application "Ekahau Site Survey"
tell application "System Events"
	tell process "Ekahau Site Survey"
		tell window 1
			click button 7
		end tell
	end tell
end tell

If you are like me and like to use shortcuts hopefully you find these useful and can incorporate them.

Alfred, BetterTouchTools, and Bartender

There’s just something about keyboard shortcuts…

If you don’t know, I used to work in video/audio production and started that as an audio engineer. While in school I got multiple levels of certification in the audio editing software ProTools. The version of ProTools I worked on was version 7 and had somewhere around 500 keyboard shortcuts! It was insane!


The instructors used to tell us to memories these as the speed you could gain could give you a leg up over someone else when looking for a gig. I used to have a stack of 3×5 flash cards with 1 side having the key combination and the other a description of what it did and I would frequently study them. Somewhere along the line I fell in love with keyboard shortcuts. I don’t know if it was just because of ProTools or because I’m left handed and it tends to get bored when my right hand is doing everything with the mouse. Anyways, to me, keyboard shortcuts are important and I’m always looking up lists of keyboard shortcuts for any app I use. I would suggest you do the same as it will definitely help you move faster. There are a couple Apps that I use that help move around faster at an OS level while using a Mac, so figured I would start with these.

Alfred ( is something that I have used for many years. I like to think of it as the spotlight before spotlight.Screen Shot 2018-02-26 at 8.34.10 PM It is similar to the current version of spotlight where with a keystroke it brings up an overlay box where you can search for applications, files, or websites. But it can do so much more with the power pack! (around $25 for single user) Using Workflows you can do something basic as setting up a shortcut key to open an application, to running a script that posts a notification when completed. Some of the workflows that I have is opening iTerm and logging into my home lab controller all from one keystroke, opening certain web pages in a specific browser, and using a shortcut key to open a certain excel file.


Making workflows is real simple. Click the plus at the bottom of the workflow list, select Blank Workflow and give it a title. Then right click in the Diagram area and add a trigger for hotkey or Input for keyword. Then right click again and highlight actions and select “open file”, “open “Launch Apps”, “Open URL”, or even “Run NSAppleScript”. You can have multiple inputs and multiple outputs, then just draw a line connecting the inputs to the outputs.


Another great feature of the power pack is the clipboard history. This will save anything I copy into my clipboard into a list. With a hotkey I can bring up that list and quickly search for anything in my clipboard history or snippets. This is something I use all the time! I can have multiple mac or IP addresses I’m working with all saved in here and can quickly paste them as needed. This is just one basic use case, but seriously I use this all the time.

Screen Shot 2018-02-26 at 8.54.51 PM

The snippets feature allows you to add the most used text for easy access. This way I can easily search for that AP switch port config and paste right in without have to search for the doc where that text is saved. I also save some of the most frequently used wireshark filters so I can just search for the name and have it pasted right in.

SnippetsSnippets Edit

With the clipboard history I can also set it to not save anything copied from specific Apps so I don’t need to worry about passwords showing up in there unless I want them.Clipboard-Advanced


Another great tool along these lines is BetterTouchTool ( BTT allows you to use the trackpad/mouse/Touch Bar/etc as triggers for things. btt.pngIt runs for $20 for a lifetime license. For the most part I use the Touch Bar feature to launch specific applications, trigger a shortcut key for a workflow I have set up in Alfred, trigger a shortcut key in the application I am in, or run an AppleScript. You can set up TouchBar buttons that work globally or only within a specific application. To add triggers to a specific app press the plus button under the list of applications on the left, then select “Select app from running apps” and select your app. Then the app will show up in the list of applications. To add a new trigger just click what kind of gesture you want in the black bar towards the top. There’s some pretty cool gestures you can add to the trackpad and magic mouse, but lets focus on the TouchBar. After you select that you can click the + TouchBar Button towards the bottom. A box opens filling up the space on the bottom where you can give it a Button Name and assign it to a keyboard shortcut or select a predefined action from a dropdown list. In that list is a option called “Controlling other Applications” and under that is “Open Application / File” and also “Run Apple Script (enter text directly)”. These are the main options I use but there are SO MANY more options!



Last week I was messing around with Apple Scripts and Ekahau and was able to add some cool TouchBar quick keys, so I will share those here in the next week or so.



The last app I want to cover is Bartender. (

Screen Shot 2018-02-26 at 9.37.50 PMScreen Shot 2018-02-26 at 9.37.57 PMThis is an app ($15) I use to clean up the Menu bar on the mac, making room for Adrian Granado’s WiFi Signal 🙂  (If you have a mac and are not using Adrian’s applications stop reading and go get those!) Bartender allows you to move icons off of the menu bar and add them to the bartender menu bar. You can switch to this by selecting the bartender icon in the menu bar. You can even have the item show up in the main menu bar if there is activity on the icon. Don’t forget that you can hold command and drag these items around in the menu bar.

Screen Shot 2018-02-26 at 9.38.40 PM



Working faster – Series intro

We all know that the expectation for speed and automation continues to grow. Expectations for designs to be completed over night, configurations build in an hour, emails responded to the minute they come in, all while going in and out of meetings planning for what’s coming next. Knowing this, we, as wireless network engineers, need to work efficiently and automate as much as possible. I feel like I’m constantly adjusting my workflow and am always looking for faster ways to complete tasks.

A lot of times while collaborating with colleagues I get the “how did you do that?” or “what application is that?” kind of questions and enjoy sharing the tools and tricks that I use and how I use them. So figured it would be good to do a small series to start off my blog.

I’m a Mac guy, as are a lot of wireless engineers it seems, and some of the tricks and apps I use are mac specific but a lot of them work just as well on Windows or Linux. If not hopefully a quick google can give you something comparable. Remember it’s not about what the app is used but what can be done in the app. Some of these things you might already take advantage of, or feel like it’s not worth switching apps for, and that’s ok but I hope that people get stuff out of these posts and can incorporate some of it. If you have a way of doing these things faster while being user friendly please share! A lot of the things I have in mind for this series can be applied to working in any field, I even used a lot of these before I started working in networking but my goal is to show how they relate to the work I do now in wireless networking.

So let’s begin with something short and sweet…

SSH Client… we all have our go-to client and boy does it get used, am I right? I’ve been using SecureCRT for the last couple of years and I have recently started playing with colors, after being shown this by a co worker. Currently I am setting different colors for mac address, IP address, AP names, and controller names.This allows these items to pop out and be easily identified.Screen Shot 2018-02-15 at 1.49.46 AM
I’m not totally sure I will keep it set up this way but I will go ahead and share it for fun. These are all keywords using regular expressions. We will get more into regex a little somewhere around part 3-5 of this series.

3To set these click the Option dropdown and select Global Options. Then under  General/Default Settings you can can select “Edit Default Settings…” This will bring up a new popup and under Terminal/Appearance you can edit the “highlight keywords”. Enter a word or regular expression and set the color. If using regex, making sure to check the “keyword is regular expression” box.

One of the other things I do is log each session. Maybe it’s overkill but it’s nice to know that  I can go back and view anything I have done. In the same default setting section you can setup logging as well. Here’s how I have mine set up, this will create a folder per day and each session I run will create its own file. I can’t remember where I got these settings from but wish I could link it for credit.

5          6

Some people like to only log when capturing debugs, etc for tac cases and whatnot so that’s definitely an option as well. One thing I want to show you is using Console when logging to file. Console is an application that comes default on every mac and in Console, you can open the file it as it writes. You can deselect the “now” button and freeze the screen which allows to scroll and look at the data easily. Then when selecting the “now” button the river of messages come back and continue flowing. Now let’s say you are trying to track how many times a certain message in a debug is showing, or tracking the time between occurrences of a message, or maybe you just want to see one particular device instead of all 300 devices showing up in a running debug. Put whatever you are looking for in the search bar in Console and now the screen will only show lines that contain the search.


If you want to see it in relation to the lines around it use the cmd+f and you get the typical find, highlighting the searched term.


Opening sessions in Console is not something I do terribly often but definitely nice to have in the back pocket when needed.

The last thing I wanted to mention with SecureCRT is the button bar at the bottom. This is something that I used to use a lot but have gotten away from it for the most part. I will cover what I have replaced it with in the next post. (but sneak peak, it is a tool that works across all applications…)

To enable the button bar select the View dropdown and make sure the button bar is checked.

13Once you have it enabled you can right click in the bar and create a new button or even a new button bar.

With multiple bars you can easily switch between them using the drop down on the left. I have used buttons to take me to different directories in Unix boxes or enter multiple lines of config on controllers and switches. ( ie AP switchport configs…)

Well that’s all I’ve got for you today. Mostly just wanted to introduce the idea. I’m excited to share some of my tips, especially when it comes to building configs…

If you like what you read, please leave a reply and let me know.

First Blog Post

So going to try this whole blog thing. My plan is to keep this wifi related, but will be covering tools and applications that I use on a daily bases. But before we get into all that let me tell you a little about myself…

I’ve spent most of my life in Arizona but relocated to Arkansas 3 years ago. I met my wife when I was in junior high but didn’t really become friends until college. After many study groups and seinfeld episodes we quickly became best friends. We ended up losing touch for a couple months with our busy schedules but when reconnecting I was drawn to her in a different way and fell deeply in love. Fast forward 12 years, which we’ve been married for 11 of those, and 4 Kids later – 8 years and younger – we have a full, crazy, fun, and loud house!

In 2005 I started going to the Conservatory of Recording Art’s and Sciences pursuing a career in Post-Production Audio. After completing the program there I spent about a year working in a Post-Production Studio in California. After this I was presented with an opportunity to work at our large multi-campus church back in Arizona running sound, helping with post-production audio, and other various recording projects. While there I picked up experience with production video, lighting and networking and eventually lead the technical department.

In 2014, fulfilling a desire to focus on one area and become an expert in that area, I moved to Arkansas and began my career as a wireless network engineer. Hearing about CWNP’s (Certified Wireless Network Professional) program I immediately started studying for my CWNA and in the last 3 years I have gotten my CWNA, CWDP, CWAP, and CWSP. I’m really excited for the beginnings of my pursuit to become an expert in Wi-Fi and look forward to sharing what I find interesting here….