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