Tag Archives: scripting

Active Unassigned DN’s – Updating with SQL

Update to a previous post

Disclaimer :

Provided as is – you break your box all on your own buddy!  Lab this first.

 The offending DNs can be queried using:

select n.dnorpattern from numplan n
left outer join devicenumplanmap m on m.fkdevice = n.pkid
where m.fkdevice is null
and n.tkpatternusage = ‘2’
and n.iscallable = ‘t’

  • m.fkdevice is null assures the Route Plan element is unassigned
  • tkpatternusage = ‘2’ matches DNs only
  • iscallable=’t’ defines the “Active” checkbox on the DN page – and our offending behaviour.

Some help came from here.

Construct your own UPDATE SQL statement to fix it!  As assistance – start here, it’s not too difficult.

#dontcalltac

Tagged , , , , , ,

WebEx in Ubuntu 14.04+ for x64 systems

As per Cisco’s WebEx System Requirements specification, WebEx is only supported in x86 for Linux, and for Ubuntu specifically in 12.x and 14.x with Gnome.

However, most modern machines use the x64 architecture, so this does create a problem.  I had some fun sorting out this one ( I need it for work, so it’s pretty important I guess 🙂 ).  The steps to resolve are fairly well documented, and in summary are as follows:

 

  1. WebEx requires Java.  The WebEx system requirements guide says Java 6, but it works just fine (eventually!) in Java 8.
  2. Regarding browsers, Chrome just doesn’t work – walk away.  Need Firefox here!
  3. Java may require certain security exceptions in certain cases to get this working
  4. Even after initiating a Webex, in-meeting features such as audio, desktop share etc. are not going to work.  At the time of meeting initiation, WebEx will prompt the user to accept the download of a number of shared libraries (.so files)  to the user’s /home directory, that are stored under /home/myuser/.webex/.  These will contain package dependencies that will prevent most features from working, and should be addressed using this process.

 

There is however still a caveat listed here that needs to be taken into consideration.  It’s important to install the correct icedtea plugin to remove any conflicts:

 

sudo apt-get -y remove icedtea-7-plugin:i386 icedtea-netx:i386
sudo apt-get install openjdk-7-jre:i386 libxmu6:i386 icedtea-7-plugin firefox
sudo update-alternatives --auto mozilla-javaplugin.so

 

It definitely doesn’t look too pretty in Ubuntu, but hey, for my purposes (support) I’m happy it’s working!

Tagged , , , , ,

Migrating to Ubuntu – Practical Guide for Voice/Network Engineers

I’ve recently migrated from Windows to Ubuntu.  I was issued a new Dell laptop at the office after suffering through an HP device for… too long!

I decided to take the opportunity to migrate to Ubuntu.  It’s been a long time coming.  I wasn’t new to the OS, but I’m not a guru either. 🙂

 

INSTALLATION AND SETUP

The key to success here is a good plan before even creating your LiveCD/USB and installing the OS!

CONVERTING FROM WINDOWS

Some planning is involved to make this a success.  These guides helped me:

 

DISK PARTITIONING

Ensure that you have a good plan on your disk partitioning, especially for /, /home, /boot, swap:

DUAL BOOT WITH WINDOWS

Very good guide – boot loader consideration, partitioning are key here:

OS INSTALLATION

The installation itself is straightforward.

 

GRUB2 BOOTLOADER

Becomes quite important, especially for non-trivial and dual boot.

 

BASIC UBUNTU DESKTOP SETUP

CLI COMMANDS

Just the basics for day 0 if you need it:

TEXT EDITOR – VI

I’m quite a fan.  For GUI-based editors, I like Geany as well (quite a lot like Notepad++ in Windows – its pretty much an IDE).

Noteinstall vim immediately! vi has issues with certain keys in 14.04.

FILE RENAMING – REMOVING WHITESPACE FROM MIGRATED WIN DOCS

Sounds silly, but this is a really key issue to resolve.

Migrate files, then update them.  Thankfully, this is what BASH was made for, and a one-liner find does this perfectly!

 

FILE SHARING AND SAMBA

Key topic in mixed office environments.

 

PRINTING

Setting up network printers for an office environment.

 

MAIL

I chose to use Thunderbird as my mail client.  Exchange generally is a problem, but there are some solutions… Took me a while to get this working, but wasn’t too emotional.

MIGRATING PST MAIL ARCHIVES

