clear_db_asterisk.sh 7.5 KB

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