*Update: The version of the requests library I used in this post was 2.2.1. Recently 2.5.0 was released (http://docs.python-requests.org/en/latest/) which seems to have broken SSL Self-signed certificates (blindly trusting the verification of a lab box). You can “downgrade” requests using Easy_Install:
#From OS X Open Your Terminal and perform the following
sudo easy_install uninstall requests
sudo easy_install https://pypi.python.org/packages/source/r/requests/requests-2.3.0.tar.gz
#On Windows from a CMD Line
easy_install -m requests
easy_install 'URL from ABOVE'
Product: CUCM 9.x – 10.x (this script was tested on CUCM 10.5 using the 9.1.x AXL ToolKit)
Scenario: You are on the other side of a Communications Manager from 6.x – 8.x upgrade to 9.x-10.x. Users in CUCM have appropriate Devices Associated with his/her UserId, but the OwnerUserId is not populated on the Phone itself.
Problem: Reconciling User Licenses in 9.x/10.x (ELM/PLM) in order to not be penalized with “less” licenses if/when we deploy Jabber and/or other services for our Users. By default, if you do not “associate” an OwnerUserName with a Device, you only consume a UCL Enhanced License which only allows an “associated user” to have 1 Device, meaning, no Jabber, etc etc devices can be added later for the “user” without purchasing appropriate licenses (again potentially).
Disclaimer: I take no responsibility and/or necessarily provide support for your consumption of this script, so Use at your own peril..and if you do use it, test run it in a lab environment first. This script does 2 things and does them well: It loops through (all) end users (not application users), populates all their controlled device associations and then updates all those devices with an appropriate ownerUserName; it also has the ability for Exclusions of end users (possibly admins who control devices that really aren’t theirs..such as the phone view user if not an application user).
Requirements: Python 2.7, Requests and LXML Libraries, a little programming knowledge is good as well. Watch how to video?
Mac(book) owners shouldn’t feel left out; Python 2.7.6 and easy_install already came preinstalled with your machine..install requests or lxml using Terminal:
sudo easy_install requests
Windows 7 Folks follow the links below:
Download link for Python:
Download link for ez_setup.py/EasyInstall:
I recorded a video that more or less captures the entirety of the process in just a couple of minutes..let me know how it goes..And Watch in full screen for full quality:
Product: UCCX version 8.x-10.x (but probably applies to 7.x and below as well)
Scenario: A call is transferred to an Agent, but the Agent does not answer the call so a Ring-No-Answer condition occurs which sends the call back into the CCX Script for processing. The call center supervisor wants all conditions that Match this Scenario to transfer the calls to a general delivery mailbox.
Problem: Number 1: If the UCCX System Parameter for Agent RNA automatically returns an Agent to READY, then the call could get stuck in a loop with the same “unavailable” Agent continuously. Number 2: Our customer’s requirement is asking that after an Agent RNA All Calls “Automatically” Transfer to a General Delivery Mailbox for the Group.
Hope that isn’t confusing. Ultimately, this post will spawn 2 videos. From a verbiage standpoint, I think this will be fairly brief however. The first order of business with the Select Resource Step is to ensure that it doesn’t “Connect” as soon as an Agent becomes available (we need the spacing this causes when we do it that way), but as part of this particular setting, it does force us to create a new User variable as you can see this below as uAgent; another tip, if you didn’t already know the Timeout below is the Default RNA timeout, of course when using the step as below that timeout doesn’t work..you would have to set that timer on the Connect Step that must be added to coincide with this particular setting in the select resource step:
Product: UCCX version 8.x-10.x (but probably applies to 7.x and below as well)
Scenario: A Caller is allowed to enter a date into the keypad of his/her phone (for example, a payment date, date of birth, etc); The Caller enters and Illegal Date like June 31st
Problem: If no error checking is performed and the String (Get Digit String) is converted to a Date using auto conversion of a CCX Set Step the application will throw an exception and the caller will hear the Error Message. (I may repeat this below because this is a new thing I’m adding to the tips/trick posts.)
If you are new to my blog, then you may not know that my day job is more or less as a Cisco Contact Center Express IVR application developer; you can read a small piece I wrote concerning the development of UCCX apps here. In this post of tips and tricks about developing on top of UCCX, I want to show you a method to validate a date without the potentiality of having an Exception thrown in your Application. If you’ve ever develop an IVR application, you’ve probably had some sort of Date input in your application such as a caller entering their Date of Birth, date they want to pay a bill, and/or date they want to go somewhere (think schedules for planes, trains, automobiles, and even ferries/boats). As a note, your UCCX system should have at least an Enhanced IVR Port/CCX seat license. Let’s look at an example that encounters a problem if used on the system (think of the string as been given its value when a caller entered the digits on a keypad).
String sDt = "01672014" //You are Reading Correctly
//This is a Set Step in the CCX Editor
Set date = sDt
//Unfortunately Your Caller Just Got The
//System Error Message and Can't Continue
Eventually I will find a Blog Series that I can Stick with. A good example of a series that has been spectacular is Will Bell’s SQL Query Series; if you want to learn some neat tricks with pulling records from the CUCM Database while getting a better understanding of how SQL Statements work and how the Fields within a Table of a Database relate with other Tables YOU WILL WANT TO CHECK IT OUT! Sorry for the caps there but you really need to check out his blog..I can only hope this blog can evolve into something like what he has created on his blog.
Today though is just an announcement..and I hope that it will be well received. As the title might denote, I will be casting a wider net when it comes to how I demonstrate Cisco DevOps; I want to “show off” a wider expanse of Cisco technologies..and I will be able to do it by utilizing the Cisco Developer Sandbox and I encourage you to join me! One, the more who have the ability to use this Sandbox the better the environment will become especially when we provide feedback on how some things may need to be set up and Two we’ll just geek out on code and junior mints perhaps..and we can collaborate in Shared Labs..
Since this is a generically titled post, I shouldn’t have any issues keeping the series going. In fact if you look at the Menu of my site, you should already see an option there that says Cisco API Series. And I’ve already interfaced with a few APIs as you will see there (all collaboration based apis): CUCM AXL, Cisco Unity Connection REST API, and Contact Center Express REST API; hopefully soon I will move onto technologies such as CMX (from the Sandbox when it becomes available), APIC-EM, IoT Controllers and Sensors, et al. If you ever visit developer.cisco.com you might notice that there are code samples available, however, they aren’t entirely consumable out of the box. What I want to provide here are practical usage guides along with the Source Code, so you can experiment yourself and come up with your own brilliant ideas of how to use the technology being dealt with. I also want to post stuff on GitHub where it can be forked and further collaboration on the Source Code can be performed. The next several posts are more than likely going to be UC Collaboration based, but I will get to the REST of the APIs very soon..
Let me know what you want to see? I’m open to requests, but remember I may not even know the technology you are asking me to post on..so it might take some time..plus, the technology may not be quite ready in the Sandbox. And, it’s probably better to keep things short…for the posts…and collaborate further in other spaces..I don’t quite know what those other spaces are yet..but I’ll come up with something..or perhaps I can encourage the setup of something that is brewing in the back of my mind…
Make no mistake about it, the DevNetZone at Cisco Live ’14 was a show in organization, meticulous planning, and superb leadership, boasting a group of unrivaled, highly caffenated coders who helped facilitate the consumption of the featured APIs…And I worked on that sentence for 2 days!! And still don’t think I got it quite right 🙂 . Over the next several years, if we want to continue to be viable in this industry, we will need to build a much stronger developer ecosystem; as some have stated, I did not say that all of us would need to become developers although that would be cool too eh?!? Getting developers interested in creating tools that are built using your technology is very important just ask some of the recent companies that have been affected by not being able to do this (ahem BB and others who were devastated by innovation in a certain sector of the market in circa 2007); this may not apply to Cisco and the type of platforms it builds, but most individuals in this particular sector of IT understand that there are major shifts occurring for the way Networks are being built, Things that are connecting to it, and Clouds that are formed and managed by it. So if one of the goals was to reinvigorate a community that has, up until recently, taken a backseat in Cisco’s ecosystem (unintentionally of course), I believe they achieved this with detailed support(those caffeinated coders) and the flawless execution of a very complex hackathon that featured a vast array of Cisco technologies(you only need to inspire 1). So I suppose I should thank software defined networking (SDN) for causing any barriers that might have existed before to start deteriorating..
Posted in Coding