Jul
10
2009
14

BASH: A simple script to check if a process is running

Scripting is very, very useful.  Don’t make the same mistake I did and wait 5 years into you career to start learning!  In the example below, I’m using the ‘ps -aux’ command piped into grep to determine if a process is still running.  for my example I’m using Firefox, but intend to use this with a Asterisk phone system.  Every minute cron will launch my script to see if Asterisk is still running.  If it is, it will do nothing.  If it isn’t, then it will attempt to restart asterisk and notify the Administrator.  I hope this example helps someone!

——————————————————————————————–

#!/bin/bash

#set -x

#
# Variables Section
#==============================================================
# list process to monitor in the variable below.

PROGRAM1=”asterisk”

# varible checks to see if $PROGRAM1
# is running.

APPCHK=$(ps aux | grep -c $PROGRAM1)

#
#
# $Company & $SITE variables are for populating the alert email
COMPANY=”VoiceIP Solutions”
SITE=”Seattle”

# $SUPPORTSTAFF is the recipient of our alert email

SUPPORTSTAFF=”savelono@gmail.com”

#==================================================================

# The ‘if’ statement below checks to see if the process is running
# with the ‘ps’ command.  If the value is returned as a ’0′ then
# an email will be sent and the process will be safely restarted.
#

if [ $APPCHK = '0' ];

then

echo mail -s “Asterisk PBX at $COMPANY $SITE may be down” $SUPPORTSTAFF < /dev/null

else

echo “$PROGRAM1 is running $APPCHK processes” >> asterisk-check.log

fi

echo $APPCHK

exit

Written by mattb in: Linux,Scripts | Tags: , , , , ,
Jun
28
2009
0

Polycom 501 XML configuration file Example

This file is named by the MAC address of your Polycom SoundPoint IP SIP phone followed by, ‘-phone.cfg’.  In your FTP folder you would have a file for each phone – I have a single phone.  It’s MAC is ’0004F202734B’; so my phones configuration file would be named, ’0004f202734b-phone.cfg’.  I believe there are other conventions for naming this file as well.

The example below was used to connect my phone with a VoiceIP Solutions Asterisk PBX.  This example shows just a fraction of the many possible features in this line.  For my purposes, I defined the Asterisk server IP address, and it’s SIP credentials.  I also added the NTP server.  The ‘mwi’ tag refers to ‘message waiting information’, here I set the mailbox(s) I’m subscribing to and the extension to check voicemail.   My Asterisk voicemail menu is extension ’299′.

0004f202734b-phone.cfg:

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?>
<!– Example Per-phone Configuration File –>
<!– $RCSfile: phone1.cfg,v $  $Revision: 1.104.2.2 $ –>
<phone1>
<reg
reg.1.displayName=”5555″
reg.1.address=”5555″
reg.1.auth.userId=”5555″
reg.1.auth.password=”2005″
reg.1.server.1.address=”192.168.1.254″
tcpIpApp.sntp.address=”pool.ntp.org”
tcpIpApp.sntp.gmtOffset=”-33600″
>
<mwi
msg.mwi.1.subscribe=”5555″
msg.mwi.1.callBackMode=”contact”
msg.mwi.1.callBack=”299″
>
</phone1>

Jun
07
2009
--

How to Configure Linux ODBC Connections for MS SQL

Last week at work(VoiceIP Solutions) I did some research for Asterisk PBX integration with Microsoft CRM.  The customer likes open source Asterisk because of the cost savings, but they requires screen pop-ups, and click to dial from their Customer Relationship Management software.  So while my manager worked on the TAPI middleware, I was charged with figuring out how to connect to the MS SQL database.  This article was prompted by a desire to connect an Asterisk PBX to MS SQL, but the tutorial applies to Apache, Postfix, CRM, PHP or any Linux app that needs to do a remote query.  Also, while the focus of this article is aimed at MS SQL the same steps(with a few tweaks) can be used for connecting to Postgre, Sybase, MySQL, etc…

I’m a lot more famalier with MySQL & PostgreSQL, but MS SQL I haven’t touched since I had the silly notion about 10 years ago to become a Windows 2000 MCSE.  Incidently, I never did take the exams, because I was a broke student at the time and I was becoming increasingly interested in Linux and Cisco.

The logical choice is to use the UNIX ODBC driver.  ODBC stands for Open Database Connectivity.  ODBC is a well documented set of API’s that is available on many platforms.  However, their are subtle differences in it’s implentation and the protocols that run at application layer.  In other words ODBC is encapsulated when making calls to a database over a network (in this case, the TDS protocol).

