Category Archives: Notepad

LG IPECS SIP Trunk Issue when WAN IP Address Changes (How to start to troubleshoot VoIP Issues with Wireshark)

Recently I had an issue with a couple of SIP trunks configured on an LG IPECs system when the WAN IP Address Changes.
TL;DR Version – I was getting a SIP2.0 502 Bad Gateway Error, turns out that the SIP provider (sip.iboss.com.au) had a setting that restricted the IP address that was being used to initiate the connection.

Basic Setup:
Router -> Switch <- IPECS The switch is a Cisco POE managed switch, with Voice Traffic on a VLAN. All the IPECS phones connect to the switch. The IPECS unit and the Router also connect into the switch. SIP trunks were setup on 2x of the CO lines. I was swapping the router from ADSL to NBN (vDSL). How to begin to troubleshoot the VoIP Connection issue. When I switched the router over (NBN), and tried dialling out on the phone they would say something like "Normal Call Clearing", and not ring. Yet, when I switched back to the original router (ADSL), it would work as normal. A lot of Googling suggested using Wireshark to inspect. How to start to troubleshoot VoIP Issues with Wireshark: Step 1) Install Wireshark on a machine Step 2) On one of the Switch ports, enable 'Mirror Mode'. On the Cisco web UI this was under Admin > Diagnostics > Port Mirroring. – Note: because VLANS were in use, I needed to mirror a VLAN, but first I had to remove the port from the VLAN, then choose that VLAN in the Port Mirroring Setup.
Step 3) Fire up Wireshark, choose the LAN connection that is connected to the Mirrored port and start the capture.

It’s always nice to see what something looks like when it ‘works’, so I first setup the ADSL router, hooked up wireshark and started the capture, I tried calling my mobile and answered it, then hung up, then stopped the capture.
Then in Wireshark you can click on ‘Telephony’ in the top menu and select SIP and will show you the connection, then click on ‘Prepare Filter’ and it will limit the main screen down to the packets that were involved in the phone call. Pretty Cool.
Closing the Telephony screen, if you right click on the first packet in the list (The Info column should say something like “Request: INVITE sip…….”), go down to Follow, then UDP Stream and a somewhat human-readable stream appears. I copied that screen out into Text File (notepad, notepad++, etc) for use later.

I then swapped over the router, did the same process as above and copied the new flow of data into another Text File.
I then compared the two files side by side using WinMerge.

The first part, looks ok. It’s natural that the IDs would change between calls.

Scroll down a bit and o dear, here is where we hit a problem.

From there it a was a case of trying various configurations. I swapped around routers (SIP ALG causes all sorts of issues with SIP lines), I tired 4G connections, finally I rang the VoIP provider – who last week told me that there wasn’t any IP address security restrictions – I was informed (I think by asking the right question and being blunt – “Are the VoIP Trunks tied to an IP Address?”) that yes they could change the configuration for me.

Side note: To make things a little easier in the testing, I copied the config from the iPECS into a Free Open Source Softphone – MicroSIP. I also had a secondary SIP account to test with a completely different provider, so my test process went something like this:
Bring up WAN connection on Router:
– Bring up Working secondary SIP account – call mobile. – Call connects and works. Router is working OK.
– Bring up Primary SIP account – call mobile. – Call works / fails.
– Change something (firewall rule, WAN connection, entire router)
– Repeat process.

By doing it this way, I have a ‘known’ test (Secondary SIP Account) that I can try, before trying the ‘unknown’ (Primary SIP Account)

Secondary Side Note: The LG iPECS has a field for “Firewall IP Address”, I believe that this is better described as “WAN IP Address”. It’s changed under ‘System&Device IP’ PGM 102 / PGM 103. It appears to use this in the SIP packets. I updated this before doing my WAN testing. Interestly, even with it set to the ‘Wrong’ IP address, things still worked?

Safe to say, I’m currently hating knowing this much about VoIP packets right about now…

