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