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