Archives For RunRouterCommand

Yesterday I discovered an error in my DownloadRouterConfig application where it would terminate abnormally if a variable (a path name) in the settings.cfg file was left blank.  Should no path name be specified, the application should have used it’s current working directory.  Instead, it just crashed.

In fixing the code, I realized that all my other applications used this same function — so I corrected all of them as well.  (I also took care of a few other miscellaneous things while I was in there.  See the CHANGELOG, if interested.)  If you happen to be using any of these applications to help manage your own Cisco routers, you’ll want to pull the latest code down to prevent any possible errors in the future.

BuildVRFIndex v0.0.9-alpha (2014-03-17)
DownloadRouterConfig.py v2.2.3 (2014-03-17)
RunRouterCommand.py v1.2.0 (2014-03-17)
VRFBackupTool v0.0.9-alpha (2014-03-17)
VRFSearchAndBackup v1.0.1 (2014-03-17)
VRFSearchTool v0.0.18-beta (2014-03-17)

The primary reason I decided to revive my rusty programming skills was to automate tedious or time-consuming functions at work.  I’m a big proponent of automation whenever possible and in an age of employment where we’re all asked to do more with less, I’ll gladly invest the time required to “automate all the things”.

However, automation is only useful if embraced by everyone that can benefit from it.  Despite frequent lip service from colleagues who expressed excitement over the creation of a few of my applications, I had reservations about who may actually be using what within the team.

So I decided to have a look…

Several weeks ago I placed a small bit of code in all of my applications to capture their usage data:

import getpass # Required to read username from the command line
def trackUsage():
# This function appends a line to a file with the timestamp, user name
# and name of the application so I can see who is using what
with open("X:\path\to\file.log", "a") as appUsage:
try:
appUsage.write(str(datetime.now())+","+getpass.getuser()+","+__title__+" "+__version__+"\n")
except IOError:
pass

Of course, it could be that some of my teammates are using antiquated versions of some of my applications despite corrected bugs or limited functionality — and there certainly isn’t any way for me to determine that.  Given the frequency in which I have communicated that each person obtain the newest version AND the results I’ve outlined above — I must conclude that either my enthusiasm for improving our work flow and time management isn’t shared among my team or I hold my applications in higher regard than they’re actually worth.

I’ve updated Run Router Command to version 1.10.

My changes to this application pretty much mirror those changes made to the application this one was built from: DownloadRouterConfig.py.

Anyway, here is a cut-n-paste of the highlights of changes made between version 1.08 and 1.10:

  • I changed the application to use ‘routers.txt’ instead of ‘routers.lst’ by request since not all users that may be using this application have the ability to make permanent file associations.  Upon further consideration, I decided to take this a step further and allow users to actually set the name of the file they want to use for this function.  I’ve created a variable to define this filename in the source code.
  • I have also improved the error-checking for the files.  I understand that this source code might actually be distributed as a binary and users may not have access to documentation or the source.  I built functionality into the application such that if a required file does not exist, the application will create an example file for the user with instructions on it’s use.  I’m still not certain this is the right approach, but I like the way that it works, in theory.

See my GitHub Repository for this project to learn more.

I’ve updated RunRouterCommand.py to version 1.08.

Changes in this version:

  • Updated error checking to include validating `commands.lst` file exists.

See my GitHub Repository for this project to learn more.