summaryrefslogtreecommitdiff
path: root/localezcreate
blob: 0422d7851308985923992ebed30c5a2b02a5f806 (plain)
  1. #!/bin/bash
  2. #
  3. # /usr/local/sbin/localezcreate
  4. # Copyright 2001-2002 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localezcreate,v 1.21 2002-12-08 17:50:27 jonas Exp $
  7. #
  8. # Create local eZ Publish site
  9. #
  10. # This script makes use of the Debian package wwwconfig-common if installed
  11. #
  12. # TODO: Ask for and set default language and theme
  13. # TODO: Make a note about installed languages and themes (for smooth upgrades)
  14. # TODO: Make md5 of all files (for smooth upgrades)
  15. # TODO: Make script (mostly) work as noon-root
  16. # TODO: Include all mail addresses in site.ini.override
  17. set -e
  18. prg=`basename $0`
  19. TEMP=`getopt -o hu:g:d:a:m:N:U:D:Z:i::v::q::f:: --long help,user:,group:,domain:,mailuser:,maildomain:,dbname:,dbuser:,dbserver:,dballow:,info::,verbose::,query::,force:: -n "$prg" -- "$@"`
  20. # Check for non-GNU getopt
  21. if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
  22. eval set -- "$TEMP"
  23. # Defaults are evaluated at runtime in this order
  24. # (If changing defaults, you might need to change these as well)
  25. opts1="user group domain maildomain dbserver dballow" # Options with self-contained defaults
  26. opts2="dbuser home" # Options requiring $opts1 to resolve default
  27. opts3="mailuser dbname basedir adminhost webcfg" # Options requiring $opts1, $opts2 or $host to resolve default
  28. optsboolean="info verbose query force" # Do not touch these!
  29. # Defaults
  30. defaultuser="www-data"
  31. defaultgroup="www-data"
  32. defaultdomain="ez."`hostname -d`
  33. defaultmailuser='$dbuser'
  34. defaultmaildomain=`cat /etc/mailname 2> /dev/null || hostname -d`
  35. defaultdbname='ez_2_2_$host' # TODO: Allow all defaults to be set like this
  36. defaultdbuser='$user'
  37. defaultdbserver="localhost"
  38. defaultdballow="localhost"
  39. defaultinfo="on"
  40. defaultverbose="off"
  41. defaultquery="on"
  42. defaultforce="off"
  43. # Defaults not (yet) user configurable
  44. templates=""
  45. languages="en_GB en_GB_org"
  46. sqlchunks="publish data"
  47. defaulthome="/var/www"
  48. defaultbasedir='/var/www/ez-$host.$domain'
  49. defaultadminhost='admin.$host.$domain'
  50. defaultwebcfg='/etc/apache/vhosts.d/ez-$host.$domain'
  51. templatedirs="/usr/src/ezpublish/templates"
  52. languagedirs="/usr/src/ezpublish/lang"
  53. sqldirs="/usr/share/ezpublish/sql"
  54. # Override defaults from config file if available
  55. if [ -e /etc/local/localezcreate.conf ]; then
  56. . /etc/local/localezcreate.conf
  57. fi
  58. # These are unlikely to change
  59. sourcedirs="/usr/src/ezpublish"
  60. sources="lib data tpl www"
  61. bindir="/usr/share/ezpublish/bin"
  62. function usage() {
  63. echo "Usage: $prg [OPTION]... HOST [HOST]..."
  64. echo "Create local eZ Publish sites"
  65. echo
  66. echo "Mandatory arguments to long options are mandatory for short options too."
  67. echo " -h, --help Show this help"
  68. echo " -u, --user=UID System user id (default: $defaultuser)"
  69. echo " -g, --group=GID System group id (default: $defaultgroup)"
  70. echo " -d, --domain=DOMAIN Domain name with hostname stripped off (default:"
  71. echo " $defaultdomain)"
  72. echo " -a, --mailuser=UID User part (account) of mail address (default: $defaultmailuser)"
  73. echo " -m, --maildomain=DOMAIN Domain part of mail address (default:"
  74. echo " $defaultmaildomain)"
  75. echo " -N, --dbname=DB MySQL database name (default:"
  76. echo " $defaultdbname)"
  77. echo " -U, --dbuser=UID MySQL database user (default: $defaultdbuser)"
  78. echo " -D, --dbserver=HOST IP or host of MySQL server (default:"
  79. echo " $defaultdbserver)"
  80. echo " -Z, --dballow=HOST IP or host of eZ server (default:"
  81. echo " $defaultdballow)"
  82. echo " -i, --info[=on|off] Show info during installation (default: $defaultinfo)"
  83. echo " -v, --verbose[=on|off] Show details during installation (default: $defaultverbose)"
  84. echo " -q, --query[=on|off] Ask for missing options (default: $defaultquery)"
  85. echo " -f, --force[=on|off] Replace existing installation (default: $defaultforce)"
  86. echo
  87. echo "Each HOST is a simple hostname, without the domain part."
  88. echo
  89. echo "MySQL password for \$dbuser can be stored in \$HOME/.my.cnf of \$user."
  90. }
  91. function setparams () { # TODO: Handle default argument '[[ASK]]', and fail loudly on empty defaults
  92. for param in $@; do
  93. eval "$param=`eval \"echo \"\\\"\$\{$param:-\\\$default${param}\}\\\"\"\"`"
  94. [ $verbose ] && echo "--> $param="`eval echo \$\{$param\}`
  95. done
  96. }
  97. while true ; do
  98. case "$1" in
  99. -h|--help) usage; exit 0;;
  100. -u|--user) user="$2"; shift 2;;
  101. -g|--group) group="$2"; shift 2;;
  102. -d|--domain) domain="$2"; shift 2;;
  103. -a|--mailuser) mailuser="$2"; shift 2;;
  104. -m|--maildomain) maildomain="$2"; shift2 ;;
  105. -N|--dbname) dbname="$2"; shift 2;;
  106. -U|--dbuser) dbuser="$2"; shift 2;;
  107. -D|--dbserver) dbserver="$2"; shift 2;;
  108. -Z|--dballow) dballow="$2"; shift 2;;
  109. -i|--info) case "$2" in ""|on) info="on";; *) info="off";; shift 2;;
  110. -v|--verbose) case "$2" in ""|on) verbose="on";; *) verbose="off";; shift 2;;
  111. -q|--query) case "$2" in ""|on) query="on";; *) query="off";; shift 2;;
  112. -f|--force) case "$2" in ""|on) force="on";; *) force="off";; shift 2;;
  113. --) shift; break;;
  114. *) echo "Internal error!" ; exit 1 ;;
  115. esac
  116. done
  117. setparams $opts1
  118. setparams $opts2
  119. optdbserver="-p$dbserver"
  120. if [ "$dbserver" = "localhost" ]; then
  121. optdbserver="" # Do not force TCP/IP access when connecting locally
  122. fi
  123. for boolean in  $optsboolean; do
  124. setparams $boolean
  125. case "$boolean" in
  126. on) eval $boolean="1";;
  127. off) eval $boolean="";;
  128. *) echo "ERROR: $boolean must be either \"on\" or \"off\"!"; exit 1;;
  129. esac
  130. done
  131. [ $verbose ] && echo "Figure out database users and passwords"
  132. if [ -z "$dbpass" ]; then
  133. if [ -f $home/.my.cnf ]; then
  134. dbpass=$(grep password $home/.my.cnf | awk -F= '{print $2}' | head -1 | sed 's/^ //g')
  135. fi
  136. if [ -z "$dbpass" ]; then
  137. if [ $query ]; then
  138. echo -n "Enter database password for MySQL user $dbuser: "
  139. read -s dbpass
  140. echo
  141. else
  142. echo "ERROR: Database password for MySQL $dbuser not found!"
  143. exit 1
  144. fi
  145. fi
  146. fi
  147. if [ -e /usr/share/wwwconfig-common/mysql-localadmpass.get -a "$dbserver" = "localhost" ] ; then
  148. status=""
  149. . /usr/share/wwwconfig-common/mysql-localadmpass.get
  150. if [ "$status" = "error" ] ; then
  151. [ $verbose ] && echo "$error"
  152. fi
  153. fi
  154. if [ -z "$dbadmin" ]; then
  155. if [ $query ]; then
  156. echo -n "Enter database administrator user (usually root): "
  157. read -s dbadmin
  158. echo
  159. else
  160. echo "ERROR: Database administrator user not resolved!"
  161. exit 1
  162. fi
  163. fi
  164. if [ -z "$dbadmpass" ]; then
  165. if [ $query ]; then
  166. echo -n "Enter database password for administrator $sbadmin: "
  167. read -s dbadmpass
  168. echo
  169. else
  170. echo "ERROR: Database password for administrator $dbadmin not found!"
  171. exit 1
  172. fi
  173. fi
  174. ##############################################
  175. # The rest of the script is host-specific... #
  176. ##############################################
  177. for host do
  178. [ $info ] && echo "Installing $host..."
  179. setparams $opts3
  180. [ $verbose ] && echo "Check for existing installation"
  181. error=""
  182. if [ -d $basedir ]; then
  183. error="Target directory already exists."
  184. elif [ -f $webcfg ]; then
  185. error="Apache config already exists."
  186. fi
  187. # TODO: Check for existing MySQL database
  188. if [ -n "$error" ]; then
  189. if [ $query ]; then
  190. echo "WARNING: $error"
  191. echo -n "Overwrite existing installation (y/N)?: "
  192. read -s ack
  193. echo
  194. case $ack in
  195. y|Y) force="1";;
  196. *) echo "Installation aborted!"; exit 1;;
  197. esac
  198. fi
  199. if [ $force ]; then
  200. mysqladmin -u$dbadmin -p$dbadmpass $optdbserver drop $dbname
  201. rm -rf $basedir
  202. else
  203. echo "ERROR: $error!"
  204. exit 1
  205. fi
  206. fi
  207. [ $verbose ] && echo "Create database $dbname"
  208. if [ -e /usr/share/wwwconfig-common/mysql-createdb.sh ] ; then
  209. status=""
  210. . /usr/share/wwwconfig-common/mysql-createdb.sh
  211. if [ "$status" = "error" ] ; then
  212. echo "$error"
  213. exit 1
  214. fi
  215. else
  216. # TODO: Purge existing database as the wwwconfig-common script does
  217. mysqladmin -u$dbadmin -p$dbadmpass $optdbserver create $dbname
  218. fi
  219. [ $verbose ] && echo "Create/update database user $dbuser"
  220. if [ -e /usr/share/wwwconfig-common/mysql-createuser.sh ] ; then
  221. status=""
  222. . /usr/share/wwwconfig-common/mysql-createuser.sh
  223. if [ "$status" = "error" ] ; then
  224. echo "$error"
  225. exit 1
  226. fi
  227. for h in `echo "localhost $dballow" | sort -u`; do
  228. echo "GRANT INDEX ON $dbname.* TO '$dbuser'@$h IDENTIFIED BY '$dbpass';" | mysql -u$dbadmin -p$dbadmpass $optdbserver
  229. done
  230. else
  231. for h in `echo "localhost $dballow" | sort -u`; do
  232. echo "GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX ON $dbname.* TO '$dbuser'@$h IDENTIFIED BY '$dbpass';" | mysql -u$dbadmin -p$dbadmpass $optdbserver
  233. done
  234. fi
  235. [ $verbose ] && echo -n "Fill the database: "
  236. for chunk in $sqlchunks; do
  237. [ $verbose ] && echo -n "$chunk "
  238. found=""
  239. sqlfile=${chunk}_mysql.sql
  240. for dir in $sqldirs; do
  241. if [ -f $dir/$sqlfile ]; then
  242. found="1"
  243. sqldir=$dir
  244. break
  245. fi
  246. done
  247. if [ "$found" = "1" ]; then
  248. if [ -e /usr/share/wwwconfig-common/mysql-exec.sh ] ; then
  249. status=""
  250. (cd $sqldir && . /usr/share/wwwconfig-common/mysql-exec.sh) || exit 1
  251. if [ "$status" = "error" ] ; then
  252. echo "$error"
  253. exit 1
  254. fi
  255. else
  256. cat $sqldir/$sqlfile | mysql -u$dbadmin -p$dbadmpass $optdbserver $dbname
  257. fi
  258. else
  259. [ $verbose ] && echo
  260. echo "ERROR: $chunk not found!"
  261. exit 1
  262. fi
  263. done
  264. [ $verbose ] && echo
  265. [ $verbose ] && echo "Create base directory $basedir"
  266. mkdir $basedir
  267. for area in source language template; do
  268. [ $verbose ] && echo -n "Unpacking $area files: "
  269. for tarball in `eval echo \$\{${area}s\}`; do
  270. [ $verbose ] && echo -n "$tarball "
  271. found=""
  272. for dir in `eval echo \$\{${area}dirs\}`; do
  273. if [ -f $dir/$tarball.tar.gz ]; then
  274. found="1"
  275. tarballdir=$dir
  276. break
  277. fi
  278. done
  279. if [ "$found" = "1" ]; then
  280. (cd $basedir && tar -xz -C $basedir -f $tarballdir/$tarball.tar.gz) || exit 1
  281. else
  282. [ $verbose ] && echo
  283. echo "ERROR: $area $tarball not found!"
  284. exit 1
  285. fi
  286. done
  287. done
  288. [ $verbose ] && echo
  289. [ $verbose ] && echo "Configuring website"
  290. (cd $basedir && $bindir/modfix.sh >/dev/null) || exit 1 # TODO: Check if these are in sync and disable one of them
  291. (cd $basedir && $bindir/secure_modfix.sh $user $group >/dev/null) || exit 1
  292. mkdir -p $basedir/override
  293. echo "[site]
  294. SiteURL=$host.$domain
  295. AdminSiteURL=$adminhost
  296. UserSiteURL=$host.$domain
  297. SiteTitle=$host eZ site
  298. Keywords=$host $maildomain
  299. SiteAuthor=someone at $maildomain
  300. SiteCopyright=someone &copy; 2001
  301. SiteDescription=a web application suite
  302. SiteKeywords=Content Management System, CMS, e-commerce
  303. Database=$dbname
  304. User=$dbuser
  305. Server=$dbserver
  306. Password=$dbpass
  307. [eZUserMain]
  308. DefaultCountry=58
  309. [eZTradeMain]
  310. OrderSenderEmail=$mailuser@$maildomain
  311. OrderReceiverEmail=$mailuser@$maildomain
  312. mailToAdmin=$mailuser@$maildomain
  313. ForceSSL=disabled
  314. ApacheUser=UserApacheRunsAs
  315. [eZForumMain]
  316. ReplyAddress=$mailuser@$maildomain
  317. " > $basedir/override/site.ini.append
  318. chown -R $user:$group $basedir
  319. [ $verbose ] && echo "Configuring Apache"
  320. echo "# Generated by $prg
  321. <VirtualHost *>
  322. ServerName $host.$domain
  323. ServerAdmin $mailuser@$maildomain
  324. DocumentRoot $basedir
  325. user $user
  326. group $group
  327. <Directory $basedir>
  328. Options FollowSymLinks
  329. AllowOverride None
  330. </Directory>
  331. php_flag magic_quotes_gpc off
  332. RewriteEngine On
  333. RewriteRule ^/stats/store/(.*).gif\$ $basedir/ezstats/user/storestats.php [S=4]
  334. RewriteRule ^/filemanager/filedownload/([^/]+)/(.*)\$ $basedir/ezfilemanager/files/\$1 [T=\"application/oct-stream\",S=3]
  335. RewriteRule .*/ezmediacatalogue/catalogue/(.*)\$ $basedir/ezmediacatalogue/catalogue/\$1 [T=\"application/oct-stream\",S=2]
  336. RewriteRule ^/xmlrpc.*\$ $basedir/index_xmlrpc.php [S=1]
  337. RewriteRule !\.(gif|css|jpg|png|jar|wbmp)\$ $basedir/index.php
  338. </VirtualHost>
  339. <VirtualHost *>
  340. ServerName $adminhost
  341. ServerAdmin $mailuser@$maildomain
  342. DocumentRoot $basedir
  343. user $user
  344. group $group
  345. <Directory $basedir>
  346. Options FollowSymLinks
  347. AllowOverride None
  348. </Directory>
  349. php_flag magic_quotes_gpc off
  350. RewriteEngine On
  351. RewriteRule .*/ezmediacatalogue/catalogue/(.*)\$ $basedir/ezmediacatalogue/catalogue/\$1 [T=\"application/oct-stream\",S=1]
  352. RewriteRule !\.(gif|css|jpg|png|jar|wbmp) $basedir/index_admin.php
  353. </VirtualHost>
  354. <VirtualHost *>
  355. ServerName www.$host.$domain
  356. RewriteEngine On
  357. RewriteRule / http://$host.$domain/ [R]
  358. TransferLog /dev/null
  359. </VirtualHost>" > $webcfg
  360. done
  361. [ $info ] && echo "All done! (Remember to reload the webserver...)"