This process is key.  The realpst package is awesome!

INTEGRATING TO EXCHANGE FROM THUNDERBIRD

Use Exquilla if you can.

This is not a free tool!

 

INTEGRATING TO OWA FROM THUNDERBIRD

I ended up using this as our exchange team couldn’t get me the EWS integration information I needed for Exquilla and auto-discovery didn’t auth with my account.

This is an excellent solution.  Watch out for package dependencies needed (JDK will be required) and untrusted sources.

CALENDAR INTEGRATION

I used DavMail for this again with DavCal.

I also integrated Gmail with DavCal.

 

THUNDERBIRD CUSTOMIZATION

Thunderbird may require some tweaking to have your client act more like Outlook – I needed this to comply to office mail standards with signatures and reply/forwarding behaviour.

Consider installing the SmartTemplate4 add-on:

Creating customized HTML mail signatures:

 

PRINTING

Easy to set up.  A good read as well

 

VIRTUALIZATION

I decided to go for VirtualBox.  Just some pointers that for things that I needed to get working with a Ubuntu Host/Win7 Guest setup.

I had some performance issues (v. high host CPU) related to:

SHARING USB

Works with vmware-tools if you using vmware, but some considerations if you use VB:

SHARING FOLDERS

Not too difficult to get working:

However, you do need to have Guest Tools loaded:

LEAVE IN WINDOWS

Some things are not better and for non-trivial tasks I didn’t even look at open source alternatives:

  • Visio
  • Office

 

PROGRAMS / SOFTWARE IN LINUX

Just the basics – it’s a great blog! 🙂

NETWORK ENGINEERING TOOLS

Just a selection of Voice/Network Engineering tools that I found useful to immediately use in Ubuntu.  This is what Linux is made for, and why I migrated I guess 🙂

VOIP/SIP TOOLS

Just to get started, the usual suspects:

  • RTMT
  • TranslatorX
  • audacity – IVR-related stuff
  • Winimage for Answer Files? – wrote a simple BASH script for that!
  • SIP Workbench in Windows – will look for a decent alternative and update…

NETWORKING TOOLS

Just some to get started with:

  • geany  – I start with this because every good engineer needs a good text editor.  For GUI-based this is my favourite
  • nmap – n00bs like me can ease into the CLI by starting with zenmap
  • gns3 – much better in linux!
  • wireshark + tshark
  • pac – excellent PERL-based replacement for SecureCRT!

A lot of scripting in Python and BASH will replace awkward Windows programs…

VPNs

As a consulting engineer, I have a number of client VPNs to connect to – covering PPTP, Cisco VPN and AnyConnect/JunOs/FortiClient.

Here’s a general Ubuntu overview:

PPTP

This is a stock standard for smaller clients.  There are occasional errors, but most are easily solved by tailing /var/log/syslog.

VPNC

I’d had tremendous issues with this, usually related to poor encryption on the server-side configuration that Linux doesn’t accept.

I wrote this wrapper script that deals with the challenges relating to 1DES weak encryption-related issues if you want to use the terminal to initiate the connection:

#!/bin/sh
sudo vpnc –local-port 0 –enable-1des /etc/vpnc/myvpncconffile.conf

I named it vpnc-connect-wrapper, made it executable and placed in it /home/myuser/bin.  It’s now available to initiate weaker connections.  I saw some solutions re-naming the default binary, which I didn’t like.

Hard-coded with the .conf filename for now…  Will add shell options later.  It’s fairly trivial to do.

The Network Manager Gnome GUI also has added a weak encryption Advanced Setting option to deal with this as well

UPDATE:

I still can’t get this working for multiple VPN connections.  I’ve resorted to doing this in my Windows VM.  I see many online posts with the same logs, and no solution in 14.04 or 14.10.  Not sure about later versions, but its been broken since before 12.04.

SSL VPN:

Got this working as well!

CHECKPOINT SNX

Used to be available as a Linux command line tool, but sadly is now only available through a browser connection – a number of dependencies to get this working, including installing Java.

 

 

OS ADMINISTRATION

LINUX KERNEL

Quite advanced.  Keep for reference for later:

 

PACKAGE MANAGEMENT

Just an overview for Linux newbies…

LINUX SYSTEM DEBUGGING

This really is an excellent tutorial on this topic

 

HARDWARE TROUBLESHOOTING

A basic overview of common troubleshooting tools and tips:

 