I did some googling and found a number of incomplete tutorials for connecting Linux to MS SQL.  This article is intended to clarify some common configuration errors and will present you with example files.  For my demonstration I’m running Fedora 10 with the latest updates as of this writing.  This article assumes you have a working MS SQL datebase with the proper user permissions in mixed mode.  I put this one in bold because it stumped the MCSE database guy for a while.

Again, I want to point out I’m not a Microsoft DBA and will likely not be able to help you on that side of the configuration.  Also, there are many versions of SQL out there and the syntax to pull data differs slightly from one version to the next.  So you may need to do a little research to make the proper pulls.

The Goals of this Post:

- install ODBC and TDS on Fedora 10

- verify TDS can login into MS SQL server

- configure odbcinst.ini, odbc.ini and freetds.conf configuration files

(more…)

May
07
2009
0

How to make USB and DVD ROM drives work on Fedora 10

Lately, I’ve been working on Asterisk PBX related articles, but today we’re going to tackle a common problem with Fedora 10: getting drives to mount to the Desktop.  If you are experiencing trouble, the likely cause is that your current user, does not have permissions to access that hardware.  The reason for this has a lot to do with the security model of Linux.

In the old days computers came on large mainframes.  It was not practical for engineers and scientist to have their very own main frame, so Unix was designed to be a multi-user operating system.  Everyone connected their own keyboard & monitor.  The permission structure was set so only certain individual accounts could do certain things.  Like say, reboot a system or delete a database.

By contrast Microsoft Windows(thru XP) is a single user operating system.  In Windows you can create extra accounts, but any of those accounts can execute arbitrary code from anywhere in the file system (c:\\ drive).  Which is a big reason for the many attacks on Windows systems.

Recently my friend got a virus that made XP unbootable and stole his World of Warcraft account login and password.  The hacker then used that information to login to his account, change his password, and his accounts valid email address.  The hacker then sold all his gear and used his character to scam other people in bad trades.  The account became banned for “economic extortion” before my friend could get his Windows XP machine back up and running.  Now he runs WoW on WINE/Fedora 10.

An appeal to Blizzard got his account back after several days and many emails. My friend requested that they check the IP address of the hacker and compare that to his previous logins.  What if the virus had collected his bank account credentials instead?  In a way he got lucky.

Goals of this Post:

- correct authorizations in Fedora 10 and allow access to USB and DVD – ROM devices

It seems odd that someone would be unable to access a USB thumb drive on any modern desktop computer, but Red Hat the maker of Fedora Linux is far more interested in their commercial offering, Red Hat Enterprise Linux(RHEL).  They model RHEL development on previous versions of Fedora.  So desktop integration is obviously not their top priority; stability and security is.  This neglect has allowed rival Unbuntu Linux to come in and snatch up the Linux desktop market.  Big mistake Red Hat…  however with a little work we can make Fedora 10 desktop work well without them.

So to correct the permissions issue(from Gnome) start by clicking, System –> Preferences –> System –> Authorizations.  Fedora may ask you for your ‘root’ password.

fedora10-authorizations-usb

fedora10-authorizations-usb

Set access to allow anyone to mount and unmount USB and other devices!  I hope this helps.  It’s frustrating dealing with these little things, but hey, “it’s free”!  If it doesn’t take, leave a comment below and I’ll try to help.

May
04
2009
4

Asterisk 1.4.23 and Queuemetrics 1.5.2 fully support Dynamic Agent Login

The standard method of configuring users in Asterisk 1.2 and early 1.4 was to define an agent in the agents.conf configuration file.  This agent is tied to no particular phone or SIP extension.  When the Agent log’s in he is prompted for three things by the dial plan application, ‘AgentCallBackLogin()’:

