f8fea39a108312849ebd36a9278eea1e6543b5dd
[sip-router] / utils / kamctl / kamdbctl.mysql
1 #
2 # Script for adding and dropping Kamailio MySQL tables
3 #
4 # History:
5 # 2006-04-07  removed gen_ha1 dependency - use md5sum;
6 #             separated the serweb from kamailio tables;
7 #             fixed the reinstall functionality (bogdan)
8 # 2006-05-16  added ability to specify MD5 from a configuration file
9 #             FreeBSD does not have the md5sum function (norm)
10 # 2006-09-02  Added address table (juhe)
11 # 2006-10-27  subscriber table cleanup; some columns are created only if
12 #             serweb is installed (bogdan)
13 # 2007-02-28  DB migration added (bogdan)
14 # 2007-05-21  Move SQL database definitions out of this script (henning)
15 # 2007-05-31  Move common definitions to kamdbctl.base file (henningw)
16 # 2007-06-11  Use a common control tool for database tasks, like the kamctl
17
18 # path to the database schemas
19 DATA_DIR="/usr/local/share/kamailio"
20 if [ -d "$DATA_DIR/mysql" ] ; then
21         DB_SCHEMA="$DATA_DIR/mysql"
22 else
23         DB_SCHEMA="./mysql"
24 fi
25
26 #################################################################
27 # config vars
28 #################################################################
29
30 # full privileges MySQL user
31 if [ -z "$DBROOTUSER" ]; then
32         DBROOTUSER="root"
33 fi
34
35 # Uncomment this to set the database root password if you want to run this 
36 # script without any user prompt. This is unsafe, but useful e.g. for 
37 # automatic testing.
38 #PW=""
39
40
41 CMD="mysql -h $DBHOST -u$DBROOTUSER "
42 DUMP_CMD="mysqldump -h $DBHOST -u$DBROOTUSER -c -t "
43 #################################################################
44
45
46 # read password
47 prompt_pw()
48 {
49         savetty=`stty -g`
50         echo -n "MySQL password for $DBROOTUSER: "
51         stty -echo
52         read PW
53         stty $savetty
54         echo
55         export PW
56 }
57
58 # execute sql command with optional db name 
59 # and password parameters given
60 sql_query()
61 {
62         if [ $# -gt 1 ] ; then
63                 if [ -n "$1" ]; then
64                         DB="$1" # no quoting, mysql client don't like this
65                 else
66                         DB=""
67                 fi
68                 shift
69                 if [ -n "$PW" ]; then
70                         $CMD "-p$PW" $DB -e "$@"
71                 else
72                         $CMD $DB -e "$@"
73                 fi
74         else
75                 if [ -n "$PW" ]; then
76                         $CMD "-p$PW" "$@"
77                 else
78                         $CMD "$@"
79                 fi
80         fi
81 }
82
83
84 kamailio_drop()  # pars: <database name>
85 {
86         if [ $# -ne 1 ] ; then
87                 merr "kamailio_drop function takes two params"
88                 exit 1
89         fi
90
91         sql_query "" "DROP DATABASE $1;"
92
93         if [ $? -ne 0 ] ; then
94                 merr "Dropping database $1 failed!"
95                 exit 1
96         fi
97         minfo "Database $1 deleted"
98 }
99
100
101 db_charset_test()
102 {
103         if [ -n "$PW" ]; then
104                 CURRCHARSET=`echo "show variables like '%character_set_server%'" | $CMD "-p$PW" | $AWK '{print $2}' | $SED -e 1d`
105                 ALLCHARSETS=`echo "show character set" | $CMD "-p$PW" | $AWK '{print $1}' | $SED -e 1d | $GREP -iv -e "utf8\|ucs2"`
106         else
107                 CURRCHARSET=`echo "show variables like '%character_set_server%'" | $CMD | $AWK '{print $2}' | $SED -e 1d`
108                 ALLCHARSETS=`echo "show character set" | $CMD | $AWK '{print $1}' | $SED -e 1d | $GREP -iv -e "utf8\|ucs2"`
109         fi
110
111         while [ `echo "$ALLCHARSETS" | $GREP -icw $CURRCHARSET`  = "0" ]
112         do
113                 mwarn "Your current default mysql characters set cannot be used to create DB. Please choice another one from the following list:"
114                 mecho "$ALLCHARSETS"
115                 mecho "Enter character set name: "
116                 read CURRCHARSET
117                 if [ `echo $CURRCHARSET | $GREP -cE "\w+"` = "0" ]; then
118                         merr "can't continue: user break"
119                         exit 1
120                 fi
121         done
122         CHARSET=$CURRCHARSET
123 }
124
125 kamailio_db_create () # pars: <database name>
126 {
127         if [ $# -ne 1 ] ; then
128                 merr "kamailio_db_create function takes one param"
129                 exit 1
130         fi
131
132         if [ "$CHARSET" = "" ]; then
133                 minfo "test server charset"
134                 db_charset_test
135         fi
136
137         minfo "creating database $1 ..."
138
139         sql_query "" "CREATE DATABASE $1 CHARACTER SET $CHARSET;"
140
141         if [ $? -ne 0 ] ; then
142                 merr "Creating database $1 failed!"
143                 exit 1
144         fi
145 }
146
147 kamailio_db_grant () # pars: <database name>
148 {
149         if [ $# -ne 1 ] ; then
150                 merr "kamailio_db_grant function takes one param"
151                 exit 1
152         fi
153
154         minfo "granting privileges to database $1 ..."
155
156         # Users: kamailio is the regular user, kamailioro only for reading
157         sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '${DBRWUSER}'@'$DBHOST' IDENTIFIED BY '$DBRWPW';
158                 GRANT SELECT ON $1.* TO '${DBROUSER}'@'$DBHOST' IDENTIFIED BY '$DBROPW';"
159
160         if [ $? -ne 0 ] ; then
161                 merr "granting privileges to database $1 failed!"
162                 exit 1
163         fi
164
165         if [ "$DBHOST" != "localhost" ] ; then
166                 sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '$DBRWUSER'@'localhost' IDENTIFIED  BY '$DBRWPW';
167                         GRANT SELECT ON $1.* TO '$DBROUSER'@'localhost' IDENTIFIED BY '$DBROPW';"
168                 if [ $? -ne 0 ] ; then
169                         merr "granting localhost privileges to database $1 failed!"
170                         exit 1
171                 fi
172         fi
173
174         if [ ! -z "$DBACCESSHOST" ] ; then
175                 sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '$DBRWUSER'@'$DBACCESSHOST' IDENTIFIED  BY '$DBRWPW';
176                         GRANT SELECT ON $1.* TO '$DBROUSER'@'$DBACCESSHOST' IDENTIFIED BY '$DBROPW';"
177                 if [ $? -ne 0 ] ; then
178                         merr "granting access host privileges to database $1 failed!"
179                         exit 1
180                 fi
181         fi
182 }
183
184 kamailio_db_revoke () # pars: <database name>
185 {
186         if [ $# -ne 1 ] ; then
187                 merr "kamailio_db_revoke function takes one param"
188                 exit 1
189         fi
190
191         minfo "revoking privileges to database $1 ..."
192
193         # Users: kamailio is the regular user, kamailioro only for reading
194         sql_query "" "REVOKE ALL PRIVILEGES ON $1.* FROM '${DBRWUSER}'@'$DBHOST';
195                 REVOKE SELECT ON $1.* FROM '${DBROUSER}'@'$DBHOST';"
196
197         if [ $? -ne 0 ] ; then
198                 merr "revoking privileges to database $1 failed!"
199                 exit 1
200         fi
201
202         if [ "$DBHOST" != "localhost" ] ; then
203                 sql_query "" "REVOKE ALL PRIVILEGES ON $1.* FROM '$DBRWUSER'@'localhost';
204                         REVOKE SELECT ON $1.* FROM '$DBROUSER'@'localhost';"
205                 if [ $? -ne 0 ] ; then
206                         merr "granting localhost privileges to database $1 failed!"
207                         exit 1
208                 fi
209         fi
210
211         if [ ! -z "$DBACCESSHOST" ] ; then
212                 sql_query "" "REVOKE ALL PRIVILEGES ON $1.* FROM '$DBRWUSER'@'$DBACCESSHOST';
213                         REVOKE SELECT ON $1.* FROM '$DBROUSER'@'$DBACCESSHOST';"
214                 if [ $? -ne 0 ] ; then
215                         merr "granting access host privileges to database $1 failed!"
216                         exit 1
217                 fi
218         fi
219 }
220
221
222 kamailio_create () # pars: <database name>
223 {
224         if [ $# -ne 1 ] ; then
225                 merr "kamailio_create function takes one param"
226                 exit 1
227         fi
228
229         kamailio_db_create $1
230
231         kamailio_db_grant $1
232
233         standard_create $1
234
235         get_answer $INSTALL_PRESENCE_TABLES "Install presence related tables? (y/n): "
236         if [ "$ANSWER" = "y" ]; then
237                 presence_create $1
238         fi
239
240         get_answer $INSTALL_EXTRA_TABLES "Install tables for $EXTRA_MODULES? (y/n): "
241         if [ "$ANSWER" = "y" ]; then
242                 HAS_EXTRA="yes"
243                 extra_create $1
244         fi
245
246         get_answer $INSTALL_DBUID_TABLES "Install tables for $DBUID_MODULES? (y/n): "
247         if [ "$ANSWER" = "y" ]; then
248                 HAS_EXTRA="yes"
249                 dbuid_create $1
250         fi
251 } # end kamailio_create
252
253 standard_create () # pars: <database name>
254 {
255         if [ $# -ne 1 ] ; then
256                 merr "standard_create function takes one param"
257                 exit 1
258         fi
259
260         minfo "creating standard tables into $1 ..."
261
262         for TABLE in $STANDARD_MODULES; do
263                 mdbg "Creating core table: $TABLE"
264                 sql_query $1 < $DB_SCHEMA/$TABLE-create.sql
265                 if [ $? -ne 0 ] ; then
266                         merr "Creating core tables failed at $TABLE!"
267                         exit 1
268                 fi
269         done
270
271         minfo "Core Kamailio tables succesfully created."
272
273         if [ -e $DB_SCHEMA/extensions-create.sql ]
274         then
275                 minfo "Creating custom extensions tables"
276                 sql_query $1 < $DB_SCHEMA/extensions-create.sql
277                 if [ $? -ne 0 ] ; then
278                         merr "Creating custom extensions tables failed!"
279                         exit 1
280                 fi
281         fi
282 }  # end standard_create
283
284
285 presence_create () # pars: <database name>
286 {
287         if [ $# -ne 1 ] ; then
288                 merr "presence_create function takes one param"
289                 exit 1
290         fi
291
292         minfo "creating presence tables into $1 ..."
293
294         for TABLE in $PRESENCE_MODULES; do
295                 mdbg "Creating presence tables for $TABLE"
296                 sql_query $1 < $DB_SCHEMA/$TABLE-create.sql
297                 if [ $? -ne 0 ] ; then
298                         merr "Creating presence tables failed at $TABLE!"
299                         exit 1
300                 fi
301         done
302
303         minfo "Presence tables succesfully created."
304 }  # end presence_create
305
306
307 extra_create () # pars: <database name>
308 {
309         if [ $# -ne 1 ] ; then
310                 merr "extra_create function takes one param"
311                 exit 1
312         fi
313
314         minfo "creating extra tables into $1 ..."
315
316         for TABLE in $EXTRA_MODULES; do
317                 mdbg "Creating extra table: $TABLE"
318                 sql_query $1 < $DB_SCHEMA/$TABLE-create.sql
319                 if [ $? -ne 0 ] ; then
320                         merr "Creating extra tables failed at $TABLE!"
321                         exit 1
322                         fi
323                 done
324         minfo "Extra tables succesfully created."
325 }  # end extra_create
326
327 dbuid_create () # pars: <database name>
328 {
329         if [ $# -ne 1 ] ; then
330                 merr "dbuid_create function takes one param"
331                 exit 1
332         fi
333
334         minfo "creating uid tables into $1 ..."
335
336         for TABLE in $DBUID_MODULES; do
337                 mdbg "Creating uid table: $TABLE"
338                 sql_query $1 < $DB_SCHEMA/$TABLE-create.sql
339                 if [ $? -ne 0 ] ; then
340                         merr "Creating uid tables failed at $TABLE!"
341                         exit 1
342                         fi
343                 done
344         minfo "UID tables succesfully created."
345 }  # end uid_create
346
347
348 kamailio_add_tables () # params: <database name> <tables group name>
349 {
350         if [ $# -ne 2 ] ; then
351                 merr "kamailio_add_tables function takes two params"
352                 exit 1
353         fi
354
355         minfo "creating group of tables [$2] into database [$1] ..."
356
357         if [ -e $DB_SCHEMA/$2-create.sql ]
358         then
359                 sql_query $1 < $DB_SCHEMA/$2-create.sql
360                 if [ $? -ne 0 ] ; then
361                         merr "Creating group of tables [$2] failed"
362                         exit 1
363                 fi
364         else
365                 merr "Script for creating group of tables [$2] not found"
366                 exit 1
367         fi
368 }  # end kamailio_add_tables
369
370 migrate_table () # 4 paremeters (dst_table, dst_cols, src_table, src_cols)
371 {
372         if [ $# -ne 4 ] ; then
373                 merr "migrate_table function takes 4 params $@"
374                 exit 1
375         fi
376
377         src_cols=`echo $4 | sed s/?/$3./g `
378
379         X=`sql_query "" "INSERT into $1 ($2) SELECT $src_cols from $3;" 2>&1`
380
381         if [ $? -ne 0 ] ; then
382                 echo $X | $GREP "ERROR 1146" > /dev/null
383                 if [ $? -eq 0 ] ; then 
384                         echo " -- Migrating $3 to $1.....SKIPPED (no source)"
385                         return 0
386                 fi
387                 echo "ERROR: failed to migrate $3 to $1!!!"
388                 echo -n "Skip it and continue (y/n)? "
389                 read INPUT
390                 if [ "$INPUT" = "y" ] || [ "$INPUT" = "Y" ]
391                 then
392                         return 0
393                 fi
394
395                 exit 1;
396         fi
397
398         minfo " -- Migrating $3 to $1.....OK"
399
400 }
401
402 migrate_db () # 2 parameters (src_db, dst_db)
403 {
404 if [ $# -ne 2 ] ; then
405         merr "migrate_db function takes 2 params"
406         exit 1
407 fi
408
409 dst_db=$2
410 src_db=$1
411
412 migrate_table ${dst_db}.acc \
413         "id,method,from_tag,to_tag,callid,sip_code,sip_reason,time" \
414         ${src_db}.acc \
415         "?id,?method,?from_tag,?to_tag,?callid,?sip_code,?sip_reason,?time"
416
417 migrate_table ${dst_db}.missed_calls \
418         "id,method,from_tag,to_tag,callid,sip_code,sip_reason,time" \
419         ${src_db}.missed_calls \
420         "?id,?method,?from_tag,?to_tag,?callid,?sip_code,?sip_reason,?time"
421
422 migrate_table ${dst_db}.aliases \
423         "id,username,domain,contact,expires,q,callid,cseq,last_modified,\
424                 flags,cflags,user_agent" \
425         ${src_db}.aliases \
426         "?id,?username,?domain,?contact,?expires,?q,?callid,?cseq,?last_modified,\
427                 ?flags,?cflags,?user_agent"
428
429 migrate_table ${dst_db}.dbaliases \
430         "id,alias_username,alias_domain,username,domain" \
431         ${src_db}.dbaliases \
432         "?id,?alias_username,?alias_domain,?username,?domain"
433
434 migrate_table ${dst_db}.grp \
435         "id,username,domain,grp,last_modified" \
436         ${src_db}.grp \
437         "?id,?username,?domain,?grp,?last_modified"
438
439 migrate_table ${dst_db}.re_grp \
440         "id,reg_exp,group_id" \
441         ${src_db}.re_grp \
442         "?id,?reg_exp,?group_id"
443
444 migrate_table ${dst_db}.silo \
445         "id,src_addr,dst_addr,username,domain,inc_time,exp_time,snd_time,\
446                 ctype,body" \
447         ${src_db}.silo \
448         "?id,?src_addr,?dst_addr,?username,?domain,?inc_time,?exp_time,?snd_time,\
449                 ?ctype,?body"
450
451 migrate_table ${dst_db}.domain \
452         "id,domain,last_modified" \
453         ${src_db}.domain \
454         "?id,?domain,?last_modified"
455
456 migrate_table ${dst_db}.uri \
457         "id,username,domain,uri_user,last_modified" \
458         ${src_db}.uri \
459         "?id,?username,?domain,?uri_user,?last_modified"
460
461 migrate_table ${dst_db}.usr_preferences \
462         "id,uuid,username,domain,attribute,type,value,last_modified" \
463         ${src_db}.usr_preferences \
464         "?id,?uuid,?username,?domain,?attribute,?type,?value,?last_modified"
465
466 migrate_table ${dst_db}.trusted \
467         "id,src_ip,proto,from_pattern,tag" \
468         ${src_db}.trusted \
469         "?id,?src_ip,?proto,?from_pattern,?tag"
470
471 migrate_table ${dst_db}.address \
472         "id,grp,ip_addr,mask,port" \
473         ${src_db}.address \
474         "?id,?grp,?ip_addr,?mask,?port"
475
476 migrate_table ${dst_db}.speed_dial \
477         "id,username,domain,sd_username,sd_domain,new_uri,\
478                 fname,lname,description" \
479         ${src_db}.speed_dial \
480         "?id,?username,?domain,?sd_username,?sd_domain,?new_uri,\
481                 ?fname,?lname,?description"
482
483 migrate_table ${dst_db}.gw \
484         "id,gw_name,grp_id,ip_addr,port,uri_scheme,transport,strip,prefix" \
485         ${src_db}.gw \
486         "?id,?gw_name,?grp_id,?ip_addr,?port,?uri_scheme,?transport,?strip,?prefix"
487
488 migrate_table ${dst_db}.gw_grp \
489         "grp_id,grp_name" \
490         ${src_db}.gw_grp \
491         "?grp_id,?grp_name"
492
493 migrate_table ${dst_db}.lcr \
494         "id,prefix,from_uri,grp_id,priority" \
495         ${src_db}.lcr \
496         "?id,?prefix,?from_uri,?grp_id,?priority"
497
498 migrate_table ${dst_db}.pdt \
499         "id,sdomain,prefix,domain" \
500         ${src_db}.pdt \
501         "?id,?sdomain,?prefix,?domain"
502
503 # migrate subscribers with no serweb support
504 migrate_table ${dst_db}.subscriber \
505         "id,username,domain,password,ha1,ha1b,rpid" \
506         ${src_db}.subscriber \
507         "?id,?username,?domain,?password,?ha1,?ha1b,?rpid"
508
509 if [ "$HAS_EXTRA" = "yes" ] ; then
510         migrate_table ${dst_db}.cpl \
511                 "id,username,domain,cpl_xml,cpl_bin" \
512                 ${src_db}.cpl \
513                 "?id,?username,?domain,?cpl_xml,?cpl_bin"
514
515         migrate_table ${dst_db}.siptrace \
516                 "id,date,callid,traced_user,msg,method,status,fromip,toip,\
517                 fromtag,direction" \
518                 ${src_db}.siptrace \
519                 "?id,?date,?callid,?traced_user,?msg,?method,?status,?fromip,?toip,\
520                 ?fromtag,?direction"
521
522         migrate_table ${dst_db}.imc_rooms \
523                 "id,name,domain,flag" \
524                 ${src_db}.imc_rooms \
525                 "?id,?name,?domain,?flag"
526
527         migrate_table ${dst_db}.imc_members \
528                 "id,username,domain,room,flag" \
529                 ${src_db}.im_members \
530                 "?id,?username,?domain,?room,?flag"
531 fi
532
533
534 }  #end migrate_db()
535
536
537 export PW
538 if [ "$#" -ne 0 ] && [ "$PW" = "" ]; then
539         if [ "$PWSKIP" = "" ]; then
540                 prompt_pw
541         fi
542 fi