You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/app-admin/zprod-manager/files/0.3.1/zprod-manager

350 lines
8.2 KiB

#!/bin/bash
# Gentoo Zope Product selection tool.
# Copyright 2003 Jason Shoemaker <kutsuya@gentoo.org>
# Distributed under GPL v2
# $Header: /var/cvsroot/gentoo-x86/app-admin/zprod-manager/files/0.3.1/zprod-manager,v 1.1 2006/11/06 05:28:09 aross Exp $
VERSION="0.3.1"
COMMAND_LIST="add del"
ZS_DIR="/usr/share/zope/"
ZI_DIR="/var/lib/zope/"
ZPROD_DIR="/usr/share/zproduct/"
ZINST_DEFAULT=".default"
ZPROD_FLIST_FNAME=".zfolder.lst"
ZPROD_PLIST_FNAME=".zproduct.lst"
# Assume the standard dialog return codes
#DIALOG_CANCEL=1
#DIALOG_ERROR=-1
#DIALOG_ESC=-255
#DIALOG_OK=0
#DIALOG_ERROR may equal #DIALOG_ESC
# Return codes used in this program:
E_SUCCESS=0
E_FAILURE=1
E_ZPLIST=20
E_ZILIST=22
E_COMMAND=24
E_OVERWRITE=26
## copied from zope-config
zinst_dir_get()
{
local RESULT=${E_FAILURE}
local LIST=$(ls ${ZI_DIR})
local LIST_CNT=$(echo ${LIST} | wc -w)
local DLIST=
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}
}
# params: none
# TODO: Maybe try to break this function down some more.
# TODO: verify items in ZP_PLIST and ZI_PLIST
mode_interactive()
{
local RESULT=
if [ $(is_command "${COMMAND_LIST}" ${1})${?} -ne 0 ] ; then
RESULT=${?}
return ${RESULT}
fi
ZP_PLIST=$(ls ${ZPROD_DIR})
if [ "${ZP_PLIST}" ] ; then
zinst_dir_get
RESULT=$?
if [ ${RESULT} -eq 0 ] ; then
ZI_PLIST=$(cat ${ZINST_DIR}/${ZPROD_PLIST_FNAME})
# Create CLIST for --menu
if [ "${ZI_PLIST}" ] ; then
for N in ${ZP_PLIST} ; do
echo ${ZI_PLIST} |grep ${N} >/dev/null
if [ $? -eq 0 ] ; then
STATUS=ON
else
STATUS=OFF
fi
CLIST="${CLIST} ${N} - ${STATUS}"
done
CTAGS=$(dialog --stdout \
--backtitle "Select the zproducts you want installed for zinstance(${ZINST_DIR})." \
--checklist "Select:" 0 0 0 ${CLIST})
RESULT=$?
CTAGS=$(echo ${CTAGS} | sed -e "s:\"::g")
# Prepare to add and delete zproducts installed in zinstance
if [[ ${RESULT} -eq 0 && "${CTAGS}" ]] ; then
for N in ${ZI_PLIST} ; do
echo "$CTAGS" |grep ${N} >/dev/null
if [ $? -ne 0 ] ; then
prod_del ${ZPROD_DIR}/${N} ${ZINST_DIR}
fi
done
for N in ${CTAGS} ; do
echo ${ZI_PLIST} |grep ${N} >/dev/null
if [ $? -ne 0 ] ; then
prod_add ${ZPROD_DIR}/${N} ${ZINST_DIR}
fi
done
RESULT=$?
elif [ ${RESULT} -eq 0 ] ; then # $CTAGS is empty
for N in ${ZI_PLIST} ; do
prod_del ${ZPROD_DIR}/${N} ${ZINST_DIR}
done
RESULT=$?
fi
else # ZI_PLIST is empty
for N in ${ZP_PLIST} ; do
CLIST="${CLIST} ${N} - 0"
done
CTAGS=$(dialog --stdout \
--backtitle "Select the zproducts you want installed for zinstance(${ZINST_DIR})." \
--checklist "Select:" 0 0 0 ${CLIST})
RESULT=$?
CTAGS=$(echo "${CTAGS}" | sed -e "s:\"::g")
if [[ ${RESULT} -eq 0 && "${CTAGS}" ]] ; then
for N in ${CTAGS} ; do
# as this is empty Products directory in instance if-case, we can safely ignore
# RESULT returned from prod_add in case of overwrite error. It can not happen
# when ZI_PLIST is empty, right? ;) <radek@gentoo.org>
prod_add ${ZPROD_DIR}/${N} ${ZINST_DIR}
done
fi
fi
fi
else # ZP_PLIST is empty
RESULT=${E_ZPLIST}
fi
return ${RESULT}
}
# Parameters:
# $1 = command list
# $2 = command received
# Returns:
# true or false
is_command()
{
local RESULT=${E_COMMAND}
local N=
echo ${1} |grep ${2} >/dev/null
if [ $? -eq 0 ] ; then
RESULT=0
fi
return ${RESULT}
}
# Parameters:
# $1 = /path/to/zinstance
# Returns:
# true or false
is_zinstanceDir()
{
local RESULT=${E_ZILIST}
# If can't find these, probably not a zinstance.
if [[ -d "${1}/Products" && -d "${1}/var" && -d "${1}/import" && -d "${1}/Extensions" ]] ; then
RESULT=0
fi
return ${RESULT}
}
# Parameters:
# $1 = /path/to/zproduct
# Returns:
# true or false
is_zproductDir()
{
local RESULT=${E_ZPLIST}
# look for something in .zproduct.lst in $1, if we can't find that...
if [ -s "${1}/${ZPROD_FLIST_FNAME}" ] ; then
RESULT=0
fi
return ${RESULT}
}
# Parameters:
# $1 = /path/to/zinst_dir
# Returns:
# stdout = name of defautl zinstance, if any.
zinst_default_get()
{
if [ -s ${1}/${ZINST_DEFAULT} ] ; then
cat ${1}/${ZINST_DEFAULT}
fi
}
# Parameters:
# $1 = /path/to/zproduct
# $2 = /path/to/zinstance
# be warned, using this function you have to immediately fail if functionss returns error.
prod_add()
{
local RESULT=
local N=
# checks if some products components are already installed,
# if yes, we have to break with error, as overwrites are DANGEROUS!
for N in $(cat "${1}/${ZPROD_FLIST_FNAME}")
do
if [ -d ${2}/Products/${N} ]
then
echo "ZPROD-MANAGER WARNING: Overwrite possiblity detected at ${N}"
return ${E_OVERWRITE}
fi
done
for N in $(cat "${1}/${ZPROD_FLIST_FNAME}") ; do
# we do copy instead of link, because its much safer, and zope-development-way compliant
cp -Ra ${1}/${N} ${2}/Products
done
RESULT=$?
if [ ${RESULT} -eq 0 ] ; then
# basically adding ${PF} to .zproduct.lst
echo $(basename $1) >> ${2}/${ZPROD_PLIST_FNAME}
sort -u ${2}/${ZPROD_PLIST_FNAME} > ${2}/.tmp
mv -f ${2}/.tmp ${2}/${ZPROD_PLIST_FNAME}
RESULT=$?
for N in $(cat "${1}/${ZPROD_FLIST_FNAME}") ; do
# setting owner and group as in Products folder, so we can compile
# python scripts with the zope user
chown -R `stat -c %U:%G ${2}/Products` ${2}/Products/${N}
# gives group writing perms (very often need in development teams)
# takes all perms from others to comply with 770 instance policy
chmod -R g+rwX,o-rwx ${2}/Products/${N}
done
fi
return ${RESULT}
}
# Parameters:
# $1 = /path/to/zproduct
# $2 = /path/to/zinstance
prod_del()
{
local RESULT=
local N=
local PF=$(basename $1)
grep "${PF}" "${2}/${ZPROD_PLIST_FNAME}" >/dev/null
RESULT=$?
if [ ${RESULT} -eq 0 ] ; then
for N in $(cat ${1}/${ZPROD_FLIST_FNAME}) ; do
rm -rf ${2}/Products/${N}
done
# remove zproduct from .zproduct.lst
sed -i -e "s/${PF}$//" -e "/^$/d" ${2}/${ZPROD_PLIST_FNAME}
RESULT=$?
fi
return ${RESULT}
}
# Parameters:
# $1 = (optional) error message
mode_help()
{
echo "$(basename $0) version ${VERSION}"
echo "A Gentoo Zope Product selection tool."
echo
echo "Interactive usage:"
echo -e "\t$(basename $0) [add | del]"
echo "Default zinstance usage:"
echo -e "\t$(basename $0) [add |del] /path/of/zproduct"
echo "Non-interactive usage:"
echo -e "\t$(basename $0) [add | del] /path/of/zproduct /path/of/zinstance/"
}
# Parameters:
# $1 = command
# $2 = /path/to/zproductDir
mode_defaultZinst()
{
local DEFAULT_ZINST=$(zinst_default_get ${ZI_DIR})
local RESULT=$?
if [ -n "${DEFAULT_ZINST}" ] ; then
mode_explicit ${1} ${2} ${ZI_DIR}/${DEFAULT_ZINST}
RESULT=${?}
fi
return ${RESULT}
}
# Parameters:
# $1 = command
# $2 = /path/to/zproduct
# $3 = /path/to/zinstance
mode_explicit()
{
local RESULT=
if [[ $(is_command "${COMMAND_LIST}" ${1})${?} -eq 0 && \
$(is_zproductDir ${2})${?} -eq 0 && \
$(is_zinstanceDir ${3})${?} -eq 0 ]] ; then
if [ ${1} = "add" ] ; then
prod_add ${2} ${3}
RESULT=$?
elif [ ${1} = "del" ] ; then
prod_del ${2} ${3}
RESULT=$?
else
RESULT=${E_COMMAND}
fi
fi
return ${RESULT}
}
### MAIN
if [ ${!#} = "--help" ] ; then
mode_help
else
case "${#}" in
0) mode_help ;;
1) mode_interactive ${1} ;;
2) mode_defaultZinst ${1} ${2} ;;
3) mode_explicit ${1} ${2} ${3} ;;
*) mode_help "Error: Too many parameters" ;;
esac
fi
RESULT=$?
if [ ${RESULT} -ne 0 ] ; then
echo "ERROR ${?}"
fi
# vim:ts=8