clear_db_asterisk.sh 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #!/bin/bash
  2. # script clear asterisk database calls (mysql/mariadb)
  3. # for Debian OS Linux - version 9,10
  4. # athor Koshuba V.O. - (c) 2021
  5. # license GPL 2.0
  6. # email master@qbpro.ru
  7. ## - connect data
  8. db_host="localhost"; # host mysql
  9. db_name="cdr"; # name database
  10. db_login="admindb"; # login for database
  11. db_pass="passdb"; # pass for login
  12. ## - tools for script
  13. get_tools=( "mysql" "mysqlcheck" "mysqldump" "pigz" "locale" ); #tools for script
  14. ## - admin values
  15. email="admin@mydomen.ru"; # mail address for notification
  16. ## - control manual values
  17. type="month"; # time interval (SECOND,MINUTE,HOUR,DAY,MONTH,YEAR)
  18. num="3"; # saze (the number 3 months)
  19. records="/home/calls"; # call recording directory
  20. typerec="mp3"; # file type records (mp3 & wav)
  21. arh_path="/home/backup/arh"; # archive of previous calls and database
  22. sw_backup="1"; # create or not create backup 1-yes,0-no
  23. ## - script values
  24. set_lang="0"; # locale (ru & en )
  25. flock="/tmp/cleardb_asterisk.lock";
  26. log="/var/log/clear_asterisk-db.log"; # temporary log file
  27. cdate="$(date +%c)"; # current date for log
  28. msg_dat=(
  29. '"Cleanup of the database and call records before the specified period was successful!" "Чистка базы данных и записей звонков до указанного периода выполнена успешно!"'
  30. '"The script stopped working due to:" "Остановлена работа скрипта по причине:"'
  31. '"create full backup database and calls before a given period" "создана резервная копия всей базы и записей звонков до заданного периода"'
  32. '"An error occurred while creating a backup, the cleaning process was stopped." "Ошибка при создании резервной копии, процесс чистки остановлен."'
  33. '"Found lock file:/tmp/cleardb_asterisk.lock!" "Найден файл блокировки:/tmp/cleardb_asterisk.lock!"'
  34. '"not found:" "файл не найден:"'
  35. '"found ok:" "файл найден:"'
  36. '"process mysqldump failed executed!" "процесс mysqldump не выполнен!"'
  37. '"no call recording files to save in the database were found!" "файлы записей звонков для сохранения в базе данных не найдены!"'
  38. '"not found for delete:" "файл для удаления не найден:"'
  39. '"delete ok:" "файл удален успешно:"'
  40. '"no call recording files to delete in the database were found!" "файлы записей звонков для удаления в базе данных не найдены!"'
  41. ); # messages array
  42. report=(); # reports array
  43. #<Fn_get-tools>
  44. function getTools() {
  45. for ((itools=0; itools != ${#get_tools[@]}; itools++))
  46. do
  47. eval get_${get_tools[$itools]}=$(whereis -b ${get_tools[$itools]}|awk '/^'${get_tools[$itools]}':/{print $2}');
  48. list_tools[${#list_tools[@]}]="$(whereis -b ${get_tools[$itools]}|awk '/^'${get_tools[$itools]}':/{print $2}')";
  49. done
  50. }
  51. #<Fn_get-lang>
  52. function langMsg() {
  53. if [[ ! $($get_locale|grep 'LANG='|sed 's/\LANG=//g'|grep 'ru_RU.UTF-8'|wc -m) -eq 0 ]];
  54. then
  55. set_lang="0";
  56. else
  57. set_lang="1";
  58. fi
  59. for ((ilang=0; ilang != ${#msg_dat[@]}; ilang++))
  60. do
  61. eval tmsg="(" $(echo -e ${msg_dat[$ilang]}) ")";
  62. msg[$ilang]=${tmsg[$set_lang]};
  63. done
  64. }
  65. #<Fn_preTest>
  66. function preTest() {
  67. if [ ! -f $log ];
  68. then
  69. touch $log
  70. else
  71. :>$log;
  72. fi
  73. if [ ! -f $flock ]
  74. then
  75. echo "$cdate">$flock;
  76. else
  77. report=();
  78. report[${#report[@]}]="${msg[1]}";
  79. report[${#report[@]}]="${msg[4]}";
  80. smsg;
  81. exit;
  82. fi
  83. sqlt="use $db_name; select filename FROM cdr WHERE cdr.calldate <= DATE_SUB(NOW(),interval $num $type) and cdr.filename !='none';";
  84. eval fdata="(" $(sudo $get_mysql -h$db_host -u$db_login -p$db_pass -e "$(echo -e $sqlt)"|grep -v filename) ")";
  85. #"
  86. }
  87. #<Fn_bak data>
  88. function bakData() {
  89. if [ $sw_backup = "1" ];
  90. then
  91. if [ ! -d $arh_path ];
  92. then
  93. sudo mkdir -p $arh_path/db
  94. sudo mkdir -p $arh_path/calls
  95. else
  96. if [ ! -d $arh_path/db ];
  97. then
  98. sudo mkdir -p $arh_path/db;
  99. fi
  100. if [ ! -d $arh_path/calls ];
  101. then
  102. sudo mkdir -p $arh_path/calls;
  103. fi
  104. fi
  105. ## clear old files
  106. sudo find $arh_path/calls -maxdepth 1 -type 'f' -name "*.$typerec" -exec rm {} \;
  107. sudo find $arh_path/db -maxdepth 1 -type 'f' -name "*.gz" -exec rm {} \;
  108. ## begin backup data
  109. if sudo $get_mysqldump -h$db_host -u$db_login -p$db_pass $db_name | sudo pigz -c9 > $arh_path/db/$db_name"_"$(date +%d-%m-%y).sql.gz;
  110. then
  111. report=();
  112. report[${#report[@]}]="$cdate clear_asterisk-db.sh: backup database - ok!";
  113. smsg;
  114. if [ ${#fdata[@]} != "0" ];
  115. then
  116. for ((dbinx=0; dbinx != ${#fdata[@]}; dbinx++))
  117. do
  118. if [ -f $records/${fdata[$dbinx]} ];
  119. then
  120. echo "${msg[6]}:${fdata[$dbinx]}">>$log;
  121. sudo cp -f $records/${fdata[$dbinx]} $arh_path/calls/${fdata[$dbinx]};
  122. else
  123. echo "${msg[5]}:${fdata[$dbinx]}">>$log;
  124. fi
  125. done
  126. else
  127. report=();
  128. report[${#report[@]}]="$cdate clear_asterisk-db.sh:${msg[8]}";
  129. smsg;
  130. fi
  131. else
  132. report=();
  133. report[${#report[@]}]="$cdate clear_asterisk-db.sh:${msg[1]} - ${msg[7]}";
  134. smsg;
  135. exit;
  136. fi
  137. fi
  138. clrData;
  139. }
  140. function clrData() {
  141. sqlt="use $db_name; DELETE FROM cdr WHERE cdr.calldate <= DATE_SUB(NOW(),interval $num $type); OPTIMIZE TABLE cdr;";
  142. sudo $get_mysql -h$db_host -u$db_login -p$db_pass -e "$(echo -e $sqlt)";
  143. if [ ${#fdata[@]} != "0" ];
  144. then
  145. for ((dbinx=0; dbinx != ${#fdata[@]}; dbinx++))
  146. do
  147. if [ -f $records/${fdata[$dbinx]} ];
  148. then
  149. echo "${msg[10]}:${fdata[$dbinx]}">>$log;
  150. sudo rm -f $records/${fdata[$dbinx]};
  151. else
  152. echo "${msg[9]}:${fdata[$dbinx]}">>$log;
  153. fi
  154. done
  155. else
  156. report=();
  157. report[${#report[@]}]="$cdate clear_asterisk-db.sh:${msg[11]}";
  158. smsg;
  159. fi
  160. lockOff;
  161. }
  162. function smsg() {
  163. if [ ${#report[@]} != "0" ];
  164. then
  165. for ((rpt_index=0; rpt_index != ${#report[@]}; rpt_index++))
  166. do
  167. if [[ "${report[$rpt_index]}" != "" ]];
  168. then
  169. echo -e "${report[$rpt_index]}">>$log;
  170. fi
  171. done
  172. fi
  173. }
  174. ## -@F function check lock file
  175. function lockOff() {
  176. if [ -f $flock ];
  177. then
  178. sudo rm -f $flock;
  179. fi
  180. report=();
  181. report[${#report[@]}]="$cdate clear_asterisk-db.sh:${msg[0]}";
  182. smsg;
  183. sudo cat $log |mail -s "asterisk clear database & records" $email
  184. sudo systemctl restart asterisk;
  185. exit;
  186. }
  187. langMsg;
  188. getTools;
  189. preTest;
  190. bakData;
  191. exit;