# # $Id$ # # control tool for maintaining Kamailio # #=================================================================== ##### ----------------------------------------------- ##### ### path to useful tools locate_tool() { TOOLPATH="" while [ -n "$1" ] do if [ -x /usr/bin/which ] ; then TOOLPATH=`which $1` if [ -n "$TOOLPATH" ]; then return fi fi # look in common locations if [ -x "/usr/bin/$1" ] ; then TOOLPATH="/usr/bin/$1" return fi if [ -x "/bin/$1" ] ; then TOOLPATH="/bin/$1" return fi if [ -x "/usr/local/bin/$1" ] ; then TOOLPATH="/usr/local/bin/$1" return fi shift done return } if [ -z "$EGREP" ] ; then locate_tool egrep if [ -z "$TOOLPATH" ] ; then # now error, but we can look for alternative names if it is the case echo "error: 'egrep' tool not found: set EGREP variable to correct tool path" exit fi EGREP="$TOOLPATH" fi if [ -z "$AWK" ] ; then locate_tool awk if [ -z "$TOOLPATH" ] ; then # now error, but we can look for alternative names if it is the case echo "error: 'awk' tool not found: set AWK variable to correct tool path" exit fi AWK="$TOOLPATH" fi if [ -z "$GDB" ] ; then locate_tool gdb if [ -z "$TOOLPATH" ] ; then # now error, but we can look for alternative names if it is the case GDB="" # echo "error: 'gdb' tool not found: set GDB variable to correct tool path" # exit else GDB="$TOOLPATH" fi fi if [ -z "$MD5" ]; then locate_tool md5sum md5 if [ -z "$TOOLPATH" ] ; then # now error, but we can look for alternative names if it is the case echo "error: 'md5sum' or 'md5' tool not found: set MD5 variable to correct tool path" exit fi MD5="$TOOLPATH" fi if [ -z "$LAST_LINE" ] ; then locate_tool tail if [ -z "$TOOLPATH" ] ; then # now error, but we can look for alternative names if it is the case echo "error: 'tail' tool not found: set LAST_LINE variable to correct tool path" exit fi LAST_LINE="$TOOLPATH -n 1" fi if [ -z "$EXPR" ] ; then locate_tool expr if [ -z "$TOOLPATH" ] ; then # now error, but we can look for alternative names if it is the case echo "error: 'expr' tool not found: set EXPR variable to correct tool path" exit fi EXPR="$TOOLPATH" fi ##### ------------------------------------------------ ##### ### configuration for starting/stopping kamailio if [ -z "$PID_FILE" ] ; then PID_FILE=/var/run/kamailio.pid fi if [ -z "$SYSLOG" ] ; then SYSLOG=1 # 0=output to console, 1=output to syslog fi if [ -z "$STARTOPTIONS" ] ; then STARTOPTIONS= # for example -dddd fi if [ -z "$DIR" ] ; then DIR=`dirname $0` fi if [ -z "$OSERBIN" ] ; then OSERBIN=$DIR/kamailio fi ##### ------------------------------------------------ ##### ### aliases configuration # ENABLE_ALIASES=0 if [ "$ALIASES_TYPE" = "UL" ] ; then ENABLE_ALIASES=1 else if [ "$ALIASES_TYPE" = "DB" ] ; then ENABLE_ALIASES=2 fi fi ##### ------------------------------------------------ ##### ### ACL name verification if [ -z "$VERIFY_ACL" ] ; then VERIFY_ACL=1 fi if [ -z "$ACL_GROUPS" ] ; then ACL_GROUPS="local ld int voicemail free-pstn" fi ##### ----------------------------------------------- ##### #### Defined values ALL_METHODS=4294967295 USERNAME_RE="[-a-zA-Z0-9&=\+\$,;\?/_\.\!~\*'\(\)]+" ##### ----------------------------------------------- ##### #### database tables for SQL databases and DBTEXT SRDB_LOAD_SER=$((1 << 0)) # The row should be loaded by SER SRDB_DISABLED=$((1 << 1)) # The row is disabled SRDB_CANON=$((1 << 2)) # Canonical entry (domain or uri) SRDB_IS_TO=$((1 << 3)) # The URI can be used in To SRDB_IS_FROM=$((1 << 4)) # The URI can be used in From SRDB_FOR_SERWEB=$((1 << 5)) # Credentials instance can be used by serweb SRDB_PENDING=$((1 << 6)) SRDB_DELETED=$((1 << 7)) SRDB_CALLER_DELETED=$((1 << 8)) # Accounting table SRDB_CALLEE_DELETED=$((1 << 9)) # Accounting table SRDB_MULTIVALUE=$((1 << 10)) # Attr_types table SRDB_FILL_ON_REG=$((1 << 11)) # Attr_types table SRDB_REQUIRED=$((1 << 12)) # Attr_types table SRDB_DIR=$((1 << 13)) # Domain_settings table # UsrLoc Table if [ -z "$UL_TABLE" ] ; then UL_TABLE=location fi USER_COLUMN=username DOMAIN_COLUMN=domain CALLID_COLUMN=callid # subscriber table if [ -z "$SUB_TABLE" ] ; then SUB_TABLE=subscriber fi REALM_COLUMN=domain HA1_COLUMN=ha1 HA1B_COLUMN=ha1b PASSWORD_COLUMN=password RPID_COLUMN=rpid SUBSCRIBER_COLUMN='username' PHP_LIB_COLUMN=phplib_id if [ -z "$STORE_PLAINTEXT_PW" ] ; then STORE_PLAINTEXT_PW=1 fi # acl table if [ -z "$ACL_TABLE" ] ; then ACL_TABLE=grp fi ACL_USER_COLUMN=username ACL_DOMAIN_COLUMN=domain ACL_GROUP_COLUMN=grp ACL_MODIFIED_COLUMN=last_modified # aliases table if [ -z "$ALS_TABLE" ] ; then ALS_TABLE=aliases fi A_USER_COLUMN=username A_CONTACT_COLUMN=contact A_EXPIRES_COLUMN=expires A_Q_COLUMN=q A_CALLID_COLUMN=callid A_CSEQ_COLUMN=cseq A_LAST_MODIFIED_COLUMN=last_modified # domain table if [ -z "$DOMAIN_TABLE" ] ; then DOMAIN_TABLE=domain fi DO_DOMAIN_COLUMN=domain DO_LAST_MODIFIED_COLUMN=last_modified # uid_domain table if [ -z "$UID_DOMAIN_TABLE" ] ; then UID_DOMAIN_TABLE=uid_domain fi UID_DO_DOMAIN_COLUMN=domain UID_DO_DID_COLUMN=did UID_DO_FLAGS_COLUMN=flags # lcr tables if [ -z "$LCR_TABLE" ] ; then LCR_TABLE=lcr fi LCR_ID_COLUMN=lcr_id LCR_PREFIX_COLUMN=prefix LCR_GRPID_COLUMN=grp_id # gw table if [ -z "$GW_TABLE" ] ; then GW_TABLE=gw fi # carrier_name table if [ -z "$CARRIER_NAME_TABLE" ] ; then CARRIER_NAME_TABLE=carrier_name fi CARRIERROUTE_CARRIER_NAME_ID_COLUMN=id CARRIERROUTE_CARRIER_NAME_CARRIER_COLUMN=carrier # domain_name table if [ -z "$DOMAIN_NAME_TABLE" ] ; then DOMAIN_NAME_TABLE=domain_name fi CARRIERROUTE_DOMAIN_NAME_ID_COLUMN=id CARRIERROUTE_DOMAIN_NAME_DOMAIN_COLUMN=domain # carrierroute table if [ -z "$CARRIERROUTE_TABLE" ] ; then CARRIERROUTE_TABLE=carrierroute fi CARRIERROUTE_CARRIERROUTE_PREFIX_COLUMN=id CARRIERROUTE_CARRIERROUTE_CARRIER_COLUMN=carrier CARRIERROUTE_CARRIERROUTE_SCAN_PREFIX_COLUMN=scan_prefix CARRIERROUTE_CARRIERROUTE_DOMAIN_COLUMN=domain CARRIERROUTE_CARRIERROUTE_PROB_COLUMN=prob CARRIERROUTE_CARRIERROUTE_STRIP_COLUMN=strip CARRIERROUTE_CARRIERROUTE_REWRITE_HOST_COLUMN=rewrite_host CARRIERROUTE_CARRIERROUTE_REWRITE_PREFIX_COLUMN=rewrite_prefix CARRIERROUTE_CARRIERROUTE_REWRITE_SUFFIX_COLUMN=rewrite_suffix CARRIERROUTE_CARRIERROUTE_COMMENT_COLUMN=description CARRIERROUTE_CARRIERROUTE_FLAGS_COLUMN=flags CARRIERROUTE_CARRIERROUTE_MASK_COLUMN=mask # URI table if [ -z "$URI_TABLE" ] ; then URI_TABLE=uri fi URIUSER_COLUMN=uri_user MODIFIED_COLUMN=last_modified # dbaliases table if [ -z "$DA_TABLE" ] ; then DA_TABLE=dbaliases fi DA_USER_COLUMN=username DA_DOMAIN_COLUMN=domain DA_ALIAS_USER_COLUMN=alias_username DA_ALIAS_DOMAIN_COLUMN=alias_domain # speeddial table if [ -z "$SD_TABLE" ] ; then SD_TABLE=speed_dial fi SD_USER_COLUMN=username SD_DOMAIN_COLUMN=domain SD_SD_USER_COLUMN=sd_username SD_SD_DOMAIN_COLUMN=sd_domain SD_NEW_URI_COLUMN=new_uri SD_DESC_COLUMN=description # avp table if [ -z "$AVP_TABLE" ] ; then AVP_TABLE=usr_preferences fi AVP_UUID_COLUMN=uuid AVP_USER_COLUMN=username AVP_DOMAIN_COLUMN=domain AVP_ATTRIBUTE_COLUMN=attribute AVP_VALUE_COLUMN=value AVP_TYPE_COLUMN=type AVP_MODIFIED_COLUMN=last_modified # trusted table if [ -z "$TRUSTED_TABLE" ] ; then TRUSTED_TABLE=trusted fi TRUSTED_SRC_IP_COLUMN=src_ip TRUSTED_PROTO_COLUMN=proto TRUSTED_FROM_PATTERN_COLUMN=from_pattern TRUSTED_TAG_COLUMN=tag # address table if [ -z "$ADDRESS_TABLE" ] ; then ADDRESS_TABLE=address fi # dispatcher tables if [ -z "$DISPATCHER_TABLE" ] ; then DISPATCHER_TABLE=dispatcher fi DISPATCHER_ID_COLUMN=id DISPATCHER_SETID_COLUMN=setid DISPATCHER_DESTINATION_COLUMN=destination DISPATCHER_FLAGS_COLUMN=flags DISPATCHER_PRIORITY_COLUMN=priority DISPATCHER_ATTRS_COLUMN=attrs DISPATCHER_DESCRIPTION_COLUMN=description # dialog tables if [ -z "$DIALOG_TABLE" ] ; then DIALOG_TABLE=dialog fi # dialplan tables if [ -z "$DIALPLAN_TABLE" ] ; then DIALPLAN_TABLE=dialplan fi DIALPLAN_ID_COLUMN=id DIALPLAN_DPID_COLUMN=dpid DIALPLAN_PR_COLUMN=pr DIALPLAN_MATCH_OP_COLUMN=match_op DIALPLAN_MATCH_EXP_COLUMN=match_exp DIALPLAN_MATCH_LEN_COLUMN=match_len DIALPLAN_SUBST_EXP_COLUMN=subst_exp DIALPLAN_REPL_EXP_COLUMN=repl_exp DIALPLAN_ATTRS_COLUMN=attrs # ##### ------------------------------------------------ ##### ### usage functions # usage_base() { echo mecho " -- command 'start|stop|restart|trap'" echo cat <] .......... creates new rootCA tls userCERT [] ... creates user certificate default is $ETCDIR/tls EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_base" usage_acl() { echo mecho " -- command 'acl' - manage access control lists (acl)" echo cat <] .............. show user membership acl grant ....... grant user membership (*) acl revoke [] .... grant user membership(s) (*) EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_acl" usage_lcr() { echo mecho " -- command 'lcr' - manage least cost routes (lcr)" echo cat < .......................... add a carrier name cr rmcn ......................................... rm a carrier name cr adddn ............................ add a domain name cr rmdn .......................................... rm a domain name cr addcarrier ................ ............... .........................add a carrier (prob, strip, rewrite_prefix, rewrite_suffix,................... flags, mask and comment are optional arguments) ............... cr rmcarrier ................ rm a carrier EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_cr" usage_rpid() { echo mecho " -- command 'rpid' - manage Remote-Party-ID (RPID)" echo cat < ......... add rpid for a user (*) rpid rm ................. set rpid to NULL for a user (*) rpid show ............... show rpid of a user EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_rpid" usage_subscriber() { echo mecho " -- command 'add|passwd|rm' - manage subscribers" echo cat < .......... add a new subscriber (*) show .................... show subscriber attributes (*) passwd ......... change user's password (*) rm ...................... delete a user (*) sets ....... set string attribute (column value) setn ....... set numeric attribute (column value) EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_subscriber" usage_trusted() { echo mecho " -- command 'add|dump|reload|rm|show' - manage trusted" echo cat < ....................... add a new entry ....................... (from_pattern and tag are optional arguments) trusted rm ............... remove all entries for the given src_ip EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_trusted" usage_address() { echo mecho " -- command 'add|dump|reload|rm|show' - manage address" echo cat < ....................... add a new entry ....................... (mask, port and tag are optional arguments) address rm ......... remove entries for given grp and ipaddr EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_address" usage_dispatcher() { echo mecho " -- command 'dispatcher' - manage dispatcher" echo cat < [flags] [priority] [attrs] [description] .......................... add gateway dispatcher rm .................. delete gateway EOF } USAGE_FUNCTIONS="$USAGE_FUNCTIONS usage_dispatcher" usage_dialog() { echo mecho " -- command 'dialog' - manage dialog records" echo cat < .............. show dialplan tables dialplan reload ................... reload dialplan tables dialplan addrule .................... add a rule dialplan rm ....................... removes the entire dialplan table dialplan rmdpid ............ removes all the gived dpid entries dialplan rmrule ..... removes all the gived dpid/prio entries EOF } ##### ----------------------------------------------- ##### #### Common functions mdbg() { if [ "0$VERBOSE" -ne 0 ] ; then if [ -t 1 -a -z "$NOHLPRINT" ] ; then echo -e "\033[1m$1\033[0m" else echo "$1" fi fi } mwarn() { if [ -t 1 -a -z "$NOHLPRINT" ] ; then echo -e '\E[37;32m'"\033[1mWARNING: $1\033[0m" else echo "** WARNING: $1" fi } minfo() { if [ -t 1 -a -z "$NOHLPRINT" ] ; then echo -e '\E[37;33m'"\033[1mINFO: $1\033[0m" else echo "** INFO: $1" fi } mecho() { if [ -t 1 -a -z "$NOHLPRINT" ] ; then echo -e "\033[1m$1\033[0m" else echo "$1" fi } merr() { if [ -t 1 -a -z "$NOHLPRINT" ] ; then echo -e '\E[37;31m'"\033[1mERROR: $1\033[0m" else echo "** ERROR: $1" fi } # determine host name, typically for use in printing UAC # messages; we use today a simplistic but portable uname -n way -- # no domain name is displayed ; fifo_uac expands !! to host # address only for optional header fields; uname output without # domain is sufficient for informational header fields such as # From # get_my_host() { if [ -z "$SIP_DOMAIN" ]; then uname -n else echo "$SIP_DOMAIN" fi } # calculate name and domain of current user set_user() { OSERUSER=`echo $1|$AWK -F@ '{print $1}'` OSERDOMAIN=`echo $1|$AWK -F@ '{print $2}'` if [ -z "$OSERDOMAIN" ] ; then OSERDOMAIN="$SIP_DOMAIN" fi if [ -z "$OSERDOMAIN" ] ; then merr "domain unknown: use usernames with domain or set default domain \ in SIP_DOMAIN" exit 1 fi } # check the parameter if it is a valid address of record (user@domain) check_aor() { echo "$1" | $EGREP "^$USERNAME_RE@.*\..*" >/dev/null if [ $? -ne 0 ] ; then echo "error: invalid AoR: $1" > /dev/stderr exit 1 fi } # check the parameter if it is a valid address of record (user@domain) is_aor() { echo "$1" | $EGREP "^$USERNAME_RE@.*\..*" >/dev/null if [ $? -ne 0 ] ; then false else true fi } # check the parameter if it is a valid SIP address of record (sip:user@domain) check_sipaor() { echo "$1" | $EGREP "^sip(s)?:$USERNAME_RE@.*\..*" >/dev/null if [ $? -ne 0 ] ; then echo "error: invalid SIP AoR: $1" > /dev/stderr exit 1 fi } # check the parameter if it is a valid SIP URI # quite simplified now -- it captures just very basic # errors check_uri() { echo "$1" | $EGREP "^sip(s)?:($USERNAME_RE@)?.*\..*" > /dev/null if [ $? -ne 0 ] ; then echo "error: invalid SIP URI: $1" > /dev/stderr exit 1 fi } print_status() { echo $1 | $EGREP "^[1-6][0-9][0-9]" > /dev/null if [ "$?" -eq 0 ] ; then echo $1 else echo "200 OK" fi } # process output from FIFO/Unixsock server; if everything is ok # skip the first "ok" line and proceed to returned # parameters filter_fl() { # tail +2 $AWK 'BEGIN {line=0;IGNORECASE=1;} {line++} NR == 1 && /^200 OK/ { next } /^$/ { next } { print }' } # params: user, realm, password # output: HA1 _gen_ha1() { HA1=`echo -n "$1:$2:$3" | $MD5 | $AWK '{ print $1 }'` if [ $? -ne 0 ] ; then echo "HA1 calculation failed" exit 1 fi } # params: user, realm, password # output: HA1B _gen_ha1b() { HA1B=`echo -n "$1@$2:$2:$3" | $MD5 | $AWK '{ print $1 }'` if [ $? -ne 0 ] ; then echo "HA1B calculation failed" exit 1 fi } # params: user, realm, password # output: PHPLIB_ID _gen_phplib_id() { NOW=`date`; PHPLIB_ID=`echo -n "$1$2:$3:$NOW" | $MD5 | $AWK '{ print $1 }'` } # params: user, password # output: HA1, HA1B credentials() { set_user $1 _gen_ha1 "$OSERUSER" "$OSERDOMAIN" "$2" _gen_ha1b "$OSERUSER" "$OSERDOMAIN" "$2" }