#!/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 } # 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" } # Usage: pleskrc pleskrc() { [ 2 -le $# ] || die "Not enough arguments" local service_name=$1 local action=$2 local ret=0 local inten local service_script 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 "$SYSTEM_RC_D/$service" ]; then service_script="$SYSTEM_RC_D/$service" elif [ ! -z ${PRODUCT_RC_D} -a -x "$PRODUCT_RC_D/$service" ]; then service_script="$PRODUCT_RC_D/$service" fi if [ "$action" = "exists" ]; then [ -n "$service_script" ] && return 0 || return 1 else [ -z "$service_script" ] && die "Unable to handle $service" fi 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 [ -n ${service_script} ]; then action_cmd="$service_script" 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() { [ -z "$product_log" ] || 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 >/dev/null 2>&1; then seq $* elif type jot >/dev/null 2>&1; 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" 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 "/usr/sbin/xinetd" false local pid=$common_var if test "$pid" -ne 1; then # running return 0 fi return 1 } package_script_begin_pkg() { package_script_begin } package_script_end_pkg() { 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_pkg } package_script_end_this_system() { package_script_end_pkg } get_pid() { local i local ex_f="$1" local opt="$2" local owner="$3" local min_num="1" # Use pidof by default, bug 121868, except for FreeBSD - 140182 if type pidof >/dev/null 2>&1 && [ "$os" != "BSD" ]; 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="localedata" EXTERNAL_PACKAGES_DIR="tmp/packages" BUILDER_UID="10007" PERL5LIB=/usr/local/psa/lib/perl5/site_perl/5.8.8:/usr/local/psa/lib/perl5/site_perl/5.8.8/mach export PERL5LIB support_contact="http://www.parallels.com/support" sales_email="sales@parallels.com" product_version="9.5.0" product_db_version="0950" product_build="95100309.15" conceived_os_vendor=FreeBSD conceived_os_version="6.1" osrels="fr6.1" # This variable contains all versions, which is supported by # cumulative upgrade known_product_versions="71 75 80 81 82 83 84 86 90 92 93 95" 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() { [ -n "$prod_conf_t" ] || prod_conf_t=/etc/psa/psa.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="/tmp/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 } # A set of functions for work with config variables # $1 is config file name, $2 is variable name, $3 is variable value conf_getvar() { cat $1 | perl -n -e '$p="'$2'"; print $1 if m/^$p\s+(.*)/' } conf_rmvar() { cat $1 | perl -n -e '$p="'$2'"; print $_ if(! m/^$p\s+(.*)/)' >$1.new if cmp -s $1.new $1; then rm -f $1.new return 0 fi rm -f $1.old ln $1 $1.old mv -f $1.new $1 chmod 644 "$1" } conf_setvar() { VARVALUE=`conf_getvar $1 $2` if [ "X$VARVALUE" = "X$3" ]; then return 0 elif [ ! -z "X$VARIABLE" ]; then conf_rmvar $1 $2 fi echo "$2 $3" >> $1 return 0 } #default values product_default_conf() { PRODUCT_ROOT_D=/usr/local/psa PRODUCT_RC_D=/usr/local/etc/rc.d PRODUCT_ETC_D=/usr/local/etc/psa PLESK_LIBEXEC_DIR=/usr/local/libexec/plesk-9.0 HTTPD_VHOSTS_D=/usr/local/www/vhosts HTTPD_CONF_D=dynamic HTTPD_INCLUDE_D=dynamic HTTPD_BIN_D=/usr/local/sbin HTTPD_LOG_D=/var/log HTTPD_SERVICE=dynamic QMAIL_ROOT_D=/usr/local/psa/qmail PLESK_MAILNAMES_D=/usr/local/psa/qmail/mailnames RBLSMTPD=/usr/local/psa/qmail/bin/rblsmtpd COURIER_IMAP_ROOT_D=/usr/local/psa/courier-imap FTPD_CONF=/usr/local/psa/ftpd/etc/proftpd.conf FTPD_CONF_INC=/usr/local/psa/ftpd/etc/proftpd.include FTPD_BIN_D=/usr/local/psa/ftpd/bin FTPD_VAR_D=/usr/local/psa/ftpd/var FTPD_SCOREBOARD=/usr/local/psa/ftpd/var/scoreboard NAMED_RUN_ROOT_D=/var/named NAMED_OPTIONS_CONF=/etc/namedb/named.conf.include.plesk-options NAMED_ZONES_CONF=/etc/namedb/named.conf.include.plesk-zones WEB_STAT=/usr/local/psa/webalizer/bin/webalizer LOGROTATE=/usr/local/psa/logrotate/sbin/logrotate MYSQL_VAR_D=/var/db/mysql MYSQL_BIN_D=/usr/local/bin PGSQL_DATA_D=/usr/local/pgsql/data PGSQL_BIN_D=/usr/local/bin DUMP_D=/usr/local/psa/var/dumps DUMP_TMP_D=/tmp MAILMAN_ROOT_D=/usr/local/mailman MAILMAN_VAR_D=/usr/local/mailman PYTHON_BIN=/usr/local/bin/python2.5 CATALINA_HOME=/usr/local/tomcat5.5 DRWEB_ROOT_D=/usr/local/drweb DRWEB_ETC_D=/usr/local/etc/drweb GPG_BIN=/usr/local/bin/gpg TAR_BIN=/usr/bin/tar AWSTATS_ETC_D=/usr/local/etc/awstats AWSTATS_BIN_D=/usr/local/psa/awstats/wwwroot/cgi-bin AWSTATS_TOOLS_D=/usr/local/psa/awstats/tools AWSTATS_DOC_D=/usr/local/psa/awstats/wwwroot 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 CGI_PHP_BIN=dynamic } #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_freebsd "$@" } register_service_freebsd() { rc_service "$1" "enable" "YES" "yes" } remove_option_string() { #using: remove_option_string