BASIC SYS-ADMIN HACKS

Some sys-admins tasks to get you going.  Some were useful early on.

BACKUPS + SYSTEM IMAGING

Key topics when you are new to an OS and you wanna back out a f&^k up.

 

USEFUL LINUX FORUMS

I got a lot of value out of these:

Hope this helps a few folks!

Tagged , , , , , , , ,

Regex – Conditionally Modifying User Data to “Title Case” for Phone Labels

Sadly a lot of UC is well, about those pesky end users.  This generally involves user data of some sort, and inevitably this is bad data.  Formatting text to get your 1k users can be a pain – even when the AD team you are working with are on top of things.

As an example, something I see a lot is changing data looking like this:

1234-AS JONES

To this:

AS Jones – x1234

This requires a conditional match, moving things around, and a case change (Title Case).  The first 2 letters are initials, so I need to account for those as they must stay capitalized.

Excel requires a number of steps to do this.  I need to use a text editor here or a CLI tool like SED.  For me, Notepad++ is my poison of choice as I’m still bound to Windows.  Its a good tool use.

Firstly, I could try and use it’s built-in features available:

propercase

 

But this doesn’t give me the CONDITIONAL control that I want.  Using Excel is even worse.  I hate it and try avoid it at all costs.   I need REGEX to complete this task.


 

My requirement is completed using tagged expressions and the following:

  • \L – Translates everything to lowercase until the end of the replacement string
  • \u – Translates the next letter to uppercase

I’m not going to go into detail on the rest, as if you’re a voice engineer on Cisco – you know the rest already (I hope!).


 

So let’s look at his this is achieved in Notepad++:

  • Input: 1234-AS JONES
  • Regular Expression: ^([0-9]{4})-([A-Z]+) ([A-Za-z]+)
  • Replaced with: \2 \L\u\3 – x\1

The output is now exactly what I want:

AS Jones – x1234

In NPP the regex input looks like this:

regex

 

 

What is neat about this is that I wanted to conditionally only change the case of the surname – this left the user’s initials intact and did not give me camel case which I wanted to avoid.

Please see here for more info.

Hope this helps!

Tagged , , , ,

Prime Collaboration Provisioning – Aborting Failed Orders

If you’ve worked with Prime Collaboration Provisioning, you will be accustomed to this ongoing headache when using Batch Provisioning:

pcp

 

The queuing architecture is atrocious, and is very prone to failure.  Also, validation is pretty much non-existent, so this is a pretty common issue.  Delightfully, there is no way to resolve failed orders other than from root.

 

[root@myhostame01 ~]# cd /opt/cupm/sep/ipt/bin/
[root@myhostame01 bin]# ./AbortOrders.sh globaladmin <password> <order_number> -forced

[root@myhostame01 ~]# cd /opt/cupm/sep/ipt/bin/
[root@myhostame01 bin]# ./AbortOrders.sh globaladmin myp@ssw0rd 164 -forced
===========================================================================
AbortOrders.sh

—————————————————————————

Copyright (c) 2009 Cisco Systems, Inc.
All rights reserved.
===========================================================================
—————————————————————————–
Aborting orders with id: 164
—————————————————————————–

Stopped Provision
Stopped VoIPBatch
Stopped AddLine
Stopped AddLineBatch
Number of rows updated = 1
—————————————————————————–
Order with Id 164 is aborted successfully
—————————————————————————–

[root@myhostame01 bin]#

 

Had to hunt to find this:

 

https://supportforums.cisco.com/discussion/12576731/prime-collaboration-provisioning-105-abort-orders

 

 

UPDATE:

During a call this week [02/2016] with the PCP Product Manager and TME this week has confirmed that this (as well as many other) features will be added to the UI to remove the need to access root.  This work is being done to meet FIPS requirements – great news functionally as well! 🙂

Tagged , , , ,

Lua Script Solves Call Forward Masking

Had to implement an Auto Attendant in Unity today.  The client had a requirement to send after-hours calls out to the PSTN, but had to be routed in to their Call Centre, which had it’s own IVR which matched on calling number, that needed to be the switchboard number for their site.

Call Flow was as follows:

  1. Inbound call from PSTN
  2. CTI RP re-direct to Unity
  3. Unity Call Handler, with Close and Holiday transfer to 2nd Call Handler
  4. After-Hours Call Handler transfers back to After-Hours CTI RP
  5. After-Hours CTI RP as Call Forward to a PSTN number

 

