db.sh 18 KB

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