db.sh 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. #!/bin/bash
  2. #===========================================================================#
  3. # #
  4. # Hestia Control Panel - Domain Function Library #
  5. # #
  6. #===========================================================================#
  7. # Global
  8. database_set_default_ports() {
  9. # Set default ports for MySQL and PostgreSQL
  10. mysql_default="3306"
  11. pgsql_default="5432"
  12. # Handle missing values for both $PORT and $port
  13. # however don't override both at once or custom ports will be overridden.
  14. if [ -z "$PORT" ]; then
  15. if [ "$type" = 'mysql' ]; then
  16. PORT="$mysql_default"
  17. fi
  18. if [ "$type" = 'pgsql' ]; then
  19. PORT="$pgsql_default"
  20. fi
  21. fi
  22. if [ -z "$port" ]; then
  23. if [ "$type" = 'mysql' ]; then
  24. port="$mysql_default"
  25. fi
  26. if [ "$type" = 'pgsql' ]; then
  27. port="$pgsql_default"
  28. fi
  29. fi
  30. }
  31. # MySQL
  32. mysql_connect() {
  33. unset PORT
  34. host_str=$(grep "HOST='$1'" $HESTIA/conf/mysql.conf)
  35. parse_object_kv_list "$host_str"
  36. if [ -z $PORT ]; then PORT=3306; fi
  37. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
  38. echo "Error: mysql config parsing failed"
  39. log_event "$E_PARSING" "$ARGUMENTS"
  40. exit $E_PARSING
  41. fi
  42. mycnf="$HESTIA/conf/.mysql.$HOST"
  43. if [ ! -e "$mycnf" ]; then
  44. echo "[client]" > $mycnf
  45. echo "host='$HOST'" >> $mycnf
  46. echo "user='$USER'" >> $mycnf
  47. echo "password='$PASSWORD'" >> $mycnf
  48. echo "port='$PORT'" >> $mycnf
  49. chmod 600 $mycnf
  50. else
  51. mypw=$(grep password $mycnf | cut -f 2 -d \')
  52. if [ "$mypw" != "$PASSWORD" ]; then
  53. echo "[client]" > $mycnf
  54. echo "host='$HOST'" >> $mycnf
  55. echo "user='$USER'" >> $mycnf
  56. echo "password='$PASSWORD'" >> $mycnf
  57. echo "port='$PORT'" >> $mycnf
  58. chmod 660 $mycnf
  59. fi
  60. fi
  61. mysql_out=$(mktemp)
  62. mysql --defaults-file=$mycnf -e 'SELECT VERSION()' > $mysql_out 2>&1
  63. if [ '0' -ne "$?" ]; then
  64. if [ "$notify" != 'no' ]; then
  65. email=$(grep CONTACT $HESTIA/data/users/admin/user.conf | cut -f 2 -d \')
  66. subj="MySQL connection error on $(hostname)"
  67. echo -e "Can't connect to MySQL $HOST\n$(cat $mysql_out)" \
  68. | $SENDMAIL -s "$subj" $email
  69. fi
  70. rm -f $mysql_out
  71. echo "Error: Connection to $HOST failed"
  72. log_event "$E_CONNECT" "$ARGUMENTS"
  73. exit $E_CONNECT
  74. fi
  75. mysql_ver=$(cat $mysql_out | tail -n1 | cut -f 1 -d -)
  76. mysql_fork="mysql"
  77. check_mysql_fork=$(grep "MariaDB" $mysql_out)
  78. if [ "$check_mysql_fork" ]; then
  79. mysql_fork="mariadb"
  80. fi
  81. rm -f $mysql_out
  82. }
  83. mysql_query() {
  84. sql_tmp=$(mktemp)
  85. echo "$1" > $sql_tmp
  86. mysql --defaults-file=$mycnf < "$sql_tmp" 2> /dev/null
  87. return_code=$?
  88. rm -f "$sql_tmp"
  89. return $return_code
  90. }
  91. mysql_dump() {
  92. err="/tmp/e.mysql"
  93. mysqldump --defaults-file=$mycnf --single-transaction --routines -r $1 $2 2> $err
  94. if [ '0' -ne "$?" ]; then
  95. mysqldump --defaults-extra-file=$mycnf --single-transaction --routines -r $1 $2 2> $err
  96. if [ '0' -ne "$?" ]; then
  97. rm -rf $tmpdir
  98. if [ "$notify" != 'no' ]; then
  99. email=$(grep CONTACT $HESTIA/data/users/admin/user.conf | cut -f 2 -d \')
  100. subj="MySQL error on $(hostname)"
  101. echo -e "Can't dump database $database\n$(cat $err)" \
  102. | $SENDMAIL -s "$subj" $email
  103. fi
  104. echo "Error: dump $database failed"
  105. log_event "$E_DB" "$ARGUMENTS"
  106. exit "$E_DB"
  107. fi
  108. fi
  109. }
  110. # PostgreSQL
  111. psql_connect() {
  112. unset PORT
  113. host_str=$(grep "HOST='$1'" $HESTIA/conf/pgsql.conf)
  114. parse_object_kv_list "$host_str"
  115. export PGPASSWORD="$PASSWORD"
  116. if [ -z $PORT ]; then PORT=5432; fi
  117. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
  118. echo "Error: postgresql config parsing failed"
  119. log_event "$E_PARSING" "$ARGUMENTS"
  120. exit $E_PARSING
  121. fi
  122. psql -h $HOST -U $USER -p $PORT -c "SELECT VERSION()" > /dev/null 2> /tmp/e.psql
  123. if [ '0' -ne "$?" ]; then
  124. if [ "$notify" != 'no' ]; then
  125. email=$(grep CONTACT $HESTIA/data/users/admin/user.conf | cut -f 2 -d \')
  126. subj="PostgreSQL connection error on $(hostname)"
  127. echo -e "Can't connect to PostgreSQL $HOST\n$(cat /tmp/e.psql)" \
  128. | $SENDMAIL -s "$subj" $email
  129. fi
  130. echo "Error: Connection to $HOST failed"
  131. log_event "$E_CONNECT" "$ARGUMENTS"
  132. exit "$E_CONNECT"
  133. fi
  134. }
  135. psql_query() {
  136. sql_tmp=$(mktemp)
  137. echo "$1" > $sql_tmp
  138. psql -h $HOST -U $USER -f "$sql_tmp" 2> /dev/null
  139. rm -f $sql_tmp
  140. }
  141. psql_dump() {
  142. pg_dump -h $HOST -U $USER -c --inserts -O -x -f $1 $2 2> /tmp/e.psql
  143. if [ '0' -ne "$?" ]; then
  144. rm -rf $tmpdir
  145. if [ "$notify" != 'no' ]; then
  146. email=$(grep CONTACT $HESTIA/data/users/admin/user.conf | cut -f 2 -d \')
  147. subj="PostgreSQL error on $(hostname)"
  148. echo -e "Can't dump database $database\n$(cat /tmp/e.psql)" \
  149. | $SENDMAIL -s "$subj" $email
  150. fi
  151. echo "Error: dump $database failed"
  152. log_event "$E_DB" "$ARGUMENTS"
  153. exit "$E_DB"
  154. fi
  155. }
  156. # Get database host
  157. get_next_dbhost() {
  158. if [ -z "$host" ] || [ "$host" == 'default' ]; then
  159. IFS=$'\n'
  160. host='EMPTY_DB_HOST'
  161. config="$HESTIA/conf/$type.conf"
  162. host_str=$(grep "SUSPENDED='no'" $config)
  163. check_row=$(echo "$host_str" | wc -l)
  164. if [ 0 -lt "$check_row" ]; then
  165. if [ 1 -eq "$check_row" ]; then
  166. for db in $host_str; do
  167. parse_object_kv_list "$db"
  168. if [ "$MAX_DB" -gt "$U_DB_BASES" ]; then
  169. host=$HOST
  170. fi
  171. done
  172. else
  173. old_weight='100'
  174. for db in $host_str; do
  175. parse_object_kv_list "$db"
  176. let weight="$U_DB_BASES * 100 / $MAX_DB" > /dev/null 2>&1
  177. if [ "$old_weight" -gt "$weight" ]; then
  178. host="$HOST"
  179. old_weight="$weight"
  180. fi
  181. done
  182. fi
  183. fi
  184. fi
  185. }
  186. # Database charset validation
  187. is_charset_valid() {
  188. host_str=$(grep "HOST='$host'" $HESTIA/conf/$type.conf)
  189. parse_object_kv_list "$host_str"
  190. if [ -z "$(echo $CHARSETS | grep -wi $charset)" ]; then
  191. echo "Error: charset $charset not exist"
  192. log_event "$E_NOTEXIST" "$ARGUMENTS"
  193. exit $E_NOTEXIST
  194. fi
  195. }
  196. # Increase database host value
  197. increase_dbhost_values() {
  198. host_str=$(grep "HOST='$host'" $HESTIA/conf/$type.conf)
  199. parse_object_kv_list "$host_str"
  200. old_dbbases="U_DB_BASES='$U_DB_BASES'"
  201. new_dbbases="U_DB_BASES='$((U_DB_BASES + 1))'"
  202. if [ -z "$U_SYS_USERS" ]; then
  203. old_users="U_SYS_USERS=''"
  204. new_users="U_SYS_USERS='$user'"
  205. else
  206. old_users="U_SYS_USERS='$U_SYS_USERS'"
  207. new_users="U_SYS_USERS='$U_SYS_USERS'"
  208. if [ -z "$(echo $U_SYS_USERS | sed "s/,/\n/g" | grep -w $user)" ]; then
  209. old_users="U_SYS_USERS='$U_SYS_USERS'"
  210. new_users="U_SYS_USERS='$U_SYS_USERS,$user'"
  211. fi
  212. fi
  213. sed -i "s/$old_dbbases/$new_dbbases/g" $HESTIA/conf/$type.conf
  214. sed -i "s/$old_users/$new_users/g" $HESTIA/conf/$type.conf
  215. }
  216. # Decrease database host value
  217. decrease_dbhost_values() {
  218. host_str=$(grep "HOST='$HOST'" $HESTIA/conf/$TYPE.conf)
  219. parse_object_kv_list "$host_str"
  220. old_dbbases="U_DB_BASES='$U_DB_BASES'"
  221. new_dbbases="U_DB_BASES='$((U_DB_BASES - 1))'"
  222. old_users="U_SYS_USERS='$U_SYS_USERS'"
  223. U_SYS_USERS=$(echo "$U_SYS_USERS" \
  224. | sed "s/,/\n/g" \
  225. | sed "s/^$user$//g" \
  226. | sed "/^$/d" \
  227. | sed ':a;N;$!ba;s/\n/,/g')
  228. new_users="U_SYS_USERS='$U_SYS_USERS'"
  229. sed -i "s/$old_dbbases/$new_dbbases/g" $HESTIA/conf/$TYPE.conf
  230. sed -i "s/$old_users/$new_users/g" $HESTIA/conf/$TYPE.conf
  231. }
  232. # Create MySQL database
  233. add_mysql_database() {
  234. mysql_connect $host
  235. mysql_ver_sub=$(echo $mysql_ver | cut -d '.' -f1)
  236. mysql_ver_sub_sub=$(echo $mysql_ver | cut -d '.' -f2)
  237. query="CREATE DATABASE \`$database\` CHARACTER SET $charset"
  238. mysql_query "$query"
  239. check_result $? "Unable to create database $database"
  240. if [ "$mysql_fork" = "mysql" ] && [ "$mysql_ver_sub" -ge 8 ]; then
  241. query="CREATE USER \`$dbuser\`@\`%\`
  242. IDENTIFIED BY '$dbpass'"
  243. mysql_query "$query" > /dev/null
  244. query="CREATE USER \`$dbuser\`@localhost
  245. IDENTIFIED BY '$dbpass'"
  246. mysql_query "$query" > /dev/null
  247. query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@\`%\`"
  248. mysql_query "$query" > /dev/null
  249. query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@localhost"
  250. mysql_query "$query" > /dev/null
  251. else
  252. query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@\`%\`
  253. IDENTIFIED BY '$dbpass'"
  254. mysql_query "$query" > /dev/null
  255. query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@localhost
  256. IDENTIFIED BY '$dbpass'"
  257. mysql_query "$query" > /dev/null
  258. fi
  259. if [ "$mysql_fork" = "mysql" ]; then
  260. # mysql
  261. if [ "$mysql_ver_sub" -ge 8 ] || { [ "$mysql_ver_sub" -eq 5 ] && [ "$mysql_ver_sub_sub" -ge 7 ]; }; then
  262. if [ "$mysql_ver_sub" -ge 8 ]; then
  263. # mysql >= 8
  264. # This query will be proceeding with the usage of Print identified with as hex feature
  265. md5=$(mysql_query "SET print_identified_with_as_hex=ON; SHOW CREATE USER \`$dbuser\`" 2> /dev/null)
  266. # echo $md5
  267. if [[ "$md5" =~ 0x([^ ]+) ]]; then
  268. md5=$(echo "$md5" | grep password | grep -E -o '0x([^ ]+)')
  269. else
  270. md5=$(echo "$md5" | grep password | cut -f4 -d \')
  271. fi
  272. # echo $md5
  273. else
  274. # mysql < 8
  275. md5=$(mysql_query "SHOW CREATE USER \`$dbuser\`" 2> /dev/null)
  276. md5=$(echo "$md5" | grep password | cut -f8 -d \')
  277. fi
  278. else
  279. # mysql < 5.7
  280. md5=$(mysql_query "SHOW GRANTS FOR \`$dbuser\`" 2> /dev/null)
  281. md5=$(echo "$md5" | grep PASSW | tr ' ' '\n' | tail -n1 | cut -f 2 -d \')
  282. fi
  283. else
  284. # mariadb
  285. md5=$(mysql_query "SHOW GRANTS FOR \`$dbuser\`" 2> /dev/null)
  286. md5=$(echo "$md5" | grep PASSW | tr ' ' '\n' | tail -n1 | cut -f 2 -d \')
  287. fi
  288. }
  289. # Create PostgreSQL database
  290. add_pgsql_database() {
  291. psql_connect $host
  292. query="CREATE ROLE $dbuser WITH LOGIN PASSWORD '$dbpass'"
  293. psql_query "$query" > /dev/null
  294. query="CREATE DATABASE $database OWNER $dbuser"
  295. if [ "$TPL" = 'template0' ]; then
  296. query="$query ENCODING '$charset' TEMPLATE $TPL"
  297. else
  298. query="$query TEMPLATE $TPL"
  299. fi
  300. psql_query "$query" > /dev/null
  301. query="GRANT ALL PRIVILEGES ON DATABASE $database TO $dbuser"
  302. psql_query "$query" > /dev/null
  303. query="GRANT CONNECT ON DATABASE template1 to $dbuser"
  304. psql_query "$query" > /dev/null
  305. query="SELECT rolpassword FROM pg_authid WHERE rolname='$dbuser'"
  306. md5=$(psql_query "$query" | grep md5 | cut -f 2 -d \ )
  307. }
  308. add_mysql_database_temp_user() {
  309. mysql_connect $host
  310. query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@localhost
  311. IDENTIFIED BY '$dbpass'"
  312. mysql_query "$query" > /dev/null
  313. }
  314. delete_mysql_database_temp_user() {
  315. mysql_connect $host
  316. query="REVOKE ALL ON \`$database\`.* FROM \`$dbuser\`@localhost"
  317. mysql_query "$query" > /dev/null
  318. query="DROP USER '$dbuser'@'localhost'"
  319. mysql_query "$query" > /dev/null
  320. }
  321. # Check if database host do not exist in config
  322. is_dbhost_new() {
  323. if [ -e "$HESTIA/conf/$type.conf" ]; then
  324. check_host=$(grep "HOST='$host'" $HESTIA/conf/$type.conf)
  325. if [ "$check_host" ]; then
  326. echo "Error: db host exist"
  327. log_event "$E_EXISTS" "$ARGUMENTS"
  328. exit $E_EXISTS
  329. fi
  330. fi
  331. }
  332. # Get database values
  333. get_database_values() {
  334. parse_object_kv_list $(grep "DB='$database'" $USER_DATA/db.conf)
  335. }
  336. # Change MySQL database password
  337. change_mysql_password() {
  338. mysql_connect $HOST
  339. mysql_ver_sub=$(echo $mysql_ver | cut -d '.' -f1)
  340. mysql_ver_sub_sub=$(echo $mysql_ver | cut -d '.' -f2)
  341. if [ "$mysql_fork" = "mysql" ]; then
  342. # mysql
  343. if [ "$mysql_ver_sub" -ge 8 ]; then
  344. # mysql >= 8
  345. query="SET PASSWORD FOR \`$DBUSER\`@\`%\` = '$dbpass'"
  346. mysql_query "$query" > /dev/null
  347. query="SET PASSWORD FOR \`$DBUSER\`@localhost = '$dbpass'"
  348. mysql_query "$query" > /dev/null
  349. else
  350. # mysql < 8
  351. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@\`%\`
  352. IDENTIFIED BY '$dbpass'"
  353. mysql_query "$query" > /dev/null
  354. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost
  355. IDENTIFIED BY '$dbpass'"
  356. mysql_query "$query" > /dev/null
  357. fi
  358. else
  359. # mariadb
  360. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@\`%\`
  361. IDENTIFIED BY '$dbpass'"
  362. mysql_query "$query" > /dev/null
  363. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost
  364. IDENTIFIED BY '$dbpass'"
  365. mysql_query "$query" > /dev/null
  366. fi
  367. if [ "$mysql_fork" = "mysql" ]; then
  368. # mysql
  369. if [ "$mysql_ver_sub" -ge 8 ] || { [ "$mysql_ver_sub" -eq 5 ] && [ "$mysql_ver_sub_sub" -ge 7 ]; }; then
  370. if [ "$mysql_ver_sub" -ge 8 ]; then
  371. # mysql >= 8
  372. # This query will be proceeding with the usage of Print identified with as hex feature
  373. md5=$(mysql_query "SET print_identified_with_as_hex=ON; SHOW CREATE USER \`$DBUSER\`" 2> /dev/null)
  374. # echo $md5
  375. if [[ "$md5" =~ 0x([^ ]+) ]]; then
  376. md5=$(echo "$md5" | grep password | grep -E -o '0x([^ ]+)')
  377. else
  378. md5=$(echo "$md5" | grep password | cut -f4 -d \')
  379. fi
  380. # echo $md5
  381. else
  382. # mysql < 8
  383. md5=$(mysql_query "SHOW CREATE USER \`$DBUSER\`" 2> /dev/null)
  384. md5=$(echo "$md5" | grep password | cut -f8 -d \')
  385. fi
  386. else
  387. # mysql < 5.7
  388. md5=$(mysql_query "SHOW GRANTS FOR \`$DBUSER\`" 2> /dev/null)
  389. md5=$(echo "$md5" | grep PASSW | tr ' ' '\n' | tail -n1 | cut -f 2 -d \')
  390. fi
  391. else
  392. # mariadb
  393. md5=$(mysql_query "SHOW GRANTS FOR \`$DBUSER\`" 2> /dev/null)
  394. md5=$(echo "$md5" | grep PASSW | tr ' ' '\n' | tail -n1 | cut -f 2 -d \')
  395. fi
  396. }
  397. # Change PostgreSQL database password
  398. change_pgsql_password() {
  399. psql_connect $HOST
  400. query="ALTER ROLE $DBUSER WITH LOGIN PASSWORD '$dbpass'"
  401. psql_query "$query" > /dev/null
  402. query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER'"
  403. md5=$(psql_query "$query" | grep md5 | cut -f 2 -d \ )
  404. }
  405. # Delete MySQL database
  406. delete_mysql_database() {
  407. mysql_connect $HOST
  408. query="DROP DATABASE \`$database\`"
  409. mysql_query "$query"
  410. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
  411. mysql_query "$query" > /dev/null
  412. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@localhost"
  413. mysql_query "$query" > /dev/null
  414. if [ "$(grep "DBUSER='$DBUSER'" $USER_DATA/db.conf | wc -l)" -lt 2 ]; then
  415. query="DROP USER '$DBUSER'@'%'"
  416. mysql_query "$query" > /dev/null
  417. query="DROP USER '$DBUSER'@'localhost'"
  418. mysql_query "$query" > /dev/null
  419. fi
  420. }
  421. # Delete PostgreSQL database
  422. delete_pgsql_database() {
  423. psql_connect $HOST
  424. query="REVOKE ALL PRIVILEGES ON DATABASE $database FROM $DBUSER"
  425. psql_query "$query" > /dev/null
  426. query="DROP DATABASE $database"
  427. psql_query "$query" > /dev/null
  428. if [ "$(grep "DBUSER='$DBUSER'" $USER_DATA/db.conf | wc -l)" -lt 2 ]; then
  429. query="REVOKE CONNECT ON DATABASE template1 FROM $DBUSER"
  430. psql_query "$query" > /dev/null
  431. query="DROP ROLE $DBUSER"
  432. psql_query "$query" > /dev/null
  433. fi
  434. }
  435. # Dump MySQL database
  436. dump_mysql_database() {
  437. mysql_connect $HOST
  438. mysql_dump $dump $database
  439. query="SHOW GRANTS FOR '$DBUSER'@'localhost'"
  440. mysql_query "$query" | grep -v "Grants for" > $grants
  441. query="SHOW GRANTS FOR '$DBUSER'@'%'"
  442. mysql_query "$query" | grep -v "Grants for" > $grants
  443. }
  444. # Dump PostgreSQL database
  445. dump_pgsql_database() {
  446. psql_connect $HOST
  447. psql_dump $dump $database
  448. query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER'"
  449. md5=$(psql_query "$query" | head -n1 | cut -f 2 -d \ )
  450. pw_str="UPDATE pg_authid SET rolpassword='$md5' WHERE rolname='$DBUSER'"
  451. gr_str="GRANT ALL PRIVILEGES ON DATABASE $database to '$DBUSER'"
  452. echo -e "$pw_str\n$gr_str" >> $grants
  453. }
  454. # Check if database server is in use
  455. is_dbhost_free() {
  456. host_str=$(grep "HOST='$host'" $HESTIA/conf/$type.conf)
  457. parse_object_kv_list "$host_str"
  458. if [ 0 -ne "$U_DB_BASES" ]; then
  459. echo "Error: host $HOST is used"
  460. log_event "$E_INUSE" "$ARGUMENTS"
  461. exit $E_INUSE
  462. fi
  463. }
  464. # Suspend MySQL database
  465. suspend_mysql_database() {
  466. mysql_connect $HOST
  467. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
  468. mysql_query "$query" > /dev/null
  469. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@localhost"
  470. mysql_query "$query" > /dev/null
  471. }
  472. # Suspend PostgreSQL database
  473. suspend_pgsql_database() {
  474. psql_connect $HOST
  475. query="REVOKE ALL PRIVILEGES ON $database FROM $DBUSER"
  476. psql_query "$query" > /dev/null
  477. }
  478. # Unsuspend MySQL database
  479. unsuspend_mysql_database() {
  480. mysql_connect $HOST
  481. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@\`%\`"
  482. mysql_query "$query" > /dev/null
  483. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost"
  484. mysql_query "$query" > /dev/null
  485. }
  486. # Unsuspend PostgreSQL database
  487. unsuspend_pgsql_database() {
  488. psql_connect $HOST
  489. query="GRANT ALL PRIVILEGES ON DATABASE $database TO $DBUSER"
  490. psql_query "$query" > /dev/null
  491. }
  492. # Get MySQL disk usage
  493. get_mysql_disk_usage() {
  494. mysql_connect $HOST
  495. query="SELECT SUM( data_length + index_length ) / 1024 / 1024 'Size'
  496. FROM information_schema.TABLES WHERE table_schema='$database'"
  497. usage=$(mysql_query "$query" | tail -n1)
  498. if [ "$usage" == '' ] || [ "$usage" == 'NULL' ] || [ "${usage:0:1}" -eq '0' ]; then
  499. usage=1
  500. fi
  501. export LC_ALL=C
  502. usage=$(printf "%0.f\n" $usage)
  503. }
  504. # Get PostgreSQL disk usage
  505. get_pgsql_disk_usage() {
  506. psql_connect $HOST
  507. query="SELECT pg_database_size('$database');"
  508. usage=$(psql_query "$query")
  509. usage=$(echo "$usage" | grep -v "-" | grep -v 'row' | sed "/^$/d")
  510. usage=$(echo "$usage" | grep -v "pg_database_size" | awk '{print $1}')
  511. if [ -z "$usage" ]; then
  512. usage=0
  513. fi
  514. usage=$(($usage / 1048576))
  515. if [ "$usage" -eq '0' ]; then
  516. usage=1
  517. fi
  518. }
  519. # Delete MySQL user
  520. delete_mysql_user() {
  521. mysql_connect $HOST
  522. query="REVOKE ALL ON \`$database\`.* FROM \`$old_dbuser\`@\`%\`"
  523. mysql_query "$query" > /dev/null
  524. query="REVOKE ALL ON \`$database\`.* FROM \`$old_dbuser\`@localhost"
  525. mysql_query "$query" > /dev/null
  526. query="DROP USER '$old_dbuser'@'%'"
  527. mysql_query "$query" > /dev/null
  528. query="DROP USER '$old_dbuser'@'localhost'"
  529. mysql_query "$query" > /dev/null
  530. }
  531. # Delete PostgreSQL user
  532. delete_pgsql_user() {
  533. psql_connect $HOST
  534. query="REVOKE ALL PRIVILEGES ON DATABASE $database FROM $old_dbuser"
  535. psql_query "$query" > /dev/null
  536. query="REVOKE CONNECT ON DATABASE template1 FROM $old_dbuser"
  537. psql_query "$query" > /dev/null
  538. query="DROP ROLE $old_dbuser"
  539. psql_query "$query" > /dev/null
  540. }