#!/bin/bash # # /usr/local/sbin/localezcreate # Copyright 2001-2002 Jonas Smedegaard # # $Id: localezcreate,v 1.19 2002-12-08 15:06:22 jonas Exp $ # # Create local eZ Publish site # # This script makes use of the Debian package wwwconfig-common if installed # # TODO: Ask for and set default language and theme # TODO: Make a note about installed languages and themes (for smooth upgrades) # TODO: Make md5 of all files (for smooth upgrades) # TODO: Make script (mostly) work as noon-root set -e prg=`basename $0` TEMP=`getopt -o hu:g:d:m:f::v --long help,user:,group:,domain:,mailuser:,maildomain:,dbname:,dbserver:,dballow:,force::,verbose -n "$prg" -- "$@"` # Check for non-GNU getopt if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi eval set -- "$TEMP" # Defaults are evaluated at runtime in this order # (If changing defaults, you might need to change these as well) opts1="user group domain maildomain dbserver dballow" # Options with self-contained defaults opts2="dbuser home" # Options requiring $opts1 to resolve default opts3="mailuser dbname basedir adminhost webcfg" # Options requiring $opts1, $opts2 or $host to resolve default # Defaults defaultuser="www-data" defaultgroup="www-data" defaultdomain="ez."`hostname -d` defaultmailuser='$dbuser' defaultmaildomain=`cat /etc/mailname 2> /dev/null || hostname -d` defaultdbname='ez_2_2_$host' # TODO: Allow all defaults to be set like this defaultdbuser='$user' defaultdbserver="localhost" defaultdballow="localhost" defaultforce="off" # Defaults not (yet) user configurable templates="" languages="en_GB en_GB_org" sqlchunks="publish data" defaulthome="/var/www" defaultbasedir='/var/www/ez-$host.$domain' defaultadminhost='admin.$host.$domain' defaultwebcfg='/etc/apache/vhosts.d/ez-$host.$domain' templatedirs="/usr/src/ezpublish/templates" languagedirs="/usr/src/ezpublish/lang" sqldirs="/usr/share/ezpublish/sql" # Override defaults from config file if available if [ -e /etc/local/localezcreate.conf ]; then . /etc/local/localezcreate.conf fi # These are unlikely to change sourcedirs="/usr/src/ezpublish" sources="lib data tpl www" bindir="/usr/share/ezpublish/bin" function usage() { echo "Usage: $prg [OPTION]... HOST [HOST]..." echo "Create local eZ Publish sites" echo echo "Mandatory arguments to long options are mandatory for short options too." echo " -h, --help Show this help" echo " -u, --user=UID System user id (default: $defaultuser)" echo " -g, --group=GID System group id (default: $defaultgroup)" echo " -d, --domain=DOMAIN Domain name with hostname stripped off (default:" echo " $defaultdomain)" echo " --mailuser=UID User part of mail address (default: $defaultmailuser)" echo " -m, --maildomain=DOMAIN Domain part of mail address (default:" echo " $defaultmaildomain)" echo " --dbname=DB MySQL database name (default:" echo " $defaultdbname)" echo " --dbuser=UID MySQL database user (default: $defaultdbuser)" echo " --dbserver=HOST IP or host of MySQL server (default:" echo " $defaultdbserver)" echo " --dballow=HOST IP or host of eZ server (default:" echo " $defaultdballow)" echo " -f, --force[=FLAG] Replace existing installation (default: $defaultforce)" echo " -v, --verbose Be talkative during installation" echo echo "Each HOST is a simple hostname, without the domain part." echo echo "MySQL password for \$dbuser can be stored in \$HOME/.my.cnf of \$user." } function setparams () { for param in $@; do # TODO: Check here if default exists or fail loudly eval "$param=`eval \"echo \"\\\"\$\{$param:-\\\$default${param}\}\\\"\"\"`" [ $verbose ] && echo "--> $param="`eval echo \$\{$param\}` done } while true ; do case "$1" in -h|--help) usage; exit 0;; -u|--user) user="$2"; shift 2;; -g|--group) group="$2"; shift 2;; -d|--domain) domain="$2"; shift 2;; -a|--mailuser) mailuser="$2"; shift 2;; -m|--maildomain) maildomain="$2"; shift2 ;; --dbname) dbname="$2"; shift 2;; --dbuser) dbuser="$2"; shift 2;; --dbserver) dbserver="$2"; shift 2;; --dballow) dballow="$2"; shift 2;; -f|--force) case "$2" in ""|on) force="on"; shift 2;; *) force="off"; shift 2;; esac ;; -v|--verbose) verbose="1"; shift;; --) shift; break;; *) echo "Internal error!" ; exit 1 ;; esac done setparams $opts1 setparams $opts2 # Attempt to figure out dbpass, dbadmin and dbadmpass, else ask for them if [ -z "$dbpass" ]; then if [ -f $home/.my.cnf ]; then dbpass=$(grep password $home/.my.cnf | awk -F= '{print $2}' | head -1 | sed 's/^ //g') fi if [ -z "$dbpass" ]; then echo -n "Enter MySQL password for $dbuser: " read -s dbpass echo fi fi if [ -e /usr/share/wwwconfig-common/mysql-localadmpass.get -a "$dbserver" = "localhost" ] ; then status="" . /usr/share/wwwconfig-common/mysql-localadmpass.get if [ "$status" = "error" ] ; then [ $verbose ] && echo "$error" fi fi if [ -z "$dbadmpass" ]; then echo -n "Enter MySQL administrator (usually root): " read -s dbadmin echo echo -n "Enter MySQL root password: " read -s dbadmpass echo fi # Do not force TCP/IP access when connecting locally optdbserver="" if [ "$dbserver" != "localhost" ]; then optdbserver="-p$dbserver" fi ############################################## # The rest of the script is host-specific... # ############################################## for host do echo "Installing $host..." setparams $opts3 if [ -d $basedir -o -d $webcfg ]; then echo "WARNING: Target dir or Apache config snippet already exists." echo -n " Purge existing installation (y/N)?: " read -s ack echo case $ack in y|Y) mysqladmin -u$dbadmin -p$dbadmpass $optdbserver drop $dbname rm -rf $basedir ;; *) echo "Installation aborted!" exit 1 ;; esac fi [ $verbose ] && echo "Create database $dbname" if [ -e /usr/share/wwwconfig-common/mysql-createdb.sh ] ; then status="" . /usr/share/wwwconfig-common/mysql-createdb.sh if [ "$status" = "error" ] ; then echo "$error" exit 1 fi else mysqladmin -u$dbadmin -p$dbadmpass $optdbserver create $dbname fi [ $verbose ] && echo "Create/update database user $dbuser" if [ -e /usr/share/wwwconfig-common/mysql-createuser.sh ] ; then status="" . /usr/share/wwwconfig-common/mysql-createuser.sh if [ "$status" = "error" ] ; then echo "$error" exit 1 fi for h in `echo "localhost $dballow" | sort -u`; do echo "GRANT INDEX ON $dbname.* TO '$dbuser'@$h IDENTIFIED BY '$dbpass';" | mysql -u$dbadmin -p$dbadmpass $optdbserver done else for h in `echo "localhost $dballow" | sort -u`; do echo "GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX ON $dbname.* TO '$dbuser'@$h IDENTIFIED BY '$dbpass';" | mysql -u$dbadmin -p$dbadmpass $optdbserver done fi for chunk in $sqlchunks; do [ $verbose ] && echo -n "Feeding $chunk into database: " found="" for dir in $sqldirs; do if [ -f $dir/${chunk}_mysql.sql ]; then found="1" sqldir=$dir sqlfile=${chunk}_mysql.sql break fi done if [ "$found" = "1" ]; then if [ -e /usr/share/wwwconfig-common/mysql-exec.sh ] ; then status="" (cd $sqldir && . /usr/share/wwwconfig-common/mysql-exec.sh) if [ "$status" = "error" ] ; then echo "$error" exit 1 fi else cat $sqldir/$sqlfile | mysql -u$dbadmin -p$dbadmpass $optdbserver $dbname fi echo -n " " else [ $verbose ] && echo echo "ERROR: $chunk not found!" exit 1 fi done [ $verbose ] && echo for area in source language template; do [ $verbose ] && echo -n "Unpacking $area files: " for tarball in `eval echo \$\{$area\}s`; do [ $verbose ] && echo -n "$tarball" found="" for dir in `eval echo \$\{$area\}dirs`; do if [ -f $dir/$tarball.tar.gz ]; then found="1" (cd $basedir; tar -xz -C $basedir -f $dir/$tarball.tar.gz) break fi done if [ "$found" = "1" ]; then echo -n " " else [ $verbose ] && echo echo "ERROR: $area $tarball not found!" exit 1 fi done done [ $verbose ] && echo [ $verbose ] && echo "Configuring website" su $user -c " set -e cd $basedir $bindir/modfix.sh >/dev/null $bindir/secure_modfix.sh $user $group >/dev/null mkdir -p override echo \"[site] SiteURL=$host.$domain AdminSiteURL=$adminhost UserSiteURL=$host.$domain SiteTitle=$host eZ site Keywords=$host $maildomain SiteAuthor=someone at $maildomain SiteCopyright=someone © 2001 SiteDescription=a web application suite SiteKeywords=Content Management System, CMS, e-commerce Database=$dbname User=$dbuser Server=$dbserver Password=$dbpass [eZUserMain] DefaultCountry=58 [eZTradeMain] OrderSenderEmail=$mailuser@$maildomain OrderReceiverEmail=$mailuser@$maildomain mailToAdmin=$mailuser@$maildomain ForceSSL=disabled ApacheUser=UserApacheRunsAs [eZForumMain] ReplyAddress=$mailuser@$maildomain \" > override/site.ini.append " chown -R $user:$group $basedir [ $verbose ] && echo "Configuring Apache" echo "# Generated for $pkg by $(basename $0) ServerName $host.$domain ServerAdmin $mailuser@$maildomain DocumentRoot $basedir user $user group $group Options FollowSymLinks AllowOverride None php_flag magic_quotes_gpc off RewriteEngine On RewriteRule ^/stats/store/(.*).gif\$ $basedir/ezstats/user/storestats.php [S=4] RewriteRule ^/filemanager/filedownload/([^/]+)/(.*)\$ $basedir/ezfilemanager/files/\$1 [T=\"application/oct-stream\",S=3] RewriteRule .*/ezmediacatalogue/catalogue/(.*)\$ $basedir/ezmediacatalogue/catalogue/\$1 [T=\"application/oct-stream\",S=2] RewriteRule ^/xmlrpc.*\$ $basedir/index_xmlrpc.php [S=1] RewriteRule !\.(gif|css|jpg|png|jar|wbmp)\$ $basedir/index.php ServerName $adminhost ServerAdmin $mailuser@$maildomain DocumentRoot $basedir user $user group $group Options FollowSymLinks AllowOverride None php_flag magic_quotes_gpc off RewriteEngine On RewriteRule .*/ezmediacatalogue/catalogue/(.*)\$ $basedir/ezmediacatalogue/catalogue/\$1 [T=\"application/oct-stream\",S=1] RewriteRule !\.(gif|css|jpg|png|jar|wbmp) $basedir/index_admin.php ServerName www.$host.$domain RewriteEngine On RewriteRule / http://$host.$domain/ [R] TransferLog /dev/null " > $webcfg done echo "All done! (Remember to reload the webserver...)"