1. Agent Number
2. Agent password(defined in agents.conf
3. Dial Back Extension

AgentCallBackLogin makes a lot of sense if CSR’s(Customer Service Representatives) switch phones frequently.  For some of my customers this is the case.  However, most of the Call Centers I’ve deployed have assigned seating.

So I commonly get the question,  “Is it possible to have ‘one touch login/logout’ for my agents?”  The sad answer is no.  It’s a valid question; for agents that never leave their desk why do they need to enter three prompts to login?

(more…)

May
04
2009
0

queues.conf – Asterisk 1.4.23 and Queuemetrics 1.5.2 fully support Dynamic Agent Login

[general]

monitor-type=MixMonitor
eventmemberstatus=no
eventwhencalled=no

;[default]
;
; Default settings for queues (currently unused)
;

[savelono-support]

context = savelono-queue-out
musiconhold = default
strategy = leastrecent
timeout = 10
retry = 5
wrapuptime=20
announce-frequency = 90
announce-holdtime = no
announce-round-seconds = 30
queue-youarenext = queue-youarenext
queue-thereare = queue-thereare
queue-callswaiting = queue-callswaiting
queue-thankyou = queue-thankyou
monitor-format = wav
monitor-join = yes
joinempty = yes
eventmemberstatus=no
autofill=yes
;memberdelay = 1

May
04
2009
1

extensions.conf – Asterisk 1.4.23 and Queuemetrics 1.5.2

[general]

static=yes
writeprotect=no

[bogon-calls]

exten => _x.,1,Congestion

[macro-stdexten]
;
;for dialing internal extensions

exten => s,1,Set(dynext=${DB(dynext/${ARG1})})
exten => s,n,NoOp(${dynext})
exten => s,n,NoOp(${LEN(${dynext})})
exten => s,n,GotoIf($["${LEN(${dynext})}" = "7"]?s,100)
exten => s,n,GotoIf($["${LEN(${dynext})}" = "10"]?s,100)
exten => s,n,GotoIf($["${LEN(${dynext})}" = "11"]?s,100)
exten => s,n,GotoIf($["${LEN(${dynext})}" = "6"]?s,200) ; Calls 6-digit Extension
exten => s,n,GotoIf($["${LEN(${dynext})}" = "0"]?s,300) ; Calls 6-digit Extension
exten => s,n(dial),Dial(SIP/${dynext},20,twW) ; Ring the interface, 20 seconds maximum
exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status
exten => s,100,Dial(ZAP/g1/${dynext},20,twW) ; Ring the interface, 20 seconds maximum
exten => s,101,Goto(s-${DIALSTATUS},1) ; Jump based on status
exten => s,200,Goto(from-sip,${dynext},1); Calls 6-digit Extension
exten => s,300,Set(dynext=${ARG1})
exten => s,301,Goto(dial)

exten => s-BUSY,1,Voicemail(b${ARG1}) ; If busy, send to voicemail w/ busy announce
exten => s-BUSY,2,Hangup
exten => s-NOANSWER,1,Voicemail(u${ARG1}) ; If unavailable, send to voicemail
exten => s-NOANSWER,2,Hangup
exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer

[from-sip]

include => test
include => from-internal

[test]

exten => 1234,1,agi(matts-test.agi)
exten => 1234,2,wait(2)
;exten => 1234,n,voicemail(8888)
exten => 1234,n,hangup
[from-internal]

;Standard Internal Extensions

exten => _888X,1,Macro(stdexten,${EXTEN},sip/${EXTEN})
exten => _888X,2,Hangup

; Add Member SIP/${CALLERID(num)}
exten => 2000,1,Answer
exten => 2000,n,VMauthenticate(${CALLERID(num)}@default)
exten => 2000,n,AddQueueMember(savelono-support|SIP/${CALLERID(num)}|1|)
exten => 2000,n,Playback(agent-loginok)
exten => 2000,n,Hangup

; Remove Member – Dynamic Agent SIP/${CALLERID(num)}
exten => 2001,1,Answer
exten => 2001,n,VMauthenticate(${CALLERID(num)}@default)
exten => 2001,n,RemoveQueueMember(savelono-support|SIP/${CALLERID(num)})
exten => 2001,n,Playback(agent-loggedoff)
exten => 2001,n,Hangup

exten => 5000,1,goto(test-queue,s,1)

[savelono-queue-out]

include => from-internal

[test-queue]

exten => s,1,Queue(savelono-support)
exten => s,2,hangup

Apr
22
2009
0

Asterisk: Creating an Extension to Logout Agents from CallerID

I told a customer for the company I for that I would figure out how to logout agents by CID(Caller ID). So I figured, why not kill two birds with one stone. Today we will create a single Queue, Agent, and dial plan to accomplish this goal. I’m using Asterisk 1.4, Fedora 10 and a Polycom IP SIP phone for my demonstration purposes.

When I started this project four hours ago, I thought I would google my way to another successful blog post(and happy customer), but no…  logging out agents in Asterisk is very unintuitive.  The agentcallbacklogin utility has the exact same prompts for logging in as out.  AgentCallbackLogin (when initiated, from the dial plan)  asks for three things, agent, agent password, and call back number.  To eliminate all these prompts I’m using the ‘$CallerID(num)’ variable to automatically answer the agent and call back number.  So the user 8888 dials ’1000′ and and AgentCallbackLogin assumes he is AGENT/8888 with a password of ’8888′.

from /etc/asterisk/extensions.conf

exten => 1000,1,AgentcallbackLogin(${CALLERID(num)}||${CALLERID(num)}@savelono-queue-out)
exten => 1000,n,hangup

(more…)

Apr
22
2009
1

extensions.conf – agent logoff example

[general]

static=yes
writeprotect=no

[bogon-calls]

exten => _x.,1,Congestion

[macro-stdexten]
;
;for dialing internal extensions

exten => s,1,Set(dynext=${DB(dynext/${ARG1})})
exten => s,n,NoOp(${dynext})
exten => s,n,NoOp(${LEN(${dynext})})
exten => s,n,GotoIf($["${LEN(${dynext})}" = "7"]?s,100)
exten => s,n,GotoIf($["${LEN(${dynext})}" = "10"]?s,100)
exten => s,n,GotoIf($["${LEN(${dynext})}" = "11"]?s,100)
exten => s,n,GotoIf($["${LEN(${dynext})}" = "6"]?s,200) ; Calls 6-digit Extension
exten => s,n,GotoIf($["${LEN(${dynext})}" = "0"]?s,300) ; Calls 6-digit Extension
exten => s,n(dial),Dial(SIP/${dynext},20,twW) ; Ring the interface, 20 seconds maximum
exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status
exten => s,100,Dial(ZAP/g1/${dynext},20,twW) ; Ring the interface, 20 seconds maximum
exten => s,101,Goto(s-${DIALSTATUS},1) ; Jump based on status
exten => s,200,Goto(from-sip,${dynext},1); Calls 6-digit Extension
exten => s,300,Set(dynext=${ARG1})
exten => s,301,Goto(dial)

exten => s-BUSY,1,Voicemail(b${ARG1}) ; If busy, send to voicemail w/ busy announce
exten => s-BUSY,2,Hangup
exten => s-NOANSWER,1,Voicemail(u${ARG1}) ; If unavailable, send to voicemail
exten => s-NOANSWER,2,Hangup
exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer

[from-sip]

include => test
include => from-internal

[test]

exten => 1234,1,agi(matts-test.agi)
exten => 1234,2,wait(2)
;exten => 1234,n,voicemail(8888)
exten => 1234,n,hangup

[from-internal]

;Standard Internal Extensions

exten => _888X,1,Macro(stdexten,${EXTEN},sip/${EXTEN})
exten => _888X,2,Hangup

;Logon
exten => 1000,1,AgentcallbackLogin(${CALLERID(num)}||${CALLERID(num)}@savelono-queue-out)
exten => 1000,n,hangup

;Logoff – best alternative I’ve found so far
;could be better with additional logic

exten => 1001,1,System(/usr/sbin/asterisk -rx “agent logoff Agent/${CALLERID(NUM)}”)
exten => 1001,n,RemoveQueueMember(savelono-support|Agent/${CALLERID(NUM)})
exten => 1001,n,Playback(agent-loggedoff)
exten => 1001,n,Playback(auth-thankyou)
exten => 1001,n,Hangup

;Logoff this way works but is not very intuitive because you
;have to hit the # key when prompted for a dial back extension
;it really doesn’t make sense to endusers
;
exten => 1002,1,AgentcallbackLogin(${CALLERID(num)}||)
exten => 1002,n,hangup

[savelono-queue-out]

include => from-internal

Apr
22
2009
1

sip.conf – agent logoff example

[general]

context=default                 ; Default context for incoming calls
;allowguest=no                  ; Allow or reject guest calls (default is yes)
allowoverlap=no                 ; Disable overlap dialing support. (Default is yes)
;allowtransfer=no               ; Disable all transfers (unless enabled in peers or users)

bindport=5060                   ; UDP Port to bind to (SIP standard port is 5060)
; bindport is the local UDP port that Asterisk will listen on

bindaddr=0.0.0.0                ; IP address to bind to (0.0.0.0 binds to all)
srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls

; Note: Asterisk only uses the first host
; in SRV records
; Disabling DNS SRV lookups disables the

[8888]
type=friend                    ; Friends place calls and receive calls
context=from-sip               ; Context for incoming calls from this user
secret=2005
host=dynamic                   ; This peer register with us
dtmfmode=rfc2833               ; Choices are inband, rfc2833, or info
username=8888
mailbox=8888
callerid=<8888>