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