From bd234136699fbe0314672aaaa9110c0d55e133d7 Mon Sep 17 00:00:00 2001 From: Jonas Smedegaard Date: Sat, 7 Dec 2002 18:34:05 +0000 Subject: Use GNU getopt, and make lots of options configurable. Redesign help text to look similar to cp help text. Generalize initializing options in function setparams. Add options --force and --verbose. Add support for overriding with locally provided tarballs and sqlfiles. --- localezcreate | 310 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 197 insertions(+), 113 deletions(-) (limited to 'localezcreate') diff --git a/localezcreate b/localezcreate index f00db8d..7db41b8 100755 --- a/localezcreate +++ b/localezcreate @@ -3,7 +3,7 @@ # /usr/local/sbin/localezcreate # Copyright 2001-2002 Jonas Smedegaard # -# $Id: localezcreate,v 1.16 2002-12-06 23:38:37 jonas Exp $ +# $Id: localezcreate,v 1.17 2002-12-07 18:34:05 jonas Exp $ # # Create local eZ Publish site # @@ -12,68 +12,121 @@ # 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 -pkg="ezpublish" -srcdir="/usr/src/ezpublish" -sqldir="/usr/share/ezpublish/sql" -bindir="/usr/share/ezpublish/bin" -tarballs="lib data tpl www" -sqlfile="publish_mysql.sql" -sqlfile2="data_mysql.sql" -defaultuid="www-data" +defaultuser="www-data" +defaultgroup="www-data" defaultdomain="ez."`hostname -d` -defaultmaildomain=`cat /etc/mailname 2> /dev/null || echo $defaultdomain` -defaultdbname="ez_2_2_$host" -defaultgid="www-data" +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" -template_tarballs="" -language_tarballs="en_GB en_GB_org" +defaultforce="off" + +# Defaults not (yet) user configurable +templates="" +languages="en_GB en_GB_org" +sqlchunks="publish data" +defaulthome='`getent passwd $user | awk -F: '"'"'{print $6}'"'"';`' +defaultbasedir='$home/webphpsites/$host.$domain' +defaultadminhost='admin.$host.$domain' +defaultadmindir='$home/webphpsites/$host.$domain/admin' +defaultwebcfg='/etc/apache/vhosts.d/$home.$domain' +templatedirs="/usr/src/ezpublish/templates" +languagedirs="/usr/src/ezpublish/lang" +sqldirs="/usr/share/ezpublish/sql" + +# If overriding some 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 admindir webcfg" # Options requiring $opts1, $opts2 or $host to resolve default + +# Override defaults from config file if available if [ -e /etc/local/localezcreate.conf ]; then . /etc/local/localezcreate.conf fi -if [ $# \< 1 -o $# \> 8 ]; then - echo "Usage: `basename $0` host [ uid [ fqdn [ maildomain [ dbname [ dbuser" - echo " [ mailuser [ gid ]]]]]]" +# 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 " OPTION DESCRIPTION DEFAULT VALUE" - echo " host: hostname (without domain)" - echo " uid: System user id ($defaultuid)" - echo " fqdn: Complete domain name (.$defaultdomain)" - echo " maildomain: Domain part of mail address ($defaultmaildomain)" - echo " dbname: MySQL database name ($defaultdbname)" - echo " dbuser: MySQL database user ()" - echo " mailuser: User part of mail address ()" - echo " gid: System group id ($defaultgid)" - echo " dbserver: IP or host of MySQL server ($defaultdbserver)" - echo " dballow: IP or host of eZ server ($defaultdballow)" + 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 " MySQL password for can be stored in \$HOME/.my.cnf of ." + echo "Each HOST is a simple hostname, without the domain part." echo - echo " Example: `basename $0` bilbo news news.forum.com" + echo "MySQL password for \$dbuser can be stored in \$HOME/.my.cnf of \$user." +} - exit 1 -fi +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 -uid=${2:-$defaultuid} -fqdn=${3:-$host.$defaultdomain} -maildomain=${4:-$defaultmaildomain} -dbname=${5:-$defaultdbname} -dbuser=${6:-$uid} -mailuser=${7:-$uid} -gid=${8:-$defaultgid} -dbserver=${9:-$defaultdbserver} -dballow=${10:-$defaultdballow} - -home=`getent passwd $uid | awk -F: '{print $6}';` -basedir="$home/webphpsites/$fqdn" -adminhost="admin.$fqdn" -adminbasedir="$basedir/admin" -webcfg="/etc/apache/vhosts.d/$fqdn" +setparams $opts1 +setparams $opts2 # Attempt to figure out dbpass, dbadmin and dbadmpass, else ask for them if [ -z "$dbpass" ]; then @@ -90,7 +143,7 @@ if [ -e /usr/share/wwwconfig-common/mysql-localadmpass.get -a "$dbserver" = "loc status="" . /usr/share/wwwconfig-common/mysql-localadmpass.get if [ "$status" = "error" ] ; then - echo "$error" + [ $verbose ] && echo "$error" fi fi if [ -z "$dbadmpass" ]; then @@ -102,20 +155,40 @@ if [ -z "$dbadmpass" ]; then echo fi -#TODO: Make sure $basedir, $dbname, $dbuser and $webcfg doesn't exist - # Do not force TCP/IP access when connecting locally optdbserver="" if [ "$dbserver" != "localhost" ]; then optdbserver="-p$dbserver" fi -#if [ "$(basename $0)" = "${pkg}betarecreate" ]; then -# mysqladmin -u$dbadmin -p$dbadmpass $optdbserver drop $dbname -# rm -rf $basedir -#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 -echo "Creating database $dbname" +[ $verbose ] && echo "Create database $dbname" if [ -e /usr/share/wwwconfig-common/mysql-createdb.sh ] ; then status="" . /usr/share/wwwconfig-common/mysql-createdb.sh @@ -126,6 +199,8 @@ if [ -e /usr/share/wwwconfig-common/mysql-createdb.sh ] ; then 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 @@ -142,63 +217,71 @@ else done fi -echo "Inject initial data into database" -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" +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 -else - cat $sqldir/$sqlfile | mysql -u$dbadmin -p$dbadmpass $optdbserver $dbname -fi +done +[ $verbose ] && echo -echo -n "Unpacking tarballs:" -mkdir $basedir -chown $uid:$gid $basedir -su $uid -c " - set -e - cd $basedir - for tarball in $tarballs; do - echo -n \" \$tarball\" - tar -xz -C $basedir -f $srcdir/\$tarball.tar.gz - done - for tarball in $language_tarballs; do - echo -n \" \$tarball\" - tar -xz -C $basedir -f $srcdir/lang/\$tarball.tar.gz - done - for tarball in $template_tarballs; do - echo -n \" \$tarball\" - tar -xz -C $basedir -f $srcdir/templates/\$tarball.tar.gz +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 - echo -" +done +[ $verbose ] && echo -echo "Adding demo data to database" -sqlfile=$sqlfile2 -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 "Configuring website" -su $uid -c " +[ $verbose ] && echo "Configuring website" +su $user -c " set -e cd $basedir $bindir/modfix.sh >/dev/null - $bindir/secure_modfix.sh $uid $gid >/dev/null + $bindir/secure_modfix.sh $user $group >/dev/null mkdir -p override echo \"[site] -SiteURL=$fqdn -AdminSiteURL=admin.$fqdn -UserSiteURL=$fqdn +SiteURL=$host.$domain +AdminSiteURL=$adminhost +UserSiteURL=$host.$domain SiteTitle=$host eZ site Keywords=$host $maildomain SiteAuthor=someone at $maildomain @@ -225,16 +308,16 @@ ReplyAddress=$mailuser@$maildomain \" > override/site.ini.append " -chown -R $uid:$gid $basedir +chown -R $user:$group $basedir -echo "Configuring Apache" +[ $verbose ] && echo "Configuring Apache" echo "# Generated for $pkg by $(basename $0) - ServerName $fqdn + ServerName $host.$domain ServerAdmin $mailuser@$maildomain DocumentRoot $basedir - user $uid - group $gid + user $user + group $group Options FollowSymLinks AllowOverride None @@ -251,8 +334,8 @@ echo "# Generated for $pkg by $(basename $0) ServerName $adminhost ServerAdmin $mailuser@$maildomain DocumentRoot $basedir - user $uid - group $gid + user $user + group $group Options FollowSymLinks AllowOverride None @@ -263,11 +346,12 @@ echo "# Generated for $pkg by $(basename $0) RewriteRule !\.(gif|css|jpg|png|jar|wbmp) $basedir/index_admin.php - ServerName www.$fqdn + ServerName www.$host.$domain RewriteEngine On - RewriteRule / http://$fqdn/ [R] + RewriteRule / http://$host.$domain/ [R] TransferLog /dev/null " > $webcfg -echo "Done!" -echo "Remember to reload Apache..." +done + +echo "All done! (Remember to reload the webserver...)" -- cgit v1.2.3