psa-api-rpc-8.4.0-sles10.build84080425.21 T > D
, 0 @ a667b471e825e55825e317255a628341428e57ac $n?bx >x > 5 G ? 7 d , D 7 = D F v0 N wh N x N
x N y N f N
N L N N X N
( > @ B $ G P N H N I N X Y Z H [ T \ X N ] N ^ b
d e f k l % C psa-api-rpc 8.4.0 sles10.build84080425.21 Plesk API RPC interface Plesk API provides the Plesk management interface for applications.
This package provides the HTTP RPC XML interface for controlling Plesk. H,bsuses10.plesk.ru
Parallels Commercial license Tools http://www.parallels.com/products/plesk linux noarch #!/bin/sh
#
# Copyright (c) 1999-2008 Parallels
# All rights reserved
#
#
# Plesk script
#
remove_tmp_state()
{
if [ -d "/tmp/.state" ]; then
rm -Rf "/tmp/.state" >> $product_log 2>&1
fi
}
true apache_status_linux_debian apache_stop_BSD
apache_status_linux_debian()
{
get_pid "/usr/sbin/apache2" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
apache_stop_BSD()
{
local apache_script
if [ "$std_to_pkg" -ne 0 ]; then
apache_script="$PRODUCT_ROOT_D/rc.d/httpd"
else
apache_script="$PRODUCT_RC_D/$apache_service_name"
fi
$apache_script stop 2>/dev/null
}
api_rpc_create_persistent_tables()
{
inten="create persistent database storage"
echo_try $inten
$mysql < ${PRODUCT_ROOT_D}/etc/api-rpc/api-rpc_db.sql
if [ "X$?" = "X0" ]; then
suc
else
warn "database initialization"
fi
}
#
# Upgrade triggers should be clever enough to recognize necessity of upgrade
#
upgrade_api_75()
{
if db_test_table secret_keys; then
# secret_keys was created - at least 8.0 version
return
fi
$mysql < ${PRODUCT_ROOT_D}/etc/api-rpc/api-rpc_db_upgrade_750.sql
}
upgrade_api_800()
{
if db_test_column_enum_value exp_event event_type exceeded; then
# 'exceeded' was added in 8.0.1
return
fi
$mysql < ${PRODUCT_ROOT_D}/etc/api-rpc/api-rpc_db_upgrade_800.sql
}
upgrade_api_801()
{
if db_test_column_enum_value exp_event obj_class domain_alias; then
# domain_alias was added in 8.0.1 update
return
fi
$mysql < ${PRODUCT_ROOT_D}/etc/api-rpc/api-rpc_db_upgrade_801.sql
}
upgrade_api_830()
{
$mysql < ${PRODUCT_ROOT_D}/etc/api-rpc/api-rpc_db_upgrade_830.sql
}
upgrade_api_840()
{
$mysql < ${PRODUCT_ROOT_D}/etc/api-rpc/api-rpc_db_upgrade_840.sql
}
#
# End of upgrade triggers
#
api_rpc_upgrade_persistent_tables()
{
inten="upgrade persistent database storage"
echo_try $inten
# As we don't know previous version of the package (for all packaging systems)
# all available database upgrade scripts should be executed.
upgrade_api_75 && \
upgrade_api_800 && \
upgrade_api_801 && \
upgrade_api_830 && \
upgrade_api_840
if [ "X$?" = "X0" ]; then
suc
else
warn "database upgrade"
fi
}
# db_test test_query awk_script
# Runs test_query and processes it with awk_script. If the output is
# not empty, return 0, otherwise return 1. Hint: supply '1' for
# awk_script to test just for the presence of any output.
db_test()
{
local any_db=
eval `sh_get_args '--any-db) any_db=yes;;'`
local test_query="$1"
local awk_script="$2"
if [ -n "$any_db" ]; then
local output="`mysql_raw_anydb -e \"$test_query\" 2>>\"$product_log\"`"
else
local output="`mysql_raw -e \"$test_query\" 2>>\"$product_log\"`"
fi
local status=$?
if [ "$status" -ne 0 ]; then
p_echo "$output"
die "run the following SQL query: $1"
fi
echo -n "$output" | awk -F '\t' -- "$awk_script" | test `wc -l` -ne 0
}
# db_test_table table
# Returns 0 if the table exists
db_test_table()
{
local table="$1"
db_test "SHOW TABLES LIKE '$table'" 1
}
# db_test_column_enum_value
# Returns O if table.column contains value in enum description
db_test_column_enum_value()
{
local table="$1"
local column="$2"
local value="$3"
db_test "DESC \`$table\` \`$column\`" "/[\'\"]$value[\'\"]/ { print 1 }"
}
proftpd_super_server_config()
{
local action="$1"
case "$superserver" in
inetd)
ftp_rec="ftp stream tcp nowait root $PROFTPD_ROOT/sbin/proftpd proftpd -c $PROFTPD_ETC_D/proftpd.conf"
;;
xinetd)
ftp_rec="service ftp
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = root
instances = UNLIMITED
server = $PROFTPD_ROOT/sbin/proftpd
server_args = -c $PROFTPD_ETC_D/proftpd.conf
}"
;;
*)
die "Super server name unknown"
;;
esac
super_server_action "$action" ftp "$ftp_rec"
}
# Keep for compatibility issue
check_mysql()
{
mysql_test_connection
}
# Usage: pleskrc
pleskrc()
{
[ 2 -le $# ] || die "Not enough arguments"
local service_name=$1
local action=$2
local ret=0
local inten
shift
shift
# Now check redefined functions
if test "$machine" = "linux" && is_function "${service_name}_${action}_${machine}_${linux_distr}"; then
"${service_name}_${action}_${machine}_${linux_distr}" $@
return $?
elif is_function "${service_name}_${action}_${machine}"; then
"${service_name}_${action}_${machine}" $@
return $?
elif is_function "${service_name}_${action}"; then
"${service_name}_${action}" $@
return $?
fi
# Not redefined - call default action
eval "service=\$${service_name}_service"
[ -n "$service" ] || die "Empty service name for $service_name"
inten="$action service $service"
[ "$action" = "status" -o "$action" = "exists" ] || echo_try "$inten"
if [ -x "/usr/sbin/invoke-rc.d" ]; then
action_cmd="/usr/sbin/invoke-rc.d $service"
elif [ -x "/sbin/service" ]; then
action_cmd="/sbin/service $service"
elif [ -x "$SYSTEM_RC_D/$service" ]; then
action_cmd="$SYSTEM_RC_D/$service"
elif [ ! -z ${PRODUCT_RC_D} -a -x "$PRODUCT_RC_D/$service" ]; then
action_cmd="$PRODUCT_RC_D/$service"
fi
if [ "$action" = "exists" ]; then
[ -n "$action_cmd" ] && return 0 || return 1
else
[ -z "$action_cmd" ] && die "Unable to handle $service"
fi
case "$action" in
start)
pleskrc $service_name status || $action_cmd $action $@
;;
stop)
if pleskrc $service_name status; then
$action_cmd $action $@
else
true
fi
;;
restart)
if pleskrc $service_name status; then
$action_cmd "restart" $@
else
$action_cmd "start" $@
fi
;;
reload)
if pleskrc $service_name status; then
$action_cmd "reload" $@
else
true
fi
;;
status)
$action_cmd "status"
;;
*)
$action_cmd $action $@
;;
esac
ret="$?"
if [ "$action" != "status" ]; then
[ "$ret" -eq 0 ] && suc || warn $inten
fi
return $ret
}
is_function()
{
local type_output="`LANG=C LC_ALL=C LC_MESSAGES=C type \"$1\" 2>/dev/null | head -n 1`"
case "$type_output" in
*function)
return 0
;;
*)
return 1
;;
esac
}
p_echo()
{
echo "$*" >> "$product_log" 2>&1
echo "$*"
}
pnnl_echo()
{
echo -n "$*" >> "$product_log" 2>&1
echo -n "$*"
}
die()
{
PACKAGE_SCRIPT_FAILED="$*"
if [ "X$trigger_uninstall" != "X1" ]; then
printf "\a\a"
p_echo
p_echo "ERROR while trying to $*"
echo "Check the error reason(see log file: ${product_log}), fix and try again"
p_echo
if [ "X$do_patch" != "X1" -a "X$do_reconfigure" != "X1" ]; then
p_echo "Aborting..."
p_echo
fi
fi
smart_undo_install
selinux_close
exit 1
}
warn()
{
local inten
inten="$1"
p_echo
p_echo "WARNING!"
pnnl_echo "During the $inten found some problems"
echo "(see log file: ${product_log})"
p_echo
p_echo "Continue..."
p_echo
}
echo_try()
{
msg="$*"
pnnl_echo " Trying to $msg... "
}
suc()
{
p_echo "done"
}
mk_backup()
{
target="$1"
dup="$2"
opts="$3"
if [ -L "$target" ]; then
rm "$target"
elif [ -$opts "$target" ]; then
if [ ! -$opts "$target.$product_suffo" ]; then
case "$dup" in
mv)
mv -f $target $target.$product_suffo || die "mv -f $target $target.$product_suff"
;;
cp)
cp -fp $target $target.$product_suffo || die "cp -fp $target $target.$product_suff"
;;
*)
p_echo " mk_backup: wrong option -- must be 'cp' or 'mv'"
die "mk_backup"
;;
esac
else
case "$dup" in
mv)
mv -f $target $target.$product_suff || die "mv -f $target $target.$product_suff"
;;
cp)
cp -fp $target $target.$product_suff || die "cp -fp $target $target.$product_suff"
;;
*)
p_echo " mk_backup: wrong option -- must be 'cp' or 'mv'"
die "mk_backup"
;;
esac
fi
else
case "$opts" in
f|d)
;;
*)
p_echo " mk_backup: wrong option -- must be 'f' or 'd'"
die "mk_backup"
;;
esac
fi
}
detect_vz()
{
local vzcheck_file
PLESK_VZ=0
vzcheck_file="/proc/self/status"
if [ ! -f ${vzcheck_file} ]; then
return 1;
fi
grep -q -E '^envID\:[[:space:]]*([[:digit:]]+)$' < ${vzcheck_file} >/dev/null 2>&1
if [ $? -eq 0 ]; then
PLESK_VZ=1
return 0;
fi
return 1;
}
call_optional_function()
{
export LANG=C LC_MESSAGES=C LC_ALL=C
local type_output="`type \"$1\" 2>/dev/null | head -n 1`"
case "$type_output" in
*function)
"$@"
;;
*)
return 0
;;
esac
}
sh_get_args()
{
echo 'while true; do case "$1" in '"$1"'*) break;; esac; shift; done'
}
sequence()
{
if type seq; then
seq $*
elif type jot; then
jot $*
else
die "Unable to find seq or jot command"
fi
}
superserver_reconfig()
{
pleskrc superserver reload
}
configure_xinetd_compat()
{
local inten="Configure xinetd compatibility mode with $superserver_service"
if [ "$linux_distr" = "debian" -o "$linux_distr" = "ubuntu" ]; then
[ "$superserver_service" = "xinetd" ] || return 1
[ -f "/etc/default/xinetd" ] || return 1
grep -q 'XINETD_OPTS=.*-inetd_compat' /etc/default/xinetd && return 1
echo_try $inten
if ! grep -q '^\s*XINETD_OPTS' /etc/default/xinetd; then
echo 'XINETD_OPTS="-inetd_compat"' >>/etc/default/xinetd
suc
return 0
fi
eval `grep '^\s*XINETD_OPTS' /etc/default/xinetd`
XINETD_OPTS="$XINETD_OPTS -inetd_compat"
local tmp_file=`mktemp /tmp/xinetdXXXXXX`
sed -e "s/XINETD_OPTS.*/XINETD_OPTS=\"$XINETD_OPTS\"/g" /etc/default/xinetd > $tmp_file && mv -f $tmp_file /etc/default/xinetd
suc
return 0
fi
return 1
}
super_server_action()
{
local in out
local action="$1"
local service="$2"
local template="$3"
inten="$action $service service record for $superserver_service daemon"
case "$action" in
remove) ;;
register)
[ -z "$template" ] && die "Template for super server $action was not defined"
;;
comment|disable)
;;
configure)
case "$superserver_mode" in
native)
register_service $superserver_service defaults defaults
;;
compat)
configure_xinetd_compat && pleskrc superserver restart
;;
*)
die "Mode for $superserver_service was not defined"
;;
esac
return 0
;;
*)
die "Some arguments was not defined or defined incorrect for action with super server"
;;
esac
case "$superserver" in
inetd)
super_server_modify_inetd "$service" "$action" "$template"
;;
xinetd)
super_server_modify_xinetd "$service" "$action" "$template"
;;
*)
die "Unable to define super server type"
;;
esac
if [ $? -ne 0 ]; then
die $inten
fi
}
super_server_modify_inetd()
{
local service="$1"
local action="$2"
local template="$3"
case "$action" in
comment|disable)
grep -q "^$service[[:space:]]" $superserver_conf || return 0
sed -e "s|^$service|#$service|g" < "$superserver_conf" > "$superserver_conf.tmp" \
&& mv -f "$superserver_conf.tmp" "$superserver_conf" \
|| return 1
;;
remove)
if [ -x /usr/sbin/update-inetd ]; then
/usr/sbin/update-inetd --enable "$service"
/usr/sbin/update-inetd --remove "$service"
else
grep -q "^$service[[:space:]]" $superserver_conf || return 0
sed -e "s|^$service[[:space:]].*||g" < "$superserver_conf" > "$superserver_conf.tmp" \
&& mv -f "$superserver_conf.tmp" "$superserver_conf" \
|| return 1
fi
;;
register)
if [ -x /usr/sbin/update-inetd ]; then
/usr/sbin/update-inetd --enable "$service"
/usr/sbin/update-inetd --remove "$service"
/usr/sbin/update-inetd --add "$template"
else
egrep -q "$template" $superserver_conf
if [ "$?" -ne "0" ]; then
super_server_modify_inetd comment $service && \
echo "$template" >> $superserver_conf || return 1
fi
fi
;;
esac
return 0
}
super_server_modify_xinetd()
{
local file
local service="$1"
local action="$2"
local template="$3"
for file in $superserver_dir/*; do
grep -q "$service" $file 1>$product_log 2>&1 || continue
case "$action" in
remove)
awk "/^[[:space:]]*(#|[[:space:]])*service[[:space:]]+$service($|[[:space:]]+)/,/.*}.*/ \
{next;} {print}
" <$file >$file.tmp \
&& mv -f $file.tmp $file || return 1
;;
comment)
awk "/^[[:space:]]*service[[:space:]]+$service($|[[:space:]]+)/,/.*}.*/ \
{ print \"#\"\$0; next; }
{print}
" < $file > $file.tmp \
&& mv -f $file.tmp $file || return 1
;;
esac
done
case "$action" in
register)
echo "$template" > "$superserver_dir/${service}_psa" || return 1
;;
disable)
[ -f "$superserver_dir/${service}_psa" ] && mv -f "$superserver_dir/${service}_psa" "$superserver_dir/${service}.psa"
;;
esac
return 0
}
true superserver_status_linux_debian
superserver_status_linux_debian()
{
get_pid "$superserver_binary" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
# here goes functions
package_script_begin_rpm()
{
package_script_begin
}
package_script_end_rpm()
{
package_script_end
}
package_script_begin()
{
local title
if [ "X$process" = "X" ]; then
if [ "X$do_reconfigure" = "X1" ]; then
process="reconfiguration"
elif [ "X$do_upgrade" = "X1" ]; then
process="upgrade"
else
process="installing"
fi
fi
product_log="/tmp/${PACKAGE_NAME}_${PACKAGE_VERSION}_${PACKAGE_RELEASE}_${process}.`date +%y%m%d.%H.%M`.log"
product_problems_log="/tmp/${PACKAGE_NAME}_${PACKAGE_VERSION}_${PACKAGE_RELEASE}_problems.`date +%y%m%d.%H.%M`.log"
title="`package_script_log_title`"
echo "START $title" >>"$product_log" \
&& echo "START $title" >>"$product_problems_log" \
&& chmod 600 "$product_log" "$product_problems_log" \
|| {
echo "Cannot write installation log $product_log, $product_problems_log" >&2
exit 1
}
problems_occured=0
product_default_conf
initial_conf
set_common_params
read_conf
}
package_script_end()
{
local title
title="`package_script_log_title`"
packagemng_set_dirty_flag
echo "STOP $title" >>"$product_log"
echo "STOP $title" >>"$product_problems_log"
}
package_script_log_title()
{
local stage
case "$do_upgrade" in
0) stage="installing";;
1) stage="upgrading";;
*) stage="installing";;
esac
if [ -n "$PACKAGE_DEB_ACTION" ]; then
stage="$stage (deb action: $PACKAGE_DEB_ACTION)"
fi
echo "$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE $stage AT `date`"
}
# NAME VERSION RELEASE [DEB_ACTION]
package_script_call_main_function()
{
package_script_call_main_function_begin "$@"
for package_func in $1; do
if ! call_optional_function "$package_func"; then
break
fi
done
package_script_end_handler ok
}
package_script_call_main_function_begin()
{
PACKAGE_NAME="$2"
PACKAGE_VERSION="$3"
PACKAGE_RELEASE="$4"
PACKAGE_DEB_ACTION="$5"
package_script_begin_this_system
trap "package_script_end_handler error" HUP PIPE INT QUIT TERM EXIT
}
package_script_end_handler()
{
case "$1" in
error)
if [ -z "$PACKAGE_SCRIPT_FAILED" ]; then
PACKAGE_SCRIPT_FAILED="Package script failed"
fi
;;
ok) PACKAGE_SCRIPT_FAILED=
;;
esac
trap - EXIT
package_script_end_this_system
}
package_script_begin_this_system()
{
package_script_begin_rpm
}
package_script_end_this_system()
{
package_script_end_rpm
}
get_pid()
{
local i
local ex_f="$1"
local opt="$2"
local owner="$3"
local min_num="1"
# Use pidof by default, bug 121868
if type pidof >/dev/null 2>&1; then
for pid in `pidof -o $$ -o $PPID -o %PPID -x $ex_f`; do
# Check for owner
[ "$opt" = "true" -a "$owner" != "`ps -p $pid -o ruser=`" ] && continue
min_num=$pid
break
done
common_var=$min_num
return $min_num
fi
case "$opt" in
false)
for i in `$ps_long | grep $ex_f | grep -v grep | grep -v httpsdctl | grep -v apachectl | awk '{print $2}' -`; do
min_num=$i
break
done
;;
true)
for i in `$ps_long | grep $ex_f | grep -v grep | grep -v httpsdctl | grep -v apachectl | grep "$owner" | awk '{print $2}' -`; do
min_num=$i
break
done
;;
*)
p_echo "get_pid: wrong parameter"
die "get_pid $ex_f $opt $owner"
;;
esac
common_var=$min_num
return $min_num
}
kill_pids()
{
ex_f="$1"
owner="$2"
for i in `$ps_long | grep $ex_f | grep -v grep | grep -v httpsdctl | grep -v apachectl | grep $owner | awk '{print $2}' -`; do
if [ $i -gt 1 ]; then
$K_TERM $i >> $product_log 2>&1
fi
done
}
delete_user()
{
local rm_user
rm_user="$1"
# if it is mailman user, remove its crontab from system
if [ "X${rm_user}" = "X${mailman_user}" ]; then
inten="remove crontab of ${rm_user}"
echo "y" | $crontab -u "${mailman_user}" -r >> $product_log 2>&1 || die "$inten"
fi
inten="remove user $rm_user"
echo_try "$inten"
case "$machine" in
BSD)
echo "y" | pw userdel $rm_user>> $product_log 2>&1 && suc
pwd_mkdb /etc/master.passwd >> $product_log 2>&1
;;
linux|solaris)
userdel $rm_user>> $product_log 2>&1 && suc || die "$inten"
;;
Darwin)
niutil -destroy / /users/"$rm_user" >> $product_log 2>&1 && suc || die "$inten"
reload_darwin_netinfo
;;
esac
}
delete_group()
{
local rm_group
rm_group="$1"
inten="remove group $rm_group"
echo_try "$inten"
case "$machine" in
BSD)
pw groupdel $rm_group>> $product_log 2>&1
pwd_mkdb /etc/master.passwd >> $product_log 2>&1
;;
linux|solaris)
mk_backup "/etc/group" cp f
if [ -f "/etc/group" ]; then
sed -e "/$rm_group/d" < /etc/group > /etc/group.tmp || die $inten
mv -f /etc/group.tmp /etc/group >> $product_log 2>&1
if [ "$?" -ne 0 ]; then
rsr_backup "/etc/group" cp f
die $inten
fi
fi
;;
Darwin)
niutil -destroy / /groups/"$rm_group" >> $product_log 2>&1 && suc || die "$inten"
reload_darwin_netinfo
;;
esac
suc
}
reload_darwin_netinfo()
{
if [ -f /var/run/memberd.pid ]; then
kill -HUP `cat /var/run/memberd.pid`
else
SystemStarter start memberd
fi
return 0
}
initial_conf()
{
DEMO_VERSION="no"
PRODNAME="psa"
PRODUCT_NAME="Plesk"
product_full="Plesk"
product=${PRODNAME}
PRODUCT_FULL_NAME="Plesk"
product_etc="/etc/${PRODNAME}"
prod_conf_t="/etc/psa/psa.conf"
prodkey="$product_etc/$PRODNAME.key"
minimal_changes="0"
MYSQL_VERS="4.1.18"
POSTGRESQL_VERS="7.4.11"
EXTERNAL_PACKAGES=""
EXTERNAL_PACKAGES_DIR=""
BUILDER_UID="10007"
PERL5LIB="/usr/local/psa/lib/perl5/site_perl/5.8.8:/usr/local/psa/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi"
export PERL5LIB
support_contact="http://www.parallels.com/support"
sales_email="sales@parallels.com"
product_version="8.4.0"
product_db_version="0840"
product_build="84080425.21"
conceived_os_vendor=SuSE
conceived_os_version="es10"
osrels="sles10"
# This variable contains all versions, which is supported by
# cumulative upgrade
known_product_versions="60 70 71 75 80 81 82 83 84"
prev_product="plesk"
prev_clients_group="${prev_product}cln"
clients_group="${product}cln"
clients_GID=10001
services_group="${product}serv"
services_GID=10003
product_suff="saved_by_${product}".`date "+%m.%d;%H:%M"`
product_suffo="saved_by_${product}"
PREV_PRODUCT_ROOT_D="/usr/local/${prev_product}"
# plesk default password
if [ "X$DEMO_VERSION" = "Xyes" ]; then
PRODUCT_DEFAULT_PASSWORD="plesk"
else
PRODUCT_DEFAULT_PASSWORD="setup"
fi
}
read_conf()
{
if [ -s $prod_conf_t ]; then
tmp_var=`perl -e 'undef $/; $_=<>; s/#.*$//gm;
s/^\s*(\S+)\s*/$1=/mg;
print' $prod_conf_t`
eval $tmp_var
else
if [ "X$do_upgrade" = "X1" ]; then
[ 0$ignore_miss_conf -ne 1 ] && p_echo "Unable to find product configuration file: $prod_conf_t"
return 1
fi
fi
return 0
}
get_my_cnf_param()
{
local my_cnf cnf_files
cnf_files="/etc/my.cnf /etc/mysql/my.cnf /var/db/mysql/my.cnf"
for my_cnf in ${cnf_files}; do
if [ -f ${my_cnf} ]; then
break
fi
done
[ -f ${my_cnf} ] && r=`perl -e '$p="'"$1"'";
undef $/; $_=<>; s/#.*$//gm;
/\[mysqld\](.*?)\[/sg;
$_=substr($1, rindex $1,"$p") and
/$p\s*=(.*)/m and print $1
' ${my_cnf}`
echo $r
}
get_mysql_socket()
{
mysql_socket="/var/lib/mysql/mysql.sock"
local mysqlsock=`get_my_cnf_param socket`
local MYSQL_SOCKETS="/var/lib/mysql/mysql.sock /tmp/mysql.sock /var/run/mysqld/mysqld.sock"
for i in $mysql_socket $mysqlsock $MYSQL_SOCKETS; do
if [ -S "$i" ]; then
MYSQL_UNIX_PORT=$i
export MYSQL_UNIX_PORT
mysql_socket="$i"
break
fi
done
}
#default values
product_default_conf()
{
PRODUCT_ROOT_D=/usr/local/psa
PRODUCT_RC_D=/etc/init.d
PRODUCT_ETC_D=/usr/local/psa/etc
HTTPD_VHOSTS_D=/srv/www/vhosts
HTTPD_CONF_D=/etc/apache2
HTTPD_INCLUDE_D=/etc/apache2/conf.d
HTTPD_BIN_D=/usr/bin
HTTPD_LOG_D=/var/log/apache2
HTTPD_SERVICE=apache2
QMAIL_ROOT_D=/var/qmail
QMAIL_MAILNAMES_D=/var/qmail/mailnames
RBLSMTPD=/usr/sbin/rblsmtpd
COURIER_IMAP_ROOT_D=/
FTPD_CONF=/etc/proftpd.conf
FTPD_CONF_INC=/etc/proftpd.include
FTPD_BIN_D=/usr/bin
FTPD_VAR_D=/var/run/proftpd
FTPD_SCOREBOARD=/var/run/proftpd/scoreboard
NAMED_RUN_ROOT_D=/var/lib/named
NAMED_OPTIONS_CONF=/etc/named.conf.include.plesk-options
NAMED_ZONES_CONF=/etc/named.conf.include.plesk-zones
WEB_STAT=/usr/bin/webalizer
LOGROTATE=/usr/local/psa/logrotate/sbin/logrotate
MYSQL_VAR_D=/var/lib/mysql
MYSQL_BIN_D=/usr/bin
PGSQL_DATA_D=/var/lib/pgsql/data
PGSQL_BIN_D=/usr/bin
DUMP_D=/var/lib/psa/dumps
MAILMAN_ROOT_D=/usr/lib/mailman
MAILMAN_VAR_D=/var/lib/mailman
PYTHON_BIN=/usr/bin/python2.4
CATALINA_HOME=/usr/share/tomcat5
DRWEB_ROOT_D=/opt/drweb
DRWEB_ETC_D=/etc/drweb
GPG_BIN=/usr/bin/gpg
TAR_BIN=/bin/tar
CURL_CA_BUNDLE_FILE=/usr/share/curl/curl-ca-bundle.crt
AWSTATS_ETC_D=/etc/awstats
AWSTATS_BIN_D=/srv/www/cgi-bin/awstats
AWSTATS_TOOLS_D=/usr/share/awstats
AWSTATS_DOC_D=/usr/share/apache2/icons/awstats
OPENSSL_BIN=/usr/bin/openssl
LIB_SSL_PATH=/lib/libssl.so
LIB_CRYPTO_PATH=/lib/libcrypto.so
CLIENT_PHP_BIN=/usr/local/psa/bin/php-cli
}
# Warning! use this function only for Linux not for FreeBSD
# This function tries to register service in different ways
# call register_service qmail priority levels_start levels_stop
# Only first parameter is necessessary
register_service_linux(){
local name=$1
local levels_start=$2
local levels_stop=$3
local priority=$4
local updatercd="/usr/sbin/update-rc.d"
local chkconfig="/sbin/chkconfig"
local insserv="/sbin/insserv"
if [ -z "$name" ]; then
return 0
fi
[ -z "$priority" ] && priority=20
local inten="register service $name"
echo_try $inten
if [ -x "$updatercd" ]; then
p_echo " using $updatercd"
if [ "X$levels_start" != "Xdefaults" -a -n "$levels_start" ]; then
start="start 20 $levels_start ."
fi
if [ "X$levels_stop" != "Xdefaults" -a -n "$levels_stop" ]; then
stop="stop 20 $levels_stop ."
fi
if [ -z "$start$stop" ]; then
$updatercd $name defaults 20 || warn $inten
else
$updatercd $name $start $stop || warn $inten
fi
elif [ -x "$insserv" ]; then
p_echo " using $insserv"
$insserv -f $name >/dev/null 2>&1 || warn $inten
elif [ -x "$chkconfig" ]; then
p_echo " using $chkconfig"
$chkconfig --add $name || warn $inten
if [ "X$levels_start" != "Xdefaults" -a -n "$levels_start" ]; then
$chkconfig --level `echo $levels_start | tr -d ' '` $name on || warn $inten
fi
if [ "X$levels_start" != "Xdefaults" -a -n "$levels_stop" ]; then
$chkconfig --level `echo $levels_stop | tr -d ' '` $name off || warn $inten
fi
else
die "Unable to find suitable application for register: $updatercd, $chkconfig or $insserv"
fi
suc
}
#Need for register/unregister services into /etc/rc.conf for BSD OSes.
#Create or change strings such as service_option_variable="variable"
rc_service()
{
local service="$1"
local option="$2"
local variable="$3"
local comment="$4"
local config="/etc/rc.conf"
if [ "X$variable" = "Xdefault" ]; then
remove_option_string "${service}_${option}" "$config"
return 0
fi
if [ ! -f /etc/rc.conf ]; then
die 'File /etc/rc.conf not found!'
fi
if [ "X$service" = "X" -o "X$option" = "X" -o "X$variable" = "X" ]; then
die
fi
local flag="`grep "${service}_${option}" $config`"
if [ "X$flag" = "X" ]; then
if [ "X$comment" = "Xyes" ]; then
echo "#Option for $service created by Plesk installer." >> $config
fi
echo "${service}_${option}=\"${variable}\"" >> $config || die
else
sed -i "" -e 's|\('"${service}_${option}"'.*=\"\).*|\1'"${variable}"'\"|' $config || die
fi
return 0
}
register_service()
{
register_service_linux "$@"
}
remove_option_string()
{
#using: remove_option_string
substring="$1"
file="$2"
awk '{
if ($0 ~ "^'"$substring"'") {
next;
};
print $0;
}' < $file > $file.tmp
mv $file.tmp $file
}
selinux_close()
{
if [ -z "$SELINUX_ENFORCE" -o "$SELINUX_ENFORCE" = "Disabled" ]; then
return
fi
setenforce "$SELINUX_ENFORCE"
}
#set_params
set_common_params()
{
common_var=0
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
LANG=C
export PATH LANG
umask 022
ulimit -n 65535 2>/dev/null
K_HUP="/bin/kill -HUP"
K_KILL="/bin/kill -KILL"
K_TERM="/bin/kill -TERM"
K_USR2="/bin/kill -USR2"
users_created=""
groups_created=""
certificate_file="$PRODUCT_ETC_D/httpsd.pem"
services="/etc/services"
mtab="/etc/mtab"
[ -f "/etc/rsyslog.conf" ] && syslog_conf="/etc/rsyslog.conf" || syslog_conf="/etc/syslog.conf"
syslog_conf_ng="/etc/syslog-ng/syslog-ng.conf"
get_hostname="hostname"
get_domainname="domainname"
#VZP used to determine that we're inside SVE
vza_file="/var/vzagent"
#default parameters
tar="tar"
crontab="/usr/bin/crontab"
cp_preserve="cp -p"
SYSTEM_RC_D=/etc/init.d
set_common_params_linux
detect_vz
}
set_common_params_linux()
{
get_hostname="hostname -f"
fstab="/etc/fstab"
cp_preserve="cp --preserve=all --remove-destination"
machine="linux"
sendmail="/usr/sbin/sendmail"
ps="ps axw"
ps_long="ps axuw"
false_shell="/bin/false"
dummy_home="/"
compress="gzip -9 -c"
uncompress="gunzip -c"
uudecode="uudecode -o /dev/stdout"
ifconfig="/sbin/ifconfig -a"
inet_str="inet addr"
if [ -f /etc/slackware-version ]; then
linux_distr="slackware"
useradd_options=""
sndml_ini="/etc/rc.d/init.d/sendmail"
mail_local="/usr/libexec/mail.local"
dummy_shell=""
named_osrelease=0
else
useradd_options="-M"
if [ -f /etc/mandrake-release ]; then
linux_distr="mandrake"
elif [ -f /etc/fedora-release ]; then
linux_distr="fedora"
elif [ -f /etc/SuSE-release ]; then
linux_distr="suse"
elif [ -f /etc/debian_version ]; then
linux_distr="debian"
get_domainname="dnsdomainname"
useradd_options=""
else
linux_distr="redhat"
fi
sndml_ini="/etc/init.d/sendmail"
mail_local="/usr/libexec/mail.local"
if [ -x /sbin/nologin ]; then
dummy_shell="/sbin/nologin"
else
dummy_shell="/bin/false"
fi
bash_shell="/bin/bash"
rbash_shell="/bin/rbash"
uudecode_full="/usr/bin/uudecode"
named_osrelease=`cat /proc/sys/kernel/osrelease | perl -F"/[.-]/" -n -a -e 'printf "%02u%02u%02u\n", $F[0],$F[1],$F[2]'`
fi
return 0
}
packagemng_set_dirty_flag()
{
if [ -f ${PRODUCT_ROOT_D}/admin/bin/packagemng ]; then
${PRODUCT_ROOT_D}/admin/bin/packagemng --set-dirty-flag 1>>$product_log 2>&1
fi
}
remove_modules()
{
p_echo
p_echo "===> Removing modules"
local moduledir
for moduledir in $PRODUCT_ROOT_D/var/modules/*; do
if [ -d "$moduledir" -a -x "$moduledir/uninstall" ]; then
local module=`basename $moduledist`
echo_try "uninstall $module module"
"$moduledir/uninstall" && suc || warn "uninstallation of $module module"
fi
done
}
# mysql
set_mysqld_params()
{
mysql_user="mysql"
mysql_UID=3306
mysql_group="mysql"
mysql_GID=3306
product_db_sql="$PRODUCT_ETC_D/db/${PRODNAME}_db.sql"
set_mysql_server_params
set_mysql_client_params
}
## @@constructor set_mysqld_params
set_mysql_server_params()
{
local service
MYSQL_ROOT="$PRODUCT_ROOT_D/mysql"
mysql_bindir="$MYSQL_BIN_D"
get_mysql_socket
if [ -x "${PRODUCT_RC_D}/mysql" ]; then
mysql_service="mysql"
elif [ -x "${PRODUCT_RC_D}/mysql.sh" ]; then
mysql_service="mysql.sh"
elif [ -x "${PRODUCT_RC_D}/mysqld" ]; then
mysql_service="mysqld"
elif [ -x "${PRODUCT_RC_D}/mysql" ]; then
mysql_service="mysql"
elif [ "X$DEMO_VERSION" = "Xyes" ]; then
mysql_service="mysqld"
else
die "$inten"
fi
}
true mysql_start mysql_stop mysql_status
set_mysql_client_params()
{
mysql_client="$MYSQL_BIN_D/mysql"
# Override these variables as needed
mysql_db_name="$PRODNAME"
mysql_passwd_file="$product_etc/.${PRODNAME}.shadow"
prev_mysql_passwd_file="$PREV_PRODUCT_ROOT_D/admin/conf/admin.conf"
if [ -z "$mysql_unconfigured" ];then
# Need for mysql_status related function
set_mysql_server_params
set_mysql_auth
fi
mysql_args="-N"
mysql_args_raw="-Br"
# For backward compatibility only, should use mysql() and mysql_raw() instead
mysql=mysql
mysql_raw=mysql_raw
}
# iF YOUR package want to use mysql db you must call this function directly
set_mysql_auth()
{
local inten="set up mysql authentification"
get_admin_passwd
pleskrc mysql start 1
mysql_user="--user=admin"
mysql_passwd="--password=$admin_passwd"
unset mysql_defaults
mysql_test_connection || die "$inten"
suc
}
get_admin_passwd()
{
[ -z "$admin_passwd" ] || return 0
if [ -f "$mysql_passwd_file" ]; then
admin_passwd=`cat "$mysql_passwd_file"`
return 0
fi
admin_passwd="$PRODUCT_DEFAULT_PASSWORD"
}
#Invoke mysql
mysql()
{
mysql_anydb -D$mysql_db_name "$@"
}
mysql_anydb()
{
if test -z "$DB_IS_MYSQL41_COMPATIBLE"; then
mysql41_init
fi
if [ "$DB_IS_MYSQL41_COMPATIBLE" != "compatible" -a "X$machine" != "XBSD" ]; then
mysql41_exec_wrapper $mysql_client $mysql_user $mysql_passwd $mysql_args "$@" 2>>"$product_log"
else
$mysql_client $mysql_user $mysql_passwd $mysql_args "$@" 2>>"$product_log"
fi
local status=$?
if [ $status -gt 0 ]; then
$mysql_client $mysql_user $mysql_passwd $mysql_args -D$mysql_db_name $mysql_args_raw -e "show innodb status" >>"$product_log" 2>&1
fi
return $status
}
# the function removes the "character set xxx" and "collate xxx" construction
# from -e * arguments, if there are any.
# otherwise, it removes the same things from standard input
mysql41_exec_wrapper()
{
perl -e '$has_command = 0;
$program = $ARGV[0];
splice (@ARGV, 0, 1);
sub remove_charsets($)
{
$refStr = shift;
$$refStr =~ s/\b(medium|long|tiny)?text\s+character\s+set\s+binary(\s+collate\s+[\w]+)?\b/ $1blob /ig;
$$refStr =~ s/\b(medium|long|tiny)?text\s+character\s+set\s+[\w]+\s+collate\s+[\w]+_bin\b/ $1blob /ig;
$$refStr =~ s/(\bcharacter\s+set\s+binary(\s+collate\s+[\w]+)?\b)/ binary /ig;
$$refStr =~ s/(\bcharacter\s+set\s+[\w]+\s+collate\s+[\w]+_bin\b)/ binary /ig;
$$refStr =~ s/(\b(character\s+set|collate)\s+[\w]+\b)//ig;
}
foreach $n (0 .. $#ARGV) {
if ($ARGV[$n] eq "-e") {
$has_command = 1;
remove_charsets \($ARGV[$n + 1]);
}
}
if ($has_command) {
exec $program, @ARGV or die "Cannot execute mysql";
} else {
open out_command, "|-", $program, @ARGV or die "Cannot start mysql";
while () {
remove_charsets \($_);
print out_command $_;
}
close out_command or die($! ? "Mysql returned an error: $!" : "Mysql exited with non-zero status $?");
}' -- "$@"
}
# Invoke mysql without any wrapper or something else
mysql_direct()
{
$mysql_client $mysql_defaults $mysql_user $mysql_passwd $mysql_args "$@" 2>>"$product_log"
}
# Invoke mysql in raw mode
mysql_raw()
{
mysql $mysql_args_raw "$@"
}
mysql_raw_anydb()
{
mysql_anydb $mysql_args_raw "$@"
}
mysql_start()
{
mysql_start_linux
if [ -z "$1" ]; then
mysql_test_connection 5 || die "Unable to perform test connection to mysql"
fi
}
mysql_start_linux()
{
mysql_start_common
}
mysql_start_common()
{
local inten count
inten="start MySQL server"
echo_try $inten
mysql_status >> $product_log 2>&1 \
&& return 0
$PRODUCT_RC_D/$mysql_service start >> $product_log 2>&1
for i in `sequence 60`; do
mysql_status && return
sleep 1
done
die $inten
}
mysql_test_connection()
{
inten="establish test connection"
echo_try $inten
attempts=${1:-1}
for i in `sequence $attempts`; do
echo "" | mysql_direct mysql >> "$product_log" 2>&1
if [ "$?" -eq "0" ]; then
p_echo "connected"
return 0
fi
[ "$attempts" -eq "1" ] || sleep 1
done
return 1
}
mysql41_init()
{
# not_installed is the default state
# we must init it to avoid endless cycle
DB_IS_MYSQL41_COMPATIBLE=not_installed
if ! mysql_anydb >"$product_log" 2>&1; then
return
fi
if db_test --any-db "SHOW VARIABLES LIKE 'version'" '$2 !~ /^(3|4\.0)\./'; then
# if database is not yet initiailized, assume it compatible
# otherwise, check the flag
if
db_test --any-db "SHOW DATABASES" '/^psa$/' \
&& db_test "SHOW TABLES" '/^misc$/' \
&& ! db_test "SELECT val FROM misc WHERE param = 'mysql41_compatible'" '/true/'
then
DB_IS_MYSQL41_COMPATIBLE='not_compatible'
else
DB_IS_MYSQL41_COMPATIBLE='compatible'
fi
fi
}
### FIXME: probably need var service_restart warn
mysql_stop()
{
local op_result i
inten="stop MySQL server"
echo_try $inten
$PRODUCT_RC_D/$mysql_service stop >> $product_log 2>&1
op_result=$?
if [ "X$linux_distr" = "Xdebian" ]; then
# Debian has well designed mysql stopping code
[ "$op_result" -eq 0 ] || die $inten
suc
return 0
fi
for i in 2 4 6 8 16; do
if ! mysql_status ; then
suc
return 0
fi
case $machine in
BSD*|Darwin*)
#In BSD systems mysqld must to be killed without -9 flag
killall mysqld mysqld_safe >> $product_log 2>&1
;;
*)
# I just want to be sure that mysql really stopped
killall -9 mysqld mysql safe_mysqld mysqld_safe >> $product_log 2>&1
;;
esac
sleep $i
done
die "$inten"
}
mysql_status()
{
local file
#Check with native script first
#debian script always return 0. bug #111825
[ "X$linux_distr" = "Xdebian" ] && msqld_status_supported="no"
if [ -z "$msqld_status_supported" ]; then
# MySQL AB packages doesn't know about status command
if LC_MESSAGES=C $PRODUCT_RC_D/$mysql_service 2>&1 | grep -q "status"; then
msqld_status_supported="yes"
else
msqld_status_supported="no"
fi
fi
if [ "$msqld_status_supported" = "yes" ]; then
# Common RPM mysql's and FreeBSD
$PRODUCT_RC_D/$mysql_service status >> $product_log 2>&1 \
&& return 0
fi
if [ "$msqld_status_supported" = "no" ]; then
# MySQL AB packages
file="/usr/sbin/mysqld"
fi
if [ -x "$file" ]; then
#standard build and debian
get_pid "$file" false
pid=$common_var
if test "$pid" -ne 1; then
echo "$file (pid $pid) is running..." >>$product_log 2>&1
return 0
else
echo "$file is stopped" >>$product_log 2>&1
return 1
fi
fi
return 1
}
true named_status_linux_debian
named_status_linux_debian()
{
get_pid "/usr/sbin/named" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
poppassd_super_server_config()
{
local action="$1"
case "$superserver" in
inetd)
case "$machine" in
BSD*)
poppassd_rec="poppassd stream tcp nowait/1000 root /usr/libexec/tcpd $PRODUCT_ROOT_D/admin/bin/poppassd"
;;
*)
poppassd_rec="poppassd stream tcp nowait/1000 root /usr/sbin/tcpd $PRODUCT_ROOT_D/admin/bin/poppassd"
;;
esac
;;
xinetd)
poppassd_rec="service poppassd
{
socket_type = stream
protocol = tcp
port = 106
wait = no
disable = no
user = root
instances = 1000
flags = KEEPALIVE
server = $PRODUCT_ROOT_D/admin/bin/poppassd
}"
;;
*)
die "Super server name unknown"
;;
esac
super_server_action "$action" poppassd "$poppassd_rec"
}
true syslog_status_linux_debian
syslog_status_linux_debian()
{
get_pid "$syslog_binary" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
## @@constructor set_syslog_params
qmail_super_server_config()
{
local action="$1"
local service="$2"
case "$superserver" in
inetd)
qmail_inetd_templates
;;
xinetd)
qmail_xinetd_templates
;;
*)
die "Super server name unknown"
;;
esac
eval "template=\$${service}_rec"
super_server_action "$action" "$service" "$template"
}
qmail_inetd_templates()
{
maxconn=''
if [ "$linux_distr" = "debian" ]; then
maxconn='.1000'
fi
smtp_rec="smtp stream tcp nowait$maxconn root $QMAIL_DIR/bin/tcp-env tcp-env /usr/bin/env SMTPAUTH=1 END=1 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $QMAIL_DIR/bin/true $QMAIL_DIR/bin/cmd5checkpw $QMAIL_DIR/bin/true"
smtps_rec="smtps stream tcp nowait$maxconn root $QMAIL_DIR/bin/tcp-env tcp-env /usr/bin/env SMTPAUTH=1 END=1 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $QMAIL_DIR/bin/true $QMAIL_DIR/bin/cmd5checkpw $QMAIL_DIR/bin/true"
submission_rec="submission stream tcp nowait$maxconn qmaild $QMAIL_DIR/bin/tcp-env tcp-env /usr/bin/env SUBMISSION=1 SMTPAUTH=1 END=1 $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $QMAIL_DIR/bin/true $QMAIL_DIR/bin/cmd5checkpw $QMAIL_DIR/bin/true"
}
qmail_xinetd_templates()
{
local TRUE_BIN
TRUE_BIN=$QMAIL_DIR/bin/true
smtp_rec="service smtp
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = root
instances = UNLIMITED
env = SMTPAUTH=1
server = $QMAIL_DIR/bin/tcp-env
server_args = -Rt0 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $TRUE_BIN $QMAIL_DIR/bin/cmd5checkpw $TRUE_BIN
}"
smtps_rec="service smtps
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = root
instances = UNLIMITED
env = SMTPAUTH=1
server = $QMAIL_DIR/bin/tcp-env
server_args = -Rt0 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $TRUE_BIN $QMAIL_DIR/bin/cmd5checkpw $TRUE_BIN
}"
submission_rec="service submission
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = qmaild
instances = UNLIMITED
env = SUBMISSION=1 SMTPAUTH=1
server = $QMAIL_DIR/bin/tcp-env
server_args = -Rt0 $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $TRUE_BIN $QMAIL_DIR/bin/cmd5checkpw $TRUE_BIN
}"
}
rsr_backup()
{
target="$1"
dup="$2"
opts="$3"
common_var=0
# if [ -$opts "$target" ]; then
if [ -$opts "$target.$product_suff" ]; then
case "$dup" in
mv)
mv -f $target.$product_suff $target>> $product_log 2>&1
common_var=1
return 1
;;
cp)
cp -fp $target.$product_suff $target>> $product_log 2>&1
common_var=1
return 1
;;
*)
p_echo " rsr_backup: wrong option -- must be 'cp' or 'mv'"
;;
esac
else
if [ -$opts "$target.$product_suffo" ]; then
case "$dup" in
mv)
mv -f $target.$product_suffo $target>> $product_log 2>&1
common_var=1
return 1
;;
cp)
cp -fp $target.$product_suffo $target>> $product_log 2>&1
common_var=1
return 1
;;
*)
p_echo " rsr_backup: wrong option -- must be 'cp' or 'mv'"
;;
esac
fi
fi
# else
# case "$opts" in
# f|d)
# ;;
# *)
# p_echo " rsr_backup: wrong option -- must be 'f' or 'd'"
# ;;
# esac
# fi
}
restore_named()
{
cd "$PRODUCT_ROOT_D" >> $product_log 2>&1
[ -f /etc/sysconfig/named ] && mv -f "/etc/sysconfig/named" "/etc/sysconfig/named.bak"
rsr_backup "/etc/sysconfig/named" mv f
[ -L $named_conf ] && rm -f "$named_conf"
rsr_backup "$named_conf" mv f
[ -L $rndc_conf ] && rm -f "$rndc_conf"
rsr_backup "$rndc_conf" mv f
case "$machine" in
BSD*)
rsr_backup /etc/named.boot mv f
;;
linux)
case "$linux_distr" in
redhat)
chkconfig --add named >> $product_log 2>&1
# std_named_sh="/etc/rc.d/init.d/named"
# rsr_backup $std_named_sh mv f
# if [ -f "$std_named_sh" ]; then
# mv -f "$std_named_sh.${product}" "$std_named_sh"
# fi
;;
slackware)
rsr_backup /etc/rc.d/rc.inet2 cp f
;;
esac
rsr_backup /etc/named.boot mv f
;;
solaris)
rsr_backup /etc/named.boot mv f
;;
esac
}
restore_sendmail()
{
[ -L $sendmail ] && rm -f "$sendmail"
[ -L /usr/lib/sendmail ] && rm -f "/usr/lib/sendmail"
rsr_backup "$sendmail" mv f
case "$machine" in
BSDI)
rsr_backup /etc/sendmail.cf mv f
;;
*)
;;
esac
if [ -f "$mail_local" ]; then
# case "$machine" in
# BSD)
# chflags schg "$mail_local" >> $product_log 2>&1
# ;;
# *)
# ;;
# esac
rsr_backup "$mail_local" mv f
chmod 4555 "$mail_local" >> $product_log 2>&1
fi
case "$machine" in
linux )
case "$linux_distr" in
redhat)
chkconfig --add sendmail >> $product_log 2>&1
# rsr_backup "$sndml_ini" mv f
;;
slackware)
rsr_backup /etc/rc.d/rc.M mv f
;;
esac
;;
solaris)
rsr_backup "$sndml_ini" mv f
;;
*)
;;
esac
}
delete_startup_scripts()
{
cd "$PRODUCT_ROOT_D" >> $product_log 2>&1
case "$machine" in
BSD)
rm -f /usr/local/etc/rc.d/${product}.sh >> $product_log 2>&1
# rsr_backup /etc/rc.conf cp f
rc_service "sendmail" "enable" "YES"
rc_service "named" "enable" "YES"
rc_service "mysqld" "enable" "NO"
;;
BSDI)
if [ -f /etc/rc.local.${product} ]; then
cp -p /etc/rc.local.${product} /etc/rc.local >> $product_log 2>&1
fi
;;
linux)
case "$linux_distr" in
redhat)
chkconfig --del ${product}
rm -f /etc/rc.d/init.d/${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc0.d/K15${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc1.d/K15${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc2.d/K15${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc3.d/S77${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc4.d/S77${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc5.d/S77${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc6.d/K15${product} >> $product_log 2>&1
;;
slackware)
if [ -f /etc/rc.d/rc.local.${product} ]; then
cp -p /etc/rc.d/rc.local.${product} /etc/rc.d/rc.local >> $product_log 2>&1
fi
;;
esac
;;
solaris)
rm -f /etc/init.d/${product} >> $product_log 2>&1
if [ -f /etc/rc0.d/K01${product} ]; then
rm -f /etc/rc0.d/K01${product} >> $product_log 2>&1
fi
if [ -f /etc/rc1.d/K01${product} ]; then
rm -f /etc/rc1.d/K01${product} >> $product_log 2>&1
fi
if [ -f /etc/rc2.d/S77${product} ]; then
rm -f /etc/rc2.d/S77${product} >> $product_log 2>&1
fi
;;
esac
}
delete_crontab()
{
$crontab -l 2>/dev/null > /tmp/crontab.${product}
sed -e "s/^.*\/${product}\/admin\/sbin\/statistics.*//g" \
-e "s/^.*\/${product}\/bin\/mysqldump.*//g" \
-e "s/^.*\/usr\/sbin\/ntpdate.*//g" \
< /tmp/crontab.${product} > /tmp/crontab.${product}_tmp
mv -f /tmp/crontab.${product}_tmp /tmp/crontab.${product} >> $product_log 2>&1
$crontab /tmp/crontab.${product} >> $product_log 2>&1
rm -f /tmp/crontab.${product} >> $product_log 2>&1
}
remove_ftpuser()
{
user=$1
ftpusers_file="/etc/ftpusers"
egrep "^$user" $ftpusers_file >> /dev/null 2>&1
case "$?" in
0)
sed -e "/$user/d" < $ftpusers_file > $ftpusers_file.tmp
mv -f $ftpusers_file.tmp $ftpusers_file
;;
1)
;;
*)
;;
esac
}
remove_product_users_groups()
{
# delete users of this(unsuccessful) installation
for i in $users_created; do
delete_user "$i"
done
# delete users with group=psacln (ftpusers and webusers)
for i in `perl -e '$gid=getgrnam("'$clients_group'"); exit if (($gid eq "") || ($gid == 0)); while(($n,$u,$g) = (getpwent)[0,2,3]) {print "$n\n" if (($gid == $g) && ($u >= 500))}'`
do
delete_user "$i"
remove_ftpuser "$i"
done
# delete users psaadm, psaftp
# delete_user "$admin_user" >> "$product_log" 2>&1
# delete_user "$anonftp_user" >> "$product_log" 2>&1
# delete groups of this(unsuccessful) installation
for i in $groups_created; do
delete_group "$i"
done
# delete groups psaadm, psaftp, psacln
delete_group "$admin_group" >> "$product_log" 2>&1
delete_group "$anonftp_group" >> "$product_log" 2>&1
delete_group "$clients_group" >> "$product_log" 2>&1
}
undo_install()
{
p_echo
if pleskrc mysql status; then
p_echo "===>Removing installed $PRODUCT_NAME components ... "
remove_modules
pleskrc mysql stop
mysql_pid_file=$mysql_bddir/*.pid
if [ -f "$mysql_pid_file" ]; then
rm -f "$mysql_pid_file"
fi
fi
$START_SH stop >> "$product_log" 2>&1
proftpd_super_server_config remove
super_server_action remove pop3
super_server_action remove pop-3
super_server_action remove imap4
super_server_action remove imap2
super_server_action remove imap
qmail_super_server_config remove smtp
qmail_super_server_config remove smtps
qmail_super_server_config remove submission
poppassd_super_server_config remove
remove_product_users_groups
if [ -f "/etc/ftpchroot" ]; then
sed -e "s/^@$clients_group//g" < /etc/ftpchroot > /etc/ftpchroot.tmp
mv -f /etc/ftpchroot.tmp /etc/ftpchroot >> $product_log 2>&1
fi
if [ -f /etc/shells ]; then
case "$machine" in
BSD|BSDI)
sed -e "s/[/]*sbin[/]*nologin//" < /etc/shells > /etc/shells.tmp
;;
linux|solaris)
sed -e "s/[/]*bin[/]*false//" < /etc/shells > /etc/shells.tmp
;;
esac
mv -f /etc/shells.tmp /etc/shells >> $product_log 2>&1
fi
remove_tmp_state
restore_named
restore_sendmail
delete_startup_scripts
delete_crontab
cd /usr/local >> $product_log 2>&1
suc
}
smart_undo_install()
{
[ "X$trigger_uninstall" = "X1" -o "X$do_patch" = "X1" -o "X$do_reconfigure" = "X1" ] && return
[ "X$PLESK_INSTALLER_NOUNDO" != "X" ] && return
# trigger_uninstall - trigger what smart_undo_install is already working now(recurrence)
trigger_uninstall=1
if [ "X$can_uninstall" = "X1" ]; then
if [ "X$do_upgrade" = "X1" ]; then
undo_upgrade
else
if [ "X$machine" != "XBSD" ]; then
undo_install
fi
fi
fi
# put suggestions for user what to do
call_optional_function failure_note
}
undo_upgrade()
{
p_echo " The attempt to upgrade $prev_product_full"
p_echo " from version $prev_version to $product_full $product_version has failed."
if [ -f "$product_sav_tar" ]; then
p_echo
p_echo " Now restore contents of $PRODUCT_NAME from $product_sav_tar"
p_echo
get_pid $PRODUCT_ROOT_D/mysql/bin/safe_mysqld true root
req_pid=$common_var
if [ $req_pid -gt 1 ]; then
$K_KILL $req_pid >> $product_log 2>&1
sleep 2
mysql_pid_file=$mysql_bddir/*.pid
kill_pids $PRODUCT_ROOT_D/mysql/libexec/mysqld mysql
sleep 2
if [ -f "$mysql_pid_file" ]; then
rm -f $mysql_pid_file
fi
fi
$START_SH stop >> $product_log 2>&1
sleep 2
rm -Rf $PRODUCT_ROOT_D
qmail_super_server_config remove "smtp"
qmail_super_server_config remove "smtps"
proftpd_super_server_config remove
poppassd_super_server_config remove
cd /
tar xvf $product_sav_tar > /dev/null 2>&1
case "$?" in
0)
# rm -f $product_sav_tar
;;
*)
p_echo
p_echo
p_echo "ERROR: restoration of files from $product_sav_tar has failed."
p_echo " Please restore them manually."
p_echo
p_echo "Exiting..."
p_echo
exit 0
;;
esac
fi
}
api_rpc_common_main()
{
# product_conf
# read_conf
# set_common_params
set_mysqld_params
check_mysql
}
api_rpc_install_post()
{
api_rpc_common_main
api_rpc_create_persistent_tables
}
api_rpc_upgrade_new_post()
{
api_rpc_common_main
api_rpc_upgrade_persistent_tables
}
if [ "X${PLESK_INSTALLER_DEBUG}" != "X" ]; then
set -x
fi
do_upgrade=0
if [ "0$1" -le 1 ]; then
package_script_call_main_function api_rpc_install_post psa-api-rpc 8.4.0 sles10.build84080425.21
else
# We are the new upgrading package
do_upgrade=1
package_script_call_main_function api_rpc_upgrade_new_post psa-api-rpc 8.4.0 sles10.build84080425.21
fi #!/bin/sh
#
# Copyright (c) 1999-2008 Parallels
# All rights reserved
#
#
# Plesk script
#
remove_tmp_state()
{
if [ -d "/tmp/.state" ]; then
rm -Rf "/tmp/.state" >> $product_log 2>&1
fi
}
true apache_status_linux_debian apache_stop_BSD
apache_status_linux_debian()
{
get_pid "/usr/sbin/apache2" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
apache_stop_BSD()
{
local apache_script
if [ "$std_to_pkg" -ne 0 ]; then
apache_script="$PRODUCT_ROOT_D/rc.d/httpd"
else
apache_script="$PRODUCT_RC_D/$apache_service_name"
fi
$apache_script stop 2>/dev/null
}
api_rpc_remove_persistent_tables()
{
inten="clear persistent database storage"
echo_try $inten
echo "DROP TABLE IF EXISTS exp_event, secret_keys" | $mysql
if [ "X$?" = "X0" ]; then
suc
else
warn "database cleanup"
fi
}
# db_test test_query awk_script
# Runs test_query and processes it with awk_script. If the output is
# not empty, return 0, otherwise return 1. Hint: supply '1' for
# awk_script to test just for the presence of any output.
db_test()
{
local any_db=
eval `sh_get_args '--any-db) any_db=yes;;'`
local test_query="$1"
local awk_script="$2"
if [ -n "$any_db" ]; then
local output="`mysql_raw_anydb -e \"$test_query\" 2>>\"$product_log\"`"
else
local output="`mysql_raw -e \"$test_query\" 2>>\"$product_log\"`"
fi
local status=$?
if [ "$status" -ne 0 ]; then
p_echo "$output"
die "run the following SQL query: $1"
fi
echo -n "$output" | awk -F '\t' -- "$awk_script" | test `wc -l` -ne 0
}
proftpd_super_server_config()
{
local action="$1"
case "$superserver" in
inetd)
ftp_rec="ftp stream tcp nowait root $PROFTPD_ROOT/sbin/proftpd proftpd -c $PROFTPD_ETC_D/proftpd.conf"
;;
xinetd)
ftp_rec="service ftp
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = root
instances = UNLIMITED
server = $PROFTPD_ROOT/sbin/proftpd
server_args = -c $PROFTPD_ETC_D/proftpd.conf
}"
;;
*)
die "Super server name unknown"
;;
esac
super_server_action "$action" ftp "$ftp_rec"
}
# Keep for compatibility issue
check_mysql()
{
mysql_test_connection
}
# Usage: pleskrc
pleskrc()
{
[ 2 -le $# ] || die "Not enough arguments"
local service_name=$1
local action=$2
local ret=0
local inten
shift
shift
# Now check redefined functions
if test "$machine" = "linux" && is_function "${service_name}_${action}_${machine}_${linux_distr}"; then
"${service_name}_${action}_${machine}_${linux_distr}" $@
return $?
elif is_function "${service_name}_${action}_${machine}"; then
"${service_name}_${action}_${machine}" $@
return $?
elif is_function "${service_name}_${action}"; then
"${service_name}_${action}" $@
return $?
fi
# Not redefined - call default action
eval "service=\$${service_name}_service"
[ -n "$service" ] || die "Empty service name for $service_name"
inten="$action service $service"
[ "$action" = "status" -o "$action" = "exists" ] || echo_try "$inten"
if [ -x "/usr/sbin/invoke-rc.d" ]; then
action_cmd="/usr/sbin/invoke-rc.d $service"
elif [ -x "/sbin/service" ]; then
action_cmd="/sbin/service $service"
elif [ -x "$SYSTEM_RC_D/$service" ]; then
action_cmd="$SYSTEM_RC_D/$service"
elif [ ! -z ${PRODUCT_RC_D} -a -x "$PRODUCT_RC_D/$service" ]; then
action_cmd="$PRODUCT_RC_D/$service"
fi
if [ "$action" = "exists" ]; then
[ -n "$action_cmd" ] && return 0 || return 1
else
[ -z "$action_cmd" ] && die "Unable to handle $service"
fi
case "$action" in
start)
pleskrc $service_name status || $action_cmd $action $@
;;
stop)
if pleskrc $service_name status; then
$action_cmd $action $@
else
true
fi
;;
restart)
if pleskrc $service_name status; then
$action_cmd "restart" $@
else
$action_cmd "start" $@
fi
;;
reload)
if pleskrc $service_name status; then
$action_cmd "reload" $@
else
true
fi
;;
status)
$action_cmd "status"
;;
*)
$action_cmd $action $@
;;
esac
ret="$?"
if [ "$action" != "status" ]; then
[ "$ret" -eq 0 ] && suc || warn $inten
fi
return $ret
}
is_function()
{
local type_output="`LANG=C LC_ALL=C LC_MESSAGES=C type \"$1\" 2>/dev/null | head -n 1`"
case "$type_output" in
*function)
return 0
;;
*)
return 1
;;
esac
}
p_echo()
{
echo "$*" >> "$product_log" 2>&1
echo "$*"
}
pnnl_echo()
{
echo -n "$*" >> "$product_log" 2>&1
echo -n "$*"
}
die()
{
PACKAGE_SCRIPT_FAILED="$*"
if [ "X$trigger_uninstall" != "X1" ]; then
printf "\a\a"
p_echo
p_echo "ERROR while trying to $*"
echo "Check the error reason(see log file: ${product_log}), fix and try again"
p_echo
if [ "X$do_patch" != "X1" -a "X$do_reconfigure" != "X1" ]; then
p_echo "Aborting..."
p_echo
fi
fi
smart_undo_install
selinux_close
exit 1
}
warn()
{
local inten
inten="$1"
p_echo
p_echo "WARNING!"
pnnl_echo "During the $inten found some problems"
echo "(see log file: ${product_log})"
p_echo
p_echo "Continue..."
p_echo
}
echo_try()
{
msg="$*"
pnnl_echo " Trying to $msg... "
}
suc()
{
p_echo "done"
}
mk_backup()
{
target="$1"
dup="$2"
opts="$3"
if [ -L "$target" ]; then
rm "$target"
elif [ -$opts "$target" ]; then
if [ ! -$opts "$target.$product_suffo" ]; then
case "$dup" in
mv)
mv -f $target $target.$product_suffo || die "mv -f $target $target.$product_suff"
;;
cp)
cp -fp $target $target.$product_suffo || die "cp -fp $target $target.$product_suff"
;;
*)
p_echo " mk_backup: wrong option -- must be 'cp' or 'mv'"
die "mk_backup"
;;
esac
else
case "$dup" in
mv)
mv -f $target $target.$product_suff || die "mv -f $target $target.$product_suff"
;;
cp)
cp -fp $target $target.$product_suff || die "cp -fp $target $target.$product_suff"
;;
*)
p_echo " mk_backup: wrong option -- must be 'cp' or 'mv'"
die "mk_backup"
;;
esac
fi
else
case "$opts" in
f|d)
;;
*)
p_echo " mk_backup: wrong option -- must be 'f' or 'd'"
die "mk_backup"
;;
esac
fi
}
detect_vz()
{
local vzcheck_file
PLESK_VZ=0
vzcheck_file="/proc/self/status"
if [ ! -f ${vzcheck_file} ]; then
return 1;
fi
grep -q -E '^envID\:[[:space:]]*([[:digit:]]+)$' < ${vzcheck_file} >/dev/null 2>&1
if [ $? -eq 0 ]; then
PLESK_VZ=1
return 0;
fi
return 1;
}
call_optional_function()
{
export LANG=C LC_MESSAGES=C LC_ALL=C
local type_output="`type \"$1\" 2>/dev/null | head -n 1`"
case "$type_output" in
*function)
"$@"
;;
*)
return 0
;;
esac
}
sh_get_args()
{
echo 'while true; do case "$1" in '"$1"'*) break;; esac; shift; done'
}
sequence()
{
if type seq; then
seq $*
elif type jot; then
jot $*
else
die "Unable to find seq or jot command"
fi
}
superserver_reconfig()
{
pleskrc superserver reload
}
configure_xinetd_compat()
{
local inten="Configure xinetd compatibility mode with $superserver_service"
if [ "$linux_distr" = "debian" -o "$linux_distr" = "ubuntu" ]; then
[ "$superserver_service" = "xinetd" ] || return 1
[ -f "/etc/default/xinetd" ] || return 1
grep -q 'XINETD_OPTS=.*-inetd_compat' /etc/default/xinetd && return 1
echo_try $inten
if ! grep -q '^\s*XINETD_OPTS' /etc/default/xinetd; then
echo 'XINETD_OPTS="-inetd_compat"' >>/etc/default/xinetd
suc
return 0
fi
eval `grep '^\s*XINETD_OPTS' /etc/default/xinetd`
XINETD_OPTS="$XINETD_OPTS -inetd_compat"
local tmp_file=`mktemp /tmp/xinetdXXXXXX`
sed -e "s/XINETD_OPTS.*/XINETD_OPTS=\"$XINETD_OPTS\"/g" /etc/default/xinetd > $tmp_file && mv -f $tmp_file /etc/default/xinetd
suc
return 0
fi
return 1
}
super_server_action()
{
local in out
local action="$1"
local service="$2"
local template="$3"
inten="$action $service service record for $superserver_service daemon"
case "$action" in
remove) ;;
register)
[ -z "$template" ] && die "Template for super server $action was not defined"
;;
comment|disable)
;;
configure)
case "$superserver_mode" in
native)
register_service $superserver_service defaults defaults
;;
compat)
configure_xinetd_compat && pleskrc superserver restart
;;
*)
die "Mode for $superserver_service was not defined"
;;
esac
return 0
;;
*)
die "Some arguments was not defined or defined incorrect for action with super server"
;;
esac
case "$superserver" in
inetd)
super_server_modify_inetd "$service" "$action" "$template"
;;
xinetd)
super_server_modify_xinetd "$service" "$action" "$template"
;;
*)
die "Unable to define super server type"
;;
esac
if [ $? -ne 0 ]; then
die $inten
fi
}
super_server_modify_inetd()
{
local service="$1"
local action="$2"
local template="$3"
case "$action" in
comment|disable)
grep -q "^$service[[:space:]]" $superserver_conf || return 0
sed -e "s|^$service|#$service|g" < "$superserver_conf" > "$superserver_conf.tmp" \
&& mv -f "$superserver_conf.tmp" "$superserver_conf" \
|| return 1
;;
remove)
if [ -x /usr/sbin/update-inetd ]; then
/usr/sbin/update-inetd --enable "$service"
/usr/sbin/update-inetd --remove "$service"
else
grep -q "^$service[[:space:]]" $superserver_conf || return 0
sed -e "s|^$service[[:space:]].*||g" < "$superserver_conf" > "$superserver_conf.tmp" \
&& mv -f "$superserver_conf.tmp" "$superserver_conf" \
|| return 1
fi
;;
register)
if [ -x /usr/sbin/update-inetd ]; then
/usr/sbin/update-inetd --enable "$service"
/usr/sbin/update-inetd --remove "$service"
/usr/sbin/update-inetd --add "$template"
else
egrep -q "$template" $superserver_conf
if [ "$?" -ne "0" ]; then
super_server_modify_inetd comment $service && \
echo "$template" >> $superserver_conf || return 1
fi
fi
;;
esac
return 0
}
super_server_modify_xinetd()
{
local file
local service="$1"
local action="$2"
local template="$3"
for file in $superserver_dir/*; do
grep -q "$service" $file 1>$product_log 2>&1 || continue
case "$action" in
remove)
awk "/^[[:space:]]*(#|[[:space:]])*service[[:space:]]+$service($|[[:space:]]+)/,/.*}.*/ \
{next;} {print}
" <$file >$file.tmp \
&& mv -f $file.tmp $file || return 1
;;
comment)
awk "/^[[:space:]]*service[[:space:]]+$service($|[[:space:]]+)/,/.*}.*/ \
{ print \"#\"\$0; next; }
{print}
" < $file > $file.tmp \
&& mv -f $file.tmp $file || return 1
;;
esac
done
case "$action" in
register)
echo "$template" > "$superserver_dir/${service}_psa" || return 1
;;
disable)
[ -f "$superserver_dir/${service}_psa" ] && mv -f "$superserver_dir/${service}_psa" "$superserver_dir/${service}.psa"
;;
esac
return 0
}
true superserver_status_linux_debian
superserver_status_linux_debian()
{
get_pid "$superserver_binary" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
# here goes functions
package_script_begin_rpm()
{
package_script_begin
}
package_script_end_rpm()
{
package_script_end
}
package_script_begin()
{
local title
if [ "X$process" = "X" ]; then
if [ "X$do_reconfigure" = "X1" ]; then
process="reconfiguration"
elif [ "X$do_upgrade" = "X1" ]; then
process="upgrade"
else
process="installing"
fi
fi
product_log="/tmp/${PACKAGE_NAME}_${PACKAGE_VERSION}_${PACKAGE_RELEASE}_${process}.`date +%y%m%d.%H.%M`.log"
product_problems_log="/tmp/${PACKAGE_NAME}_${PACKAGE_VERSION}_${PACKAGE_RELEASE}_problems.`date +%y%m%d.%H.%M`.log"
title="`package_script_log_title`"
echo "START $title" >>"$product_log" \
&& echo "START $title" >>"$product_problems_log" \
&& chmod 600 "$product_log" "$product_problems_log" \
|| {
echo "Cannot write installation log $product_log, $product_problems_log" >&2
exit 1
}
problems_occured=0
product_default_conf
initial_conf
set_common_params
read_conf
}
package_script_end()
{
local title
title="`package_script_log_title`"
packagemng_set_dirty_flag
echo "STOP $title" >>"$product_log"
echo "STOP $title" >>"$product_problems_log"
}
package_script_log_title()
{
local stage
case "$do_upgrade" in
0) stage="installing";;
1) stage="upgrading";;
*) stage="installing";;
esac
if [ -n "$PACKAGE_DEB_ACTION" ]; then
stage="$stage (deb action: $PACKAGE_DEB_ACTION)"
fi
echo "$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE $stage AT `date`"
}
# NAME VERSION RELEASE [DEB_ACTION]
package_script_call_main_function()
{
package_script_call_main_function_begin "$@"
for package_func in $1; do
if ! call_optional_function "$package_func"; then
break
fi
done
package_script_end_handler ok
}
package_script_call_main_function_begin()
{
PACKAGE_NAME="$2"
PACKAGE_VERSION="$3"
PACKAGE_RELEASE="$4"
PACKAGE_DEB_ACTION="$5"
package_script_begin_this_system
trap "package_script_end_handler error" HUP PIPE INT QUIT TERM EXIT
}
package_script_end_handler()
{
case "$1" in
error)
if [ -z "$PACKAGE_SCRIPT_FAILED" ]; then
PACKAGE_SCRIPT_FAILED="Package script failed"
fi
;;
ok) PACKAGE_SCRIPT_FAILED=
;;
esac
trap - EXIT
package_script_end_this_system
}
package_script_begin_this_system()
{
package_script_begin_rpm
}
package_script_end_this_system()
{
package_script_end_rpm
}
get_pid()
{
local i
local ex_f="$1"
local opt="$2"
local owner="$3"
local min_num="1"
# Use pidof by default, bug 121868
if type pidof >/dev/null 2>&1; then
for pid in `pidof -o $$ -o $PPID -o %PPID -x $ex_f`; do
# Check for owner
[ "$opt" = "true" -a "$owner" != "`ps -p $pid -o ruser=`" ] && continue
min_num=$pid
break
done
common_var=$min_num
return $min_num
fi
case "$opt" in
false)
for i in `$ps_long | grep $ex_f | grep -v grep | grep -v httpsdctl | grep -v apachectl | awk '{print $2}' -`; do
min_num=$i
break
done
;;
true)
for i in `$ps_long | grep $ex_f | grep -v grep | grep -v httpsdctl | grep -v apachectl | grep "$owner" | awk '{print $2}' -`; do
min_num=$i
break
done
;;
*)
p_echo "get_pid: wrong parameter"
die "get_pid $ex_f $opt $owner"
;;
esac
common_var=$min_num
return $min_num
}
kill_pids()
{
ex_f="$1"
owner="$2"
for i in `$ps_long | grep $ex_f | grep -v grep | grep -v httpsdctl | grep -v apachectl | grep $owner | awk '{print $2}' -`; do
if [ $i -gt 1 ]; then
$K_TERM $i >> $product_log 2>&1
fi
done
}
delete_user()
{
local rm_user
rm_user="$1"
# if it is mailman user, remove its crontab from system
if [ "X${rm_user}" = "X${mailman_user}" ]; then
inten="remove crontab of ${rm_user}"
echo "y" | $crontab -u "${mailman_user}" -r >> $product_log 2>&1 || die "$inten"
fi
inten="remove user $rm_user"
echo_try "$inten"
case "$machine" in
BSD)
echo "y" | pw userdel $rm_user>> $product_log 2>&1 && suc
pwd_mkdb /etc/master.passwd >> $product_log 2>&1
;;
linux|solaris)
userdel $rm_user>> $product_log 2>&1 && suc || die "$inten"
;;
Darwin)
niutil -destroy / /users/"$rm_user" >> $product_log 2>&1 && suc || die "$inten"
reload_darwin_netinfo
;;
esac
}
delete_group()
{
local rm_group
rm_group="$1"
inten="remove group $rm_group"
echo_try "$inten"
case "$machine" in
BSD)
pw groupdel $rm_group>> $product_log 2>&1
pwd_mkdb /etc/master.passwd >> $product_log 2>&1
;;
linux|solaris)
mk_backup "/etc/group" cp f
if [ -f "/etc/group" ]; then
sed -e "/$rm_group/d" < /etc/group > /etc/group.tmp || die $inten
mv -f /etc/group.tmp /etc/group >> $product_log 2>&1
if [ "$?" -ne 0 ]; then
rsr_backup "/etc/group" cp f
die $inten
fi
fi
;;
Darwin)
niutil -destroy / /groups/"$rm_group" >> $product_log 2>&1 && suc || die "$inten"
reload_darwin_netinfo
;;
esac
suc
}
reload_darwin_netinfo()
{
if [ -f /var/run/memberd.pid ]; then
kill -HUP `cat /var/run/memberd.pid`
else
SystemStarter start memberd
fi
return 0
}
initial_conf()
{
DEMO_VERSION="no"
PRODNAME="psa"
PRODUCT_NAME="Plesk"
product_full="Plesk"
product=${PRODNAME}
PRODUCT_FULL_NAME="Plesk"
product_etc="/etc/${PRODNAME}"
prod_conf_t="/etc/psa/psa.conf"
prodkey="$product_etc/$PRODNAME.key"
minimal_changes="0"
MYSQL_VERS="4.1.18"
POSTGRESQL_VERS="7.4.11"
EXTERNAL_PACKAGES=""
EXTERNAL_PACKAGES_DIR=""
BUILDER_UID="10007"
PERL5LIB="/usr/local/psa/lib/perl5/site_perl/5.8.8:/usr/local/psa/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi"
export PERL5LIB
support_contact="http://www.parallels.com/support"
sales_email="sales@parallels.com"
product_version="8.4.0"
product_db_version="0840"
product_build="84080425.21"
conceived_os_vendor=SuSE
conceived_os_version="es10"
osrels="sles10"
# This variable contains all versions, which is supported by
# cumulative upgrade
known_product_versions="60 70 71 75 80 81 82 83 84"
prev_product="plesk"
prev_clients_group="${prev_product}cln"
clients_group="${product}cln"
clients_GID=10001
services_group="${product}serv"
services_GID=10003
product_suff="saved_by_${product}".`date "+%m.%d;%H:%M"`
product_suffo="saved_by_${product}"
PREV_PRODUCT_ROOT_D="/usr/local/${prev_product}"
# plesk default password
if [ "X$DEMO_VERSION" = "Xyes" ]; then
PRODUCT_DEFAULT_PASSWORD="plesk"
else
PRODUCT_DEFAULT_PASSWORD="setup"
fi
}
read_conf()
{
if [ -s $prod_conf_t ]; then
tmp_var=`perl -e 'undef $/; $_=<>; s/#.*$//gm;
s/^\s*(\S+)\s*/$1=/mg;
print' $prod_conf_t`
eval $tmp_var
else
if [ "X$do_upgrade" = "X1" ]; then
[ 0$ignore_miss_conf -ne 1 ] && p_echo "Unable to find product configuration file: $prod_conf_t"
return 1
fi
fi
return 0
}
get_my_cnf_param()
{
local my_cnf cnf_files
cnf_files="/etc/my.cnf /etc/mysql/my.cnf /var/db/mysql/my.cnf"
for my_cnf in ${cnf_files}; do
if [ -f ${my_cnf} ]; then
break
fi
done
[ -f ${my_cnf} ] && r=`perl -e '$p="'"$1"'";
undef $/; $_=<>; s/#.*$//gm;
/\[mysqld\](.*?)\[/sg;
$_=substr($1, rindex $1,"$p") and
/$p\s*=(.*)/m and print $1
' ${my_cnf}`
echo $r
}
get_mysql_socket()
{
mysql_socket="/var/lib/mysql/mysql.sock"
local mysqlsock=`get_my_cnf_param socket`
local MYSQL_SOCKETS="/var/lib/mysql/mysql.sock /tmp/mysql.sock /var/run/mysqld/mysqld.sock"
for i in $mysql_socket $mysqlsock $MYSQL_SOCKETS; do
if [ -S "$i" ]; then
MYSQL_UNIX_PORT=$i
export MYSQL_UNIX_PORT
mysql_socket="$i"
break
fi
done
}
#default values
product_default_conf()
{
PRODUCT_ROOT_D=/usr/local/psa
PRODUCT_RC_D=/etc/init.d
PRODUCT_ETC_D=/usr/local/psa/etc
HTTPD_VHOSTS_D=/srv/www/vhosts
HTTPD_CONF_D=/etc/apache2
HTTPD_INCLUDE_D=/etc/apache2/conf.d
HTTPD_BIN_D=/usr/bin
HTTPD_LOG_D=/var/log/apache2
HTTPD_SERVICE=apache2
QMAIL_ROOT_D=/var/qmail
QMAIL_MAILNAMES_D=/var/qmail/mailnames
RBLSMTPD=/usr/sbin/rblsmtpd
COURIER_IMAP_ROOT_D=/
FTPD_CONF=/etc/proftpd.conf
FTPD_CONF_INC=/etc/proftpd.include
FTPD_BIN_D=/usr/bin
FTPD_VAR_D=/var/run/proftpd
FTPD_SCOREBOARD=/var/run/proftpd/scoreboard
NAMED_RUN_ROOT_D=/var/lib/named
NAMED_OPTIONS_CONF=/etc/named.conf.include.plesk-options
NAMED_ZONES_CONF=/etc/named.conf.include.plesk-zones
WEB_STAT=/usr/bin/webalizer
LOGROTATE=/usr/local/psa/logrotate/sbin/logrotate
MYSQL_VAR_D=/var/lib/mysql
MYSQL_BIN_D=/usr/bin
PGSQL_DATA_D=/var/lib/pgsql/data
PGSQL_BIN_D=/usr/bin
DUMP_D=/var/lib/psa/dumps
MAILMAN_ROOT_D=/usr/lib/mailman
MAILMAN_VAR_D=/var/lib/mailman
PYTHON_BIN=/usr/bin/python2.4
CATALINA_HOME=/usr/share/tomcat5
DRWEB_ROOT_D=/opt/drweb
DRWEB_ETC_D=/etc/drweb
GPG_BIN=/usr/bin/gpg
TAR_BIN=/bin/tar
CURL_CA_BUNDLE_FILE=/usr/share/curl/curl-ca-bundle.crt
AWSTATS_ETC_D=/etc/awstats
AWSTATS_BIN_D=/srv/www/cgi-bin/awstats
AWSTATS_TOOLS_D=/usr/share/awstats
AWSTATS_DOC_D=/usr/share/apache2/icons/awstats
OPENSSL_BIN=/usr/bin/openssl
LIB_SSL_PATH=/lib/libssl.so
LIB_CRYPTO_PATH=/lib/libcrypto.so
CLIENT_PHP_BIN=/usr/local/psa/bin/php-cli
}
# Warning! use this function only for Linux not for FreeBSD
# This function tries to register service in different ways
# call register_service qmail priority levels_start levels_stop
# Only first parameter is necessessary
register_service_linux(){
local name=$1
local levels_start=$2
local levels_stop=$3
local priority=$4
local updatercd="/usr/sbin/update-rc.d"
local chkconfig="/sbin/chkconfig"
local insserv="/sbin/insserv"
if [ -z "$name" ]; then
return 0
fi
[ -z "$priority" ] && priority=20
local inten="register service $name"
echo_try $inten
if [ -x "$updatercd" ]; then
p_echo " using $updatercd"
if [ "X$levels_start" != "Xdefaults" -a -n "$levels_start" ]; then
start="start 20 $levels_start ."
fi
if [ "X$levels_stop" != "Xdefaults" -a -n "$levels_stop" ]; then
stop="stop 20 $levels_stop ."
fi
if [ -z "$start$stop" ]; then
$updatercd $name defaults 20 || warn $inten
else
$updatercd $name $start $stop || warn $inten
fi
elif [ -x "$insserv" ]; then
p_echo " using $insserv"
$insserv -f $name >/dev/null 2>&1 || warn $inten
elif [ -x "$chkconfig" ]; then
p_echo " using $chkconfig"
$chkconfig --add $name || warn $inten
if [ "X$levels_start" != "Xdefaults" -a -n "$levels_start" ]; then
$chkconfig --level `echo $levels_start | tr -d ' '` $name on || warn $inten
fi
if [ "X$levels_start" != "Xdefaults" -a -n "$levels_stop" ]; then
$chkconfig --level `echo $levels_stop | tr -d ' '` $name off || warn $inten
fi
else
die "Unable to find suitable application for register: $updatercd, $chkconfig or $insserv"
fi
suc
}
#Need for register/unregister services into /etc/rc.conf for BSD OSes.
#Create or change strings such as service_option_variable="variable"
rc_service()
{
local service="$1"
local option="$2"
local variable="$3"
local comment="$4"
local config="/etc/rc.conf"
if [ "X$variable" = "Xdefault" ]; then
remove_option_string "${service}_${option}" "$config"
return 0
fi
if [ ! -f /etc/rc.conf ]; then
die 'File /etc/rc.conf not found!'
fi
if [ "X$service" = "X" -o "X$option" = "X" -o "X$variable" = "X" ]; then
die
fi
local flag="`grep "${service}_${option}" $config`"
if [ "X$flag" = "X" ]; then
if [ "X$comment" = "Xyes" ]; then
echo "#Option for $service created by Plesk installer." >> $config
fi
echo "${service}_${option}=\"${variable}\"" >> $config || die
else
sed -i "" -e 's|\('"${service}_${option}"'.*=\"\).*|\1'"${variable}"'\"|' $config || die
fi
return 0
}
register_service()
{
register_service_linux "$@"
}
remove_option_string()
{
#using: remove_option_string
substring="$1"
file="$2"
awk '{
if ($0 ~ "^'"$substring"'") {
next;
};
print $0;
}' < $file > $file.tmp
mv $file.tmp $file
}
selinux_close()
{
if [ -z "$SELINUX_ENFORCE" -o "$SELINUX_ENFORCE" = "Disabled" ]; then
return
fi
setenforce "$SELINUX_ENFORCE"
}
#set_params
set_common_params()
{
common_var=0
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
LANG=C
export PATH LANG
umask 022
ulimit -n 65535 2>/dev/null
K_HUP="/bin/kill -HUP"
K_KILL="/bin/kill -KILL"
K_TERM="/bin/kill -TERM"
K_USR2="/bin/kill -USR2"
users_created=""
groups_created=""
certificate_file="$PRODUCT_ETC_D/httpsd.pem"
services="/etc/services"
mtab="/etc/mtab"
[ -f "/etc/rsyslog.conf" ] && syslog_conf="/etc/rsyslog.conf" || syslog_conf="/etc/syslog.conf"
syslog_conf_ng="/etc/syslog-ng/syslog-ng.conf"
get_hostname="hostname"
get_domainname="domainname"
#VZP used to determine that we're inside SVE
vza_file="/var/vzagent"
#default parameters
tar="tar"
crontab="/usr/bin/crontab"
cp_preserve="cp -p"
SYSTEM_RC_D=/etc/init.d
set_common_params_linux
detect_vz
}
set_common_params_linux()
{
get_hostname="hostname -f"
fstab="/etc/fstab"
cp_preserve="cp --preserve=all --remove-destination"
machine="linux"
sendmail="/usr/sbin/sendmail"
ps="ps axw"
ps_long="ps axuw"
false_shell="/bin/false"
dummy_home="/"
compress="gzip -9 -c"
uncompress="gunzip -c"
uudecode="uudecode -o /dev/stdout"
ifconfig="/sbin/ifconfig -a"
inet_str="inet addr"
if [ -f /etc/slackware-version ]; then
linux_distr="slackware"
useradd_options=""
sndml_ini="/etc/rc.d/init.d/sendmail"
mail_local="/usr/libexec/mail.local"
dummy_shell=""
named_osrelease=0
else
useradd_options="-M"
if [ -f /etc/mandrake-release ]; then
linux_distr="mandrake"
elif [ -f /etc/fedora-release ]; then
linux_distr="fedora"
elif [ -f /etc/SuSE-release ]; then
linux_distr="suse"
elif [ -f /etc/debian_version ]; then
linux_distr="debian"
get_domainname="dnsdomainname"
useradd_options=""
else
linux_distr="redhat"
fi
sndml_ini="/etc/init.d/sendmail"
mail_local="/usr/libexec/mail.local"
if [ -x /sbin/nologin ]; then
dummy_shell="/sbin/nologin"
else
dummy_shell="/bin/false"
fi
bash_shell="/bin/bash"
rbash_shell="/bin/rbash"
uudecode_full="/usr/bin/uudecode"
named_osrelease=`cat /proc/sys/kernel/osrelease | perl -F"/[.-]/" -n -a -e 'printf "%02u%02u%02u\n", $F[0],$F[1],$F[2]'`
fi
return 0
}
packagemng_set_dirty_flag()
{
if [ -f ${PRODUCT_ROOT_D}/admin/bin/packagemng ]; then
${PRODUCT_ROOT_D}/admin/bin/packagemng --set-dirty-flag 1>>$product_log 2>&1
fi
}
remove_modules()
{
p_echo
p_echo "===> Removing modules"
local moduledir
for moduledir in $PRODUCT_ROOT_D/var/modules/*; do
if [ -d "$moduledir" -a -x "$moduledir/uninstall" ]; then
local module=`basename $moduledist`
echo_try "uninstall $module module"
"$moduledir/uninstall" && suc || warn "uninstallation of $module module"
fi
done
}
# mysql
set_mysqld_params()
{
mysql_user="mysql"
mysql_UID=3306
mysql_group="mysql"
mysql_GID=3306
product_db_sql="$PRODUCT_ETC_D/db/${PRODNAME}_db.sql"
set_mysql_server_params
set_mysql_client_params
}
## @@constructor set_mysqld_params
set_mysql_server_params()
{
local service
MYSQL_ROOT="$PRODUCT_ROOT_D/mysql"
mysql_bindir="$MYSQL_BIN_D"
get_mysql_socket
if [ -x "${PRODUCT_RC_D}/mysql" ]; then
mysql_service="mysql"
elif [ -x "${PRODUCT_RC_D}/mysql.sh" ]; then
mysql_service="mysql.sh"
elif [ -x "${PRODUCT_RC_D}/mysqld" ]; then
mysql_service="mysqld"
elif [ -x "${PRODUCT_RC_D}/mysql" ]; then
mysql_service="mysql"
elif [ "X$DEMO_VERSION" = "Xyes" ]; then
mysql_service="mysqld"
else
die "$inten"
fi
}
true mysql_start mysql_stop mysql_status
set_mysql_client_params()
{
mysql_client="$MYSQL_BIN_D/mysql"
# Override these variables as needed
mysql_db_name="$PRODNAME"
mysql_passwd_file="$product_etc/.${PRODNAME}.shadow"
prev_mysql_passwd_file="$PREV_PRODUCT_ROOT_D/admin/conf/admin.conf"
if [ -z "$mysql_unconfigured" ];then
# Need for mysql_status related function
set_mysql_server_params
set_mysql_auth
fi
mysql_args="-N"
mysql_args_raw="-Br"
# For backward compatibility only, should use mysql() and mysql_raw() instead
mysql=mysql
mysql_raw=mysql_raw
}
# iF YOUR package want to use mysql db you must call this function directly
set_mysql_auth()
{
local inten="set up mysql authentification"
get_admin_passwd
pleskrc mysql start 1
mysql_user="--user=admin"
mysql_passwd="--password=$admin_passwd"
unset mysql_defaults
mysql_test_connection || die "$inten"
suc
}
get_admin_passwd()
{
[ -z "$admin_passwd" ] || return 0
if [ -f "$mysql_passwd_file" ]; then
admin_passwd=`cat "$mysql_passwd_file"`
return 0
fi
admin_passwd="$PRODUCT_DEFAULT_PASSWORD"
}
#Invoke mysql
mysql()
{
mysql_anydb -D$mysql_db_name "$@"
}
mysql_anydb()
{
if test -z "$DB_IS_MYSQL41_COMPATIBLE"; then
mysql41_init
fi
if [ "$DB_IS_MYSQL41_COMPATIBLE" != "compatible" -a "X$machine" != "XBSD" ]; then
mysql41_exec_wrapper $mysql_client $mysql_user $mysql_passwd $mysql_args "$@" 2>>"$product_log"
else
$mysql_client $mysql_user $mysql_passwd $mysql_args "$@" 2>>"$product_log"
fi
local status=$?
if [ $status -gt 0 ]; then
$mysql_client $mysql_user $mysql_passwd $mysql_args -D$mysql_db_name $mysql_args_raw -e "show innodb status" >>"$product_log" 2>&1
fi
return $status
}
# the function removes the "character set xxx" and "collate xxx" construction
# from -e * arguments, if there are any.
# otherwise, it removes the same things from standard input
mysql41_exec_wrapper()
{
perl -e '$has_command = 0;
$program = $ARGV[0];
splice (@ARGV, 0, 1);
sub remove_charsets($)
{
$refStr = shift;
$$refStr =~ s/\b(medium|long|tiny)?text\s+character\s+set\s+binary(\s+collate\s+[\w]+)?\b/ $1blob /ig;
$$refStr =~ s/\b(medium|long|tiny)?text\s+character\s+set\s+[\w]+\s+collate\s+[\w]+_bin\b/ $1blob /ig;
$$refStr =~ s/(\bcharacter\s+set\s+binary(\s+collate\s+[\w]+)?\b)/ binary /ig;
$$refStr =~ s/(\bcharacter\s+set\s+[\w]+\s+collate\s+[\w]+_bin\b)/ binary /ig;
$$refStr =~ s/(\b(character\s+set|collate)\s+[\w]+\b)//ig;
}
foreach $n (0 .. $#ARGV) {
if ($ARGV[$n] eq "-e") {
$has_command = 1;
remove_charsets \($ARGV[$n + 1]);
}
}
if ($has_command) {
exec $program, @ARGV or die "Cannot execute mysql";
} else {
open out_command, "|-", $program, @ARGV or die "Cannot start mysql";
while () {
remove_charsets \($_);
print out_command $_;
}
close out_command or die($! ? "Mysql returned an error: $!" : "Mysql exited with non-zero status $?");
}' -- "$@"
}
# Invoke mysql without any wrapper or something else
mysql_direct()
{
$mysql_client $mysql_defaults $mysql_user $mysql_passwd $mysql_args "$@" 2>>"$product_log"
}
# Invoke mysql in raw mode
mysql_raw()
{
mysql $mysql_args_raw "$@"
}
mysql_raw_anydb()
{
mysql_anydb $mysql_args_raw "$@"
}
mysql_start()
{
mysql_start_linux
if [ -z "$1" ]; then
mysql_test_connection 5 || die "Unable to perform test connection to mysql"
fi
}
mysql_start_linux()
{
mysql_start_common
}
mysql_start_common()
{
local inten count
inten="start MySQL server"
echo_try $inten
mysql_status >> $product_log 2>&1 \
&& return 0
$PRODUCT_RC_D/$mysql_service start >> $product_log 2>&1
for i in `sequence 60`; do
mysql_status && return
sleep 1
done
die $inten
}
mysql_test_connection()
{
inten="establish test connection"
echo_try $inten
attempts=${1:-1}
for i in `sequence $attempts`; do
echo "" | mysql_direct mysql >> "$product_log" 2>&1
if [ "$?" -eq "0" ]; then
p_echo "connected"
return 0
fi
[ "$attempts" -eq "1" ] || sleep 1
done
return 1
}
mysql41_init()
{
# not_installed is the default state
# we must init it to avoid endless cycle
DB_IS_MYSQL41_COMPATIBLE=not_installed
if ! mysql_anydb >"$product_log" 2>&1; then
return
fi
if db_test --any-db "SHOW VARIABLES LIKE 'version'" '$2 !~ /^(3|4\.0)\./'; then
# if database is not yet initiailized, assume it compatible
# otherwise, check the flag
if
db_test --any-db "SHOW DATABASES" '/^psa$/' \
&& db_test "SHOW TABLES" '/^misc$/' \
&& ! db_test "SELECT val FROM misc WHERE param = 'mysql41_compatible'" '/true/'
then
DB_IS_MYSQL41_COMPATIBLE='not_compatible'
else
DB_IS_MYSQL41_COMPATIBLE='compatible'
fi
fi
}
### FIXME: probably need var service_restart warn
mysql_stop()
{
local op_result i
inten="stop MySQL server"
echo_try $inten
$PRODUCT_RC_D/$mysql_service stop >> $product_log 2>&1
op_result=$?
if [ "X$linux_distr" = "Xdebian" ]; then
# Debian has well designed mysql stopping code
[ "$op_result" -eq 0 ] || die $inten
suc
return 0
fi
for i in 2 4 6 8 16; do
if ! mysql_status ; then
suc
return 0
fi
case $machine in
BSD*|Darwin*)
#In BSD systems mysqld must to be killed without -9 flag
killall mysqld mysqld_safe >> $product_log 2>&1
;;
*)
# I just want to be sure that mysql really stopped
killall -9 mysqld mysql safe_mysqld mysqld_safe >> $product_log 2>&1
;;
esac
sleep $i
done
die "$inten"
}
mysql_status()
{
local file
#Check with native script first
#debian script always return 0. bug #111825
[ "X$linux_distr" = "Xdebian" ] && msqld_status_supported="no"
if [ -z "$msqld_status_supported" ]; then
# MySQL AB packages doesn't know about status command
if LC_MESSAGES=C $PRODUCT_RC_D/$mysql_service 2>&1 | grep -q "status"; then
msqld_status_supported="yes"
else
msqld_status_supported="no"
fi
fi
if [ "$msqld_status_supported" = "yes" ]; then
# Common RPM mysql's and FreeBSD
$PRODUCT_RC_D/$mysql_service status >> $product_log 2>&1 \
&& return 0
fi
if [ "$msqld_status_supported" = "no" ]; then
# MySQL AB packages
file="/usr/sbin/mysqld"
fi
if [ -x "$file" ]; then
#standard build and debian
get_pid "$file" false
pid=$common_var
if test "$pid" -ne 1; then
echo "$file (pid $pid) is running..." >>$product_log 2>&1
return 0
else
echo "$file is stopped" >>$product_log 2>&1
return 1
fi
fi
return 1
}
true named_status_linux_debian
named_status_linux_debian()
{
get_pid "/usr/sbin/named" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
poppassd_super_server_config()
{
local action="$1"
case "$superserver" in
inetd)
case "$machine" in
BSD*)
poppassd_rec="poppassd stream tcp nowait/1000 root /usr/libexec/tcpd $PRODUCT_ROOT_D/admin/bin/poppassd"
;;
*)
poppassd_rec="poppassd stream tcp nowait/1000 root /usr/sbin/tcpd $PRODUCT_ROOT_D/admin/bin/poppassd"
;;
esac
;;
xinetd)
poppassd_rec="service poppassd
{
socket_type = stream
protocol = tcp
port = 106
wait = no
disable = no
user = root
instances = 1000
flags = KEEPALIVE
server = $PRODUCT_ROOT_D/admin/bin/poppassd
}"
;;
*)
die "Super server name unknown"
;;
esac
super_server_action "$action" poppassd "$poppassd_rec"
}
true syslog_status_linux_debian
syslog_status_linux_debian()
{
get_pid "$syslog_binary" false
local pid=$common_var
if test "$pid" -ne 1; then
# running
return 0
fi
return 1
}
## @@constructor set_syslog_params
qmail_super_server_config()
{
local action="$1"
local service="$2"
case "$superserver" in
inetd)
qmail_inetd_templates
;;
xinetd)
qmail_xinetd_templates
;;
*)
die "Super server name unknown"
;;
esac
eval "template=\$${service}_rec"
super_server_action "$action" "$service" "$template"
}
qmail_inetd_templates()
{
maxconn=''
if [ "$linux_distr" = "debian" ]; then
maxconn='.1000'
fi
smtp_rec="smtp stream tcp nowait$maxconn root $QMAIL_DIR/bin/tcp-env tcp-env /usr/bin/env SMTPAUTH=1 END=1 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $QMAIL_DIR/bin/true $QMAIL_DIR/bin/cmd5checkpw $QMAIL_DIR/bin/true"
smtps_rec="smtps stream tcp nowait$maxconn root $QMAIL_DIR/bin/tcp-env tcp-env /usr/bin/env SMTPAUTH=1 END=1 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $QMAIL_DIR/bin/true $QMAIL_DIR/bin/cmd5checkpw $QMAIL_DIR/bin/true"
submission_rec="submission stream tcp nowait$maxconn qmaild $QMAIL_DIR/bin/tcp-env tcp-env /usr/bin/env SUBMISSION=1 SMTPAUTH=1 END=1 $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $QMAIL_DIR/bin/true $QMAIL_DIR/bin/cmd5checkpw $QMAIL_DIR/bin/true"
}
qmail_xinetd_templates()
{
local TRUE_BIN
TRUE_BIN=$QMAIL_DIR/bin/true
smtp_rec="service smtp
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = root
instances = UNLIMITED
env = SMTPAUTH=1
server = $QMAIL_DIR/bin/tcp-env
server_args = -Rt0 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $TRUE_BIN $QMAIL_DIR/bin/cmd5checkpw $TRUE_BIN
}"
smtps_rec="service smtps
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = root
instances = UNLIMITED
env = SMTPAUTH=1
server = $QMAIL_DIR/bin/tcp-env
server_args = -Rt0 $QMAIL_DIR/bin/relaylock $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $TRUE_BIN $QMAIL_DIR/bin/cmd5checkpw $TRUE_BIN
}"
submission_rec="service submission
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = qmaild
instances = UNLIMITED
env = SUBMISSION=1 SMTPAUTH=1
server = $QMAIL_DIR/bin/tcp-env
server_args = -Rt0 $QMAIL_DIR/bin/qmail-smtpd $QMAIL_DIR/bin/smtp_auth $TRUE_BIN $QMAIL_DIR/bin/cmd5checkpw $TRUE_BIN
}"
}
rsr_backup()
{
target="$1"
dup="$2"
opts="$3"
common_var=0
# if [ -$opts "$target" ]; then
if [ -$opts "$target.$product_suff" ]; then
case "$dup" in
mv)
mv -f $target.$product_suff $target>> $product_log 2>&1
common_var=1
return 1
;;
cp)
cp -fp $target.$product_suff $target>> $product_log 2>&1
common_var=1
return 1
;;
*)
p_echo " rsr_backup: wrong option -- must be 'cp' or 'mv'"
;;
esac
else
if [ -$opts "$target.$product_suffo" ]; then
case "$dup" in
mv)
mv -f $target.$product_suffo $target>> $product_log 2>&1
common_var=1
return 1
;;
cp)
cp -fp $target.$product_suffo $target>> $product_log 2>&1
common_var=1
return 1
;;
*)
p_echo " rsr_backup: wrong option -- must be 'cp' or 'mv'"
;;
esac
fi
fi
# else
# case "$opts" in
# f|d)
# ;;
# *)
# p_echo " rsr_backup: wrong option -- must be 'f' or 'd'"
# ;;
# esac
# fi
}
restore_named()
{
cd "$PRODUCT_ROOT_D" >> $product_log 2>&1
[ -f /etc/sysconfig/named ] && mv -f "/etc/sysconfig/named" "/etc/sysconfig/named.bak"
rsr_backup "/etc/sysconfig/named" mv f
[ -L $named_conf ] && rm -f "$named_conf"
rsr_backup "$named_conf" mv f
[ -L $rndc_conf ] && rm -f "$rndc_conf"
rsr_backup "$rndc_conf" mv f
case "$machine" in
BSD*)
rsr_backup /etc/named.boot mv f
;;
linux)
case "$linux_distr" in
redhat)
chkconfig --add named >> $product_log 2>&1
# std_named_sh="/etc/rc.d/init.d/named"
# rsr_backup $std_named_sh mv f
# if [ -f "$std_named_sh" ]; then
# mv -f "$std_named_sh.${product}" "$std_named_sh"
# fi
;;
slackware)
rsr_backup /etc/rc.d/rc.inet2 cp f
;;
esac
rsr_backup /etc/named.boot mv f
;;
solaris)
rsr_backup /etc/named.boot mv f
;;
esac
}
restore_sendmail()
{
[ -L $sendmail ] && rm -f "$sendmail"
[ -L /usr/lib/sendmail ] && rm -f "/usr/lib/sendmail"
rsr_backup "$sendmail" mv f
case "$machine" in
BSDI)
rsr_backup /etc/sendmail.cf mv f
;;
*)
;;
esac
if [ -f "$mail_local" ]; then
# case "$machine" in
# BSD)
# chflags schg "$mail_local" >> $product_log 2>&1
# ;;
# *)
# ;;
# esac
rsr_backup "$mail_local" mv f
chmod 4555 "$mail_local" >> $product_log 2>&1
fi
case "$machine" in
linux )
case "$linux_distr" in
redhat)
chkconfig --add sendmail >> $product_log 2>&1
# rsr_backup "$sndml_ini" mv f
;;
slackware)
rsr_backup /etc/rc.d/rc.M mv f
;;
esac
;;
solaris)
rsr_backup "$sndml_ini" mv f
;;
*)
;;
esac
}
delete_startup_scripts()
{
cd "$PRODUCT_ROOT_D" >> $product_log 2>&1
case "$machine" in
BSD)
rm -f /usr/local/etc/rc.d/${product}.sh >> $product_log 2>&1
# rsr_backup /etc/rc.conf cp f
rc_service "sendmail" "enable" "YES"
rc_service "named" "enable" "YES"
rc_service "mysqld" "enable" "NO"
;;
BSDI)
if [ -f /etc/rc.local.${product} ]; then
cp -p /etc/rc.local.${product} /etc/rc.local >> $product_log 2>&1
fi
;;
linux)
case "$linux_distr" in
redhat)
chkconfig --del ${product}
rm -f /etc/rc.d/init.d/${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc0.d/K15${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc1.d/K15${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc2.d/K15${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc3.d/S77${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc4.d/S77${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc5.d/S77${product} >> $product_log 2>&1
# rm -f /etc/rc.d/rc6.d/K15${product} >> $product_log 2>&1
;;
slackware)
if [ -f /etc/rc.d/rc.local.${product} ]; then
cp -p /etc/rc.d/rc.local.${product} /etc/rc.d/rc.local >> $product_log 2>&1
fi
;;
esac
;;
solaris)
rm -f /etc/init.d/${product} >> $product_log 2>&1
if [ -f /etc/rc0.d/K01${product} ]; then
rm -f /etc/rc0.d/K01${product} >> $product_log 2>&1
fi
if [ -f /etc/rc1.d/K01${product} ]; then
rm -f /etc/rc1.d/K01${product} >> $product_log 2>&1
fi
if [ -f /etc/rc2.d/S77${product} ]; then
rm -f /etc/rc2.d/S77${product} >> $product_log 2>&1
fi
;;
esac
}
delete_crontab()
{
$crontab -l 2>/dev/null > /tmp/crontab.${product}
sed -e "s/^.*\/${product}\/admin\/sbin\/statistics.*//g" \
-e "s/^.*\/${product}\/bin\/mysqldump.*//g" \
-e "s/^.*\/usr\/sbin\/ntpdate.*//g" \
< /tmp/crontab.${product} > /tmp/crontab.${product}_tmp
mv -f /tmp/crontab.${product}_tmp /tmp/crontab.${product} >> $product_log 2>&1
$crontab /tmp/crontab.${product} >> $product_log 2>&1
rm -f /tmp/crontab.${product} >> $product_log 2>&1
}
remove_ftpuser()
{
user=$1
ftpusers_file="/etc/ftpusers"
egrep "^$user" $ftpusers_file >> /dev/null 2>&1
case "$?" in
0)
sed -e "/$user/d" < $ftpusers_file > $ftpusers_file.tmp
mv -f $ftpusers_file.tmp $ftpusers_file
;;
1)
;;
*)
;;
esac
}
remove_product_users_groups()
{
# delete users of this(unsuccessful) installation
for i in $users_created; do
delete_user "$i"
done
# delete users with group=psacln (ftpusers and webusers)
for i in `perl -e '$gid=getgrnam("'$clients_group'"); exit if (($gid eq "") || ($gid == 0)); while(($n,$u,$g) = (getpwent)[0,2,3]) {print "$n\n" if (($gid == $g) && ($u >= 500))}'`
do
delete_user "$i"
remove_ftpuser "$i"
done
# delete users psaadm, psaftp
# delete_user "$admin_user" >> "$product_log" 2>&1
# delete_user "$anonftp_user" >> "$product_log" 2>&1
# delete groups of this(unsuccessful) installation
for i in $groups_created; do
delete_group "$i"
done
# delete groups psaadm, psaftp, psacln
delete_group "$admin_group" >> "$product_log" 2>&1
delete_group "$anonftp_group" >> "$product_log" 2>&1
delete_group "$clients_group" >> "$product_log" 2>&1
}
undo_install()
{
p_echo
if pleskrc mysql status; then
p_echo "===>Removing installed $PRODUCT_NAME components ... "
remove_modules
pleskrc mysql stop
mysql_pid_file=$mysql_bddir/*.pid
if [ -f "$mysql_pid_file" ]; then
rm -f "$mysql_pid_file"
fi
fi
$START_SH stop >> "$product_log" 2>&1
proftpd_super_server_config remove
super_server_action remove pop3
super_server_action remove pop-3
super_server_action remove imap4
super_server_action remove imap2
super_server_action remove imap
qmail_super_server_config remove smtp
qmail_super_server_config remove smtps
qmail_super_server_config remove submission
poppassd_super_server_config remove
remove_product_users_groups
if [ -f "/etc/ftpchroot" ]; then
sed -e "s/^@$clients_group//g" < /etc/ftpchroot > /etc/ftpchroot.tmp
mv -f /etc/ftpchroot.tmp /etc/ftpchroot >> $product_log 2>&1
fi
if [ -f /etc/shells ]; then
case "$machine" in
BSD|BSDI)
sed -e "s/[/]*sbin[/]*nologin//" < /etc/shells > /etc/shells.tmp
;;
linux|solaris)
sed -e "s/[/]*bin[/]*false//" < /etc/shells > /etc/shells.tmp
;;
esac
mv -f /etc/shells.tmp /etc/shells >> $product_log 2>&1
fi
remove_tmp_state
restore_named
restore_sendmail
delete_startup_scripts
delete_crontab
cd /usr/local >> $product_log 2>&1
suc
}
smart_undo_install()
{
[ "X$trigger_uninstall" = "X1" -o "X$do_patch" = "X1" -o "X$do_reconfigure" = "X1" ] && return
[ "X$PLESK_INSTALLER_NOUNDO" != "X" ] && return
# trigger_uninstall - trigger what smart_undo_install is already working now(recurrence)
trigger_uninstall=1
if [ "X$can_uninstall" = "X1" ]; then
if [ "X$do_upgrade" = "X1" ]; then
undo_upgrade
else
if [ "X$machine" != "XBSD" ]; then
undo_install
fi
fi
fi
# put suggestions for user what to do
call_optional_function failure_note
}
undo_upgrade()
{
p_echo " The attempt to upgrade $prev_product_full"
p_echo " from version $prev_version to $product_full $product_version has failed."
if [ -f "$product_sav_tar" ]; then
p_echo
p_echo " Now restore contents of $PRODUCT_NAME from $product_sav_tar"
p_echo
get_pid $PRODUCT_ROOT_D/mysql/bin/safe_mysqld true root
req_pid=$common_var
if [ $req_pid -gt 1 ]; then
$K_KILL $req_pid >> $product_log 2>&1
sleep 2
mysql_pid_file=$mysql_bddir/*.pid
kill_pids $PRODUCT_ROOT_D/mysql/libexec/mysqld mysql
sleep 2
if [ -f "$mysql_pid_file" ]; then
rm -f $mysql_pid_file
fi
fi
$START_SH stop >> $product_log 2>&1
sleep 2
rm -Rf $PRODUCT_ROOT_D
qmail_super_server_config remove "smtp"
qmail_super_server_config remove "smtps"
proftpd_super_server_config remove
poppassd_super_server_config remove
cd /
tar xvf $product_sav_tar > /dev/null 2>&1
case "$?" in
0)
# rm -f $product_sav_tar
;;
*)
p_echo
p_echo
p_echo "ERROR: restoration of files from $product_sav_tar has failed."
p_echo " Please restore them manually."
p_echo
p_echo "Exiting..."
p_echo
exit 0
;;
esac
fi
}
api_rpc_uninstall_post()
{
# product_conf
# read_conf
# set_common_params
set_mysqld_params
check_mysql
if [ "X$do_upgrade" = "X" ]; then
api_rpc_remove_persistent_tables
fi
}
if [ "X${PLESK_INSTALLER_DEBUG}" != "X" ]; then
set -x
fi
do_upgrade=0
if [ "0$1" -eq 0 ]; then
package_script_call_main_function "api_rpc_uninstall_post api_rpc_uninstall_purge" psa-api-rpc 8.4.0 sles10.build84080425.21
else
# We are the old package being upgraded
do_upgrade=1
package_script_call_main_function api_rpc_upgrade_old_post psa-api-rpc 8.4.0 sles10.build84080425.21
fi = \ @ ;i +E 0 %L *' d 6 X Vm (L ?7 G
- 0 #| Z :a 6 0 :+ T B x ? 1[ N 9 x 8 " Ag R 9 8 c E -2 IA h u% x W ^ \ K a i큤A큤 HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH11b7ece7a79804e5dea5fc514727fa06 ead4e191781792ac0d8285944846de08 ec949e561a9ed3d0a79979d8ddafa5ea e1c84f1cf3538c64e4e8978a1ef67540 614ea999aaf49977e270044e6e8c2b55 2f184da5f89236ce87a542a0fec9d0d2 1986a283bcb25ea6ac49c3d6d6a09696 42b16488489c632a55700eaf7a56ec28 0e14d6a4e5a102d1f4061bc541ed14d9 cdd8225e5e4eca61c85416b8bf4b493d d8b5c8ceb69170c6d909e8d1373e3bf1 fe03688cbac5fe548d4498eee69ce384 3078589323b6534f22e0fa1cee105a73 673d29dec925b8e172c3e7a84b79dffd 6ae68a09e40ae4d03207da52aaa4cad0 e5a300011c003a434daa9daa4a46d174 5fd63ae807e6069377a301185e76a346 98f32813af6b9e0ed7f4218521561140 42c0828c79f175e2743fa301fe40dfb6 baf0374a659f04fda822215906ae8fb6 b05f6bba5ddd8b52b118ab8b6265c719 3f24c4f0216f370b6ed2cbb36cac5804 c63b9c0ee96382af3dd1f4a01ac38e79 353cfa9f5523186e8e9aa5d2259058a1 e64388b0151a5f9f4595e2095420b5cd 45ce72b7902a79a035cd91eb4739f175 8753fac0f98a146f86f6ba66a4c87d32 a73813e30d6b49104af680d37bc007cf cc694cf1a4c1dba9d3d10e23a3a9de67 ca7edbf6387c17c6c66bf8b99433e53c f8aa848eb0b7beb71fa655a356d4d785 cb8f62c0e90ab40031ca5f27191b142d f571ce29df4820e993c6b7b7cef6c806 49edd152125767bcfb116bf473b4d4fd 147418441fdadea106c9034e1ffa49d9 7d42b60336fe71e9edddee35ef56e6d7 7a0ab01f05bb6f1f8cf692f03be46c1b 8bd093481a6098dce653e8828995ac8f e7914dfcb8a748db509aab88385e372d 7cf561301255893380cca3221c5cb6f4 e0391c67a33509180c8755fde8e54af7 b9a6c9c027db5edcddd127e30d187b8d d51c462fb6612f7d6d2f72a330b9ad37 9550886d64701f3b885641858a5a4420 df4c287f7e594a921ca42e55b93257c2 5742cbe976416b5c3629071f645ccbbd 61aa886b2c1e8d836b3608777c93f92d 019247f7e7fc16ed5f4815859615bf5e c111c469136f617f080322f038901283 b8bdb84b335252ff9eb3e245340d7a4a 06cdfd46023445ede1cebc342d180a86 9c05013a07c6bc5a6f48395936d97138 819dfb5ef68612c1923bba45255d1978 549a9daeddae6477743f121371743f22 80fff638b125c55ad5962b9f7189da70 ad7f8790e46cf91e7497fe16a24ad07c 24ed3532f39d3920889764a461e03600 491bd9406ae6039e538966aa18d8ca94 62a8a880dc687f50aca787f2f187514b 85e01e6d1ccf30747f5089b3ae2699e5 2f5f3183c277afb2d3f9b9eee4ba0131 64123ce90cc0a071d61b44e877082261 6482b3c236ab32ad0aa64004d5413613 f51b3ea43edcee1b5e4267ef231d33f3 286bcd3c50354d26918213e7843009b7 f1f985dbebbe43dfd13280ea5bb01c78 5a033dd1e9e5a8f2400239ec63c2b607 9d481facc31d57bd5f532b798f2c4351 fb5030e2729993de7f567fa62fd278a0 305a83caff036a694dd046a8ac2ef60c f2d8d3a96a3e16be1879da6111d836fd 5b7f16cc339f8efee453af559bdc3e71 5afffa5bc019e2353997e1cb29bcc465 1131b73ecbaf6366e14a860ffd4ef018 ../sbin/wrapper ../sbin/wrapper /usr/local/psa/admin/htdocs/schemas/rpc/1.5.2.1/agent-runner.xsd root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root root psa-api-rpc-8.4.0-sles10.build84080425.21.src.rpm psa-rpc-protocol psa-api-rpc J H @ @ J J @ @ Jrpmlib(VersionedDependencies) psa psa-api /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) rpmlib(CompressedFileNames) /usr/bin/python2.4 /usr/local/psa/admin/bin/php rpmlib(PayloadIsBzip2) 3.0.3-1 8.4.0 8.4.0-sles10.build84080425.21 4.0-1 3.0.4-1 3.0.5-1 4.4.2 /bin/sh /bin/sh psa-agent psa-rsession expand-pleskagent 8$d "$&(
Z4,6n*,.024 1.5.2-84080425.21 8.4.0-sles10.build84080425.21
PleskX.tar.signed agent_extract agent_runner agent.php remote_sender.php rsession_back_sender.php rsession_back_url.php rsession_error.php rsession_init.php rsession_welcome.php agent-runner.xsd agent-runner.xsd api-rpc Agent.php AgentBCSpamFilter.php AgentBackup.php AgentCertificate.php AgentClient.php AgentClientTemplate.php AgentDNS.php AgentDatabase.php AgentDatabaseServer.php AgentDesktop.php AgentDomain.php AgentDomainAlias.php AgentDomainTemplate.php AgentErrors.php AgentErrorsMap.php AgentEvLog.php AgentIp.php AgentLocale.php AgentLogRotation.php AgentMail.php AgentMaillist.php AgentMigration.php AgentOp.php AgentProtectedDirectory.php AgentRSession.php AgentSSO.php AgentSecretKey.php AgentServer.php AgentSession.php AgentSiteApp.php AgentSpamFilter.php AgentSubDomain.php AgentUI.php AgentUpdater.php AgentUpload.php AgentWebUser.php ApiRpcVersion.php AuxiliaryMigrationAgent.php CoreErrHandler.php CoreLib.php Descriptor.php ExpandXMLLib.php LimitDescriptor.php PHostingDescriptor.php PermissionDescriptor.php PleskAPIOperator.php ProtectedDirectoryDescriptor.php SecretKey.php common_dataset.php loger.php cmd_rsession.php agent_extract agent_runner GPG.py agent_extract.py agents_pubkey.py agent_runner.py agent_runner_protocol.py config.py api-rpc_db.sql api-rpc_db_upgrade_750.sql api-rpc_db_upgrade_800.sql api-rpc_db_upgrade_801.sql api-rpc_db_upgrade_830.sql api-rpc_db_upgrade_840.sql /usr/local/psa/PMM/ /usr/local/psa/admin/bin/ /usr/local/psa/admin/htdocs/enterprise/control/ /usr/local/psa/admin/htdocs/enterprise/ /usr/local/psa/admin/htdocs/enterprise/ /usr/local/psa/admin/htdocs/enterprise/ /usr/local/psa/admin/htdocs/schemas/rpc/1.5.2.1/ /usr/local/psa/admin/htdocs/schemas/rpc/ /usr/local/psa/admin/plib/ /usr/local/psa/admin/plib/api-rpc/ /usr/local/psa/admin/sbin/ /usr/local/psa/admin/share/agent_extract/ /usr/local/psa/admin/share/agent_runner/ /usr/local/psa/etc/api-rpc/ -O2 cpio bzip2 9 noarch noarch-suse-linux ? BZh91AY&SYwa`螟 mt j4@4J#ERAHhE5iTdP [h -`*@(B(U JckB
Ph4y>)wiVEX̞զ[ZXQXTP(UP(5 Al iUhdeAJdlh5
M2 $֊hj՛*i
Phh
[i@P
@j4b@$jj( Uг
YF -l l5PMT(d5AR-*U@Y(CM4֒h4(
[&lVZYT CJ(MkEj нGBҍ5$Pmhl
[c@U A4i R-@U4 5+A4ՙCl[kFAm@(3`@4ѥ&2PkZAF@ɫ\+mkpKKYJހPG$ kFP6(C@mR`=O(j7wWiV5