The behavior that we see is controlled by SIP Trunk Calling Party Selection parameter, which is set to “Originator” by default:

pic1

 

The SIP INVITE sent to the CUBE looked like this:

INVITE sip:0112223344@mygateway.mydomain.com:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.5.5:5060;branch=z9hG4bK55cd222ad94e
From: <sip:0255667787@myhostname.mydomain.com>;tag=336868~0d10edf8-0553-4009-a728-c065d8394e46-24136542
To: <sip:0112223344@mygateway.mydomain.com>
Date: Mon, 07 Dec 2015 10:38:00 GMT
Call-ID: 94dfb980-66516188-5120-247410ac@192.168.5.5
Supported: 100rel,timer,resource-priority,replaces
Min-SE: 1800
User-Agent: Cisco-CUCM11.0
Allow: INVITE, OPTIONS, INFO, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY
CSeq: 101 INVITE
Expires: 180
Allow-Events: presence, kpml
Supported: X-cisco-srtp-fallback
Supported: Geolocation
Call-Info: <sip:192.168.5.5:5060>;method=”NOTIFY;Event=telephone-event;Duration=500″
Call-Info: <urn:x-cisco-remotecc:callinfo>;x-cisco-video-traffic-class=DESKTOP
Session-ID: 97632eb36d62419cbdc5fe71aa336867;remote=00000000000000000000000000000000
Cisco-Guid: 2497689984-0000065536-0000000110-0611586220
Session-Expires: 1800
Diversion: “After-Hours Re-Direct” <sip:**999@mydomain.com>;reason=unconditional;privacy=off;screen=yes
P-Asserted-Identity: <sip:0255667787@myhostname.mydomain.com>
Remote-Party-ID: <sip:0255667787@myhostname.mydomain.com>;party=calling;screen=yes;privacy=off
Contact: <sip:0255667787@192.168.5.5:5060>
Max-Forwards: 69
Content-Type: application/sdp
Content-Length: 227

v=0
o=CiscoSystemsCCM-SIP 336868 1 IN IP4 192.168.5.5
s=SIP Call
c=IN IP4 172.16.115.23
b=TIAS:8000
b=AS:8
t=0 0
m=audio 26842 RTP/AVP 18 101
a=rtpmap:18 G729/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15

 

  • In this case the calling party is sent out at 0255667787.  We want this sent out as 0255667000 to me the client’s requirement.
  • To do this, we need to correct the From, PAI, RPID, and Contact headers
  • The Diversion Header contains the Internal DN of the CTI RP – not very pretty, and something that our ITSP may bark at!  We must change it.
  • The headers MUST ONLY be modified when the call is forwarded FROM THIS CTI RP – my “hook” here will be the offending Diversion header.

 

I opted for a Lua script.  I find complex SIP Profiles unwieldly, which could have been another option.  Vomit.

 

So, here’s the script that achieved it.  Pretty simple in fact:

M = {}

trace.enable()

function M.outbound_INVITE(msg)

— Input for script
local ctirpdn = scriptParameters.getValue(“ctirpdn”)
local mainnumber = scriptParameters.getValue(“mainnumber”)
local rdnis = scriptParameters.getValue(“rdnis”)

— Get Diversion header
local diversion = msg:getHeader(“Diversion”)

— Check if Diversion Header exists and if the CTI RP DN is matched
if diversion and diversion:find(ctirpdn) then
trace.format(“Successful match on diversion – applying masking”)

trace.format(“CTI RP DN is : %s”, ctirpdn)
trace.format(“Main Number is : %s”, mainnumber)

— Apply masking to affected headers – From, PAI, RPID, Contact
msg:applyNumberMask(“From”, mainnumber)
msg:applyNumberMask(“P-Asserted-Identity”, mainnumber)
msg:applyNumberMask(“Remote-Party-ID”, mainnumber)
msg:applyNumberMask(“Contact”, mainnumber)
— Apply masking to Diversion to mask internal CTI RP DN
msg:applyNumberMask(“Diversion”, rdnis)

end
end

return M

The bold script params were applied on the SIP Trunk.  I decided to use Unity as the forwarding station, as set this as the “rdnis”.  The key is the IF STATEMENT, that only applied changes if the CTI RP DN is matched in the header.  Otherwise, the script is skipped.

 

