#!/bin/bash # vim: set noexpandtab ts=4: # Gentoo Zope Instance configure tool. # # Originally written by Jason Shoemaker # Portions by Jodok Batlogg (Logging and some cleanups) # Portions by Robin Johnson (Documentation and further cleanup) # Portions by Carter Smithhart (2.7.0 stuff) # # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/app-admin/zope-config/files/0.4/zope-config,v 1.2 2004/07/14 21:22:44 agriffis Exp $ # # # Notes: # $ZI_DIR/.default holds name of default zope instance # $NEWZOPE is set to 1 if the zope server is 2.7.0 or newer # VERSION="0.4" CONFIGFILE=/etc/zope-config.conf if [ -e ${CONFIGFILE} ]; then source ${CONFIGFILE} else echo "Unable to find config file: ${CONFIGFILE}" 1>&2 exit 1 fi # Return codes used in this program: E_SUCCESS=0 E_FAILURE=1 E_ZILIST=22 E_PARAM=26 E_ZSLIST=28 E_ZIDEFAULT=30 #Parameters: # $1 = instance directory # $2 = group zinst_security_setup() { if [ ${ZOPE27} ] ; then chown -R root:${2} ${1} chmod -R o-rwx ${1} chmod g+ws ${1}/{var,log} chmod g+rX -R ${1} else chown -R ${ZUID}:${2} ${1} chmod -R g+u ${1} chmod -R o-rwx ${1} chown root ${1}/var/ # needed if $ZOPE_OPTS='-u root' chmod +t ${1}/var/ fi } # params: $ZSERV_DIR # returns 1 if $ZSERV_DIR is a 2.7 or newer Zope. Also sets NEWZOPE to 1. zserv_is_2.7_or_newer() { TEXT=$(echo $1 | grep ${ZS_DIR2}) if [ "$TEXT" = "" ] ; then NEWZOPE=0 return 0; fi NEWZOPE=1 return 1; } #Params: # $1 = zserv dir # $2 = zinst dir zinst_fs_setup() { local RESULT=${E_FAILURE} local USER= local PASS= local PASS2= if [ "${#}" -lt 2 ] ; then # need a param RESULT=${E_PARAM} elif [ ${ZOPE27} ] ; then if [ "x$3" == "xinituser" ] ; then ${BIN}/mkzopeinstance.py --user admin:admin --dir $2 else ${BIN}/mkzopeinstance.py --dir $2 fi RESULT=$? else if [ $NEWZOPE = 1 ] ; then while : ; do USER=$(dialog --stdout \ --backtitle "Please choose a username and password for the initial user." \ --inputbox "Username:" 0 0 "admin") RESULT=$? if [ "$USER" != "" ] ; then break fi done while : ; do PASS=$(dialog --stdout \ --backtitle "Please choose a username and password for the initial user." \ --passwordbox "Password:" 0 0 "") RESULT=$? if [ "$PASS" = "" ] ; then continue fi PASS2=$(dialog --stdout \ --backtitle "Please choose a username and password for the initial user." \ --passwordbox "Reenter Password:" 0 0 "") RESULT=$? if [ "$PASS2" = "" ] ; then continue fi if [ $PASS = $PASS2 ] ; then break else dialog --msgbox "Passwords must be equal!" 0 0 fi done su zope -c "$1/bin/mkzopeinstance.py --dir $2 --user $USER:$PASS" RESULT=${E_SUCCESS} else # prior to 2.7 mkdir -p $2 || exit 1 if [ $(zinst_default_get >/dev/null)$? -ne 0 ] ; then echo $(basename ${ZINST_DIR}) >${ZI_DIR}/.default chown zope:root ${ZI_DIR}/.default fi if [ -f $2/var/Data.fs ]; then mv $2/var/Data.fs $2/var/Data.fs.org fi cp -R $1/.templates/Extensions $2 cp -R $1/.templates/import $2 cp -R $1/.templates/var $2 mkdir $2/Products if [ -f $2/var/Data.fs.org ]; then mv $2/var/Data.fs $2/var/Data.fs.dist mv $2/var/Data.fs.org $2/var/Data.fs fi RESULT=$? fi fi return ${RESULT} } #Params: # $1 = zserv dir # $2 = zinst dir # $3 = zinst name zinst_rc_setup() { local RESULT=${E_FAILURE} if [ "${#}" -lt 3 ] ; then # need a param RESULT=${E_PARAM} elif [ ${ZOPE27} ] ; then install $1/skel/zope.initd ${INITD}/${3} echo "INSTANCE_HOME=${2}" >${CONFD}/$3 echo "EVENT_LOG_FILE=${EVENTLOGDIR}/${3}" >>${CONFD}/$3 sed -i \ -e "/^# *effective-user/ a\\effective-user ${ZUID}\\ " \ ${2}/etc/zope.conf RESULT=$? else if [ $NEWZOPE = 1 ] ; then install $1/.templates/zope.initd ${INITD}/${3} sed -i \ -e "s|ZINST_DIR=|ZINST_DIR=${2}|" \ -e "s|EVENT_LOG_FILE=|EVENT_LOG_FILE=${EVENTLOGDIR}\/${3}|" \ ${INITD}/${3} RESULT=${E_SUCCESS} else install $1/.templates/zope.confd ${CONFD}/${3} install $1/.templates/zope.initd ${INITD}/${3} sed -i \ -e "/INSTANCE_HOME=/ c\\INSTANCE_HOME=${2}\\ " \ -e "/CLIENT_HOME=/ c\\CLIENT_HOME=${2}/var\\ " \ -e "/EVENT_LOG_FILE=/ c\\EVENT_LOG_FILE=${EVENTLOGDIR}\/${3}\\ " \ ${CONFD}/${3} RESULT=$? fi # make sure the directory exists mkdir -p ${EVENTLOGDIR} >/dev/null 2>&1 fi return ${RESULT} } # Sets the variable: ZSERV_DIR and returns 0 # or returns a non-zero error code zserv_dir_get() { local RESULT=${E_FAILURE} local LIST=$(ls -d ${ZS_DIR}* ; ls -d ${ZS_DIR2}*) local LIST_CNT=$(echo ${LIST} | wc -w) local DLIST= # Assume that LIST_TMP contains valid zserver dirs. if [ ${LIST_CNT} -eq 1 ] ; then ZSERV_DIR=${LIST} RESULT=${E_SUCCESS} elif [ ${LIST_CNT} -ne 0 ] ; then for N in ${LIST} ; do DLIST="${DLIST} $N -" done ZSERV_DIR=$(dialog --stdout \ --title "Zope Server List" \ --menu "Select desired zserver: " 0 40 ${LIST_CNT} ${DLIST}) RESULT=$? else RESULT=${E_ZSLIST} # There are no zservers fi # set NEWZOPE to 1 if we are dealing with a "newer" zope version zserv_is_2.7_or_newer ${ZERV_DIR} return ${RESULT} } # Sets the variable: ZINST_DIR and returns 0 # or returns a non-zero error code zinst_dir_set() { local RESULT= if [ ! -d ${ZI_DIR} ] ; then mkdir -p ${ZI_DIR} fi while : ; do ZINST_DIR=$(dialog --stdout \ --backtitle "Need a uniqe name for zinstance directory.(Also the name of the rcscript.)" \ --inputbox "Enter a new zinstance name:" 0 0 ${DEFAULT_ZINSTANCENAME} ) RESULT=$? if [ ${RESULT} -ne 0 ] ; then break elif [ -z ${ZINST_DIR} ] ; then dialog --msgbox "Error: need a name." 0 0 continue elif echo ${ZINST_DIR} |grep "/" ; then dialog --msgbox "Error: ${ZINST_DIR} is a path, not a name." 0 0 continue elif [[ -d "${ZI_DIR}${ZINST_DIR}" && \ -f "${INITD}/${ZINST_DIR}" ]] ; then dialog --msgbox "Error: ${ZINST_DIR} zinstance already exists. Delete ${INITD}/${ZINST_DIR} to replace instance." 0 0 continue fi ZINST_DIR=${ZI_DIR}${ZINST_DIR} break done return ${RESULT} } # sets the variable $ZINST_DIR and returns 0 # or returns non-null error code zinst_dir_get() { local RESULT=1 local LIST=$(ls ${ZI_DIR}) local LIST_CNT=$(echo ${LIST} | wc -w) local DLIST= # Assume that LIST_TMP contains valid zinstance dirs. if [ ${LIST_CNT} -eq 1 ] ; then ZINST_DIR=${LIST} RESULT=${E_SUCCESS} elif [ ${LIST_CNT} -ne 0 ] ; then for N in ${LIST} ; do DLIST="${DLIST} $N -" done ZINST_DIR=$(dialog --stdout \ --title "Zope Instance List" \ --menu "Select desired zinstance:" 0 0 ${LIST_CNT} ${DLIST}) RESULT=$? else RESULT=${E_ZILIST} # There are no zinstances fi ZINST_DIR="${ZI_DIR}${ZINST_DIR}" return ${RESULT} } # makes ZSERV_DIR the default zope version. if ZSERV_DIR zinst_default_set() { local RESULT= if [ -z ${ZINST_DIR} ] ; then zinst_dir_get || { echo 'Canceled: zinst_dir_get' ; exit 1 ; } fi RESULT=$? if [ ${RESULT} -eq 0 ] ; then echo $(basename ${ZINST_DIR}) >${ZI_DIR}/.default chown zope ${ZI_DIR}/.default fi return ${RESULT} } # Echos the default directory that this instance was created in zinst_default_get() { local RESULT=${E_ZIDEFAULT} if [ -s ${ZI_DIR}/.default ] ; then cat ${ZI_DIR}/.default RESULT=$? # use to be 0 fi return ${RESULT} } # Gets a name for the group that owns the new zinstance and also creates the # group if nessicary zinst_zgid_set() { local RESULT= while : ; do ZGID_NAME=$(dialog --stdout \ --backtitle "Need to create/assign a zinstance group name." \ --inputbox "Enter a group name:" \ 0 0 $(basename ${ZIRC_NAME})) RESULT=$? if [ ${RESULT} -ne 0 ] ; then break elif [ -z ${ZGID_NAME} ] ; then dialog --msgbox "Error: empty string." 0 0 continue elif groupmod ${ZGID_NAME} >/dev/null 2>&1 ; then dialog --yesno "${ZGID_NAME} already exists, use it?" 0 0 RESULT=$? [ ${RESULT} -ne 0 ] && continue fi break done return ${RESULT} } # Sets the inituser password for a given zinstance zinst_zpasswd_set() { if [ -z ${ZSERV_DIR} ] ; then zserv_dir_get || { exit $? ; } fi if [ -z ${ZINST_DIR} ] ; then zinst_dir_get || exit $? fi zserv_is_2.7_or_newer ${ZSERV_DIR} if [ $NEWZOPE = 1 ] ; then echo ">>> Create Zope inituser for \"$(basename ${ZINST_DIR})\"..." /usr/bin/python ${BIN}/zpasswd.py ${ZINST_DIR}/inituser # If zpasswd is aborted it creates a blank inituser chown ${ZUID} ${ZINST_DIR}/inituser else echo ">>> Create Zope inituser for \"$(basename ${ZINST_DIR})\"..." /usr/bin/python ${ZSERV_DIR}/zpasswd.py ${ZINST_DIR}/inituser # If zpasswd is aborted it creates a blank inituser chown ${ZUID} ${ZINST_DIR}/inituser fi } # help! usage() { echo "$(basename $0) version ${VERSION}" echo "A Gentoo Zope Instance configure tool." echo echo "Interactive usage:" echo -e "\t$(basename $0)" echo "Partial interactive usage:" echo -e "\t$(basename $0) --[zserv=[dir] &| zinst=[dir] &| zgid=[name]]" echo "Non-interactive usage:" echo -e "\t$(basename $0) --[zidef-get | zidef-set | zpasswd | version | help]" echo -e "\t$(basename $0) --[zserv=[dir] & zinst=[di] & zgid=[name]]" exit ${E_SUCCESS} } zserv_version_detect() { if [ -d "${ZSERV_DIR}/bin" ] ; then ZOPE27=1 BIN=${ZSERV_DIR}/bin else ZOPE27=0 BIN=${ZSERV_DIR} fi } ##### Process the commandline while [ "$#" -gt 0 ] ; do case "$1" in -*=*) OPTARG=$(echo "$1" | sed 's/[-_a-zA-Z0-9:]*=//') ;; *) OPTARG= ;; esac case "$1" in --zserv=*) ZSERV_DIR=${OPTARG} ; zserv_version_detect ;; --zinst=*) ZINST_DIR=${OPTARG} ;; --zgid=*) ZGID_NAME=${OPTARG} ;; --zinituser) ZINIT_USER=inituser ;; --zidef-set) zinst_default_set ; exit $? ;; --zidef-get) zinst_default_get ; exit $? ;; --zpasswd) zinst_zpasswd_set ; exit $? ;; --version) echo ${VERSION} ; exit 0 ;; -*) usage ; exit 0 ;; *) usage ; exit 0 ;; esac shift done # if ZSERV_DIR isn't set by command line, call zserv_dir_get to set it if [ -z ${ZSERV_DIR} ] ; then zserv_dir_get || { echo 'Canceled: zserv_dir_get' ; exit 1 ; } zserv_version_detect fi # if ZINST_DIR passed by command line, call zinst_dir_set to set it if [ -z ${ZINST_DIR} ] ; then zinst_dir_set || { echo 'Canceled: zinst_dir_set' ; exit 1 ; } fi # if ZIRC_NAME isn't set then use the base of the ZINST_DIR for ZIRC_NAME [ -z ${ZIRC_NAME} ] && ZIRC_NAME=$(basename ${ZINST_DIR}) if [ -z ${ZGID_NAME} ] ; then zinst_zgid_set || { echo 'Canceled: zinst_zgid_set' ; exit 1 ; } fi zserv_is_2.7_or_newer ${ZSERV_DIR} zinst_fs_setup ${ZSERV_DIR} ${ZINST_DIR} ${ZINIT_USER} zinst_rc_setup ${ZSERV_DIR} ${ZINST_DIR} ${ZIRC_NAME} ! groupmod ${ZGID_NAME} >/dev/null 2>&1 && groupadd ${ZGID_NAME} # add existing user zope to the new group gpasswd -a zope ${ZGID_NAME} zinst_security_setup ${ZINST_DIR} ${ZGID_NAME} # TODO: see about adding interactive configuration of ZOPE_OPTS if [ ${ZOPE27} ] ; then echo "Note: Review settings in ${ZINST_DIR}/etc/zope.conf." echo "Then you can start your new instance with:" echo " /etc/init.d/${ZIRC_NAME} start" else echo "Note: Don\'t forget to edit ZOPE_OPTS in ${CONFD}${ZIRC_NAME}" echo " (you might want to add -P 8{1,2,3,..}00 to set the zope ports offset)" fi