summaryrefslogtreecommitdiff
path: root/localaddmysqldb
blob: 5167f90f2546dd2aa0cf761267971517d1bd4f96 (plain)
  1. #!/bin/bash
  2. #
  3. # /usr/local/sbin/localaddmysqldb
  4. # Copyright 2001-2002 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localaddmysqldb,v 1.1 2003-05-12 03:28:31 jonas Exp $
  7. #
  8. # Add/update MySQL database
  9. #
  10. # This script makes use of the Debian package wwwconfig-common if installed
  11. #
  12. # TODO: Make script (mostly) work as noon-root
  13. # TODO: Add a --dry-run or --test option showing what would be done (how options are set, and a descriptive text about how they are used)
  14. # TODO: Add option to reset access for all existing databases owned by user:
  15. # echo $alldb | egrep "^$dbuser(_|$)"
  16. set -e
  17. prg=`basename $0`
  18. TEMP=`getopt -o hu:U:D:Z:i::v::q::f:: --long help,user:,dbuser:,dbserver:,dballow:,info::,verbose::,debug::,query::,force:: -n "$prg" -- "$@"`
  19. # Check for non-GNU getopt
  20. if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
  21. eval set -- "$TEMP"
  22. # Defaults are evaluated at runtime in this order
  23. # (If changing defaults, you might need to change these as well)
  24. opts1="user dbserver dballow" # Options with self-contained defaults
  25. opts2="dbuser home" # Options requiring $opts1 to resolve default
  26. optsboolean="debug verbose info query force" # Do not touch these!
  27. # Defaults
  28. defaultuser="www-data"
  29. defaultdbuser='$user'
  30. defaultdbserver="localhost"
  31. defaultdballow="localhost"
  32. defaultinfo="on"
  33. defaultverbose="off"
  34. defaultdebug="off"
  35. defaultquery="on"
  36. defaultforce="off"
  37. # Defaults not (yet) user configurable
  38. defaulthome="/var/www"
  39. # Override defaults from config file if available
  40. if [ -e /etc/local/localaddmysqldb.conf ]; then
  41. . /etc/local/localaddmysqldb.conf
  42. fi
  43. # This needs to exist from before parsing options
  44. debug="off"
  45. function usage() {
  46. echo "Usage: $prg [OPTION]... DBNAME [DBNAME]..."
  47. echo "Add/update MySQL database"
  48. echo
  49. echo "Mandatory arguments to long options are mandatory for short options too."
  50. echo " -h, --help Show this help"
  51. echo " -u, --user=UID System user id (default: $defaultuser)"
  52. echo " -U, --dbuser=UID MySQL database user (default: $defaultdbuser)"
  53. echo " -D, --dbserver=HOST IP or host of MySQL server (default:"
  54. echo " $defaultdbserver)"
  55. echo " -Z, --dballow=HOST IP or host of application server (default:"
  56. echo " $defaultdballow)"
  57. echo " -i, --info[=on|off] Show info during installation (default: $defaultinfo)"
  58. echo " -v, --verbose[=on|off] Show details during installation (default: $defaultverbose)"
  59. echo " --debug[=on|off] Show debug during installation (default: $defaultdebug)"
  60. echo " -q, --query[=on|off] Ask for missing options (default: $defaultquery)"
  61. echo " -f, --force[=on|off] Replace existing installation (default: $defaultforce)"
  62. echo
  63. echo "Each DBNAME can contain only alphanumerics."
  64. echo
  65. echo "MySQL password for \$dbuser can be stored in \$HOME/.my.cnf of \$user."
  66. }
  67. function setopts () {
  68. for opt in $@; do
  69. defaultvalue="`eval echo \$\{default$opt\}`"
  70. value="`eval echo \$\{$opt:-$defaultvalue\}`"
  71. if [ "$value" = '[[ASK]]' ]; then
  72. if [ -n "$query" ]; then
  73. echo -n "Enter value for $opt: "
  74. read value
  75. echo
  76. else
  77. echo "ERROR: value for $opt requested, but not running interactively!"
  78. exit 1
  79. fi
  80. fi
  81. if [ -z "$value" ]; then
  82. echo "ERROR: Value of \"$opt\" is empty!"
  83. exit 1
  84. fi
  85. eval $opt=\"$value\"
  86. if [ "$debug" = "1" -o "$debug" = "on" ]; then
  87. echo "----> $opt=\"$value\" (default: \"$defaultvalue\")"
  88. fi
  89. done
  90. }
  91. while true ; do
  92. case "$1" in
  93. -h|--help) usage; exit 0;;
  94. -u|--user) user="$2"; shift 2;;
  95. -U|--dbuser) dbuser="$2"; shift 2;;
  96. -D|--dbserver) dbserver="$2"; shift 2;;
  97. -Z|--dballow) dballow="$2"; shift 2;;
  98. -i|--info) case "$2" in ""|on) info="on";; *) info="off";; esac; shift 2;;
  99. -v|--verbose) case "$2" in ""|on) verbose="on";; *) verbose="off";; esac; shift 2;;
  100. --debug) case "$2" in ""|on) debug="on";; *) debug="off";; esac; shift 2;;
  101. -q|--query) case "$2" in ""|on) query="on";; *) query="off";; esac; shift 2;;
  102. -f|--force) case "$2" in ""|on) force="on";; *) force="off";; esac; shift 2;;
  103. --) shift; break;;
  104. *) echo "Internal error!" ; exit 1 ;;
  105. esac
  106. done
  107. setopts $optsboolean
  108. if [ "$debug" = "1" -o "$debug" = "on" ]; then
  109. verbose="on" # Debug implies verbose
  110. fi
  111. for boolean in $optsboolean; do
  112. case `eval echo \$\{$boolean\}` in
  113. on) eval $boolean="1";;
  114. off) eval $boolean="";;
  115. *) echo "ERROR: Value of boolean option \"$boolean\" must be \"on\" or \"off\"!"; exit 1;;
  116. esac
  117. done
  118. setopts $opts1
  119. setopts $opts2
  120. optdbserver="-p$dbserver"
  121. if [ "$dbserver" = "localhost" ]; then
  122. optdbserver="" # Do not force TCP/IP access when connecting locally
  123. fi
  124. if [ -n "$verbose" ]; then
  125. echo "--> Figure out database users and passwords"
  126. fi
  127. if [ -z "$dbpass" ]; then
  128. if [ -f $home/.my.cnf ]; then
  129. dbpass=$(grep password $home/.my.cnf | awk -F= '{print $2}' | head -1 | sed 's/^ //g')
  130. fi
  131. if [ -z "$dbpass" ]; then
  132. if [ -n "$query" ]; then
  133. echo -n "Enter database password for MySQL user $dbuser: "
  134. read -s dbpass
  135. echo
  136. else
  137. echo "ERROR: Database password for MySQL $dbuser not found!"
  138. exit 1
  139. fi
  140. fi
  141. fi
  142. if [ -e /usr/share/wwwconfig-common/mysql-localadmpass.get -a "$dbserver" = "localhost" ] ; then
  143. status=""
  144. . /usr/share/wwwconfig-common/mysql-localadmpass.get
  145. if [ "$status" = "error" ] ; then
  146. if [ -n "$info" ]; then
  147. echo "--> $error"
  148. fi
  149. fi
  150. fi
  151. if [ -z "$dbadmin" ]; then
  152. if [ -n "$query" ]; then
  153. echo -n "Enter database administrator user (usually root): "
  154. read dbadmin
  155. echo
  156. else
  157. echo "ERROR: Database administrator user not resolved!"
  158. exit 1
  159. fi
  160. fi
  161. if [ -z "$dbadmpass" ]; then
  162. if [ -n "$query" ]; then
  163. echo -n "Enter database password for administrator $sbadmin: "
  164. read -s dbadmpass
  165. echo
  166. else
  167. echo "ERROR: Database password for administrator $dbadmin not found!"
  168. exit 1
  169. fi
  170. fi
  171. alldb=`mysql -u$dbadmin -p$dbadmpass $optdbserver mysql -f -e "show databases;" | grep -v '^Database$'`
  172. ##############################################
  173. # The rest of the script is dbname-specific... #
  174. ##############################################
  175. for dbname do
  176. if [ -n "$info" ]; then
  177. echo "Creating $dbname..."
  178. fi
  179. if [ -n "$verbose" ]; then
  180. echo "--> Check for existing installation"
  181. fi
  182. error=""
  183. if echo $alldb | grep -q $dbname; then
  184. if [ -n "$verbose" ]; then
  185. error="Database $dbname already exists."
  186. else
  187. error="Database already exists."
  188. fi
  189. fi
  190. if [ -n "$error" ]; then
  191. if [ -n "$query" ]; then
  192. echo "WARNING: $error"
  193. echo -n "Overwrite existing installation (y/N)?: "
  194. read ack
  195. echo
  196. case $ack in
  197. y|Y) force="1";;
  198. *) echo "Installation aborted!"; exit 1;;
  199. esac
  200. fi
  201. if [ -n "$force" ]; then
  202. if [ -e /usr/share/wwwconfig-common/mysql-dropdb.sh ] ; then
  203. status=""
  204. . /usr/share/wwwconfig-common/mysql-dropdb.sh
  205. if [ "$status" = "error" ] ; then
  206. echo "$error"
  207. exit 1
  208. fi
  209. else
  210. mysqladmin -u$dbadmin -p$dbadmpass $optdbserver -f drop $dbname
  211. fi
  212. else
  213. echo "ERROR: $error!"
  214. exit 1
  215. fi
  216. fi
  217. if [ -n "$verbose" -a "$dbhost" != "localhost" ]; then
  218. echo "--> Create database $dbname on $dbserver"
  219. elif [ -n "$verbose" ]; then
  220. echo "--> Create database $dbname"
  221. fi
  222. if [ -e /usr/share/wwwconfig-common/mysql-createdb.sh ] ; then
  223. status=""
  224. . /usr/share/wwwconfig-common/mysql-createdb.sh
  225. if [ "$status" = "error" ] ; then
  226. echo "$error"
  227. exit 1
  228. fi
  229. else
  230. # TODO: Purge existing database as the wwwconfig-common script does
  231. mysqladmin -u$dbadmin -p$dbadmpass $optdbserver create $dbname
  232. fi
  233. if [ -n "$verbose" ]; then
  234. echo "--> Create/update database user $dbuser"
  235. fi
  236. if [ -e /usr/share/wwwconfig-common/mysql-createuser.sh ] ; then
  237. status=""
  238. . /usr/share/wwwconfig-common/mysql-createuser.sh
  239. if [ "$status" = "error" ] ; then
  240. echo "$error"
  241. exit 1
  242. fi
  243. for h in `echo "localhost $dballow" | sort -u`; do
  244. # mysql -u$dbadmin -p$dbadmpass $optdbserver mysql -f -e "GRANT INDEX ON $dbname.* TO '$dbuser'@'$h';"
  245. mysql -u$dbadmin -p$dbadmpass $optdbserver mysql -f -e "REVOKE DELETE,CREATE,DROP ON $dbname.* FROM '$dbuser'@'$h';"
  246. done
  247. else
  248. for h in `echo "localhost $dballow" | sort -u`; do
  249. # mysql -u$dbadmin -p$dbadmpass $optdbserver mysql -f -e "GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX ON $dbname.* TO '$dbuser'@'$h' IDENTIFIED BY '$dbpass';"
  250. mysql -u$dbadmin -p$dbadmpass $optdbserver mysql -f -e "GRANT SELECT,INSERT,UPDATE ON $dbname.* TO '$dbuser'@'$h' IDENTIFIED BY '$dbpass';"
  251. done
  252. fi
  253. for h in `echo "localhost $dballow" | sort -u`; do
  254. mysql -u$dbadmin -p$dbadmpass $optdbserver mysql -f -e "GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX ON $dbname.* TO '$dbuser-admin'@'$h' IDENTIFIED BY '$dbpass';"
  255. done
  256. done