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