BA Falcon Notes

General Personal Notes Around my BA Falcon. Petrol.
(Don’t follow this if you have LPG)

Spark Plugs:
– Buy the Genuine Ford ones. (Part: K16SR14)
– Tighten to 17NM (Section 303-01a-6 of Ford Manual)

Engine Oil (According to the manual):
– Engine Oil 10W-30 ILSAC – GF2 – [WSS M2C910 2 (I6 DOHC VCT)]
– 6 cyl capacity (inc filter) – 6.5 litres (why do they sell it in 6L bottles!)
Notes on Engine Oil (http://www.fordmods.com/ford-4l-and-6-cylinder-f1/oil-once-and-for-all-t27324.html)

Other Recommendations:
– Silicone Sealant (Loctite 5900 or similar) [WSS M4G323 A7]
– Anti Seize compound (Loctite 767 or similar) [ESE FM99C100 A]

Power Steering:
– BA Nut Part Number: BA3F656B
– BA O Ring for the Rack: N 803257 S
( Source: http://www.fordmods.com/ford-4l-and-6-cylinder-f1/high-pressure-steering-hose-t104852.html )

Limesurvey Admin 500 Internal Server Error

Recently I moved a LimeSurvey instance from one server to another, unfortunately, upon doing this I was suddenly unable to login to the admin panel.
The login screen would appear, but upon trying to login, the browser just sat there with a spinning “thinking” wheel.

After sometime the following would appear on the screen:

Request Timeout
This request takes too long to process, it is timed out by the server. If it should not be timed out, please contact administrator of this web site to increase ‘Connection Timeout’.

I tried enabling Debugging mode, but nothing was logged.
After some googling, I found this thread followed by this thread

The solution
It turns out that Limesurvey is trying to ‘call’ home in the background to see if there is an update. For whatever reason, this request is failing.
To stop it from doing this, it’s possible to edit the config.php file (/application/config/config.php)
And under the section:

'config'=>array(
// debug: Set this to 1 if you are looking for errors. If you still get no errors after enabling this
// then please check your error-logs - either in your hosting provider admin panel or in some /logs directory
// on your webspace.
// LimeSurvey developers: Set this to 2 to additionally display STRICT PHP error messages and get full access to standard templates
'debug'=>0,
'debugsql'=>0, // Set this to 1 to enanble sql logging, only active when debug = 2
// Update default LimeSurvey config here
)

And add a line to the bottom there ‘updatable’ => false,:


'config'=>array(
// debug: Set this to 1 if you are looking for errors. If you still get no errors after enabling this
// then please check your error-logs - either in your hosting provider admin panel or in some /logs directory
// on your webspace.
// LimeSurvey developers: Set this to 2 to additionally display STRICT PHP error messages and get full access to standard templates
'debug'=>0,
'debugsql'=>0, // Set this to 1 to enanble sql logging, only active when debug = 2
// Update default LimeSurvey config here
'updatable' => false,
)

Success!
I use Installatron inside of Cpanel to manage updates, so I’m ok with disabling updates here.

Environment Info:
LimeSurvey: 2.72.3+171020
Cpanel with
PHP 7
Litespeed

ASP.NET Core 2 Collection of Useful Resources

For a project, I’ve had to jump into ASP.NET Core 2.
I know nothing about ASP.NET Core 2, nor C#. (My background is in Python and PHP)

These resources helped me get going to build a REST API:

Start Here:
Offical Microsfot ASP.NET Core 2.0 Tutorial

Understanding of ASP.NET 2.0 MVC Model Binding, and all the different ways it can be used:
https://tahirnaushad.com/2017/08/22/asp-net-core-2-0-mvc-model-binding/

DateTime Model Binding:
It appears that if you want to easily use a date in a Model, it needs a bit more work. With this it allows the app to parse YYYY-MM-DD (and other formats) easily.
https://gist.github.com/vickramravichandran/f06d63bfb50f27e6549978b7538d214c

Understanding ASP.NET Core 2.0 MVC Filters – How to run code before and after MVC request pipeline in ASP.NET Core.
https://tahirnaushad.com/2017/08/28/asp-net-core-2-0-mvc-filters/

Zato MySQL Connection with UTF-8

Today this error appeared in an Zato Service:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2019' in position 1: ordinal not in range(256)

I turns out that SQLAlchemy defaults to latin-1 encoding instead of UTF-8 for MySQL connections.

Thanks to Andrea on a Zato Thread here: https://mailman-mail5.webfaction.com/pipermail/zato-discuss/2015-November/001443.html points out that we can just add
dbname?charset=utf8 in the WebUI.

While not intuitive, it does work.
I added it, had the service try the action again and all was well in the world again.

SuiteCRM / SugarCRM Rest API 500 Error get_entry_list

I stumbled upon this problem today when trying out the SuiteCRM Rest API.
When searching for an account by it’s name I was using a search like this:

"name = 'Andrew'"

The API was returning a 500 error.
I dug into the suitecrm.log and found this:

where (name = 'Andrew') AND accounts.deleted=0: MySQL error 1052: Column 'name' in where clause is ambiguous

It seems that because of the joins, it can’t work out which ‘name’ we are talking about. Lets add the table name in and tada it works:

"accounts.name = 'Andrew'"

Zato and Pandas (strange combination I know)

I’ve been working with Zato for a project and I’m getting some random text out of a HTTP request that looks like a CSV file, so the easiest way I know how to deal with this CSV data is with Pandas, then I could process it enough and clean it up to hand back to Zato.

But Zato doesn’t ship with Pandas….
(TL;DR at the bottom of the post)

In theory this should work:

/opt/zato/2.0.7/bin/pip install pandas

But then I get the error when I do the following:

/opt/zato/2.0.7/bin/python
>>> import pandas as pd
File "/opt/zato/current/local/lib/python2.7/site-packages/pandas/__init__.py", line 19, in
"Missing required dependencies {0}".format(missing_dependencies))
ImportError: Missing required dependencies ['pytz', 'dateutil']

No luck.

After trying pip install pytz and pip install –upgrade pytz
I get this error:

Installing collected packages: pytz
Found existing installation: pytz 2014.4
Cannot remove entries from nonexistent file /opt/zato/2.0.7/eggs/easy-install.pth

But this does work:

/opt/zato/2.0.7/bin/easy_install --upgrade pytz

Now to fix dateutil.

easy_install --upgrade python-dateutil

Let’s try it again:

/opt/zato/2.0.7/bin/python
>>> import pandas as pd
Traceback (most recent call last):
File "", line 1, in
File "/opt/zato/current/local/lib/python2.7/site-packages/pandas/__init__.py", line 23, in
from pandas.compat.numpy import *
File "/opt/zato/current/local/lib/python2.7/site-packages/pandas/compat/__init__.py", line 361, in
from dateutil import parser as _date_parser
File "/opt/zato/current/local/lib/python2.7/site-packages/python_dateutil-2.6.0-py2.7.egg/dateutil/parser.py", line 40, in
from six import text_type, binary_type, integer_types
ImportError: No module named six

Bummer!


easy_install six

And for a final test:

/opt/zato/2.0.7/bin/python
>>> import pandas as pd
>>>

Yay, it’s working. Hopefully, nothing in Zato has broken…

TL;DR:


/opt/zato/2.0.7/bin/easy_install pandas
/opt/zato/2.0.7/bin/easy_install --upgrade pytz
/opt/zato/2.0.7/bin/easy_install --upgrade pytz
/opt/zato/2.0.7/bin/easy_install six

UPDATE:
(I have not tested this)
It might work better to use buildout to make this work see this comment here:

https://forum.zato.io/t/what-is-the-canonical-way-to-add-extra-python-packages-to-my-zato-server/580?source_topic_id=586

There is another way, that of updating versions.cfg and buildout.cfg files but if you are more familiar with pip than buildout then pip install package-name is perfectly fine.

However, if a dependency is not on PyPI nor any other package index (such as your own internal one) then you can place individual Python modules in zato_extra_paths too.

Yii CGridView Default Order / Yii ActiveRecord Default Sort

Disclaimer, I know next to nothing about Yii….

Today I had an issue with a Yii App and it’s default admin CRUD tables, and sorting fields, well everything that listed a record from the database was in the order it was inserted into the database and not in a human friendly alphabetical order.

It turns out it’s really easy to set a default so that everything that uses the Model, comes out in a sorted way. (Note for larger things, you probably don’t want every single query that hits the DB getting sorted, so you’d probably only apply the sorting as required, but for small things, this shouldn’t be an issue).

For this example I have a Model called ‘Contacts’.

Open up your model (mine is: /models/Contacts.php)

Above the function ‘ public static function model($className=__CLASS__)’

Add the following function (if it’s not present)


/*
* Let's Setup some defaults!
*/
public function defaultScope()
{
return array(
'order' => 'FirstName'
);
}

In the array of ‘order’ change the value to the name of the column that you want to sort by, for my example it was ‘FirstName’.

Save, upload, test, enjoy.

Like I said at the start, I know nothing about Yii, had I, I probably wouldn’t have spent 20 minutes googling it.

Resources: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#default-scope

LG IPECs Tips and Tricks

Things I’ve had to pick up from working with an LG IPECs phone system.

1) Default Phone Password is: 147* (for when prompted when you first take them out of the box).

