I've been troubleshooting a phone issue recently which required me to upgrade the firmware. The deal however is that the phone is a few thousand miles away from me across a link with poor connetivity. The remote phone is running a firmware of 8.5 and the Cisco Call Manager is holding a version of 9.1. Upgrading the firmware across the link using TFTP causes huge packet loss and frankly takes about 5 hours...per phone! I needed a way to get those phones upgraded without the pain of waiting. I found one and it's using good old TFTP off the router.
So usually when a phone registers with the Call Manager it checks that the phone is running the same firmware and if not upgrades it. So in the first instance to get the phone registered we need to tell Call Manager that the remote phone is running good firmware i.e. we both agree on the version. First thing to do is to edit the Default phone load -> Device -> Device Settings -> Device Defaults
My phones are all 7942's so I'm going to edit that line for the SCCP image (adjust accordingly if you are running SIP). See the others are 9-1-1 but the remote phone is running 8-5.2 so lets set it to the same and then when it boots up it'll think it's all good.
OK so thats all good. Now my remote phone boots and registers with CUCM - great news for the customer but not awesome for me because I'm now running older firmware on the phone which means some of the features won't work.
So how do we get the remote phones to upgrade with this poor link? Locally.
First thing I needed to do was to upload the firmware to a remote device. The remote device then had to be running a TFTP service. The remote site is very 'remote' so on top of everything I have no-one at the remote side to help with this. So the best option available to me was to dump the firmware onto the flash of the router.
First I needed to get a copy of the firmware running on the call manager onto the remote router. The first thing I did was archive all the files I needed into .tar files. This fills three purposes; firstly it allows me to reduce the size of the files and keep them neat, secondly it allows me to unarchive them at the remote end and it's way faster than individual tftp copies. Finally it allows me to use FTP (reliable TCP) rather than TFTP (unreliable UDP) to move the files across the ether...way better. I used 7-zip
to make the tar file but you can use whatever works for you.
I won't bore you with the details but here is the main points. First I wanted to source the FTP from my tunnel interface because I'm running VRF's...this is not essential usually.
|(config)#ip ftp source-interface Tunnel30|
Next I needed to create some directories to put these files into. Again this is not essential, I just wanted to keep things neat. Here si a quick 'dir flash:' and you can see there are a few files here like IOS and secure desktop VPN client etc. No phone firmware for sure.
So in priv exec mode we need to create the folders. Like good CLI guys we all use mkdir (Make Directory) right?
OK so now we use a little gem of a tool called 'archive'. With it we can now extract a TAR file as it is pulled from our FTP server. I call archive and ask it to uncompress 'xtract' the TAR achive we created earlier using 7-zip called '7942-7962.tar'. We'll extract it into the folder we just created. The attached picture doesn't show the command...
archive tar /xtract ftp://10.1.130.200/7942-7962.tar flash:/phones/7942-7962
OK so the files are on the firmware now. So I need some configuration so that the router can act like a TFTP server. I've made my life a little more difficult by putting th files into directories so I need to you the 'alias' command to make the TFTP server those embedded files as if they were on the root of the TFTP server.
The XMLDefault.cnf.xml file is the config master and is lifted by the phones...it has to be there. The other files are called from the .loads file and are pulled using TFTP in order.
OK so we've got all the firmware on the router. The router has been configured to serve the files using TFTP from the root using the filenames listed. In my case because I am running VRF's I needed to source the TFTP loads from an interface which the phones are in.
So whats next? Well its all down to Call Manager now. When you boot the phones they pick up Option 150 from the DHCP server running on the router pointing them at the Call Manager. The CUCM box therefore needs to tell the phone to pick it's firmware from the local router. Fortunately this is easy enough.
First off lets find a phone over there which needs the new firmware. On the Call Manager click Device -> Phone and Find your phone. Click the link for your phoen and it'll open the main phone configuration dialog. Scroll right down to Phone Load Name or Ctrl+F to the work 'Load'
OK so now you set the new firmware version (the one which is loaded on the router) and here I have 9-2-1S. When thats done spin down to almost the bottom of the page and look for 'Load Server'.
Edit this and put in the IP address for the interface of the router holding the TFTP server/files. Also make sure the tick box is checked.
Now click Save and Apply Config.....Job Done. You can power on or reset the phone and it scoots off and downloads the firmware from the local router!
Thanks for reading!