Now, for testing… Let’s open up RTMT and trace this in SDL:

 

 

03149762.001 |13:00:37.979 |AppInfo |//SIP/SIPUdp/wait_SdlSPISignal: Outgoing SIP UDP message to 192.168.1.3:[5060]:
[990360,NET]
INVITE sip:0112223344@mygateway.@mydomain.com:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.5.5:5060;branch=z9hG4bK5634188efa43
From: <sip:0255667000@myhostname.@mydomain.com>;tag=337995~0d10edf8-0553-4009-a728-c065d8394e46-24136584
To: <sip:0112223344@mygateway.@mydomain.com>
Date: Mon, 07 Dec 2015 11:00:37 GMT
Call-ID: bdb57e00-665166d5-516d-247410ac@192.168.5.5
Supported: 100rel,timer,resource-priority,replaces
Min-SE: 1800
User-Agent: Cisco-CUCM11.0
Allow: INVITE, OPTIONS, INFO, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY
CSeq: 101 INVITE
Expires: 180
Allow-Events: presence, kpml
Supported: X-cisco-srtp-fallback
Supported: Geolocation
Call-Info: <sip:192.168.5.5:5060>;method=”NOTIFY;Event=telephone-event;Duration=500″
Call-Info: <urn:x-cisco-remotecc:callinfo>;x-cisco-video-traffic-class=DESKTOP
Session-ID: 97632eb36d62419cbdc5fe71aa337994;remote=00000000000000000000000000000000
Cisco-Guid: 3182788096-0000065536-0000000119-0611586220
Session-Expires: 1800
Diversion: “After-Hours Re-Direct” <sip:0255667800@@mydomain.com>;reason=unconditional;privacy=off;screen=yes
P-Asserted-Identity: <sip:0255667000@myhostname.@mydomain.com>
Remote-Party-ID: <sip:0255667000@myhostname.@mydomain.com>;party=calling;screen=yes;privacy=off
Contact: <sip:0255667000@192.168.5.5:5060>
Max-Forwards: 69
Content-Type: application/sdp
Content-Length: 227

v=0
o=CiscoSystemsCCM-SIP 337995 1 IN IP4 192.168.5.5
s=SIP Call
c=IN IP4 172.16.115.23
b=TIAS:8000
b=AS:8
t=0 0
m=audio 22640 RTP/AVP 18 101
a=rtpmap:18 G729/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15

 

Working perfectly! 🙂

 

#dontcalltac

 

 

 

 

Tagged , , , , , ,

Lua Scripting – Replacing FQDN with IP in SIP Headers

A friend of mine at Cisco TAC pinged me a few days ago, asking to assist him with a case he’s working on that required a sip normalization script.

The call flow included a SIP Trunk to a conferencing system that was DNS-enabled.  CUCM was unable to lookup the DNS address (in this case due to a bug), and since the system was integrated directly to CUCM (not via CUBE), the only option for normalization was a Lua script.

The requirements of the script were:

  1. Find/Replace a number of potential FQDN/IP combinations
  2. Apply required normalization to “Contact” header
  3. Contact head must be modified for initial inbound INVITE, and all subsequent inbound responses to the INVITE
  4. Other messages should be ignored

Script:

–[[

Author : Jonathan Els
Email : jonathanelscpt@gmail.com
Version : 3.0

Description:

Find and replace FQDN with IP in Contact headers.
Script is applied to Inbound INVITEs and all Inbound INVITE responses

Future development:

None planned

–]]

M = {}

trace.enable()

— Customer-specific DNS table initialization – edit on per-script basis
local dns = {}
dns[“1.1.1.1”] = “hostname1%.rootdomain%.com”
dns[“2.2.2.2”] = “hostname2%.rootdomain%.com”
dns[“3.3.3.3”] = “hostname3%.subdomain%.rootdomain%.com”
local function process_contact_headers

— Get Contact header
local contact = msg:getHeader(“Contact”)
local iptest = “@(%d+%.%d+%.%d+%.%d+)”

— Check if exists and if URI host portion is FQDN
if contact and not contact:match(iptest) then
trace.format(” — Contact URI host portion matched FQDN”)
trace.format(” — Contact header is : %s”, contact)

— Iterate over domain and substitute if matched
for ip,fqdn in pairs(dns) do
if contact:match(fqdn) then
contact = contact:gsub(fqdn, ip)
trace.format(” — Matched on : %s”, fqdn)
trace.format(” — Modified to : %s”, ip)

