db.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. # MySQL
  2. mysql_connect() {
  3. host_str=$(grep "HOST='$1'" $VESTA/conf/mysql.conf)
  4. eval $host_str
  5. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
  6. echo "Error: mysql config parsing failed"
  7. log_event "$E_PARSING" "$ARGUMENTS"
  8. exit $E_PARSING
  9. fi
  10. mycnf="$VESTA/conf/.mysql.$HOST"
  11. if [ ! -e "$mycnf" ]; then
  12. echo "[client]">$mycnf
  13. echo "host='$HOST'" >> $mycnf
  14. echo "user='$USER'" >> $mycnf
  15. echo "password='$PASSWORD'" >> $mycnf
  16. chmod 600 $mycnf
  17. else
  18. mypw=$(grep password $mycnf|cut -f 2 -d \')
  19. if [ "$mypw" != "$PASSWORD" ]; then
  20. echo "[client]">$mycnf
  21. echo "host='$HOST'" >> $mycnf
  22. echo "user='$USER'" >> $mycnf
  23. echo "password='$PASSWORD'" >> $mycnf
  24. chmod 660 $mycnf
  25. fi
  26. fi
  27. err="/tmp/e.mysql"
  28. mysql --defaults-file=$mycnf -e 'SELECT VERSION()' >/dev/null 2> $err
  29. if [ '0' -ne "$?" ]; then
  30. if [ "$notify" != 'no' ]; then
  31. echo -e "Can't connect to MySQL $HOST\n$(cat $err)" |\
  32. $SENDMAIL -s "$subj" $email
  33. fi
  34. echo "Error: Connection to $HOST failed"
  35. log_event "$E_CONNECT" "$ARGUMENTS"
  36. exit $E_CONNECT
  37. fi
  38. }
  39. mysql_query() {
  40. mysql --defaults-file=$mycnf -e "$1" 2>/dev/null
  41. }
  42. mysql_dump() {
  43. err="/tmp/e.mysql"
  44. mysqldump --defaults-file=$mycnf --single-transaction -r $1 $2 2> $err
  45. if [ '0' -ne "$?" ]; then
  46. rm -rf $tmpdir
  47. if [ "$notify" != 'no' ]; then
  48. echo -e "Can't dump database $database\n$(cat $err)" |\
  49. $SENDMAIL -s "$subj" $email
  50. fi
  51. echo "Error: dump $database failed"
  52. log_event "$E_DB" "$ARGUMENTS"
  53. exit $E_DB
  54. fi
  55. }
  56. # PostgreSQL
  57. psql_connect() {
  58. host_str=$(grep "HOST='$1'" $VESTA/conf/pgsql.conf)
  59. eval $host_str
  60. export PGPASSWORD="$PASSWORD"
  61. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
  62. echo "Error: postgresql config parsing failed"
  63. log_event "$E_PARSING" "$ARGUMENTS"
  64. exit $E_PARSING
  65. fi
  66. psql -h $HOST -U $USER -c "SELECT VERSION()" > /dev/null 2>/tmp/e.psql
  67. if [ '0' -ne "$?" ]; then
  68. if [ "$notify" != 'no' ]; then
  69. echo -e "Can't connect to PostgreSQL $HOST\n$(cat /tmp/e.psql)" |\
  70. $SENDMAIL -s "$subj" $email
  71. fi
  72. echo "Error: Connection to $HOST failed"
  73. log_event "$E_CONNECT" "$ARGUMENTS"
  74. exit $E_CONNECT
  75. fi
  76. }
  77. psql_query() {
  78. psql -h $HOST -U $USER -c "$1" 2>/dev/null
  79. }
  80. psql_dump() {
  81. pg_dump -h $HOST -U $USER -c --inserts -O -x -i -f $1 $2 2>/tmp/e.psql
  82. if [ '0' -ne "$?" ]; then
  83. rm -rf $tmpdir
  84. if [ "$notify" != 'no' ]; then
  85. echo -e "Can't dump database $database\n$(cat /tmp/e.psql)" |\
  86. $SENDMAIL -s "$subj" $email
  87. fi
  88. echo "Error: dump $database failed"
  89. log_event "$E_DB" "$ARGUMENTS"
  90. exit $E_DB
  91. fi
  92. }
  93. # Get database host
  94. get_next_dbhost() {
  95. if [ -z "$host" ] || [ "$host" == 'default' ]; then
  96. IFS=$'\n'
  97. host='EMPTY_DB_HOST'
  98. config="$VESTA/conf/$type.conf"
  99. host_str=$(grep "SUSPENDED='no'" $config)
  100. check_row=$(echo "$host_str"|wc -l)
  101. if [ 0 -lt "$check_row" ]; then
  102. if [ 1 -eq "$check_row" ]; then
  103. for db in $host_str; do
  104. eval $db
  105. if [ "$MAX_DB" -gt "$U_DB_BASES" ]; then
  106. host=$HOST
  107. fi
  108. done
  109. else
  110. old_weight='100'
  111. for db in $host_str; do
  112. eval $db
  113. let weight="$U_DB_BASES * 100 / $MAX_DB" >/dev/null 2>&1
  114. if [ "$old_weight" -gt "$weight" ]; then
  115. host="$HOST"
  116. old_weight="$weight"
  117. fi
  118. done
  119. fi
  120. fi
  121. fi
  122. }
  123. # Database charset validation
  124. is_charset_valid() {
  125. host_str=$(grep "HOST='$host'" $VESTA/conf/$type.conf)
  126. eval $host_str
  127. if [ -z "$(echo $CHARSETS | grep -wi $charset )" ]; then
  128. echo "Error: charset $charset not exist"
  129. log_event "$E_NOTEXIST" "$ARGUMENTS"
  130. exit $E_NOTEXIST
  131. fi
  132. }
  133. # Increase database host value
  134. increase_dbhost_values() {
  135. host_str=$(grep "HOST='$host'" $VESTA/conf/$type.conf)
  136. eval $host_str
  137. old_dbbases="U_DB_BASES='$U_DB_BASES'"
  138. new_dbbases="U_DB_BASES='$((U_DB_BASES + 1))'"
  139. if [ -z "$U_SYS_USERS" ]; then
  140. old_users="U_SYS_USERS=''"
  141. new_users="U_SYS_USERS='$user'"
  142. else
  143. old_users="U_SYS_USERS='$U_SYS_USERS'"
  144. new_users="U_SYS_USERS='$U_SYS_USERS'"
  145. if [ -z "$(echo $U_SYS_USERS|sed "s/,/\n/g"|grep -w $user)" ]; then
  146. old_users="U_SYS_USERS='$U_SYS_USERS'"
  147. new_users="U_SYS_USERS='$U_SYS_USERS,$user'"
  148. fi
  149. fi
  150. sed -i "s/$old_dbbases/$new_dbbases/g" $VESTA/conf/$type.conf
  151. sed -i "s/$old_users/$new_users/g" $VESTA/conf/$type.conf
  152. }
  153. # Decrease database host value
  154. decrease_dbhost_values() {
  155. host_str=$(grep "HOST='$HOST'" $VESTA/conf/$TYPE.conf)
  156. eval $host_str
  157. old_dbbases="U_DB_BASES='$U_DB_BASES'"
  158. new_dbbases="U_DB_BASES='$((U_DB_BASES - 1))'"
  159. old_users="U_SYS_USERS='$U_SYS_USERS'"
  160. U_SYS_USERS=$(echo "$U_SYS_USERS" |\
  161. sed "s/,/\n/g"|\
  162. sed "s/^$user$//g"|\
  163. sed "/^$/d"|\
  164. sed ':a;N;$!ba;s/\n/,/g')
  165. new_users="U_SYS_USERS='$U_SYS_USERS'"
  166. sed -i "s/$old_dbbases/$new_dbbases/g" $VESTA/conf/$TYPE.conf
  167. sed -i "s/$old_users/$new_users/g" $VESTA/conf/$TYPE.conf
  168. }
  169. # Create MySQL database
  170. add_mysql_database() {
  171. mysql_connect $host
  172. query="CREATE DATABASE \`$database\` CHARACTER SET $charset"
  173. mysql_query "$query" > /dev/null
  174. query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@\`%\`
  175. IDENTIFIED BY '$dbpass'"
  176. mysql_query "$query" > /dev/null
  177. query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@localhost
  178. IDENTIFIED BY '$dbpass'"
  179. mysql_query "$query" > /dev/null
  180. query="SHOW GRANTS FOR \`$dbuser\`"
  181. md5=$(mysql_query "$query" 2>/dev/null)
  182. md5=$(echo "$md5" |grep 'PASSWORD' |tr ' ' '\n' |tail -n1 |cut -f 2 -d \')
  183. }
  184. # Create PostgreSQL database
  185. add_pgsql_database() {
  186. psql_connect $host
  187. query="CREATE ROLE $dbuser WITH LOGIN PASSWORD '$dbpass'"
  188. psql_query "$query" > /dev/null
  189. query="CREATE DATABASE $database OWNER $dbuser"
  190. if [ "$TPL" = 'template0' ]; then
  191. query="$query ENCODING '$charset' TEMPLATE $TPL"
  192. else
  193. query="$query TEMPLATE $TPL"
  194. fi
  195. psql_query "$query" > /dev/null
  196. query="GRANT ALL PRIVILEGES ON DATABASE $database TO $dbuser"
  197. psql_query "$query" > /dev/null
  198. query="GRANT CONNECT ON DATABASE template1 to $dbuser"
  199. psql_query "$query" > /dev/null
  200. query="SELECT rolpassword FROM pg_authid WHERE rolname='$dbuser';"
  201. md5=$(psql_query "$query" | grep md5 | cut -f 2 -d \ )
  202. }
  203. # Check if database host do not exist in config
  204. is_dbhost_new() {
  205. if [ -e "$VESTA/conf/$type.conf" ]; then
  206. check_host=$(grep "HOST='$host'" $VESTA/conf/$type.conf)
  207. if [ ! -z "$check_host" ]; then
  208. echo "Error: db host exist"
  209. log_event "$E_EXISTS" "$ARGUMENTS"
  210. exit $E_EXISTS
  211. fi
  212. fi
  213. }
  214. # Get database values
  215. get_database_values() {
  216. eval $(grep "DB='$database'" $USER_DATA/db.conf)
  217. }
  218. # Change MySQL database password
  219. change_mysql_password() {
  220. mysql_connect $HOST
  221. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@\`%\`
  222. IDENTIFIED BY '$dbpass'"
  223. mysql_query "$query" > /dev/null
  224. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost
  225. IDENTIFIED BY '$dbpass'"
  226. mysql_query "$query" > /dev/null
  227. query="SHOW GRANTS FOR '$DBUSER'"
  228. md5=$(mysql_query "$query" 2>/dev/null)
  229. md5=$(echo "$md5" |grep 'PASSWORD' |tr ' ' '\n' |tail -n1 |cut -f 2 -d \')
  230. }
  231. # Change PostgreSQL database password
  232. change_pgsql_password() {
  233. psql_connect $HOST
  234. query="ALTER ROLE $DBUSER WITH LOGIN PASSWORD '$dbpass'"
  235. psql_query "$query" > /dev/null
  236. query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER';"
  237. md5=$(psql_query "$query" | grep md5 |cut -f 2 -d \ )
  238. }
  239. # Delete MySQL database
  240. delete_mysql_database() {
  241. mysql_connect $HOST
  242. query="DROP DATABASE \`$database\`"
  243. mysql_query "$query" > /dev/null
  244. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
  245. mysql_query "$query" > /dev/null
  246. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@localhost"
  247. mysql_query "$query" > /dev/null
  248. if [ "$(grep "DBUSER='$DBUSER'" $USER_DATA/db.conf |wc -l)" -lt 2 ]; then
  249. query="DROP USER '$DBUSER'@'%'"
  250. mysql_query "$query" > /dev/null
  251. query="DROP USER '$DBUSER'@'localhost'"
  252. mysql_query "$query" > /dev/null
  253. fi
  254. }
  255. # Delete PostgreSQL database
  256. delete_pgsql_database() {
  257. psql_connect $HOST
  258. query="REVOKE ALL PRIVILEGES ON DATABASE $database FROM $DBUSER"
  259. psql_qyery "$query" > /dev/null
  260. query="DROP DATABASE $database"
  261. psql_query "$query" > /dev/null
  262. if [ "$(grep "DBUSER='$DBUSER'" $USER_DATA/db.conf |wc -l)" -lt 2 ]; then
  263. query="REVOKE CONNECT ON DATABASE template1 FROM $db_user"
  264. psql_query "$query" > /dev/null
  265. query="DROP ROLE $db_user"
  266. psql_query "$query" > /dev/null
  267. fi
  268. }
  269. # Dump MySQL database
  270. dump_mysql_database() {
  271. mysql_connect $HOST
  272. mysql_dump $dump $database
  273. query="SHOW GRANTS FOR '$DBUSER'@'localhost'"
  274. mysql_query "$query" | grep -v "Grants for" > $grants
  275. query="SHOW GRANTS FOR '$DBUSER'@'%'"
  276. mysql_query "$query" | grep -v "Grants for" > $grants
  277. }
  278. # Dump PostgreSQL database
  279. dump_pgsql_database() {
  280. psql_connect $HOST
  281. psql_dump $dump $database
  282. query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER';"
  283. md5=$(psql_query "$query" | head -n1 | cut -f 2 -d \ )
  284. pw_str="UPDATE pg_authid SET rolpassword='$md5' WHERE rolname='$DBUSER';"
  285. gr_str="GRANT ALL PRIVILEGES ON DATABASE $database to '$DBUSER'"
  286. echo -e "$pw_str\n$gr_str" >> $grants
  287. }
  288. # Check if database server is in use
  289. is_dbhost_free() {
  290. host_str=$(grep "HOST='$host'" $VESTA/conf/$type.conf)
  291. eval $host_str
  292. if [ 0 -ne "$U_DB_BASES" ]; then
  293. echo "Error: host $HOST is used"
  294. log_event "$E_INUSE" "$ARGUMENTS"
  295. exit $E_INUSE
  296. fi
  297. }
  298. # Suspend MySQL database
  299. suspend_mysql_database() {
  300. mysql_connect $HOST
  301. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
  302. mysql_query "$query" > /dev/null
  303. query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@localhost"
  304. mysql_query "$query" > /dev/null
  305. }
  306. # Suspend PostgreSQL database
  307. suspend_pgsql_database() {
  308. psql_connect $HOST
  309. query="REVOKE ALL PRIVILEGES ON $database FROM $DBUSER"
  310. psql_query "$query" > /dev/null
  311. }
  312. # Unsuspend MySQL database
  313. unsuspend_mysql_database() {
  314. mysql_connect $HOST
  315. query="GRANT ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
  316. mysql_query "$query" > /dev/null
  317. query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost"
  318. mysql_query "$query" > /dev/null
  319. }
  320. # Unsuspend PostgreSQL database
  321. unsuspend_pgsql_database() {
  322. psql_connect $HOST
  323. query="GRANT ALL PRIVILEGES ON DATABASE $database TO $DBUSER"
  324. psql_query "$query" > /dev/null
  325. }
  326. # Get MySQL disk usage
  327. get_mysql_disk_usage() {
  328. mysql_connect $HOST
  329. query="SELECT SUM( data_length + index_length ) / 1024 / 1024 \"Size\"
  330. FROM information_schema.TABLES WHERE table_schema='$database'"
  331. usage=$(mysql_query "$query" |tail -n1)
  332. if [ "$usage" == '' ] || [ "$usage" == 'NULL' ] || [ "${usage:0:1}" -eq '0' ]; then
  333. usage=1
  334. fi
  335. export LC_ALL=C
  336. usage=$(printf "%0.f\n" $usage)
  337. }
  338. # Get PostgreSQL disk usage
  339. get_pgsql_disk_usage() {
  340. psql_connect $HOST
  341. query="SELECT pg_database_size('$database');"
  342. usage=$(psql_query "$query")
  343. usage=$(echo "$usage" | grep -v "-" | grep -v 'row' | sed "/^$/d")
  344. usage=$(echo "$usage" | grep -v "pg_database_size" | awk '{print $1}')
  345. if [ -z "$usage" ]; then
  346. usage=0
  347. fi
  348. usage=$(($usage / 1048576))
  349. if [ "$usage" -eq '0' ]; then
  350. usage=1
  351. fi
  352. }
  353. # Delete MySQL user
  354. delete_mysql_user() {
  355. mysql_connect $HOST
  356. query="REVOKE ALL ON \`$database\`.* FROM \`$old_dbuser\`@\`%\`"
  357. mysql_query "$query" > /dev/null
  358. query="REVOKE ALL ON \`$database\`.* FROM \`$old_dbuser\`@localhost"
  359. mysql_query "$query" > /dev/null
  360. query="DROP USER '$old_dbuser'@'%'"
  361. mysql_query "$query" > /dev/null
  362. query="DROP USER '$old_dbuser'@'localhost'"
  363. mysql_query "$query" > /dev/null
  364. }
  365. # Delete PostgreSQL user
  366. delete_pgsql_user() {
  367. psql_connect $HOST
  368. query="REVOKE ALL PRIVILEGES ON DATABASE $database FROM $old_dbuser"
  369. psql_query "$query" > /dev/null
  370. query="REVOKE CONNECT ON DATABASE template1 FROM $old_dbuser"
  371. psql_query "$query" > /dev/null
  372. query="DROP ROLE $old_dbuser"
  373. psql_query "$query" > /dev/null
  374. }