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.
 
 
 
 
 
 

328 lines
8.8 KiB

# --- SDE-COPYRIGHT-NOTE-BEGIN ---
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
#
# Filename: package/.../zope/stone_mod_zope.sh
# Copyright (C) 2004 - 2006 The T2 SDE Project
#
# More information can be found in the files COPYING and README.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License. A copy of the
# GNU General Public License can be found in the file COPYING.
# --- SDE-COPYRIGHT-NOTE-END ---
ZOPESYSCONFDIR=/etc/opt/zope
PRODUCTTAB=$ZOPESYSCONFDIR/producttab
INSTANCETAB=$ZOPESYSCONFDIR/instancetab
declare -a zope_containers
declare -a zope_instances
declare -a zope_products
[ -f $PRODUCTTAB ] || touch $PRODUCTTAB
[ -f $INSTANCETAB ] || touch $INSTANCETAB
zope_update_containers() {
local line=0 size=
while read zope_containers[line++]; do :; done < $PRODUCTTAB
size=$line; for line in ${!zope_containers[@]}; do
[ $line -lt $size ] || unset zope_containers[$line]
done
}
zope_containers_menu() {
local containers= line=
for line in ${!zope_containers[@]}; do
[ -n "${zope_containers[$line]}" ] && \
containers="$containers '${zope_containers[$line]}' \
'zope_containers_edit $line'"
done
[ -z "$containers" ] || containers="$containers '' ''"
eval "gui_menu zope_container 'ZOPE Product Containers' \
$containers \
'Add new product container' zope_containers_add"
}
zope_containers_edit() {
local container= line="$1"
gui_input "Please enter a directory which contains ZOPE products" "${zope_containers[$line]}" container
if [ -z "$container" ]; then
unset zope_containers[$line]
zope_update_products
elif [ "${zope_containers[$line]}" != "$container" ]; then
zope_containers[$line]="$container"
zope_update_products
fi
}
zope_containers_add() {
local container=
gui_input "Please enter a directory which contains ZOPE products" '' container
if [ -n "$container" ]; then
zope_containers[${#zope_containers[@]}]="$container"
zope_update_products
fi
}
zope_containers_commit() {
local container=
for container in ${!zope_containers[@]}; do
echo "${zope_containers[$container]}"
done > $PRODUCTTAB
}
zope_update_products() {
local container=0 productdir=
local init= product= version=
local entry=0 size=
for container in ${!zope_containers[@]}; do
while read init; do
productdir=${init%/__init__.py}
product=${productdir##*/}
if [ -f $productdir/version.txt ]; then
version=$( cat $productdir/version.txt )
elif [ "${product/-/}" != "$product" ]; then
version="${product#*-}"
else
version=undefined
fi
product=${product%%-*}
zope_products[$entry*3+0]="$product"
zope_products[$entry*3+1]="$version"
zope_products[$entry*3+2]="$productdir"
(( entry++ ))
done < <( ls -1 ${zope_containers[$container]}/*/__init__.py 2> /dev/null )
done
(( size=$entry*3 )); for entry in ${!zope_products[@]}; do
[ $entry -lt $size ] || unset zope_products[$entry]
done
}
zope_products_list() {
local entry=0 count=
local product= version= productdir=
(( count=${#zope_products[@]}/3 ))
while [ $entry -lt $count ]; do
product=${zope_products[ $entry * 3 + 0 ]}
version=${zope_products[ $entry * 3 + 1 ]}
productdir=${zope_products[ $entry * 3 + 2 ]}
echo "'$product - $version' 'gui_message \"$productdir\"'"
(( entry++ ))
done
}
zope_products_menu() {
eval "gui_menu zope_products 'ZOPE Products List' \
$( zope_products_list | sort -t' ' | tr '\n' ' ' )"
}
zope_update_instances() {
local line=0 size=
while read zope_instances[line++]; do :; done < $INSTANCETAB
size=$line; for line in ${!zope_instances[@]}; do
[ $line -lt $size ] || unset zope_instances[$line]
done
}
zope_instances_menu() {
local instances= line=
for line in ${!zope_instances[@]}; do
[ -n "${zope_instances[$line]}" ] && \
instances="$instances '${zope_instances[$line]}' \
'while zope_instances_products $line; do :; done'"
done
[ -z "$instances" ] || instances="$instances '' ''"
eval "gui_menu zope_instance 'ZOPE Instances' \
$instances \
'Add new instance' zope_instances_add"
}
zope_instances_products() {
local instance=$1 instancedir=${zope_instances[$1]}
local installed= available=
local productdir= product=
local entry= count=
local productname= version=
local installedlist= code=
count=${#zope_products[@]}; (( count=count/3 ))
if [ -d $instancedir/Products ]; then
installed="'Installed products:' ''"
for product in $instancedir/Products/*; do
if [ -d $product/ -a -L $product ]; then
productdir="`readlink -f $product`"
for (( entry=0; entry<count; entry++ )); do
[ "${zope_products[$entry*3+2]}" != "$productdir" ] || break
done
if [ "${zope_products[$entry*3+2]}" == "$productdir" ]; then
productname="${zope_products[$entry*3+0]}"
version="${zope_products[$entry*3+1]}"
installedlist="$installedlist $productname"
code="zope_instances_update \"${productname}\" \"${product}\" \"${version}\""
installed="$installed '$productname - $version' '$code'"
else
installed="$installed '[$productdir] unknown' ''"
fi
elif [ -L $product ]; then
installed="$installed '[${product##*/}] broken' 'zope_instances_uninstall \"${product}\"'"
elif [ -d $product/ ]; then
installed="$installed '[${product##*/}] static' ''"
fi
done
available="'Other available products:' ''"
for (( entry=0; entry<count; entry++ )); do
set -- $installedlist
while [ $# -gt 0 ]; do
[ "$1" != "${zope_products[$entry*3+0]}" ] || continue 2
shift
done
productname="${zope_products[$entry*3+0]}"
product="$instancedir/Products/$productname"
installedlist="$installedlist $productname"
if [ -e "$product" ]; then
code=
else
code="zope_instances_install ${productname} \"$product\""
fi
available="$available '$productname' '$code'"
done
else
installed="'* NOT A VALID INSTANCE DIR*' ''"
fi
eval "gui_menu zope_instance_product 'Zope Instance Products' \
'location: $instancedir' 'zope_instances_edit $instance' \
'' '' \
$installed \
'' '' \
$available"
}
zope_instances_install() {
local productname="$1" product="$2"
local productdir= version=
if gui_yesno "Are you sure you want to install $productname?"; then
count=${#zope_products[@]}; (( count=count/3 ))
for (( entry=0; entry<count; entry++ )); do
[ "${zope_products[$entry*3+0]}" == "$productname" ] || continue
version="${zope_products[$entry*3+1]}"
productdir="${zope_products[$entry*3+2]}"
break
done
if [ ! -e "$product" -a "${zope_products[$entry*3+0]}" == "$productname" ]; then
if ln -s "$productdir" "$product"; then
gui_message "$productname - $version was succesfully installed"
zope_instances_update "${productname}" "${product}" "${version}"
else
gui_message "Failed to install $productname - $version"
fi
else
gui_message "Failed to install $productname, garbage on the road."
fi
fi
}
zope_instances_uninstall() {
rm "$1"
}
zope_instances_set() {
rm "$1"
ln -s "$2" "$1"
}
zope_instances_update() {
local productname="$1" product="$2" version="$3"
local versions= entry= count=
count=${#zope_products[@]}; (( count=count/3 ))
for (( entry=0; entry<count; entry++ )); do
[ "${zope_products[$entry*3+0]}" == "$productname" ] || continue
if [ "${zope_products[$entry*3+1]}" == "$version" ]; then
versions="$versions '(X) ${zope_products[$entry*3+1]}' 'true'"
else
versions="$versions '( ) ${zope_products[$entry*3+1]}' \
'zope_instances_set \"$product\" \"${zope_products[$entry*3+2]}\"'"
fi
done
eval "gui_menu zope_instance_update 'Update Zope Instance Product - $productname' \
$versions \
'' '' \
'Uninstall $productname - $version' 'zope_instances_uninstall \"$product\"'"
true
}
zope_instances_edit() {
local instance= line="$1"
gui_input "Please enter a directory which contains the ZOPE instance" "${zope_instances[$line]}" instance
if [ -z "$instance" ]; then
unset zope_instances[$line]
elif [ "${zope_instances[$line]}" != "$instance" ]; then
zope_instances[$line]="$instance"
fi
}
zope_instances_add() {
local instance=
gui_input "Please enter a directory which contains the ZOPE instance" '' instance
if [ -n "$instance" ]; then
zope_instances[${#zope_instances[@]}]="$instance"
fi
}
zope_instances_commit() {
local instance=
for instance in ${!zope_instances[@]}; do
echo "${zope_instances[$instance]}"
done > $INSTANCETAB
}
# populate caches
zope_update_containers
zope_update_products
zope_update_instances
main() {
while gui_menu zope 'ZOPE Manager' \
'Product Containers' 'while zope_containers_menu; do :; done' \
'Available Products' 'while zope_products_menu; do :; done' \
'ZOPE Instances' 'while zope_instances_menu; do :; done'
do :; done
zope_containers_commit
zope_instances_commit
}