— Modify contact header
msg:modifyHeader(“Contact”, contact)
break
end
end
end
end

— Apply to INVITE request and all INVITE responses
M.inbound_INVITE = process_contact_headers
M.inbound_ANY_INVITE = process_contact_headers
return M

Some Notes:

  • The requirement called for both request and response handling
    • M.inbound_INVITE
    • M.inbound_ANY_INVITE
  • The multiple handling requirement resulted in a “purposed-based” function being used to avoid duplication of code.
  • Some checks were added to skip and exit in the event that
    1. Contact header did not exist
    2. URI host portion was an IP Address.
  • Lua does not support full regex (regex is slow), so a standard IP approximation was used.  The “@” prefix in the match is used to ensure the match is on the URI.

Useful Resources:

The last resource from Cisco Live is possibly the best “How-To” out there!

Happy scripting.

#dontcalltac

Tagged , , , ,

Lua Scripting – Proxied Manager Breaks MWI for Centralized CUC Behind SME

I’ve been working as design and deployment lead on a globally significant full Collaboration on-premise deployment for the last 3 months (think 120 CUCM across 9 Leaf Clusters on 101 UCS C240’s) that’s been keeping me quite busy 🙂

As part of the deployment design phase, a decision was taken to centrally host Unity Connection for all 9 Leaf Clusters.  As I commenced with the dial plan design, while I reviewed the business requirements I identified a call flow that I knew would immediately create a problem.  Some like a board, pen and paper or even spreadsheets for call routing – I like to do these in my head as I jot down the configuration elements in notepad++.  Your preferred method is irrelevant – the point is always to model your call flow design prior to implementation – with the intention to find inherent call flow failures.

The client had a strong use case for a proxied manager configuration, with a secretary available to take calls on their behalf.  There are a number of ways to configure this, but from a routing perspective, a separate partition is always required for the manager, with reach-ability only from the secretary’s CSS.

The Challenge:

  • Call flow required is CUC > SME > Leaf > Manager Phone
  • MWI is routed from CUC via an Out-of-Dialog SIP NOTIFY
  • In the CUCM SIP construct, this uses the same Inbound CSS as a standard call

The Likely Result:

  • The manager’s MWI will never light up – no reach-ability in the inbound CSS without violating an inter-cluster proxied routing requirement
  • Depending on your configuration, the proxied line on the secretary’s phone is probably going to light up instead!

The requirement is not unique, but the advent of SIP, and wanting a scale-able solution posed a challenge.


Due to the scale of deployment and tight timelines, our local SE was kind enough to arrange some time with a BU dial plan specialist to review my dial plan design, with some recommendations along the way (what an awesome experience!).  I was keen to pose my dial plan issue to the BU, as I was quite sure that a special method would be needed to accommodate this.

After some discussion, a Lua script was proposed.  I was quite keen on the idea, as I’ve had some experience writing these before.  The call flow idea was actually quite simple:

  1. CUC > SME > Leaf (end-to-end SIP)
  2. SIP Normalization Script (on Leaf Trunk) > Custom Routing Prefix on Manager DN (think “**”)
  3. Translation Pattern (PreDot strip with correct re-prefixing) > Custom CSS with prioritization of Manager Partition(s)

The BU provided me a script for a similar case, which I customized to support my requirement:

–[[

Author : Jonathan Els

Description:

Script for separate handling of MWI to accommodate proxied partitions for centralized voicemail designs with SME – e.g. with Proxied Manager/Secretary configurations
Script strips initial chars (“0” hard-coded in this script) to add a prefix for custom routing

Future development:

1. Add contextual checks to specifically limit to MWI – possible matching on Content (“Messages-Waiting” etc.) or CUC source address could apply
1. Use prefix as script param.

–]]
M={}

trace.enable()

function M.inbound_NOTIFY(msg)

— Set prefix for MWI
prefix = “**”

— Need to convert E.164 to **-prefixed string in request URI and To header
local m,r,v = msg:getRequestLine()
r=string.gsub (r,”sip:0(%d*)@”, “sip:” .. prefix .. “%1@”)
msg:setRequestUri (r )

local t = msg:getHeader(“To”)
t=string.gsub (t,”sip:0(%d*)@”, “sip:” .. prefix .. “%1@”)
msg:modifyHeader (“To”, t)
end