2) Setting up an additional phone.
– Make sure that DIP switch 3 is set to ‘on’ to allow additional handset registration.
– On another phone Go to ‘Trans/PGM’ -> [7] Supplementary -> [8] Network Config to see how the system in setup (handy for finding VLANs and such).
– Plug in the new phone and set the settings similar to the current one, just using a different IP address.

2) Voicemail.
– Voicemail is setup as a Hunt Group, the station has to call into that Hunt group and provide a Password, the password is the extension number, followed by the code found in the Authorization Code Table (227).
If the code was 111, the password for Extension 246 would be 246111

– Voicemail can be sent to email. Here is a document outlining how to do it: http://www.ariatech.com.au/uploaded/File/iPECS/QHG-KB/Q522_VSF_to_Email.pdf

3) System Speed Dial / Public Directory.
– Nobody likes bashing in a bunch of contacts on the desk phone. They can instead be updated via the ‘System Speed Dial’ screen in the Web management tool, found under ‘System Data’ -> ‘System Speed Dial’

4) Changing Extensions around.
Update the extensions in Flexible Station Number(PGM 105)
And don’t forget the Flexible DID table (Flexible DID Conversion(231))

5) Performing a factory reset. Flick DIP4 to ON (Same as DIP3 above), remove power, return power. Manually configure network IP to 10.10.10.x / 255.255.255.0 (where X is any number between 3 and 254) and Open up a web browser and go to https://10.10.10.2
Default password is empty. From here, upload a database backup, connect MFIM back into Network and remember to flick DIP4 to Off, otherwise the next time it reboots it will forget the database.

6) Checking a handset firmware:
Trans/PGM -> 79 (all the Phone PGM codes can be found here: https://www.nonstoptelecom.com/site/download/LIP-8012E-8024E.pdf)

7) Adding a DND Flex button for a Hunt Group. It’s possible to do this from the handset, but I needed to do it from the webadmin.
In Flexbutton UI, set the Type to ‘Programming (Numbering Plan) then the Value of 571XYZ where XYZ is the Hunt group. Upon saving the Value should change to ‘HUNT DUTY(XYZ)’ (again XYZ is the Hunt group).