1#!/bin/sh 2# 3# control tool for maintaining Kamailio 4# 5#=================================================================== 6 7### version for this script 8VERSION='5.4.0' 9 10PATH=$PATH:/usr/local/sbin/ 11 12# for testing only, please don't enable this in production environments 13# as this introduce security risks 14if [ -z "$KAMCTL_TEST" ]; then 15 TEST="false" 16else 17 TEST="true" 18fi 19 20### include config files 21 22# check for rc file at same location with kamctl 23which greadlink >/dev/null 2>&1 24ret=$? 25if [ $ret -eq 0 ] ; then 26 KAMCTLFULLPATH=$(greadlink -f "$0") 27else 28 which readlink >/dev/null 2>&1 29 ret=$? 30 if [ $ret -eq 0 ] ; then 31 KAMCTLFULLPATH=$(readlink -f "$0") 32 fi 33fi 34if [ -n "$KAMCTLFULLPATH" ] ; then 35 KAMCTLDIRPATH=$(dirname "$KAMCTLFULLPATH") 36 if [ -f $KAMCTLDIRPATH/kamctlrc ]; then 37 . $KAMCTLDIRPATH/kamctlrc 38 fi 39fi 40 41# check for rc file at standard locations 42if [ -f /etc/kamailio/kamctlrc ]; then 43 . /etc/kamailio/kamctlrc 44fi 45if [ -f /usr/local/etc/kamailio/kamctlrc ]; then 46 . /usr/local/etc/kamailio/kamctlrc 47fi 48if [ -f ~/.kamctlrc ]; then 49 . ~/.kamctlrc 50fi 51 52if [ $TEST = "true" ]; then 53 if [ -f ./kamctlrc ]; then 54 . ./kamctlrc 55 fi 56fi 57 58 59### force values for variables in this section 60# you better set the variables in ~/.kamctlrc 61if [ -z "$ETCDIR" ] ; then 62 ETCDIR="/usr/local/etc/kamailio" 63fi 64 65if [ -z "$MYDIR" ] ; then 66 MYDIR=`dirname $0` 67fi 68 69if [ -z "$MYLIBDIR" ] ; then 70 MYLIBDIR="/usr/local/lib/kamailio/kamctl" 71 if [ ! -d "$MYLIBDIR" ]; then 72 MYLIBDIR=$MYDIR 73 fi 74fi 75 76##### ------------------------------------------------ ##### 77### load base functions 78# 79if [ -f "$MYLIBDIR/kamctl.base" ]; then 80 . "$MYLIBDIR/kamctl.base" 81else 82 echo -e "Cannot load core functions '$MYLIBDIR/kamctl.base' - exiting ...\n" 83 exit -1 84fi 85 86# locate kamcmd 87if [ -z "$SERCMD" ] ; then 88 # try same dir as kamctl 89 SERCMD="$MYDIR/kamcmd" 90 if [ ! -f "$SERCMD" -o ! -x "$SERCMD" ] ; then 91 # try standard location installed from sources 92 SERCMD="/usr/local/sbin/kamcmd" 93 if [ ! -f "$SERCMD" -o ! -x "$SERCMD" ] ; then 94 # try source tree location 95 SERCMD="$MYDIR/../sercmd/kamcmd" 96 if [ ! -f "$SERCMD" -o ! -x "$SERCMD" ] ; then 97 # try locate it with which 98 SERCMD=`which kamcmd` 99 if [ ! -f "$SERCMD" -o ! -x "$SERCMD" ] ; then 100 mdbg "kamcmd tool not found" 101 fi 102 fi 103 fi 104 fi 105else 106 if [ ! -f "$SERCMD" -o ! -x "$SERCMD" ] ; then 107 merr "SERCMD does not point to an executable file" 108 exit -1; 109 fi 110fi 111 112# 113##### ------------------------------------------------ ##### 114### DBENGINE 115# 116DBENGINELOADED=0 117case $DBENGINE in 118 MYSQL|mysql|MySQL) 119 if [ -f "$MYLIBDIR/kamctl.mysql" ]; then 120 . "$MYLIBDIR/kamctl.mysql" 121 DBENGINELOADED=1 122 fi 123 ;; 124 PGSQL|pgsql|postgres|postgresql|POSTGRESQL) 125 if [ -f "$MYLIBDIR/kamctl.pgsql" ]; then 126 . "$MYLIBDIR/kamctl.pgsql" 127 DBENGINELOADED=1 128 fi 129 ;; 130 ORACLE|oracle|Oracle) 131 if [ -f "$MYLIBDIR/kamctl.oracle" ]; then 132 . "$MYLIBDIR/kamctl.oracle" 133 DBENGINELOADED=1 134 fi 135 ;; 136 137 DBTEXT|dbtext|textdb) 138 if [ -f "$MYLIBDIR/kamctl.dbtext" ]; then 139 . "$MYLIBDIR/kamctl.dbtext" 140 DBENGINELOADED=1 141 fi 142 ;; 143 DB_BERKELEY|db_berkeley|BERKELEY|berkeley) 144 if [ -f "$MYLIBDIR/kamctl.db_berkeley" ]; then 145 . "$MYLIBDIR/kamctl.db_berkeley" 146 DBENGINELOADED=1 147 fi 148 ;; 149 SQLITE|sqlite) 150 if [ -f "$MYLIBDIR/kamctl.sqlite" ]; then 151 . "$MYLIBDIR/kamctl.sqlite" 152 DBENGINELOADED=1 153 fi 154 ;; 155 156esac 157 158if [ $DBENGINELOADED -eq 1 ] ; then 159 mdbg "database engine '$DBENGINE' loaded" 160elif [ -n "$DBENGINE" ] ; then 161 mwarn "database engine not found - tried '$DBENGINE'" 162fi 163 164# 165##### ------------------------------------------------ ##### 166### CTLENGINE 167# 168 169require_kamcmd() { 170 if [ -z "$SERCMD" ] ; then 171 merr "kamcmd tool is missing" 172 exit -1 173 fi 174} 175 176CTLENGINELOADED=0 177CTLENGINETYPE=0 178 179if [ -z "$CTLENGINE" ] ; then 180 CTLENGINE="RPCFIFO" 181fi 182case $CTLENGINE in 183 RPCFIFO|rpcfifo) 184 if [ -f "$MYLIBDIR/kamctl.rpcfifo" ]; then 185 . "$MYLIBDIR/kamctl.rpcfifo" 186 CTLENGINELOADED=1 187 CTLENGINETYPE=1 188 fi 189 ;; 190esac 191 192#### ------------------------------------------------- ##### 193### Load kamcmd interface 194# 195if [ -f "$MYLIBDIR/kamctl.ser" ]; then 196 . "$MYLIBDIR/kamctl.ser" 197fi 198 199if [ $CTLENGINELOADED -eq 1 ] ; then 200 mdbg "Control engine '$CTLENGINE' loaded" 201else 202 mwarn "no control engine found - tried '$CTLENGINE'" 203fi 204 205# 206##### ------------------------------------------------ ##### 207### common functions 208# 209usage() { 210 CMD=`basename $0` 211 if [ "0$VERIFY_ACL" -eq 1 ] ; then 212 EXTRA_TEXT="ACL privileges are: $ACL_GROUPS" 213 fi 214 cat <<EOF 215$0 $VERSION 216 217Existing commands: 218EOF 219for f in $USAGE_FUNCTIONS 220do 221 $f 222done 223 echo 224 225} 226 227require_dbengine() { 228 if [ $DBENGINELOADED -eq 0 ] ; then 229 merr "This command requires a database engine - none was loaded" 230 exit -1 231 fi 232} 233 234require_ctlengine() { 235 if [ $CTLENGINELOADED -eq 0 ] ; then 236 merr "This command requires a control engine - none was loaded" 237 exit -1 238 fi 239} 240 241# 242##### ------------------------------------------------ ##### 243### combined functions (require db and/or ctl) 244# 245# 246 247# 248##### ------------------------------------------------ ##### 249### helper functions (require db and/or ctl) 250# 251 252## 253# wrapper to run RPC command based on configured engine 254# - first parameter is the RPC command 255# - the rest are the parameters for the RPC command 256ctl_cmd_run () { 257 VCMDRPC="$1" 258 shift 259 260 if [ $CTLENGINETYPE -eq 1 ] ; then 261 $CTLCMD $VCMDRPC $@ 262 else 263 merr "ctl engine not configured" 264 exit 1 265 fi 266} 267 268lower() { 269 echo $1 | tr [A-Z] [a-z] 270} 271 272# params: user 273# output: false if exists, true otherwise 274is_user() { 275 set_user $1 276 277 QUERY="select count(*) from $SUB_TABLE where \ 278$SUBSCRIBER_COLUMN='$OSERUSER' and $REALM_COLUMN='$OSERDOMAIN';" 279 280 CNT=`$DBROCMD "$QUERY" "$DBRAWPARAMS" | $EGREP -v ERROR | $LAST_LINE` 281 mdbg "is_user: user counter=$CNT" 282 if [ "$CNT" = "0" ] ; then 283 false 284 else 285 true 286 fi 287} 288 289 290# params: table, column, value 291# output: false if exists, true otherwise 292is_value_in_db() { 293 TABLE=$1 294 COL=$2 295 VALUE=$3 296 297 QUERY="select count(*) from $TABLE where $COL='$VALUE';" 298 CNT=`$DBROCMD "$QUERY" "$DBRAWPARAMS" | $EGREP -v ERROR | $LAST_LINE` 299 mdbg "is_value_in_db: counter=$CNT" 300 if [ "$CNT" = "0" ] ; then 301 false 302 else 303 true 304 fi 305} 306 307# 308##### ------------------------------------------------ ##### 309### ACL Management 310# 311acl() { 312 require_dbengine 313 case $1 in 314 show) 315 if [ $# -eq 2 ] ; then 316 if [ $VERIFY_USER -eq 1 ] ; then 317 is_user $2 318 if [ $? -ne 0 ] ; then 319 mecho "Non-existent user '$2'. Still proceeding? [Y|N] " 320 read answer 321 if [ "$answer" = "y" -o "$answer" = "Y" ] ; then 322 minfo "Proceeding with non-local user" 323 else 324 exit 1 325 fi 326 fi 327 fi 328 set_user $2 329 CLAUSE=" WHERE $ACL_USER_COLUMN='$OSERUSER' AND \ 330 $ACL_DOMAIN_COLUMN='$OSERDOMAIN' " 331 elif [ $# -ne 1 ] ; then 332 usage_acl 333 exit 1 334 fi 335 QUERY="select * FROM $ACL_TABLE $CLAUSE ; " 336 $DBROCMD "$QUERY" 337 338 ;; 339 340 grant) 341 if [ $# -lt 3 ] ; then 342 usage 343 exit 1 344 fi 345 if [ $VERIFY_USER -eq 1 ] ; then 346 is_user $2 347 if [ $? -ne 0 ] ; then 348 mecho "Non-existent user '$2'. Still proceeding? [Y|N] " 349 read answer 350 if [ "$answer" = "y" -o "$answer" = "Y" ] ; then 351 minfo "Proceeding with non-local user" 352 else 353 exit 1 354 fi 355 fi 356 fi 357 set_user $2 358 shift 2 359 acl_inserted=0 360 while [ $# -gt 0 ] ; do 361 362 if [ $VERIFY_ACL -eq 1 ] ; then 363 found=0 364 for i in $ACL_GROUPS ; do 365 if [ "$1" = "$i" ] ; then 366 found=1 367 break 368 fi 369 done 370 if [ $found -eq 0 ] ; then 371 mwarn "Invalid privilege: acl '$1' ignored" 372 shift 373 continue 374 fi 375 fi 376 377 QUERY="insert into $ACL_TABLE ($ACL_USER_COLUMN,\ 378$ACL_GROUP_COLUMN,$ACL_MODIFIED_COLUMN,$ACL_DOMAIN_COLUMN ) values \ 379('$OSERUSER','$1', $DBFNOW, '$OSERDOMAIN' );" 380 $DBCMD "$QUERY" 381 if [ $? -ne 0 ] ; then 382 merr "acl - SQL Error" 383 exit 1 384 fi 385 acl_inserted=1 386 shift 387 done 388 389 if [ $acl_inserted -eq 1 ] ; then 390 $0 acl show "$OSERUSER@$OSERDOMAIN" 391 fi 392 393 ;; 394 395 revoke) 396 if [ $# -eq 3 ] ; then 397 CLAUSE=" and $ACL_GROUP_COLUMN='$3' " 398 elif [ $# -ne 2 ] ; then 399 merr "acl - wrong number of parameters" 400 usage_acl 401 exit 1 402 fi 403 404 set_user $2 405 406 QUERY="delete from $ACL_TABLE where \ 407$ACL_TABLE.$ACL_USER_COLUMN='$OSERUSER' AND $ACL_DOMAIN_COLUMN='$OSERDOMAIN' \ 408$CLAUSE;" 409 $DBCMD "$QUERY" 410 411 $0 acl show "$2" 412 413 ;; 414 415 *) 416 merr "acl - invalid commad '$1'" 417 usage_acl 418 exit 1 419 ;; 420 esac 421} 422 423 424# 425##### ------------------------------------------------ ##### 426### alias management 427# 428check_ul_alias() { 429 require_ctlengine 430 RES=`ctl_cmd_run ul.lookup "$ALS_TABLE" "$1@$2"` 431 RET="$?" 432 ALIAS_UL_EXISTS=0 433 if [ $RET -ne 0 ] ; then 434 merr "Kamailio $CTLENGINE not accessible: $RET" 435 exit 1 436 fi 437 echo "$RES" | $EGREP "^404" > /dev/null 438 if [ $? -ne 0 ] ; then 439 echo "$RES" | $EGREP "^400" > /dev/null 440 if [ $? -eq 0 ] ; then 441 merr "400; check if you use aliases in Kamailio" 442 exit 1 443 fi 444 echo "$RES" | $EGREP "^200" > /dev/null 445 if [ $? -eq 0 ] ; then 446 ALIAS_UL_EXISTS=1 447 fi 448 # other errors 449 merr "$RES" 450 exit 1 451 fi 452} 453 454check_db_alias() { 455 require_dbengine 456 457 ALIAS_DB_EXISTS=0 458 459 QUERY="select count(*) from $DA_TABLE where $DA_ALIAS_USER_COLUMN='$1' \ 460and $DA_ALIAS_DOMAIN_COLUMN='$2';" 461 CNT=`$DBROCMD "$QUERY" | $EGREP -v ERROR | $LAST_LINE` 462 mdbg "check_db_alias: alias counter=$CNT" 463 if [ "$CNT" = "0" ] ; then 464 ALIAS_DB_EXISTS=0 465 else 466 ALIAS_DB_EXISTS=1 467 fi 468} 469 470# 471# check for alias duplicates 472# params: user domain 473# output: false if exists, true otherwise 474check_alias() { 475 ALIAS_EXISTS=0 476 477 if [ "$ENABLE_ALIASES" = "1" ] ; then 478 check_ul_alias "$1" "$2" 479 if [ "$ALIAS_UL_EXISTS" = "0" ] ; then 480 ALIAS_EXISTS=0 481 else 482 ALIAS_EXISTS=1 483 fi 484 elif [ "$ENABLE_ALIASES" = "2" ] ; then 485 check_db_alias "$1" "$2" 486 if [ "$ALIAS_DB_EXISTS" = "0" ] ; then 487 ALIAS_EXISTS=0 488 else 489 ALIAS_EXISTS=1 490 fi 491 fi 492} 493 494# db-based aliases 495alias_db() { 496 if [ "$#" -lt 2 ] ; then 497 merr "alias_db - too few parameters" 498 echo 499 usage_alias_db 500 exit 1 501 fi 502 503 require_dbengine 504 505 shift 506 507 case $1 in 508 list) 509 if [ $# -eq 2 ] ; then 510 # print aliases for user 511 check_aor "$2" 512 if [ "$?" -ne "0" ] ; then 513 merr "alias_db - <$2> is not a valid AoR (user@domain)" 514 exit 1 515 fi 516 517 set_user $2 518 519 CLAUSE="WHERE $DA_USER_COLUMN='$OSERUSER' AND \ 520$DA_DOMAIN_COLUMN='$OSERDOMAIN'" 521 mecho "Dumping aliases for user=<$2>" 522 echo 523 QUERY="SELECT CONCAT($DA_ALIAS_USER_COLUMN,\ 524'@',$DA_ALIAS_DOMAIN_COLUMN) AS ALIAS FROM $DA_TABLE $CLAUSE;" 525 $DBROCMD "$QUERY" 526 # | $AWK 'BEGIN {line=0;} 527 # /^\+/ { next } 528 # { if(line==0) print "ALIASES"; 529 # else print line ")\t" $1 "@" $2; 530 # line++; }' 531 elif [ $# -eq 1 ] ; then 532 mecho "Dumping all aliases may take long: do you want to proceed? [Y|N] " 533 read answer 534 if [ "$answer" = "y" -o "$answer" = "Y" ] ; then 535 mecho "Dumping all aliases..." 536 echo 537 else 538 exit 1 539 fi 540 QUERY="SELECT $DA_ALIAS_USER_COLUMN, $DA_ALIAS_DOMAIN_COLUMN,\ 541$DA_USER_COLUMN, $DA_DOMAIN_COLUMN FROM $DA_TABLE;" 542 $DBROCMD "$QUERY" 543 # | $AWK 'BEGIN {line=0;} 544 # /^\+/ { next } 545 # { line++; 546 # if(line==1) print "SIP-ID \tALIAS\n"; 547 # else print $3 "@" $4 "\t" $1 "@" $2 }' 548 else 549 merr "alias_db - wrong number of params for command [list]" 550 echo 551 usage_alias_db 552 exit 1 553 fi 554 555 exit $? 556 ;; 557 show) 558 if [ $# -ne 2 ] ; then 559 merr "alias_db - wrong number of params for command [show]" 560 usage_alias_db 561 exit 1 562 fi 563 564 check_aor "$2" 565 if [ "$?" -ne "0" ] ; then 566 merr "alias_db - $2 is not a valid AoR (user@domain)" 567 exit 1 568 fi 569 570 set_user $2 571 572 CLAUSE="WHERE $DA_ALIAS_USER_COLUMN='$OSERUSER' AND \ 573$DA_ALIAS_DOMAIN_COLUMN='$OSERDOMAIN'" 574 QUERY="SELECT CONCAT($DA_USER_COLUMN,'@',$DA_DOMAIN_COLUMN) \ 575AS 'SIP-ID' FROM $DA_TABLE $CLAUSE ; " 576 $DBROCMD "$QUERY" 577 #TMP_UUID=`sql_ro_query "$QUERY" | $AWK 'BEGIN {line=0;} 578 # /^\+/ { next } 579 # { line++; 580 # if(line==2) print $1 "@" $2;}'` 581 # 582 #if [ "$TMP_UUID" = "" ] ; then 583 # mecho "non-existent alias <$2>" 584 # exit 1 585 #fi 586 # 587 #echo "Details for alias <$2>" 588 #echo 589 #echo "SIP-ID: $TMP_UUID" 590 #echo 591 #exit $? 592 ;; 593 add) 594 if [ $# -ne 3 ] ; then 595 usage_alias_db 596 exit 1 597 fi 598 shift 599 check_aor "$1" 600 if [ "$?" -ne "0" ] ; then 601 err "alias_db - $1 is not a valid AoR (user@domain)" 602 exit 1 603 fi 604 605 check_aor "$2" 606 if [ "$?" -ne "0" ] ; then 607 err "alias_db - $2 is not a valid AoR (user@domain)" 608 exit 1 609 fi 610 611 set_user $1 612 TMP_OSERUSER=$OSERUSER 613 TMP_OSERDOMAIN=$OSERDOMAIN 614 set_user $2 615 616 if is_value_in_db $DA_TABLE $DA_ALIAS_USER_COLUMN $TMP_OSERUSER; then 617 minfo "$TMP_OSERUSER alias already in $DA_TABLE table" 618 exit 0 619 fi 620 621 QUERY="INSERT INTO $DA_TABLE ($DA_USER_COLUMN,$DA_DOMAIN_COLUMN,\ 622$DA_ALIAS_USER_COLUMN,$DA_ALIAS_DOMAIN_COLUMN) VALUES ('$OSERUSER',\ 623'$OSERDOMAIN','$TMP_OSERUSER','$TMP_OSERDOMAIN' );" 624 $DBCMD "$QUERY" 625 if [ $? -ne 0 ] ; then 626 merr "alias_db - SQL Error" 627 exit 1 628 fi 629 630 exit $? 631 ;; 632 rm) 633 if [ $# -ne 2 ] ; then 634 merr "alias_db - wrong numbers of parameters" 635 usage_alias_db 636 exit 1 637 fi 638 639 shift 640 641 check_aor "$1" 642 if [ "$?" -ne "0" ] ; then 643 merr "alias_db - $1 is not a valid URI" 644 exit 1 645 fi 646 647 set_user $1 648 CLAUSE="WHERE $DA_ALIAS_USER_COLUMN='$OSERUSER' AND \ 649$DA_ALIAS_DOMAIN_COLUMN='$OSERDOMAIN'" 650 QUERY="DELETE FROM $DA_TABLE $CLAUSE;" 651 $DBCMD "$QUERY" 652 if [ $? -ne 0 ] ; then 653 merr "alias_db - SQL Error" 654 exit 1 655 fi 656 657 exit $? 658 ;; 659 660 help) 661 usage_alias_db "alone" 662 ;; 663 664 *) 665 usage_alias_db 666 exit 1 667 ;; 668 esac 669} # end db-aliases 670 671 672# 673##### ------------------------------------------------ ##### 674### AVP management 675# 676# avp list [-T table] [-u <sip-id|uuid>] 677# [-a attribute] [-v value] [-t type] ... list AVPs 678# avp add [-T table] <sip-id|uuid> 679# <attribute> <type> <value> ............ add AVP (*) 680# avp rm [-T table] [-u <sip-id|uuid>] 681# [-a attribute] [-v value] [-t type] ... remove AVP (*) 682 683avpops() { 684 require_dbengine 685 if [ "$#" -lt 2 ] ; then 686 merr "avp - too few parameters" 687 minfo "see '$0 avp help'" 688 exit 1 689 fi 690 if [ "$1" = "avp" ] ; then 691 shift 692 else 693 merr "avp - unknown command $1" 694 minfo "see '$0 avp help'" 695 exit 1 696 fi 697 698 case $1 in 699 list) 700 shift 701 CLAUSE="" 702 while [ "$#" != "0" ] 703 do 704 TMP_ARG=$1 705 shift 706 case $TMP_ARG in 707 -T) 708 if [ -z "$1" ] ; then 709 merr "avp list - table name parameter missing" 710 exit 1 711 fi 712 AVP_TABLE=$1 713 ;; 714 -u) 715 if [ -z "$1" ] ; then 716 merr "avp list - user id or uuid parameter missing" 717 exit 1 718 fi 719 is_aor "$1" 720 if [ "$?" -eq "0" ] ; then 721 set_user $1 722 if [ "$CLAUSE" = "" ] ; then 723 CLAUSE=" WHERE $AVP_USER_COLUMN='$OSERUSER' \ 724AND $AVP_DOMAIN_COLUMN='$OSERDOMAIN'" 725 else 726 CLAUSE="$CLAUSE AND \ 727$AVP_USER_COLUMN='$OSERUSER' AND $AVP_DOMAIN_COLUMN='$OSERDOMAIN'" 728 fi 729 else 730 if [ "$CLAUSE" = "" ] ; then 731 CLAUSE=" WHERE $AVP_UUID_COLUMN='$1'" 732 else 733 CLAUSE="$CLAUSE AND $AVP_UUID_COLUMN='$1'" 734 fi 735 fi 736 ;; 737 -a) 738 if [ -z "$1" ] ; then 739 merr "avp list - attribute name parameter missing" 740 exit 1 741 fi 742 if [ "$CLAUSE" = "" ] ; then 743 CLAUSE=" WHERE $AVP_ATTRIBUTE_COLUMN='$1'" 744 else 745 CLAUSE="$CLAUSE AND $AVP_ATTRIBUTE_COLUMN='$1'" 746 fi 747 ;; 748 -v) 749 if [ -z "$1" ] ; then 750 merr "avp list - value parameter missing" 751 exit 1 752 fi 753 if [ "$CLAUSE" = "" ] ; then 754 CLAUSE=" WHERE $AVP_VALUE_COLUMN='$1'" 755 else 756 CLAUSE="$CLAUSE AND $AVP_VALUE_COLUMN='$1'" 757 fi 758 ;; 759 -t) 760 if [ -z "$1" ] ; then 761 merr "avp list - type parameter missing" 762 exit 1 763 fi 764 if [ "$CLAUSE" = "" ] ; then 765 CLAUSE=" WHERE $AVP_TYPE_COLUMN='$1'" 766 else 767 CLAUSE="$CLAUSE AND $AVP_TYPE_COLUMN='$1'" 768 fi 769 ;; 770 *) 771 merr "avp list - unknown parameter $1" 772 exit 1 773 ;; 774 esac 775 shift 776 done 777 778 QUERY="SELECT $AVP_UUID_COLUMN,$AVP_USER_COLUMN,\ 779$AVP_DOMAIN_COLUMN,$AVP_ATTRIBUTE_COLUMN,$AVP_TYPE_COLUMN,$AVP_VALUE_COLUMN \ 780FROM $AVP_TABLE $CLAUSE;" 781 mdbg "Query: $QUERY" 782 mecho "Dumping AVPs" 783 echo 784 $DBROCMD "$QUERY" 785 # | $AWK 'BEGIN {line=0;} 786 # /^\+/ { next } 787 # { if(line==0) print "## UUID \tUserID \tAttribute \tType \tValue\n"; 788 # else { 789 # ORS_BAK=ORS; 790 # ORS=""; 791 # print line ") " $1 $2 "@" $3 "\t" $4 "\t\"" $5; 792 # for (i=6;i<=NF;++i) print FS $i; 793 # ORS=ORS_BAK; 794 # print "\""; 795 # } 796 # line++; 797 # }' 798 799 exit $? 800 ;; 801 802 add) 803 shift 804 if [ $# -ne 4 ] ; then 805 if [ $# -ne 6 ] ; then 806 merr "avp add - bad number of parameters" 807 exit 1 808 fi 809 fi 810 if [ $# -eq 6 ] ; then 811 if [ "$1" = "-T" ] ; then 812 AVP_TABLE=$2 813 shift 814 shift 815 else 816 mecho "avp add - unknown parameter '$1'" 817 exit 1 818 fi 819 fi 820 821 is_aor "$1" 822 if [ "$?" -eq "0" ] ; then 823 set_user $1 824 else 825 AVP_UUID=$1 826 fi 827 828 QUERY="INSERT INTO $AVP_TABLE \ 829($AVP_UUID_COLUMN,$AVP_USER_COLUMN,$AVP_DOMAIN_COLUMN,$AVP_ATTRIBUTE_COLUMN,\ 830$AVP_TYPE_COLUMN,$AVP_VALUE_COLUMN,$AVP_MODIFIED_COLUMN) \ 831VALUES ('$AVP_UUID','$OSERUSER','$OSERDOMAIN','$2',$3,'$4',$DBFNOW);" 832 # echo "Query: $QUERY" 833 $DBCMD "$QUERY" 834 if [ $? -ne 0 ] ; then 835 merr "avp add - SQL Error" 836 exit 1 837 else 838 echo 839 mecho "avp add - attribute added" 840 fi 841 842 exit $? 843 ;; 844 845 rm) 846 shift 847 CLAUSE="" 848 while [ "$#" != "0" ] 849 do 850 TMP_ARG=$1 851 shift 852 case $TMP_ARG in 853 -T) 854 if [ -z "$1" ] ; then 855 merr "avp rm - table name parameter missing" 856 exit 1 857 fi 858 AVP_TABLE=$1 859 ;; 860 -u) 861 if [ -z "$1" ] ; then 862 merr "avp rm - user id or uuid parameter missing" 863 exit 1 864 fi 865 is_aor "$1" 866 if [ "$?" -eq "0" ] ; then 867 set_user $1 868 if [ "$CLAUSE" = "" ] ; then 869 CLAUSE="WHERE $AVP_USER_COLUMN='$OSERUSER' \ 870AND $AVP_DOMAIN_COLUMN='$OSERDOMAIN'" 871 else 872 CLAUSE="$CLAUSE AND \ 873$AVP_USER_COLUMN='$OSERUSER' AND $AVP_DOMAIN_COLUMN='$OSERDOMAIN'" 874 fi 875 else 876 if [ "$CLAUSE" = "" ] ; then 877 CLAUSE="WHERE $AVP_UUID_COLUMN='$1'" 878 else 879 CLAUSE="$CLAUSE AND $AVP_UUID_COLUMN='$1'" 880 fi 881 fi 882 ;; 883 -a) 884 if [ -z "$1" ] ; then 885 merr "avp rm - attribute name parameter missing" 886 exit 1 887 fi 888 if [ "$CLAUSE" = "" ] ; then 889 CLAUSE="WHERE $AVP_ATTRIBUTE_COLUMN='$1'" 890 else 891 CLAUSE="$CLAUSE AND $AVP_ATTRIBUTE_COLUMN='$1'" 892 fi 893 ;; 894 -v) 895 if [ -z "$1" ] ; then 896 merr "avp rm - value parameter missing" 897 exit 1 898 fi 899 if [ "$CLAUSE" = "" ] ; then 900 CLAUSE="WHERE $AVP_VALUE_COLUMN='$1'" 901 else 902 CLAUSE="$CLAUSE AND $AVP_VALUE_COLUMN='$1'" 903 fi 904 ;; 905 -t) 906 if [ -z "$1" ] ; then 907 merr "avp rm - type parameter missing" 908 exit 1 909 fi 910 if [ "$CLAUSE" = "" ] ; then 911 CLAUSE="WHERE $AVP_TYPE_COLUMN='$1'" 912 else 913 CLAUSE="$CLAUSE AND $AVP_TYPE_COLUMN='$1'" 914 fi 915 ;; 916 *) 917 merr "avp rm - unknown parameter $1" 918 exit 1 919 ;; 920 esac 921 shift 922 done 923 QUERY="DELETE FROM $AVP_TABLE $CLAUSE;" 924 mdbg "Query: $QUERY" 925 $DBCMD "$QUERY" 926 if [ $? -ne 0 ] ; then 927 merr "avp rm - SQL Error" 928 exit 1 929 else 930 echo 931 mecho "avp rm - AVP(s) deleted" 932 fi 933 934 exit $? 935 ;; 936 937 help) 938 usage_avp 939 ;; 940 941 *) 942 merr "avp - unknown command" 943 usage 944 exit 1 945 ;; 946 esac 947} # end avpops() 948 949# 950##### ------------------------------------------------ ##### 951### cisco restart 952# 953cisco_restart() { 954 require_ctlengine 955 myhost=`get_my_host` 956 CMDPARAMS="= tm.t_uac_start NOTIFY \"$1\" \".\" \".\" \"From:sip:daemon@$myhost=CRLF=To:<$1>=CRLF=Event:check-sync=CRLF=Contact:sip:daemon@$myhost=CRLF=\"" 957 958 ctl_cmd_run $CMDPARAMS 959} 960 961# 962##### ------------------------------------------------ ##### 963### DB operations 964# 965db_ops() { 966 require_dbengine 967 case $1 in 968 exec|query) 969 shift 970 if [ $# -ne 1 ] ; then 971 merr "missing query parameter" 972 exit 1 973 fi 974 $DBCMD "$1" 975 ;; 976 roexec|roquery) 977 shift 978 if [ $# -ne 1 ] ; then 979 merr "missing query parameter" 980 exit 1 981 fi 982 $DBROCMD "$1" 983 ;; 984 run) 985 shift 986 if [ $# -ne 1 ] ; then 987 merr "missing query parameter" 988 exit 1 989 fi 990 eval QUERY=\$$1 991 if [ -z "$QUERY" ] ; then 992 merr "missing query value" 993 exit 1 994 fi 995 $DBCMD "$QUERY" 996 ;; 997 rorun) 998 shift 999 if [ $# -ne 1 ] ; then 1000 merr "missing query parameter" 1001 exit 1 1002 fi 1003 eval QUERY=\$$1 1004 if [ -z "$QUERY" ] ; then 1005 merr "missing query value" 1006 exit 1 1007 fi 1008 $DBROCMD "$QUERY" 1009 ;; 1010 show) 1011 shift 1012 if [ $# -ne 1 ] ; then 1013 merr "missing table parameter" 1014 exit 1 1015 fi 1016 QUERY="select * FROM $1;" 1017 $DBROCMD "$QUERY" 1018 ;; 1019 showg) 1020 shift 1021 if [ $# -ne 1 ] ; then 1022 merr "missing table parameter" 1023 exit 1 1024 fi 1025 QUERY="select * FROM $1\\G;" 1026 $DBROCMD "$QUERY" 1027 ;; 1028 smatch) 1029 shift 1030 if [ $# -ne 3 ] ; then 1031 merr "missing parameters" 1032 exit 1 1033 fi 1034 QUERY="SELECT * FROM $1 WHERE $2='$3'\\G;" 1035 $DBROCMD "$QUERY" 1036 ;; 1037 nmatch) 1038 shift 1039 if [ $# -ne 3 ] ; then 1040 merr "missing parameters" 1041 exit 1 1042 fi 1043 QUERY="SELECT * FROM $1 WHERE $2=$3\\G;" 1044 $DBROCMD "$QUERY" 1045 ;; 1046 connect) 1047 shift 1048 if [ -z "$DBCMDCONNECT" ] ; then 1049 merr "extension not implemented" 1050 exit 1 1051 fi 1052 $DBCMDCONNECT 1053 ;; 1054 version) 1055 shift 1056 if [ $# -ne 3 ] ; then 1057 merr "missing parameters" 1058 exit 1 1059 fi 1060 case $1 in 1061 add) 1062 QUERY="INSERT INTO version (table_name, table_version) VALUES ('$2', $3);" 1063 $DBCMD "$QUERY" 1064 ;; 1065 set) 1066 QUERY="DELETE FROM version WHERE table_name='$2';" 1067 $DBCMD "$QUERY" 1068 QUERY="INSERT INTO version (table_name, table_version) VALUES ('$2', $3);" 1069 $DBCMD "$QUERY" 1070 ;; 1071 update) 1072 QUERY="UPDATE version SET table_version=$3 WHERE table_name='$2';" 1073 $DBCMD "$QUERY" 1074 ;; 1075 *) 1076 usage_db_ops 1077 exit 1 1078 esac 1079 ;; 1080 *) 1081 usage_db_ops 1082 exit 1 1083 esac 1084} 1085 1086# 1087##### ------------------------------------------------ ##### 1088### domain management 1089# 1090domain() { 1091 case $1 in 1092 reload) 1093 require_ctlengine 1094 ctl_cmd_run domain.reload 1095 ;; 1096 show) 1097 require_ctlengine 1098 ctl_cmd_run domain.dump 1099 ;; 1100 showdb) 1101 require_dbengine 1102 QUERY="select * FROM $DOMAIN_TABLE ; " 1103 $DBROCMD "$QUERY" 1104 ;; 1105 add) 1106 require_dbengine 1107 shift 1108 if [ $# -ne 1 ] ; then 1109 merr "missing domain parameter" 1110 exit 1 1111 fi 1112 if is_value_in_db $DOMAIN_TABLE $DO_DOMAIN_COLUMN $1; then 1113 minfo "$1 already in $DOMAIN_TABLE table" 1114 exit 0 1115 fi 1116 QUERY="insert into $DOMAIN_TABLE ($DO_DOMAIN_COLUMN, \ 1117 $DO_LAST_MODIFIED_COLUMN) VALUES ('$1',$DBFNOW);" 1118 $DBCMD "$QUERY" 1119 if [ $? -ne 0 ] ; then 1120 merr "domain - SQL Error" 1121 exit 1 1122 fi 1123 minfo "execute '$0 domain reload' to synchronize cache and database" 1124 ;; 1125 rm) 1126 require_dbengine 1127 shift 1128 if [ $# -ne 1 ] ; then 1129 merr "missing domain parameter" 1130 exit 1 1131 fi 1132 QUERY="delete from $DOMAIN_TABLE where domain='$1';" 1133 $DBCMD "$QUERY" 1134 if [ $? -ne 0 ] ; then 1135 merr "domain - SQL Error" 1136 exit 1 1137 fi 1138 minfo "execute '$0 domain reload' to synchronize cache and database" 1139 ;; 1140 *) 1141 usage_domain 1142 exit 1 1143 esac 1144} 1145 1146# 1147##### ------------------------------------------------ ##### 1148### uid_domain management 1149# 1150uid_domain() { 1151 case $1 in 1152 reload) 1153 require_kamcmd 1154 $SERCTLCMD domain.reload 1155 ;; 1156 show) 1157 require_kamcmd 1158 $SERCTLCMD domain.dump 1159 ;; 1160 showdb) 1161 require_dbengine 1162 QUERY="select * FROM $UID_DOMAIN_TABLE ; " 1163 $DBROCMD "$QUERY" 1164 ;; 1165 add) 1166 require_dbengine 1167 shift 1168 if [ $# -lt 1 ] ; then 1169 merr "too few parameters" 1170 exit 1 1171 fi 1172 1173 DOMAIN=$1 1174 DID=$2 1175 FLAGS=$3 1176 1177 if [ -z "$2" ] ; then 1178 DID=$DOMAIN 1179 fi 1180 if [ -z "$3" ] ; then 1181 FLAGS=$(( $SRDB_LOAD_SER | $SRDB_CANON | $SRDB_FOR_SERWEB )) 1182 fi 1183 1184 if is_value_in_db $UID_DOMAIN_TABLE $UID_DO_DOMAIN_COLUMN $DOMAIN; then 1185 minfo "$1 already in $UID_DOMAIN_TABLE table" 1186 exit 0 1187 fi 1188 QUERY="insert into $UID_DOMAIN_TABLE ($UID_DO_DID_COLUMN,$UID_DO_DOMAIN_COLUMN,$UID_DO_FLAGS_COLUMN) VALUES ('$DID','$DOMAIN',$FLAGS);" 1189 $DBCMD "$QUERY" 1190 if [ $? -ne 0 ] ; then 1191 merr "uid_domain - SQL Error" 1192 exit 1 1193 fi 1194 minfo "execute '$0 uid_domain reload' to synchronize cache and database" 1195 ;; 1196 rm) 1197 require_dbengine 1198 shift 1199 if [ $# -ne 1 ] ; then 1200 merr "missing domain parameter" 1201 exit 1 1202 fi 1203 QUERY="delete from $UID_DOMAIN_TABLE where domain='$1';" 1204 $DBCMD "$QUERY" 1205 if [ $? -ne 0 ] ; then 1206 merr "domain - SQL Error" 1207 exit 1 1208 fi 1209 minfo "execute '$0 uid_domain reload' to synchronize cache and database" 1210 ;; 1211 *) 1212 usage_uid_domain 1213 exit 1 1214 esac 1215} 1216 1217# 1218##### ------------------------------------------------ ##### 1219### permissions trusted management 1220# 1221permissions_trusted() { 1222 case $1 in 1223 reload) 1224 require_ctlengine 1225 ctl_cmd_run permissions.trustedReload 1226 ;; 1227 dump) 1228 require_ctlengine 1229 ctl_cmd_run permissions.trustedDump 1230 ;; 1231 show) 1232 require_dbengine 1233 QUERY="select * FROM $TRUSTED_TABLE ; " 1234 $DBROCMD "$QUERY" 1235 ;; 1236 add) 1237 require_dbengine 1238 shift 1239 if [ $# -lt 2 ] ; then 1240 usage_trusted 1241 exit 1 1242 fi 1243 if is_value_in_db $TRUSTED_TABLE src_ip $1; then 1244 minfo "$1 already in $TRUSTED_TABLE table" 1245 exit 0 1246 fi 1247 case $2 in 1248 any|udp|tcp|tls|sctp|none) 1249 ;; 1250 *) 1251 merr "unknown protocol" 1252 exit 1 1253 esac 1254 PATTERN="" 1255 if [ ! -z "$3" ]; then 1256 PATTERN="$3" 1257 fi 1258 1259 QUERY="insert into $TRUSTED_TABLE \ 1260 ( $TRUSTED_SRC_IP_COLUMN, $TRUSTED_PROTO_COLUMN, \ 1261 $TRUSTED_FROM_PATTERN_COLUMN, $TRUSTED_TAG_COLUMN) \ 1262 VALUES ('$1', '$2', '$PATTERN', '$4');" 1263 $DBCMD "$QUERY" 1264 if [ $? -ne 0 ] ; then 1265 merr "trusted - SQL Error" 1266 exit 1 1267 fi 1268 minfo "execute '$0 trusted reload' to synchronize cache and database" 1269 ;; 1270 rm) 1271 require_dbengine 1272 shift 1273 if [ $# -ne 1 ] ; then 1274 usage_trusted 1275 exit 1 1276 fi 1277 QUERY="delete from $TRUSTED_TABLE where $TRUSTED_SRC_IP_COLUMN='$1';" 1278 $DBCMD "$QUERY" 1279 if [ $? -ne 0 ] ; then 1280 merr "trusted - SQL Error" 1281 exit 1 1282 fi 1283 minfo "execute '$0 trusted reload' to synchronize cache and database" 1284 ;; 1285 *) 1286 usage_trusted 1287 exit 1 1288 esac 1289} 1290 1291 1292# 1293##### ------------------------------------------------ ##### 1294### permissions address management 1295# 1296permissions_address() { 1297 case $1 in 1298 reload) 1299 require_ctlengine 1300 ctl_cmd_run permissions.addressReload 1301 ;; 1302 dump) 1303 require_ctlengine 1304 ctl_cmd_run permissions.addressDump 1305 ctl_cmd_run permissions.subnetDump 1306 ;; 1307 show) 1308 require_dbengine 1309 QUERY="select * FROM $ADDRESS_TABLE ; " 1310 $DBROCMD "$QUERY" 1311 ;; 1312 add) 1313 require_dbengine 1314 shift 1315 if [ $# -lt 2 ] ; then 1316 usage_address 1317 exit 1 1318 fi 1319 AMASK=32 1320 if [ ! -z "$3" ]; then 1321 AMASK="$3" 1322 fi 1323 APORT=0 1324 if [ ! -z "$4" ]; then 1325 APORT="$4" 1326 fi 1327 ATAG="" 1328 if [ ! -z "$5" ]; then 1329 ATAG="$5" 1330 fi 1331 1332 QUERY="insert into $ADDRESS_TABLE \ 1333 (grp, ip_addr, mask, port, tag) \ 1334 VALUES ($1, '$2', $AMASK, $APORT, '$ATAG');" 1335 $DBCMD "$QUERY" 1336 if [ $? -ne 0 ] ; then 1337 merr "permissions address - SQL Error" 1338 exit 1 1339 fi 1340 minfo "execute '$0 address reload' to synchronize cache and database" 1341 ;; 1342 rm) 1343 require_dbengine 1344 shift 1345 if [ $# -ne 2 ] ; then 1346 usage_address 1347 exit 1 1348 fi 1349 QUERY="delete from $ADDRESS_TABLE where grp=$1 and ip_addr='$2';" 1350 $DBCMD "$QUERY" 1351 if [ $? -ne 0 ] ; then 1352 merr "permissions address - SQL Error" 1353 exit 1 1354 fi 1355 minfo "execute '$0 address reload' to synchronize cache and database" 1356 ;; 1357 *) 1358 usage_address 1359 exit 1 1360 esac 1361} 1362 1363 1364# 1365##### ------------------------------------------------ ##### 1366### mtree management 1367# 1368mtree_management() { 1369 case $1 in 1370 reload) 1371 require_ctlengine 1372 ctl_cmd_run mtree.reload $2 1373 ;; 1374 dump) 1375 require_ctlengine 1376 ctl_cmd_run mtree.list $2 1377 ;; 1378 showdb) 1379 require_dbengine 1380 QUERY="select * FROM $2 ; " 1381 $DBROCMD "$QUERY" 1382 ;; 1383 add) 1384 require_dbengine 1385 if [ $# -lt 4 ] ; then 1386 usage_mtree 1387 exit 1 1388 fi 1389 1390 QUERY="INSERT INTO $2 \ 1391 (tprefix, tvalue) \ 1392 VALUES ($3, '$4');" 1393 $DBCMD "$QUERY" 1394 if [ $? -ne 0 ] ; then 1395 merr "mtree - SQL Error" 1396 exit 1 1397 fi 1398 minfo "execute '$0 mtree reload' to synchronize cache and database" 1399 ;; 1400 rm) 1401 require_dbengine 1402 shift 1403 if [ $# -ne 3 ] ; then 1404 usage_address 1405 exit 1 1406 fi 1407 QUERY="DELETE FROM $2 where tprefix='$3';" 1408 $DBCMD "$QUERY" 1409 if [ $? -ne 0 ] ; then 1410 merr "mtree - SQL Error" 1411 exit 1 1412 fi 1413 minfo "execute '$0 mtree reload' to synchronize cache and database" 1414 ;; 1415 *) 1416 usage_mtree 1417 exit 1 1418 esac 1419} 1420 1421 1422# 1423##### ------------------------------------------------ ##### 1424### LCR management 1425# 1426lcr() { 1427 case $1 in 1428 show_gws) 1429 merr "command disabled" 1430 exit 1 1431 require_dbengine 1432 mecho "lcr gateways" 1433 QUERY="select * FROM $GW_TABLE ORDER BY $LCR_ID_COLUMN, $LCR_GW_GRPID_COLUMN; " 1434 $DBROCMD "$QUERY" 1435 ;; 1436 show_routes) 1437 merr "command disabled" 1438 exit 1 1439 require_dbengine 1440 mecho "lcr routes" 1441 QUERY="select * FROM $LCR_TABLE ORDER BY $LCR_ID_COLUMN, $LCR_PREFIX_COLUMN; " 1442 $DBROCMD "$QUERY" 1443 ;; 1444 reload) 1445 merr "command disabled" 1446 exit 1 1447 ctl_cmd_run lcr.reload 1448 ;; 1449 dump_gws) 1450 merr "command disabled" 1451 exit 1 1452 ctl_cmd_run lcr.dump_gws 1453 ;; 1454 dump_routes) 1455 merr "command disabled" 1456 exit 1 1457 ctl_cmd_run lcr.dump_lcrs 1458 ;; 1459 eval_weights) 1460 shift 1461 $AWK 'BEGIN { 1462 if (ARGC < 2) { 1463 printf("Usage: lcr eval_weights <list of weights (integers 1-254)>\n"); 1464 exit; 1465 } 1466 iters = 100000; 1467 for (i = 1; i < ARGC; i++) { counts[i] = 0; } 1468 for (i = 1; i <= iters; i++) { 1469 for (j = 1; j < ARGC; j++) { 1470 elem[j] = ARGV[j] * rshift(int(2147483647 * rand()), 8); 1471 } 1472 at = 1; 1473 max = elem[at]; 1474 for (j = 2; j < ARGC; j++) { 1475 if (elem[j] > max) { 1476 max = elem[j]; 1477 at = j; 1478 } 1479 } 1480 counts[at] = counts[at] + 1; 1481 } 1482 for (i = 1; i < ARGC; i++) { 1483 printf("weight %d probability %.4f\n", ARGV[i], counts[i]/iters); 1484 } 1485 }' $@ 1486 ;; 1487 *) 1488 usage_lcr 1489 exit 1 1490 esac 1491} 1492 1493# 1494##### ------------------------------------------------ ##### 1495### CARRIERROUTE management 1496# 1497cr() { 1498 require_dbengine 1499 require_ctlengine 1500 case $1 in 1501 show) 1502 mecho "cr carrier names" 1503 QUERY="select * FROM $CARRIER_NAME_TABLE ORDER BY $CARRIERROUTE_CARRIER_NAME_ID_COLUMN; " 1504 $DBROCMD "$QUERY" 1505 mecho "cr domain names" 1506 QUERY="select * FROM $DOMAIN_NAME_TABLE ORDER BY $CARRIERROUTE_DOMAIN_NAME_ID_COLUMN; " 1507 $DBROCMD "$QUERY" 1508 mecho "cr routes" 1509 QUERY="select * FROM $CARRIERROUTE_TABLE ORDER BY \ 1510 $CARRIERROUTE_CARRIERROUTE_CARRIER_COLUMN,\ 1511 $CARRIERROUTE_CARRIERROUTE_SCAN_PREFIX_COLUMN,\ 1512 $CARRIERROUTE_CARRIERROUTE_DOMAIN_COLUMN,\ 1513 $CARRIERROUTE_CARRIERROUTE_PROB_COLUMN;" 1514 $DBROCMD "$QUERY" 1515 ;; 1516 reload) 1517 ctl_cmd_run cr.reload_routes 1518 ;; 1519 1520 dump) 1521 ctl_cmd_run cr.dump_routes 1522 ;; 1523 1524 addcn) 1525 shift 1526 if [ $# -ne 2 ] ; then 1527 merr "cr - missing carrier id or name" 1528 exit 1 1529 fi 1530 QUERY="insert into $CARRIER_NAME_TABLE 1531 ( $CARRIERROUTE_CARRIER_NAME_ID_COLUMN, \ 1532 $CARRIERROUTE_CARRIER_NAME_CARRIER_COLUMN) \ 1533 VALUES ($1, '$2');" 1534 $DBCMD "$QUERY" 1535 if [ $? -ne 0 ] ; then 1536 merr "cr - SQL Error" 1537 exit 1 1538 fi 1539 minfo "execute '$0 cr reload' to synchronize cache and database" 1540 ;; 1541 1542 rmcn) 1543 shift 1544 if [ $# -ne 1 ] ; then 1545 merr "cr - missing carrier id to be removed" 1546 exit 1 1547 fi 1548 QUERY="delete from $CARRIER_NAME_TABLE where $CARRIERROUTE_CARRIER_NAME_ID_COLUMN='$1';" 1549 $DBCMD "$QUERY" 1550 if [ $? -ne 0 ] ; then 1551 merr "cr - SQL Error" 1552 exit 1 1553 fi 1554 minfo "execute '$0 cr reload' to synchronize cache and database" 1555 ;; 1556 1557 adddn) 1558 shift 1559 if [ $# -ne 2 ] ; then 1560 merr "cr - missing domain id or name" 1561 exit 1 1562 fi 1563 QUERY="insert into $DOMAIN_NAME_TABLE 1564 ( $CARRIERROUTE_DOMAIN_NAME_ID_COLUMN, \ 1565 $CARRIERROUTE_DOMAIN_NAME_DOMAIN_COLUMN) \ 1566 VALUES ($1, '$2');" 1567 $DBCMD "$QUERY" 1568 if [ $? -ne 0 ] ; then 1569 merr "cr - SQL Error" 1570 exit 1 1571 fi 1572 minfo "execute '$0 cr reload' to synchronize cache and database" 1573 ;; 1574 1575 rmdn) 1576 shift 1577 if [ $# -ne 1 ] ; then 1578 merr "cr - missing domain id to be removed" 1579 exit 1 1580 fi 1581 QUERY="delete from $DOMAIN_NAME_TABLE where $CARRIERROUTE_DOMAIN_NAME_ID_COLUMN='$1';" 1582 $DBCMD "$QUERY" 1583 if [ $? -ne 0 ] ; then 1584 merr "cr - SQL Error" 1585 exit 1 1586 fi 1587 minfo "execute '$0 cr reload' to synchronize cache and database" 1588 ;; 1589 1590 addcarrier) 1591 shift 1592 if [ $# -lt 4 ] ; then 1593 merr "cr - too few parameters" 1594 exit 1 1595 fi 1596 PROB=1 1597 STRIP=0 1598 REWRITE_PREFIX= 1599 REWRITE_SUFFIX= 1600 COMMENT= 1601 FLAGS=0 1602 MASK=0 1603 if [ $# -gt 4 ] ; then 1604 PROB=$5 1605 if [ $# -gt 5 ] ; then 1606 STRIP=$6 1607 if [ $# -gt 6 ] ; then 1608 REWRITE_PREFIX=$7 1609 if [ $# -gt 7 ] ; then 1610 REWRITE_SUFFIX=$8 1611 if [ $# -gt 8 ] ; then 1612 MASK=$9 1613 if [ $# -gt 9 ] ; then 1614 FLAGS=${10} 1615 if [ $# -gt 10 ] ; then 1616 COMMENT=${11} 1617 fi 1618 fi 1619 fi 1620 fi 1621 fi 1622 fi 1623 fi 1624 CARRIER=$1 1625 SCAN_PREFIX=$2 1626 DOMAIN=$3 1627 REWRITE_HOST=$4 1628 echo $FLAGS 1629 echo $MASK 1630 QUERY="insert into $CARRIERROUTE_TABLE \ 1631 ( $CARRIERROUTE_CARRIERROUTE_CARRIER_COLUMN, \ 1632 $CARRIERROUTE_CARRIERROUTE_SCAN_PREFIX_COLUMN, \ 1633 $CARRIERROUTE_CARRIERROUTE_DOMAIN_COLUMN, \ 1634 $CARRIERROUTE_CARRIERROUTE_PROB_COLUMN, \ 1635 $CARRIERROUTE_CARRIERROUTE_STRIP_COLUMN, \ 1636 $CARRIERROUTE_CARRIERROUTE_REWRITE_HOST_COLUMN, \ 1637 $CARRIERROUTE_CARRIERROUTE_REWRITE_PREFIX_COLUMN, \ 1638 $CARRIERROUTE_CARRIERROUTE_REWRITE_SUFFIX_COLUMN, \ 1639 $CARRIERROUTE_CARRIERROUTE_COMMENT_COLUMN, \ 1640 $CARRIERROUTE_CARRIERROUTE_FLAGS_COLUMN, \ 1641 $CARRIERROUTE_CARRIERROUTE_MASK_COLUMN ) \ 1642 VALUES ($CARRIER, '$SCAN_PREFIX', '$DOMAIN', $PROB, $STRIP, \ 1643 '$REWRITE_HOST', '$REWRITE_PREFIX', '$REWRITE_SUFFIX', '$COMMENT', \ 1644 $FLAGS, $MASK);" 1645 $DBCMD "$QUERY" 1646 if [ $? -ne 0 ] ; then 1647 merr "cr - SQL Error" 1648 exit 1 1649 fi 1650 minfo "execute '$0 cr reload' to synchronize cache and database" 1651 ;; 1652 1653 rmcarrier) 1654 shift 1655 if [ $# -ne 3 ] ; then 1656 merr "cr - too few parameters" 1657 exit 1 1658 fi 1659 CARRIER=$1 1660 SCAN_PREFIX=$2 1661 DOMAIN=$3 1662 QUERY="delete from $CARRIERROUTE_TABLE where $CARRIERROUTE_CARRIERROUTE_CARRIER_COLUMN='$CARRIER' AND \ 1663 $CARRIERROUTE_CARRIERROUTE_SCAN_PREFIX_COLUMN='$SCAN_PREFIX' AND \ 1664 $CARRIERROUTE_CARRIERROUTE_DOMAIN_COLUMN=$DOMAIN ;" 1665 $DBCMD "$QUERY" 1666 if [ $? -ne 0 ] ; then 1667 merr "cr - SQL Error" 1668 exit 1 1669 fi 1670 minfo "execute '$0 cr reload' to synchronize cache and database" 1671 ;; 1672 1673 *) 1674 usage_cr 1675 exit 1 1676 esac 1677} 1678 1679# 1680##### ------------------------------------------------ ##### 1681### DISPATCHER management 1682# 1683dispatcher() { 1684 case $1 in 1685 show) 1686 require_dbengine 1687 mecho "dispatcher gateways" 1688 QUERY="select * FROM $DISPATCHER_TABLE ORDER BY $DISPATCHER_SETID_COLUMN; " 1689 $DBROCMD "$QUERY" 1690 ;; 1691 addgw|add) 1692 require_dbengine 1693 shift 1694 if [ $# -lt 2 ] ; then 1695 merr "too few parameters" 1696 usage_dispatcher 1697 exit 1 1698 fi 1699 1700 DISPATCHER_SETID=$1 1701 DISPATCHER_DESTINATION=$2 1702 1703 if [ $# -gt 2 ] ; then 1704 DISPATCHER_FLAGS=$3 1705 else 1706 DISPATCHER_FLAGS=0 1707 fi 1708 1709 if [ $# -gt 3 ] ; then 1710 DISPATCHER_PRIORITY=$4 1711 else 1712 DISPATCHER_PRIORITY=0 1713 fi 1714 1715 if [ $# -gt 4 ] ; then 1716 DISPATCHER_ATTRS=$5 1717 else 1718 DISPATCHER_ATTRS="" 1719 fi 1720 1721 if [ $# -gt 5 ] ; then 1722 DISPATCHER_DESCRIPTION=$6 1723 else 1724 DISPATCHER_DESCRIPTION="" 1725 fi 1726 1727 QUERY="insert into $DISPATCHER_TABLE \ 1728 ( $DISPATCHER_SETID_COLUMN, $DISPATCHER_DESTINATION_COLUMN, $DISPATCHER_FLAGS_COLUMN, $DISPATCHER_PRIORITY_COLUMN, $DISPATCHER_ATTRS_COLUMN, $DISPATCHER_DESCRIPTION_COLUMN ) \ 1729 VALUES ($DISPATCHER_SETID,'$DISPATCHER_DESTINATION',$DISPATCHER_FLAGS,$DISPATCHER_PRIORITY,'$DISPATCHER_ATTRS','$DISPATCHER_DESCRIPTION');" 1730 $DBCMD "$QUERY" 1731 1732 if [ $? -ne 0 ] ; then 1733 merr "dispatcher - SQL Error" 1734 exit 1 1735 fi 1736 1737 ;; 1738 rmgw|rm) 1739 require_dbengine 1740 shift 1741 if [ $# -ne 1 ] ; then 1742 merr "missing gateway id to be removed" 1743 exit 1 1744 fi 1745 1746 QUERY="delete from $DISPATCHER_TABLE where $DISPATCHER_ID_COLUMN='$1';" 1747 $DBCMD "$QUERY" 1748 1749 if [ $? -ne 0 ] ; then 1750 merr "dispatcher - SQL Error" 1751 exit 1 1752 fi 1753 1754 ;; 1755 reload) 1756 require_ctlengine 1757 ctl_cmd_run dispatcher.reload 1758 ;; 1759 1760 dump) 1761 require_ctlengine 1762 ctl_cmd_run dispatcher.list 1763 ;; 1764 1765 *) 1766 usage_dispatcher 1767 exit 1 1768 1769 esac 1770} 1771 1772# 1773##### ------------------------------------------------ ##### 1774### Server management 1775# 1776ksr_srv() { 1777 case $1 in 1778 sockets) 1779 require_ctlengine 1780 mecho "list listen sockets" 1781 ctl_cmd_run corex.list_sockets 1782 ;; 1783 aliases) 1784 require_ctlengine 1785 mecho "list server aliases" 1786 ctl_cmd_run corex.list_aliases 1787 ;; 1788 rpclist) 1789 require_ctlengine 1790 mecho "list server rpc commands" 1791 ctl_cmd_run system.listMethods 1792 ;; 1793 debug) 1794 require_ctlengine 1795 mecho "server debug level command" 1796 if [ $# -lt 2 ] ; then 1797 ctl_cmd_run corex.debug 1798 else 1799 ctl_cmd_run corex.debug $2 1800 fi 1801 ;; 1802 version) 1803 require_ctlengine 1804 mecho "list server version" 1805 ctl_cmd_run core.version 1806 ;; 1807 *) 1808 usage_ksr_srv 1809 exit 1 1810 1811 esac 1812} 1813 1814 1815# 1816##### ------------------------------------------------ ##### 1817### DIALOG management 1818# 1819dialog() { 1820 case $1 in 1821 show|list) 1822 require_ctlengine 1823 mecho "dialog memory records" 1824 ctl_cmd_run dlg.list 1825 ;; 1826 showdb) 1827 require_dbengine 1828 mecho "dialog database records" 1829 QUERY="select * FROM $DIALOG_TABLE ORDER BY id; " 1830 $DBROCMD "$QUERY" 1831 ;; 1832 *) 1833 usage_dialog 1834 exit 1 1835 1836 esac 1837} 1838 1839# 1840##### ------------------------------------------------ ##### 1841### DIALPLAN management 1842# 1843dialplan() { 1844 require_dbengine 1845 require_ctlengine 1846 case $1 in 1847 show) 1848 shift 1849 if [ $# -gt 0 ] ; then 1850 mecho "dialplan $1 tables" 1851 QUERY="select * FROM $DIALPLAN_TABLE WHERE $DIALPLAN_DPID_COLUMN=$1 ORDER BY $DIALPLAN_PR_COLUMN ; " 1852 else 1853 mecho "dialplan tables" 1854 QUERY="select * FROM $DIALPLAN_TABLE ORDER BY $DIALPLAN_DPID_COLUMN, $DIALPLAN_PR_COLUMN; " 1855 fi 1856 $DBROCMD "$QUERY" 1857 ;; 1858 1859 addrule) 1860 shift 1861 if [ $# -lt 4 ] ; then 1862 merr "too few parameters" 1863 usage_dialplan 1864 exit 1 1865 fi 1866 1867 DIALPLAN_DPID=$1 1868 DIALPLAN_PR=$2 1869 DIALPLAN_MATCH_OP=$3 1870 case $DIALPLAN_MATCH_OP in 1871 equal) 1872 DIALPLAN_MATCH_OP=0 1873 ;; 1874 regexp) 1875 DIALPLAN_MATCH_OP=1 1876 ;; 1877 fnmatch) 1878 DIALPLAN_MATCH_OP=2 1879 ;; 1880 *) 1881 merr "dialplan - unexpected $DIALPLAN_MATCH_OP for operating matching. Use 'equal' or 'regexp'!" 1882 exit 1 1883 esac 1884 DIALPLAN_MATCH_EXP=$4 1885 DIALPLAN_MATCH_LEN=0 1886 if [ $# -gt 4 ] ; then 1887 DIALPLAN_MATCH_LEN=$5 1888 fi 1889 if [ $# -gt 5 ] ; then 1890 DIALPLAN_SUBST_EXP=$6 1891 fi 1892 if [ $# -gt 6 ] ; then 1893 DIALPLAN_REPL_EXP=$7 1894 fi 1895 if [ $# -gt 7 ] ; then 1896 DIALPLAN_ATTRS=$8 1897 fi 1898 1899 QUERY="insert into $DIALPLAN_TABLE \ 1900 ( $DIALPLAN_DPID_COLUMN, $DIALPLAN_PR_COLUMN, $DIALPLAN_MATCH_OP_COLUMN, \ 1901 $DIALPLAN_MATCH_EXP_COLUMN, $DIALPLAN_MATCH_LEN_COLUMN, \ 1902 $DIALPLAN_SUBST_EXP_COLUMN, $DIALPLAN_REPL_EXP_COLUMN, \ 1903 $DIALPLAN_ATTRS_COLUMN ) \ 1904 VALUES ( $DIALPLAN_DPID, $DIALPLAN_PR, $DIALPLAN_MATCH_OP, \ 1905 '$DIALPLAN_MATCH_EXP', $DIALPLAN_MATCH_LEN, '$DIALPLAN_SUBST_EXP', \ 1906 '$DIALPLAN_REPL_EXP', '$DIALPLAN_ATTRS')"; 1907 mdbg "$QUERY" 1908 $DBCMD "$QUERY" 1909 1910 if [ $? -ne 0 ] ; then 1911 merr "dialplan - SQL Error" 1912 exit 1 1913 fi 1914 1915 minfo "do not forget to do dialplan reload" 1916 ;; 1917 1918 rm) 1919 QUERY="delete from $DIALPLAN_TABLE; " 1920 $DBCMD "$QUERY" 1921 1922 if [ $? -ne 0 ] ; then 1923 merr "dialplan - SQL Error" 1924 exit 1 1925 fi 1926 1927 minfo "do not forget to do dialplan reload" 1928 ;; 1929 1930 rmdpid) 1931 shift 1932 if [ $# -lt 1 ] ; then 1933 merr "too few parameters" 1934 usage_dialplan 1935 exit 1 1936 fi 1937 1938 DIALPLAN_DPID=$1 1939 1940 QUERY="delete from $DIALPLAN_TABLE where $DIALPLAN_DPID_COLUMN=$DIALPLAN_DPID; " 1941 $DBCMD "$QUERY" 1942 1943 if [ $? -ne 0 ] ; then 1944 merr "dialplan - SQL Error" 1945 exit 1 1946 fi 1947 1948 minfo "do not forget to do dialplan reload" 1949 ;; 1950 1951 rmrule) 1952 shift 1953 if [ $# -lt 2 ] ; then 1954 merr "too few parameters" 1955 usage_dialplan 1956 exit 1 1957 fi 1958 1959 DIALPLAN_DPID=$1 1960 DIALPLAN_PR=$2 1961 1962 QUERY="delete from $DIALPLAN_TABLE where $DIALPLAN_DPID_COLUMN=$DIALPLAN_DPID AND $DIALPLAN_PR_COLUMN=$DIALPLAN_PR; " 1963 $DBCMD "$QUERY" 1964 1965 if [ $? -ne 0 ] ; then 1966 merr "dialplan - SQL Error" 1967 exit 1 1968 fi 1969 1970 minfo "do not forget to do dialplan reload" 1971 ;; 1972 1973 reload) 1974 ctl_cmd_run dialplan.reload 1975 ;; 1976 1977 *) 1978 usage_dialplan 1979 exit 1 1980 1981 esac 1982} 1983 1984# 1985##### ------------------------------------------------ ##### 1986### kamailio_start 1987# 1988kamailio_start() { 1989 echo 1990 minfo "Starting Kamailio : " 1991 if [ -r $PID_FILE ] ; then 1992 ps axw | $EGREP kamailio 1993 ls -l $PID_FILE 1994 minfo "PID file exists ($PID_FILE)! Kamailio already running?" 1995 exit 1 1996 fi 1997 1998 if [ ! -x "$KAMBIN" ] ; then 1999 echo 2000 merr "Kamailio binaries not found at $KAMBIN" 2001 merr "set KAMBIN to the path of kamailio in $0 or ~/.kamctlrc" 2002 exit 1 2003 fi 2004 if [ $SYSLOG = 1 ] ; then 2005 $KAMBIN -P $PID_FILE -f $ETCDIR/kamailio.cfg $STARTOPTIONS 1>/dev/null 2>/dev/null 2006 else 2007 $KAMBIN -P $PID_FILE -E -f $ETCDIR/kamailio.cfg $STARTOPTIONS 2008 fi 2009 sleep 3 2010 if [ ! -s $PID_FILE ] ; then 2011 echo 2012 merr "PID file $PID_FILE does not exist -- Kamailio start failed" 2013 exit 1 2014 fi 2015 minfo "started (pid: `cat $PID_FILE`)" 2016} 2017 2018# 2019##### ------------------------------------------------ ##### 2020### kamailio_stop 2021# 2022kamailio_stop() { 2023 echo 2024 minfo "Stopping Kamailio : " 2025 if [ -r $PID_FILE ] ; then 2026 kill `cat $PID_FILE` 2027 minfo "stopped" 2028 else 2029 echo 2030 merr "No PID file found ($PID_FILE)! Kamailio probably not running" 2031 minfo "check with 'ps axw | $EGREP kamailio'" 2032 exit 1 2033 fi 2034} 2035 2036# 2037##### ------------------------------------------------ ##### 2038### options_ping 2039# 2040options_ping() { 2041 myhost=`get_my_host` 2042 require_ctlengine 2043 CMDPARAMS="= tm.t_uac_wait_block OPTIONS \"$1\" \".\" \".\" \"From:sip:daemon@$myhost=CRLF=To:<$1>=CRLF=Contact:sip:daemon@$myhost=CRLF=\"" 2044 ctl_cmd_run $CMDPARAMS 2045} 2046 2047# 2048##### ------------------------------------------------ ##### 2049### rpid management 2050# 2051rpid() { 2052 if [ "$#" -lt 2 ] ; then 2053 merr "rpid - too few parameters" 2054 exit 1 2055 fi 2056 shift; 2057 require_dbengine 2058 case $1 in 2059 show) 2060 if [ $# -eq 2 ] ; then 2061 set_user $2 2062 is_user $2 2063 if [ $? -ne 0 ] ; then 2064 merr "rpid - invalid user '$2'" 2065 exit 1; 2066 fi 2067 CLAUSE=" WHERE $SUBSCRIBER_COLUMN='$OSERUSER' AND \ 2068$REALM_COLUMN='$OSERDOMAIN' " 2069 elif [ $# -ne 1 ] ; then 2070 usage_rpid 2071 exit 1 2072 fi 2073 QUERY="select $SUBSCRIBER_COLUMN, $RPID_COLUMN FROM $SUB_TABLE \ 2074$CLAUSE ; " 2075 $DBROCMD "$QUERY" 2076 ;; 2077 2078 add|rm) 2079 MODE=$1; 2080 2081 if [ "$MODE" = "add" ] ; then 2082 ARG_NUM=3; 2083 else 2084 ARG_NUM=2; 2085 fi 2086 2087 if [ $# -lt $ARG_NUM ] ; then 2088 usage_rpid 2089 exit 1 2090 fi 2091 2092 set_user $2 2093 is_user $2 2094 if [ $? -ne 0 ] ; then 2095 merr "rpid - invalid user '$2'" 2096 exit 1 2097 fi 2098 shift 2 2099 2100 if [ "$MODE" = "add" ] ; then 2101 RPID_VAL="'$1'"; 2102 else 2103 RPID_VAL=NULL; 2104 fi 2105 2106 QUERY="UPDATE $SUB_TABLE SET $RPID_COLUMN=$RPID_VAL \ 2107WHERE $SUBSCRIBER_COLUMN='$OSERUSER' AND $REALM_COLUMN='$OSERDOMAIN';" 2108 $DBCMD "$QUERY" 2109 if [ $? -ne 0 ] ; then 2110 merr "rpid - SQL Error" 2111 exit 1 2112 fi 2113 2114 $0 rpid show "$OSERUSER@$OSERDOMAIN" 2115 2116 ;; 2117 2118 *) 2119 usage_rpid 2120 exit 1 2121 ;; 2122 esac 2123} 2124 2125# 2126##### ------------------------------------------------ ##### 2127### SPEEDDIAL management 2128# 2129speeddial() { 2130 if [ "$#" -lt 2 ] ; then 2131 merr "speeddial - too few parameters" 2132 echo 2133 usage_speeddial 2134 exit 1 2135 fi 2136 2137 require_dbengine 2138 shift 2139 2140 case $1 in 2141 list) 2142 if [ $# -eq 2 ] ; then 2143 # print speed-dials for user 2144 check_aor "$2" 2145 if [ "$?" -ne "0" ] ; then 2146 merr "speeddial - <$2> is not a valid AoR (user@domain)" 2147 exit 1 2148 fi 2149 2150 set_user $2 2151 2152 CLAUSE="WHERE $SD_USER_COLUMN='$OSERUSER' AND \ 2153$SD_DOMAIN_COLUMN='$OSERDOMAIN'" 2154 mecho "Dumping speed-dials for user=<$2>" 2155 echo 2156 QUERY="SELECT CONCAT($SD_SD_USER_COLUMN,'@',\ 2157$SD_SD_DOMAIN_COLUMN) AS 'Short number', $SD_NEW_URI_COLUMN AS 'New URI',\ 2158$SD_DESC_COLUMN FROM $SD_TABLE $CLAUSE;" 2159 $DBROCMD "$QUERY" 2160 #| $AWK 'BEGIN {line=0;} 2161 # /^\+/ { next } 2162 #{ if(line==0) print "## SpeedDial \tNew-URI \tDescription\n"; 2163 # else { 2164 # ORS_BAK=ORS; 2165 # ORS=""; 2166 # print line ") " $1 "@" $2 "\t" $3 "\t\"" $4; 2167 # for (i=5;i<=NF;++i) print FS $i; 2168 # ORS=ORS_BAK; 2169 # print "\""; 2170 # } 2171 # line++; 2172 #}' 2173 elif [ $# -eq 1 ] ; then 2174 mecho "Dumping all speed-dials may take long: do you want to proceed? [Y|N] " 2175 read answer 2176 if [ "$answer" = "y" -o "$answer" = "Y" ] ; then 2177 mecho "Dumping all speed-dials..." 2178 echo 2179 else 2180 exit 1 2181 fi 2182 QUERY="SELECT CONCAT($SD_SD_USER_COLUMN,'@',\ 2183$SD_SD_DOMAIN_COLUMN) AS 'Short number', CONCAT($SD_USER_COLUMN,'@',\ 2184$SD_DOMAIN_COLUMN) AS 'Owner', $SD_NEW_URI_COLUMN AS 'New URI',\ 2185$SD_DESC_COLUMN FROM $SD_TABLE;" 2186 $DBROCMD "$QUERY" 2187 #| $AWK 'BEGIN {line=0;} 2188 # /^\+/ { next } 2189 # { line++; 2190 #if(line==1) print "SIP-ID \tSpeedDial \tNew-URI \tDescritpion\n"; 2191 # else { 2192 # ORS_BAK=ORS; 2193 # ORS=""; 2194 # print $3 "@" $4 "\t" $1 "@" $2 "\t" $5 "\t\"" $6; 2195 # for (i=7;i<=NF;++i) print FS $i; 2196 # ORS=ORS_BAK; 2197 # print "\""; 2198 # } 2199 # }' 2200 else 2201 merr "speeddial - wrong number of params for command [list]" 2202 usage_speeddial 2203 exit 1 2204 fi 2205 2206 exit $? 2207 ;; 2208 show) 2209 if [ $# -ne 2 ] ; then 2210 merr "speeddial - wrong number of params for command [show]" 2211 usage_speeddial 2212 exit 1 2213 fi 2214 2215 check_aor "$2" 2216 if [ "$?" -ne "0" ] ; then 2217 merr "speeddial - $2 is not a valid AoR (user@domain)" 2218 exit 1 2219 fi 2220 2221 set_user $2 2222 2223 CLAUSE="WHERE $SD_SD_USER_COLUMN='$OSERUSER' AND \ 2224$SD_SD_DOMAIN_COLUMN='$OSERDOMAIN'" 2225 QUERY="SELECT CONCAT($SD_USER_COLUMN,'@',$SD_DOMAIN_COLUMN) \ 2226AS 'Owner', $SD_NEW_URI_COLUMN AS 'New URI', $SD_DESC_COLUMN FROM \ 2227$SD_TABLE $CLAUSE ; " 2228 mecho "Details for speeddial <$2>" 2229 $DBROCMD "$QUERY" 2230 # | $AWK 'BEGIN {line=0;} /^\+/ { next } 2231 # { 2232 # if(line==0) print "## SIP-ID \tNew-URI \tDescritpion\n"; 2233 # else { 2234 # ORS_BAK=ORS;usage_kamailio_monitor() { 2235 # ORS=""; 2236 # print line ") " $1 "@" $2 "\t" $3 "\t\"" $4; 2237 # for (i=5;i<=NF;++i) print FS $i; 2238 # ORS=ORS_BAK; 2239 # print "\""; 2240 # } 2241 # line++; 2242 # }' 2243 2244 exit $? 2245 ;; 2246 add) 2247 if [ $# -ne 4 ] ; then 2248 if [ $# -ne 5 ] ; then 2249 merr "speeddial - wrong number of parameters" 2250 usage_speeddial 2251 exit 1 2252 fi 2253 fi 2254 shift 2255 check_aor "$1" 2256 if [ "$?" -ne "0" ] ; then 2257 merr "speeddial - $1 is not a valid AoR (user@domain)" 2258 exit 1 2259 fi 2260 2261 check_aor "$2" 2262 if [ "$?" -ne "0" ] ; then 2263 merr "speeddial - $2 is not a valid AoR (user@domain)" 2264 exit 1 2265 fi 2266 2267 check_sipaor "$3" 2268 if [ "$?" -ne "0" ] ; then 2269 merr "speeddial - $3 is not a valid SIP AoR (sip:user@domain)" 2270 exit 1 2271 fi 2272 2273 set_user $1 2274 TMP_OSERUSER=$OSERUSER 2275 TMP_OSERDOMAIN=$OSERDOMAIN 2276 set_user $2 2277 2278 QUERY="INSERT INTO $SD_TABLE ($SD_USER_COLUMN,$SD_DOMAIN_COLUMN,\ 2279$SD_SD_USER_COLUMN,$SD_SD_DOMAIN_COLUMN,$SD_NEW_URI_COLUMN,$SD_DESC_COLUMN) \ 2280VALUES ('$TMP_OSERUSER','$TMP_OSERDOMAIN','$OSERUSER','$OSERDOMAIN','$3','$4');" 2281 $DBCMD "$QUERY" 2282 if [ $? -ne 0 ] ; then 2283 merr "speeddial - SQL Error" 2284 exit 1 2285 fi 2286 mecho "ok - spedd dial added" 2287 echo 2288 exit $? 2289 ;; 2290 rm) 2291 if [ $# -ne 3 ] ; then 2292 merr "speeddial rm - invalid number of parameters" 2293 usage_speeddial 2294 exit 1 2295 fi 2296 2297 shift 2298 2299 check_aor "$1" 2300 if [ "$?" -ne "0" ] ; then 2301 merr "speeddial - $1 is not a valid AoR (user@domain)" 2302 exit 1 2303 fi 2304 2305 check_aor "$2" 2306 if [ "$?" -ne "0" ] ; then 2307 merr "speeddial - $2 is not a valid AoR (user@domain)" 2308 exit 1 2309 fi 2310 2311 set_user $1 2312 TMP_OSERUSER=$OSERUSER 2313 TMP_OSERDOMAIN=$OSERDOMAIN 2314 set_user $2 2315 2316 CLAUSE="WHERE $SD_USER_COLUMN='$TMP_OSERUSER' AND \ 2317$SD_DOMAIN_COLUMN='$TMP_OSERDOMAIN' AND $SD_SD_USER_COLUMN='$OSERUSER' AND \ 2318$SD_SD_DOMAIN_COLUMN='$OSERDOMAIN'" 2319 QUERY="DELETE FROM $SD_TABLE $CLAUSE;" 2320 $DBCMD "$QUERY" 2321 if [ $? -ne 0 ] ; then 2322 merr "speeddial - SQL Error" 2323 exit 1 2324 fi 2325 2326 mecho "ok - spedd dial deleted" 2327 echo 2328 2329 ;; 2330 2331 help) 2332 usage_speeddial 2333 ;; 2334 2335 *) 2336 merr "speeddial - unknown command" 2337 usage_speeddial 2338 exit 1 2339 ;; 2340 esac 2341} # end speed_dial() 2342 2343# 2344##### ------------------------------------------------ ##### 2345### acc management 2346# 2347acc() { 2348 if [ "$#" -lt 2 ] ; then 2349 merr "acc - too few parameters" 2350 usage_acc 2351 exit 1 2352 fi 2353 shift; 2354 require_dbengine 2355 case $1 in 2356 initdb) 2357 QUERY=$(cat <<-END 2358ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT ''; 2359ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT ''; 2360ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default ''; 2361ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT ''; 2362ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT ''; 2363ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT ''; 2364ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT ''; 2365ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT ''; 2366ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default ''; 2367ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT ''; 2368ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT ''; 2369ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT ''; 2370END 2371) 2372 $DBCMD "$QUERY" 2373 if [ $? -ne 0 ] ; then 2374 merr "error - acc db init" 2375 exit 1 2376 fi 2377 2378 mecho "ok - acc db init" 2379 2380 ;; 2381 2382 showdb) 2383 QUERY="select * FROM $ACC_TABLE ;" 2384 $DBROCMD "$QUERY" 2385 ;; 2386 2387 recent) 2388 TIMENOW=`date +"%s"` 2389 if [ $# -eq 2 ] ; then 2390 CLAUSE=" WHERE time>=$TIMENOW - $2 " 2391 else 2392 CLAUSE=" WHERE time>=$TIMENOW - 300 " 2393 fi 2394 QUERY="select * FROM $ACC_TABLE $CLAUSE ; " 2395 $DBROCMD "$QUERY" 2396 ;; 2397 2398 2399 *) 2400 usage_acc 2401 exit 1 2402 ;; 2403 esac 2404} # end acc() 2405 2406 2407# 2408##### ================================================ ##### 2409### subscriber management 2410# 2411subscriber() { 2412 if [ "$#" -lt 2 ] ; then 2413 merr "too few parameters" 2414 usage_subscriber 2415 exit 1 2416 fi 2417 2418 require_dbengine 2419 2420 case $1 in 2421 add) 2422 if [ $# -ne 3 ] ; then 2423 usage_subscriber 2424 exit 1 2425 fi 2426 shift 2427 credentials $1 $2 2428 is_user $1 2429 if [ $? -eq 0 ] ; then 2430 minfo "user '$1' already exists" 2431 exit 1 2432 fi 2433 set_user $1 2434 check_alias $OSERUSER $OSERDOMAIN 2435 if [ "$ALIAS_EXISTS" = "1" ] ; then 2436 minfo "user '$1' already exists as alias" 2437 exit 1 2438 fi 2439 2440 if [ "$STORE_PLAINTEXT_PW" = "1" ] ; then 2441 PASS="$2" 2442 else 2443 PASS="" 2444 fi 2445 2446 QUERY="insert into $SUB_TABLE ($SUBSCRIBER_COLUMN,\ 2447 $REALM_COLUMN,$HA1_COLUMN,$HA1B_COLUMN,$PASSWORD_COLUMN) \ 2448 values ('$OSERUSER','$OSERDOMAIN','$HA1','$HA1B','$PASS');"; 2449 $DBCMD "$QUERY" 2450 if [ $? -ne 0 ] ; then 2451 merr "introducing the new user '$1' to the database failed" 2452 else 2453 mecho "new user '$1' added" 2454 fi 2455 ;; 2456 2457 show) 2458 if [ $# -ne 2 ] ; then 2459 usage_subscriber 2460 exit 1 2461 fi 2462 shift 2463 2464 set_user $1 2465 2466 case $DBENGINE in 2467 MYSQL|mysql|MySQL) 2468 QUERY="SELECT * FROM $SUB_TABLE \ 2469WHERE $SUBSCRIBER_COLUMN='$OSERUSER' AND $REALM_COLUMN='$OSERDOMAIN'\G" 2470 ;; 2471 *) 2472 QUERY="SELECT * FROM $SUB_TABLE \ 2473WHERE $SUBSCRIBER_COLUMN='$OSERUSER' AND $REALM_COLUMN='$OSERDOMAIN';" 2474 ;; 2475 esac 2476 $DBROCMD "$QUERY" 2477 ;; 2478 2479 passwd) 2480 if [ $# -ne 3 ] ; then 2481 usage_subscriber 2482 exit 1 2483 fi 2484 shift 2485 credentials $1 $2 2486 2487 is_user $1 2488 if [ $? -ne 0 ] ; then 2489 merr "non-existent user '$1'" 2490 exit 1 2491 fi 2492 2493 if [ "$STORE_PLAINTEXT_PW" = "1" ] ; then 2494 PASS="$2" 2495 else 2496 PASS="" 2497 fi 2498 2499 QUERY="update $SUB_TABLE set $HA1_COLUMN='$HA1', \ 2500$HA1B_COLUMN='$HA1B', $PASSWORD_COLUMN='$PASS' \ 2501WHERE $SUBSCRIBER_COLUMN='$OSERUSER' and $REALM_COLUMN='$OSERDOMAIN';" 2502 $DBCMD "$QUERY" 2503 if [ $? -ne 0 ] ; then 2504 merr "password change failed" 2505 else 2506 minfo "password change succeeded" 2507 fi 2508 ;; 2509 2510 rm) 2511 if [ $# -ne 2 ] ; then 2512 usage_subscriber 2513 exit 1 2514 fi 2515 2516 require_ctlengine 2517 shift 2518 2519 is_user $1 2520 if [ $? -ne 0 ] ; then 2521 merr "non-existent user '$1'" 2522 exit 1 2523 fi 2524 2525 # begin with remove all user's privileges 2526 acl revoke $1 > /dev/null 2>&1 2527 2528 # destroy db-aliases 2529 QUERY="delete from $DA_TABLE where $DA_USER_COLUMN='$OSERUSER' \ 2530and $DA_DOMAIN_COLUMN='$OSERDOMAIN';" 2531 $DBCMD "$QUERY" 2532 2533 2534 # destroy the user now 2535 QUERY="delete from $SUB_TABLE where $SUBSCRIBER_COLUMN='$OSERUSER' \ 2536and $REALM_COLUMN='$OSERDOMAIN';" 2537 $DBCMD "$QUERY" 2538 2539 # and also all his contacts 2540 $0 ul rm $1 > /dev/null 2>&1 2541 ;; 2542 sets) 2543 if [ $# -ne 4 ] ; then 2544 usage_subscriber 2545 exit 1 2546 fi 2547 shift 2548 2549 is_user $1 2550 if [ $? -ne 0 ] ; then 2551 merr "non-existent user '$1'" 2552 exit 1 2553 fi 2554 2555 QUERY="update $SUB_TABLE set $2='$3' \ 2556WHERE $SUBSCRIBER_COLUMN='$OSERUSER' and $REALM_COLUMN='$OSERDOMAIN';" 2557 $DBCMD "$QUERY" 2558 if [ $? -ne 0 ] ; then 2559 merr "attribute change failed" 2560 else 2561 minfo "attribute change succeeded" 2562 fi 2563 ;; 2564 setn) 2565 if [ $# -ne 4 ] ; then 2566 usage_subscriber 2567 exit 1 2568 fi 2569 shift 2570 2571 is_user $1 2572 if [ $? -ne 0 ] ; then 2573 merr "non-existent user '$1'" 2574 exit 1 2575 fi 2576 2577 QUERY="update $SUB_TABLE set $2=$3 \ 2578WHERE $SUBSCRIBER_COLUMN='$OSERUSER' and $REALM_COLUMN='$OSERDOMAIN';" 2579 $DBCMD "$QUERY" 2580 if [ $? -ne 0 ] ; then 2581 merr "attribute change failed" 2582 else 2583 minfo "attribute change succeeded" 2584 fi 2585 ;; 2586 2587 esac 2588 2589} 2590 2591# 2592##### ================================================ ##### 2593### USRLOC management 2594# 2595usrloc() { 2596 if [ "$#" -lt 2 ] ; then 2597 merr "usrloc - too few parameters" 2598 usage_usrloc 2599 exit 1 2600 fi 2601 2602 require_ctlengine 2603 2604 if [ "$1" = "alias" ] ; then 2605 USRLOC_TABLE="$ALS_TABLE" 2606 if [ -z "$USRLOC_TABLE" ] ; then 2607 USRLOC_TABLE=aliases 2608 fi 2609 CHECK_SUB=1 2610 elif [ "$1" = "ul" ] ; then 2611 USRLOC_TABLE="$UL_TABLE" 2612 if [ -z "$USRLOC_TABLE" ] ; then 2613 USRLOC_TABLE=location 2614 fi 2615 CHECK_SUB=0 2616 elif [ "$1" = "usrloc" ] ; then 2617 USRLOC_TABLE="$UL_TABLE" 2618 if [ -z "$USRLOC_TABLE" ] ; then 2619 USRLOC_TABLE=location 2620 fi 2621 CHECK_SUB=0 2622 else 2623 merr "usrloc - unknown subcommand '$1'" 2624 usage_usrloc 2625 exit 1 2626 fi 2627 shift 2628 2629 case $1 in 2630 show) 2631 if [ $# -eq 2 ] ; then 2632 if [ "$2" = "--brief" ] ; then 2633 ctl_cmd_run ul.dump brief 2634 else 2635 set_user $2 2636 ctl_cmd_run ul.lookup \ 2637 $USRLOC_TABLE "$OSERUSER@$OSERDOMAIN" 2638 fi 2639 elif [ $# -eq 1 ] ; then 2640 ctl_cmd_run ul.dump 2641 else 2642 merr "wrong number of params" 2643 usage_usrloc 2644 exit 1 2645 fi 2646 exit $? 2647 ;; 2648 add) 2649 if [ $# -eq 3 ] ; then 2650 # expires 0 means persistent contact 2651 UL_EXPIRES=0 2652 UL_FLAGS=0 2653 BR_FLAGS=0 2654 UL_PATH="." 2655 elif [ $# -eq 4 ] ; then 2656 UL_EXPIRES=$4 2657 UL_FLAGS=0 2658 BR_FLAGS=0 2659 UL_PATH="." 2660 elif [ $# -eq 5 ] ; then 2661 UL_EXPIRES=$4 2662 UL_FLAGS=0 2663 BR_FLAGS=0 2664 UL_PATH="$5" 2665 else 2666 usage_usrloc 2667 exit 1 2668 fi 2669 shift 2670 check_uri "$2" 2671 2672 if [ "$?" -ne "0" ] ; then 2673 merr "$2 is not a valid URI" 2674 exit 1 2675 fi 2676 2677 set_user $1 2678 if [ "$CHECK_SUB" -ne 0 ] ; then 2679 is_user $1 2680 if [ $? -eq 0 ] ; then 2681 merr "overlap of alias with an existing subscriber name" 2682 exit 1; 2683 fi 2684 fi 2685 2686 check_alias $OSERUSER $OSERDOMAIN 2687 if [ "$ALIAS_EXISTS" = "1" ] ; then 2688 if [ "$CHECK_SUB" -ne 0 ] ; then 2689 minfo "alias already defined" 2690 else 2691 merr "AOR is an alias" 2692 fi 2693 exit 1 2694 fi 2695 2696 if [ -z "$DEFAULT_Q" ] ; then 2697 DEFAULT_Q="1.0" 2698 fi 2699 2700 ctl_cmd_run ul.add "$USRLOC_TABLE" "$OSERUSER@$OSERDOMAIN" "$2" \ 2701"$UL_EXPIRES" "$DEFAULT_Q" "$UL_PATH" "$UL_FLAGS" "$BR_FLAGS" "$ALL_METHODS" 2702 exit $? 2703 ;; 2704 rm) 2705 if [ $# -eq 2 ] ; then 2706 shift 2707 set_user $1 2708 ctl_cmd_run ul.rm $USRLOC_TABLE "$OSERUSER@$OSERDOMAIN" 2709 2710 elif [ $# -eq 3 ] ; then 2711 shift 2712 set_user $1 2713 check_uri "$2" 2714 if [ "$?" -ne "0" ] ; then 2715 merr "$2 is not a valid SIP URI (sip:[user@]domain)" 2716 exit 1 2717 fi 2718 2719 ctl_cmd_run ul.rm_contact $USRLOC_TABLE "$OSERUSER@$OSERDOMAIN" "$2" 2720 2721 else 2722 merr "wrong number of params" 2723 usage_usrloc 2724 exit 1 2725 fi 2726 ;; 2727 2728 dbclean) 2729 require_dbengine 2730 KSR_CLEAN_VAL=3600 2731 if [ $# -eq 2 ] ; then 2732 KSR_CLEAN_VAL=$2 2733 fi 2734 QUERY="delete from $USRLOC_TABLE where expires < SUBDATE(NOW(), INTERVAL $KSR_CLEAN_VAL SECOND);" 2735 $DBCMD "$QUERY" 2736 2737 exit $? 2738 ;; 2739 2740 *) 2741 usage_usrloc 2742 exit 1 2743 ;; 2744 esac 2745} 2746 2747##### ================================================ ##### 2748### TLS CA management 2749# 2750 2751tls_ca() { 2752 2753 if [ "$1" = "rootCA" ] ; then 2754 if [ -z $2 ] ; then 2755 # use default 2756 CA_BASE=$ETCDIR/tls 2757 else 2758 CA_BASE=`(cd $2;pwd)` 2759 fi 2760 2761 if [ ! -d $CA_BASE ] ; then 2762 merr "Config directory ($CA_BASE) does not exist" 2763 exit 1 2764 fi 2765 2766 CA_CONF='ca.conf' 2767 CA_PATH=$CA_BASE/rootCA 2768 if [ ! -f $CA_BASE/$CA_CONF ] ; then 2769 merr "root CA config file ($CA_BASE/$CA_CONF) does not exist" 2770 exit 1 2771 fi 2772 2773 if [ -d $CA_PATH ] ; then 2774 mwarn "root CA directory ($CA_PATH) exists! Remove it (y/n)?" 2775 read X 2776 if [ "$X" != "y" -a "$X" != "Y" ] ; then 2777 exit 1 2778 fi 2779 fi 2780 2781 mecho "Creating directory $CA_PATH and its sub-tree" 2782 mkdir -p $CA_PATH 2783 if [ $? -ne 0 ] ; then 2784 merr "Failed to create root directory $CA_PATH" 2785 exit 1 2786 fi 2787 rm -fr "${CA_PATH:?}"/* 2788 mkdir $CA_PATH/private 2789 mkdir $CA_PATH/certs 2790 touch $CA_PATH/index.txt 2791 echo 01 >$CA_PATH/serial 2792 2793 mecho "Creating CA self-signed certificate" 2794 ( cd $CA_PATH; openssl req -config $CA_BASE/$CA_CONF -x509 -newkey \ 2795 rsa:2048 -days 365 -out ./cacert.pem -outform PEM ) 2796 if [ $? -ne 0 ] ; then 2797 merr "Failed to create self-signed certificate" 2798 exit 1 2799 fi 2800 2801 mecho "Protecting CA private key" 2802 chmod 600 $CA_PATH/private/cakey.pem 2803 2804 mecho "DONE" 2805 minfo "Private key can be found in $CA_PATH/private/cakey.pem" 2806 minfo "Certificate can be found in $CA_PATH/cacert.pem" 2807 2808 elif [ "$1" = "userCERT" ] ; then 2809 2810 if [ -z $2 ] ; then 2811 merr "Missing user name parameter" 2812 exit 1 2813 fi 2814 2815 if [ -z $3 ] ; then 2816 # use default 2817 CA_BASE=$ETCDIR/tls 2818 else 2819 CA_BASE=`(cd $3;pwd)` 2820 fi 2821 2822 if [ ! -d $CA_BASE ] ; then 2823 merr "Config directory ($CA_BASE) does not exist" 2824 exit 1 2825 fi 2826 2827 USER_DIR=$CA_BASE/$2 2828 USER_CFG=$CA_BASE/$2.conf 2829 USER=$2 2830 REQ_CFG=$CA_BASE/request.conf 2831 2832 if [ ! -f $USER_CFG ] ; then 2833 merr "User config file $USER_CFG not found" 2834 exit 1 2835 fi 2836 2837 if [ ! -f $REQ_CFG ] ; then 2838 merr "Request config file $REQ_CFG not found" 2839 exit 1 2840 fi 2841 2842 mecho "Using config file $USER_CFG" 2843 2844 if [ -d $USER_DIR ] ; then 2845 mwarn "User CERT directory ($USER_DIR) exists! Remove it (y/n)?" 2846 read X 2847 if [ "$X" != "y" -a "$X" != "Y" ] ; then 2848 exit 1 2849 fi 2850 fi 2851 2852 mecho "Creating directory $USER_DIR" 2853 mkdir -p $USER_DIR 2854 if [ $? -ne 0 ] ; then 2855 merr "Failed to create user directory $USER_DIR " 2856 exit 1 2857 fi 2858 rm -fr "${USER_DIR:?}"/* 2859 2860 mecho "Creating user certificate request" 2861 openssl req -config $USER_CFG -out $USER_DIR/$USER-cert_req.pem \ 2862 -keyout $USER_DIR/$USER-privkey.pem -new -nodes 2863 if [ $? -ne 0 ] ; then 2864 merr "Failed to generate certificate request" 2865 exit 1 2866 fi 2867 2868 mecho "Signing certificate request" 2869 ( cd $CA_BASE ; openssl ca -config $REQ_CFG -in \ 2870 $USER_DIR/$USER-cert_req.pem -out $USER_DIR/$USER-cert.pem ) 2871 if [ $? -ne 0 ] ; then 2872 merr "Failed to generate certificate request" 2873 exit 1 2874 fi 2875 2876 mecho "Generating CA list" 2877 cat $CA_BASE/rootCA/cacert.pem >> $USER_DIR/$USER-calist.pem 2878 2879 mecho "DONE" 2880 minfo "Private key is locate at $USER_DIR/$USER-privkey.pem " 2881 minfo "Certificate is locate at $USER_DIR/$USER-cert.pem " 2882 minfo "CA-List is locate at $USER_DIR/$USER-calist.pem " 2883 2884 else 2885 merr "unknown TLS command $1" 2886 usage_tls 2887 exit 1 2888 fi 2889} 2890 2891extcmd() { 2892 if [ -f $ETCDIR/kamctl.${1}.ext ]; then 2893 . $ETCDIR/kamctl.${1}.ext 2894 else 2895 if [ -f ~/.kamctl/kamctl.${1}.ext ]; then 2896 . ~/.kamctl/kamctl.${1}.ext 2897 else 2898 return 2899 fi 2900 fi 2901 2902 XCMD=cmd_${1} 2903 2904 shift 2905 $XCMD "$@" 2906 2907 exit 1 2908} 2909 2910##### ================================================ ##### 2911### trap with gdb kamailio processes using RPC core.psx 2912# 2913 2914kamailio_trap() { 2915 if [ -z "$GDB" ] ; then 2916 merr "'gdb' tool not found: set GDB variable to correct tool path" 2917 exit 2918 fi 2919 DATE=`/bin/date +%Y%m%d_%H%M%S` 2920 LOG_FILE=/tmp/gdb_kamailio_${DATE}.txt 2921 minfo "Trap file: $LOG_FILE" 2922 ctl_cmd_run core.psx > $LOG_FILE 2923 echo -n "Trapping Kamailio with gdb: " 2924 PID_TIMESTAMP_VECTOR=`$EGREP 'PID' $LOG_FILE | $EGREP -Eo '[0-9]+'` 2925 for pid in $PID_TIMESTAMP_VECTOR 2926 do 2927 echo -n "." 2928 PID=`echo $pid | cut -d '-' -f 1` 2929 echo "" >> $LOG_FILE 2930 echo "---start $PID -----------------------------------------------------" >> $LOG_FILE 2931 $GDB kamailio $PID -batch --eval-command="bt full" >> $LOG_FILE 2>&1 2932 echo "---end $PID -------------------------------------------------------" >> $LOG_FILE 2933 done 2934 echo "." 2935} 2936 2937##### ================================================ ##### 2938### trap with gdb kamailio processes using ps command 2939# 2940 2941kamailio_pstrap() { 2942 if [ -z "$GDB" ] ; then 2943 merr "'gdb' tool not found: set GDB variable to correct tool path" 2944 exit 2945 fi 2946 DATE=`/bin/date +%Y%m%d_%H%M%S` 2947 LOG_FILE=/tmp/gdb_kamailio_${DATE}.txt 2948 minfo "Trap file: $LOG_FILE" 2949 ps axw | grep kamailio | grep -v grep | grep -v kamctl | sort > $LOG_FILE 2950 echo "" >> $LOG_FILE 2951 echo "" >> $LOG_FILE 2952 echo -n "Trapping Kamailio with gdb: " 2953 PID_TIMESTAMP_VECTOR=`ps axw | grep kamailio | grep -v grep | grep -v kamctl | sort | awk '{print $1}'` 2954 for pid in $PID_TIMESTAMP_VECTOR 2955 do 2956 echo -n "." 2957 PID=`echo $pid | cut -d '-' -f 1` 2958 echo "" >> $LOG_FILE 2959 echo "---start $PID -----------------------------------------------------" >> $LOG_FILE 2960 $GDB kamailio $PID -batch --eval-command="p process_no" --eval-command="p pt[process_no]" --eval-command="bt full" >> $LOG_FILE 2>&1 2961 echo "---end $PID -------------------------------------------------------" >> $LOG_FILE 2962 done 2963 echo "." 2964} 2965 2966# 2967##### ================================================ ##### 2968### main command switch 2969# 2970case $1 in 2971 acl) 2972 shift 2973 acl "$@" 2974 ;; 2975 2976 add) 2977 subscriber "$@" 2978 ;; 2979 2980 show) 2981 subscriber "$@" 2982 ;; 2983 2984 passwd) 2985 subscriber "$@" 2986 ;; 2987 2988 rm) 2989 subscriber "$@" 2990 ;; 2991 2992 sets) 2993 subscriber "$@" 2994 ;; 2995 2996 setn) 2997 subscriber "$@" 2998 ;; 2999 3000 alias|ul|usrloc) 3001 usrloc "$@" 3002 ;; 3003 3004 alias_db|aliasdb) 3005 alias_db "$@" 3006 ;; 3007 3008 avp) 3009 avpops "$@" 3010 ;; 3011 3012 cisco_restart) 3013 if [ "$#" -ne 2 ] ; then 3014 usage_cisco_restart 3015 exit 1 3016 fi 3017 cisco_restart $2 3018 ;; 3019 3020 db) 3021 shift 3022 db_ops "$@" 3023 ;; 3024 3025 showdb|userdb) 3026 usage 3027 exit 1 3028 ;; 3029 3030 domain) 3031 shift 3032 domain "$@" 3033 ;; 3034 3035 uid_domain) 3036 shift 3037 uid_domain "$@" 3038 ;; 3039 3040 trusted) 3041 shift 3042 permissions_trusted "$@" 3043 ;; 3044 3045 address) 3046 shift 3047 permissions_address "$@" 3048 ;; 3049 3050 mtree) 3051 shift 3052 mtree_management "$@" 3053 ;; 3054 3055 rpc) 3056 require_ctlengine 3057 shift 3058 $CTLCMD "$@" 3059 ;; 3060 3061 rpcprint) 3062 require_ctlengine 3063 shift 3064 $CTLCMDPRINT "$@" 3065 ;; 3066 3067 ser|sercmd|kamcmd) 3068 require_kamcmd 3069 shift 3070 $SERCTLCMD "$@" 3071 ;; 3072 3073 lcr) 3074 shift 3075 lcr "$@" 3076 ;; 3077 3078 cr) 3079 shift 3080 cr "$@" 3081 ;; 3082 3083 dispatcher) 3084 shift 3085 dispatcher "$@" 3086 ;; 3087 3088 dialog) 3089 shift 3090 dialog "$@" 3091 ;; 3092 3093 dialplan) 3094 shift 3095 dialplan "$@" 3096 ;; 3097 3098 monitor|console|moni|con) 3099 require_ctlengine 3100 $KAMAILIO_MONITOR "$@" 3101 ;; 3102 3103 online) 3104 require_ctlengine 3105 ctl_cmd_run ul.dump brief | $EGREP -i aor | $EGREP -v AoRs \ 3106 | awk '{print $2}' | sed 's/"//g' | sort | sort -mu 3107 exit $? 3108 ;; 3109 3110 ping) 3111 # error handling is hacked -- filter_fl should not 3112 # consume positive status -- that should be done by 3113 # calling app 3114 if [ "$#" -ne 2 ] ; then 3115 usage_ping 3116 exit 1 3117 fi 3118 options_ping $2 3119 ;; 3120 3121 ps) 3122 require_ctlengine 3123 ctl_cmd_run core.psx 3124 ;; 3125 3126 psa) 3127 require_ctlengine 3128 ctl_cmd_run core.psa 3129 ;; 3130 3131 uptime) 3132 require_ctlengine 3133 ctl_cmd_run core.uptime 3134 ;; 3135 3136 stats) 3137 require_ctlengine 3138 if [ "$#" -eq 1 ] ; then 3139 ctl_cmd_run stats.get_statistics all 3140 else 3141 ctl_cmd_run stats.get_statistics "${2}:" 3142 fi 3143 ;; 3144 3145 srv) 3146 shift 3147 ksr_srv "$@" 3148 ;; 3149 3150 restart) 3151 kamailio_stop 3152 sleep 2 3153 kamailio_start 3154 ;; 3155 3156 rpid) 3157 rpid "$@" 3158 ;; 3159 3160 speeddial|speed_dial) 3161 speeddial "$@" 3162 ;; 3163 3164 acc) 3165 acc "$@" 3166 ;; 3167 3168 tls) 3169 shift 3170 tls_ca "$@" 3171 ;; 3172 3173 trap) 3174 require_ctlengine 3175 kamailio_trap 3176 ;; 3177 3178 pstrap) 3179 kamailio_pstrap 3180 ;; 3181 3182 start) 3183 kamailio_start 3184 ;; 3185 3186 stop) 3187 kamailio_stop 3188 ;; 3189 3190 version) 3191 echo "$0 $VERSION" 3192 ;; 3193 3194 *) 3195 extcmd "$@" 3196 3197 usage 3198 exit 1 3199 ;; 3200esac 3201 3202