return M

In our dial plan, we deviated from the +-E.164 CVD best practice due to a limitation on the client’s billing system.  We preferred localized DID’s instead.  As a result, the above script uses the following pattern match:

sip:0(%d*)@”

Without excessive deviation, if your call routing requirement dictates the need for Lua scripting, please take the time to understand Lua Pattern Matching.  Lua’s about *speed*.  Regex is damn slow.


During testing, I hit a snag and reached out to the BU once again…

Looking at SDL showed the script to be working:

00240075.000 |17:09:45.622 |SdlSig   |SIPNormalizeReq                        |wait                           |SIPNormalization(2,100,78,1)     |SIPHandler(2,100,79,1)           |2,100,14,91.8^192.168.116.12^*           |*TraceFlagOverrode

00240075.001 |17:09:45.622 |AppInfo  |//SIP/SIPNormalization/trace_sip_message: After inbound SIP Normalization msg is:

[20427,INT]

NOTIFY sip:**111001001@192.168.116.21:5060 SIP/2.0

Date: Wed, 24 Jun 2015 15:09:45 GMT

From: <sip:voicemail@192.168.116.12>;tag=36349161

Event: message-summary

Content-Length: 23

User-Agent: Cisco-CUCM10.5

To: <sip:**111001001@192.168.116.21>

Contact: <sip:voicemail@192.168.116.12:5060;transport=tcp>

Content-Type: application/simple-message-summary

Call-ID: ad6c800-58a1c839-13de1-c74a8c0@192.168.116.12

Subscription-State: active

Via: SIP/2.0/TCP 192.168.116.12:5060;branch=z9hG4bK13ecf35a0eda8

CSeq: 102 NOTIFY

Max-Forwards: 70

 

Messages-Waiting: yes

However, I soon found that the standard digit analysis engine was not being applied.  The TP’s in my CSS’s were not being matched!  I actually confirmed this by configuring my expected pattern – **111001001 – on an entirely different phone and watched its MWI light up.

The BU suggested that I try setting the Advanced CallManager Service Parameter Multiple Tenant MWI Mode to “True”.  In our initial discussions, I’d been informed that this was not required in the SIP Trunking use case, but this ultimately did not prove to be the case.  After doing this, the translation pattern kicked in and that elusive MWI lit up immediately.

Tagged , , , , , ,

Quick and Dirty DNS Testing

Quick and easy sanity checks…

My requirement was to test 500 A/PTR records.  The client didn’t feel comfortable with bulk loading the records, so the work had been split up to be manually added between multiple resources – I was concerned, and didn’t have much time to find the errors.

Process followed:

  1. Save a file containing all your IP’s
  2. Save a file containing all FQDNs
  3. Run the following from windows cmd:

FOR /F %i in (txt) DO nslookup %i >> resolutions-ip.txt 2>> failures-ip.txt

FOR /F %i in (.txt) DO nslookup %i >> resolutions-fqdn.txt 2>> failures-fqdn.txt

  1. Go have coffee and think how clever you are
  2. Realize that this could actually be scripted properly in Python and realize how clever you aren’t

This quickly gave me a great list of missed records from STDERR.  The duplicates and mismatched records were confirmed with some regex magic in notepad++ on the STDOUT output.

3mins work for pretty good yield, but if it’s a repetitive task (it wasn’t for me… yet…), script it properly!

Tagged , , ,
Collaboration Engineer

All things Collaboration - Posts to save for when you need them

Gerry Keleghan's Blog

A Blog about Cisco Unified Communications

ccieme

my personal journey to ccie collaboration

Striving for greatness

Thoughts on emerging tech, open source, and life

Network Experts Blog

“Knowledge comes by eyes always open and working hands.”

SIP Adventures

A unified communications blog by Andrew Prokop

The Cloverhound Blog

Cloverhound Employees Talk Unified Communications and Contact Center

Warcop

Fog navigator. Get out of the clouds. Down to earth solutions. @Warcop

Cisco Collab Engineering Tips

Michael White - CCIE #26626

Darkroomstory

Photography by Manos,

afterthenumber

Thoughts and experiences of a Cisco Collaboration engineer after clearing the CCIE lab...

Longreads

The best longform stories on the web

The Daily Post

The Art and Craft of Blogging

The WordPress.com Blog

The latest news on WordPress.com and the WordPress community.