diff options
author | Dirk Meyer <dinoex@FreeBSD.org> | 2003-06-01 05:45:34 +0000 |
---|---|---|
committer | Dirk Meyer <dinoex@FreeBSD.org> | 2003-06-01 05:45:34 +0000 |
commit | 044a2ff8cf2fd5f4864a3e696d549a7570d607d9 (patch) | |
tree | 279a3ec4d9ff546ca3ca7afbcd6a95c992ea2dd7 /astro | |
parent | - Update to 1.1.0 (diff) |
version bump to 3.08 w/ the following enhancements :
- only one master shell to monitor multiple setiathome instances
- wait some time for setiathome server to come up between restarts
- xsetiathome comes back
- -graphics is now the default (so xsetiathome may be launched)
- registration heuristic changed (see comments below)
- take care, some variable names have changed (see comments below)
- manual page reviewed
The setiathome manual page refer to setiathome.conf while it is
now named rc.setiathome.conf. also, the manual page has been
completed (variables, start/stop scripts, etc.)
- gracefull startup script option added
Makefile
PORTVERSION bumped
PORTREVISION deleted
FORBIDDEN deleted
BROKEN bumped to 4.0
NO_XBIN deleted except for linux_base-6
wrapper added
pkg-install
registration heuristic changed (don't register if already
registered, then automatically start setiathome in either
case)
pkg-list
$FreeBSD$ added
libexec/setiathome.bin added
pkg-message
FreeBSD 5.x a.out comment changed to FreeBSD 4.x comment
files/rc.setiathome.conf
seti_std_args defaulted to "-email -graphics"
seti_proxy_args changed to seti_proxy_server
seti_socks_server, seti_socks_user, seti_socks_passwd added
seti_sleep changed to seti_sleep_time
files/setiathome.1
/usr/local changed to %%PREFIX%%
above and below changes described
files/setiathome.sh
same changes as files/rc.setiathome.conf
don't start setiathome if already started
su heuristic changed to call an external wrapper
gracefull (aka apachectl :) option added using
stop_after_send.txt
PR: 50723,51759,52297,52709
Submitted by: cyrille.lefevre@laposte.net
Diffstat (limited to 'astro')
-rw-r--r-- | astro/setiathome/Makefile | 45 | ||||
-rw-r--r-- | astro/setiathome/distinfo | 2 | ||||
-rw-r--r-- | astro/setiathome/files/rc.setiathome.conf | 15 | ||||
-rw-r--r-- | astro/setiathome/files/setiathome.1 | 53 | ||||
-rw-r--r-- | astro/setiathome/files/setiathome.bin | 426 | ||||
-rw-r--r-- | astro/setiathome/files/setiathome.sh | 86 | ||||
-rw-r--r-- | astro/setiathome/pkg-install | 43 | ||||
-rw-r--r-- | astro/setiathome/pkg-message | 9 | ||||
-rw-r--r-- | astro/setiathome/pkg-plist | 2 |
9 files changed, 594 insertions, 87 deletions
diff --git a/astro/setiathome/Makefile b/astro/setiathome/Makefile index 171bf0498158..785e32430deb 100644 --- a/astro/setiathome/Makefile +++ b/astro/setiathome/Makefile @@ -5,8 +5,7 @@ # $FreeBSD$ PORTNAME= setiathome -PORTVERSION?= 3.03 -PORTREVISION?= 7 +PORTVERSION?= 3.08 CATEGORIES?= astro MASTER_SITES= ftp://ftp.cdrom.com/pub/setiathome/ \ ftp://alien.ssl.berkeley.edu/pub/ @@ -16,10 +15,6 @@ EXTRACT_SUFX= .tar MAINTAINER?= cyrille.lefevre@laposte.net COMMENT?= Donate idle cycles to the search for space aliens -.if ${PORTVERSION} == "3.03" -FORBIDDEN= 'Exploitable buffer overflow. http://spoor12.edup.tudelft.nl/' -.endif - .include <bsd.port.pre.mk> # Global variables @@ -34,8 +29,8 @@ ONLY_FOR_ARCHS?= alpha i386 NO_BUILD= binary distribution NO_CDROM= interactive install -.if ${OSVERSION} <= 226000 -BROKEN= "currently supports only FreeBSD 2.2.6 and above" +.if ${OSVERSION} < 400000 +BROKEN= "currently supports only FreeBSD 4.0 and above" .endif EXTRACT_CMD= ${CAT} @@ -63,7 +58,7 @@ PORT_OSREL= v4.0d .else PORT_VENDOR?= unknown PORT_OSNAME?= freebsd -PORT_OSREL?= 2.2.8 +PORT_OSREL?= 4.0 .endif PORT_OS= ${PORT_OSNAME}${PORT_OSREL} PORT_HOST= ${PORT_CPU}-${PORT_VENDOR}-${PORT_OS} @@ -82,15 +77,13 @@ DESCR= ${.CURDIR}/pkg-descr .if !exists(${LINUXBASE}/usr/X11R6/lib/libXaw.so.7) NO_XBIN= libXaw.so.7 is missing from linux_base-6 .endif -NO_XBIN?= xsetiathome is broken .endif -.elif ${OSVERSION} >= 300000 -NO_XBIN= xsetiathome is broken .endif # Local variables # +LBIN_DIR= ${PREFIX}/libexec SBIN_DIR= ${PREFIX}/sbin CONF_DIR= ${PREFIX}/etc RC_DIR= ${PREFIX}/etc/rc.d @@ -100,18 +93,8 @@ SAMP_SUFX= .sample BIN_FILE= setiathome RC_FILES= setiathome -# i386 NOTES: -# xsetiathome is currently broken at 4.2. should work at 2.x, -# don't know between 3.0 and 4.2 ? so, be conservative... -# diagnostic messages are : -# Warning: Cannot convert string "doneB" to type Widget -# Floating point exception (core dumped) # Linux NOTES: # xsetiathome requires libXawk.so.7 which is missing from linux_base-6. -# using linux_base-7, diagnostic messages are : -# Warning: Cannot convert string "doneB" to type Widget -# Shared memory segment doesn't exist. errno=2 -# Couldn't attach to the science process! .if !defined(NO_XBIN) MAN1+= x${PORTNAME}.1 @@ -125,7 +108,7 @@ X11PORTS= "@comment " # Post-patch # -post-patch: patch-pkgmessage +post-patch: patch-pkgmessage patch-man patch-pkgmessage: @${SED} 's|%%PREFIX%%|${PREFIX}|g; \ @@ -133,6 +116,16 @@ patch-pkgmessage: s|%%SUFX%%|${PKGNAMESUFFIX}|g' \ ${MSG_FILE} > ${PKGMESSAGE} +patch-man: +.for mansect in 1 +.for man in ${MAN${mansect}} + @${SED} 's|%%PREFIX%%|${PREFIX}|g; \ + s|%%PREFX%%|${PKGNAMEPREFIX}|g; \ + s|%%SUFX%%|${PKGNAMESUFFIX}|g' \ + ${FILESDIR}/${man} > ${WRKDIR}/${man} +.endfor +.endfor + # Install # @@ -151,7 +144,7 @@ install-program: install-man: .for mansect in 1 .for man in ${MAN${mansect}} - @${INSTALL_MAN} ${FILESDIR}/${man} \ + @${INSTALL_MAN} ${WRKDIR}/${man} \ ${MAN${mansect}PREFIX}/man/man${mansect} .endfor .endfor @@ -178,6 +171,10 @@ install-startup-files: @${INSTALL_SCRIPT} ${FILESDIR}/${file}.sh \ ${RC_DIR}/${PKGNAMEPREFIX}${file}${PKGNAMESUFFIX}.sh .endif +.if exists(${FILESDIR}/${file}.bin) + @${INSTALL_SCRIPT} ${FILESDIR}/${file}.bin \ + ${LBIN_DIR}/${PKGNAMEPREFIX}${file}${PKGNAMESUFFIX}.bin +.endif .endfor configure-package: diff --git a/astro/setiathome/distinfo b/astro/setiathome/distinfo index abbf450f439e..2409a3f71c12 100644 --- a/astro/setiathome/distinfo +++ b/astro/setiathome/distinfo @@ -1 +1 @@ -MD5 (setiathome-3.03.i386-unknown-freebsd2.2.8.tar) = 2dd4c9016059b7532ae721c7b92be821 +MD5 (setiathome-3.08.i386-unknown-freebsd4.0.tar) = f6ba42a3bd93313cf61df62cde3c262e diff --git a/astro/setiathome/files/rc.setiathome.conf b/astro/setiathome/files/rc.setiathome.conf index f7049c5855b2..209917e17e36 100644 --- a/astro/setiathome/files/rc.setiathome.conf +++ b/astro/setiathome/files/rc.setiathome.conf @@ -4,11 +4,14 @@ # # seti_wrkdir=/var/db/${rc_file%.sh} # primary working directory -# seti_std_args=-email # command arguments for standard mode -# seti_reg_args=-login # command arguments for register mode -# seti_proxy_args= # proxy arguments -# seti_user=setiathome # user id to run as -# seti_group=${seti_user} # group id to run as +# seti_std_args="-email -graphics" # startup command line arguments +# seti_reg_args=-login # command line arguments to register +# seti_proxy_server= # HTTP proxy server (hostname:port) +# seti_socks_server= # SOCKS proxy server (hostname:port) +# seti_socks_user= # SOCKS proxy user name +# seti_socks_passwd= # SOCKS proxy password +# seti_user=setiathome # user name to run as +# seti_group=${seti_user} # group name to run as # seti_nice=15 # nice level to run at # seti_maxprocs=$(sysctl -n hw.ncpu) # max. number of processes to start -# seti_sleep=21600 # time to sleep between restarts +# seti_sleep_time=21600 # time to sleep between restarts diff --git a/astro/setiathome/files/setiathome.1 b/astro/setiathome/files/setiathome.1 index 4ac329052633..3ad84bf3fd53 100644 --- a/astro/setiathome/files/setiathome.1 +++ b/astro/setiathome/files/setiathome.1 @@ -118,22 +118,51 @@ This .Fx port includes a start-up script that starts .Nm -at system start-up. +at system start-up and stop it at system shut-down. +.Ss Stopping setiathome +There is two way to stop +.Nm , +gracefully (See +.Pa stop_after_send.txt +mentioned in +.Sx FILES +below) and urgently (using kill as done at system shut-down time). +To do so, respectively run +.Pp +.Dl %%PREFIX%%/etc/rc.d/%%PREFX%%setiathome%%SUFX%%.sh gracefull +or +.Dl %%PREFIX%%/etc/rc.d/%%PREFX%%setiathome%%SUFX%%.sh stop .Ss Configuration File The optional configuration file -.Pa /usr/local/etc/setiathome.conf -can contain one or more of the following variable assignments to override +.Pa %%PREFIX%%/etc/rc.%%PREFX%%setiathome%%SUFX%%.conf +may contain one or more of the following variable assignments to override their default values: .Bl -tag -width seti_wrkdir .It Pa seti_wrkdir=/var/db/setiathome The working directory where .Nm will store it's temporary files. -.It Pa seti_user=nobody +.It Pa seti_std_args=-email and/or -graphics +The command line arguments for normal start-up. +.It Pa seti_reg_args=-login +The command line arguments for registration. +.It Pa seti_proxy_server=hostname:port +The HTTP proxy server and port to connect through. +.It Pa seti_socks_server=hostname:port +The SOCKS server and port to connect through. +.It Pa seti_socks_user=username +The SOCKS user name to connect with. +.It Pa seti_socks_passwd=password +The SOCKS password to connect with. +.It Pa seti_user=setiathome The user to run .Nm as. -.It Pa seti_nice=1 +.It Pa seti_group=setiathome +The group to run +.Nm +as (only used at registration time). +.It Pa seti_nice=15 The .Xr nice 1 value to run @@ -146,6 +175,10 @@ processes to run concurrently. Defaults to the number of CPUs installed. Running more than one instance per CPU is not useful, as .Nm is almost completely CPU-bound. +.It Pa seti_sleep_time=21600 +The time to sleep (in seconds) between restarts if the +.Nm +data server is unresponsive. .El .Pp If you change values in the configuration file, you need to stop and start @@ -153,9 +186,9 @@ If you change values in the configuration file, you need to stop and start and possibly reconfigure the working directory for the changes to take effect. Run .Pp -.Dl /usr/local/etc/rc.d/setiathome.sh stop -.Dl /usr/local/etc/rc.d/setiathome.sh register -.Dl /usr/local/etc/rc.d/setiathome.sh start +.Dl %%PREFIX%%/etc/rc.d/%%PREFX%%setiathome%%SUFX%%.sh stop +.Dl %%PREFIX%%/etc/rc.d/%%PREFX%%setiathome%%SUFX%%.sh register +.Dl %%PREFIX%%/etc/rc.d/%%PREFX%%setiathome%%SUFX%%.sh start .Pp to do that. .Ss Setting up setiathome @@ -210,10 +243,10 @@ will query you. .El .Sh FILES .Bl -tag -width /var/db -compact -.It Pa /usr/local/etc/rc.d/setiathome.sh +.It Pa %%PREFIX%%/etc/rc.d/%%PREFX%%setiathome%%SUFX%%.sh Start-up script. .Pp -.It Pa /usr/local/etc/setiathome.conf +.It Pa %%PREFIX%%/etc/rc.%%PREFX%%setiathome%%SUFX%%.conf Optional configuration file for the start-up script. .Pp .It Pa /var/db/setiathome/ diff --git a/astro/setiathome/files/setiathome.bin b/astro/setiathome/files/setiathome.bin new file mode 100644 index 000000000000..3aff3acff02b --- /dev/null +++ b/astro/setiathome/files/setiathome.bin @@ -0,0 +1,426 @@ +#!/bin/sh -T + +# $FreeBSD$ + +# Copyright (c) 2003 Cyrille Lefevre. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The name of the authors and contributors may not be used to +# endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +setistart () { # dir + local dir + dir=$1 + + # goto the startup dir + cd ${dir} || return + + # don't start a dying client + [ -f stop_after_send.txt ] && return + + # fire up a setiathome client + ${program_path} ${program_args} > /dev/null & + + # memorize the startup dir + eval pid_$!=${dir} + # and the client process ID + setipids="${setipids} $!" +} + +setikill () { # SIGTERM handler + local pids pid + + # save pids to kill + pids="${sleeppid} ${setipids}" + # avoid futher setiathome startup + unset setipids + + # kill'em all if any + for pid in ${pids}; do + ps p ${pid} > /dev/null && kill ${pid} + done +} + +setirestart () { # SIGCHLD handler + local pids pid dir + + # killing in progress + [ -n "${setipids}" ] || return + # restart in process + [ -n "${sleeppids}" ] && return + + # wait for setiathome servers to come up + sleep ${seti_sleep_time} & + + # wait even if more than one setiathome client dies + sleeppid=$! + while ps p ${sleeppid} > /dev/null; do + wait ${sleeppid} + done + unset sleeppid + + # killing while sleeping + [ -n "${setipids}" ] || return + + # save pids to restart + pids=${setipids} + # reset the process ID list + unset setipids + + for pid in ${pids}; do + if ps p ${pid} > /dev/null; then + # still alive + setipids="${setipids} ${pid}" + else + # backup the startup dir + eval dir=\${pid_${pid}} + # clean the old one + unset pid_${pid} + # launch the dead client + eval setistart ${dir} + fi + done +} + +if [ -z "${program_path}" ]; then + case $0 in + /*) rc_dir=${0%/*} ;; + *) rc_dir=${PWD:-$(pwd)} ;; + esac + rc_file=${0##*/} + rc_path=${rc_dir}/${rc_file} + + if ! PREFIX=$(expr ${rc_path} : "\(/.*\)/libexec/${rc_file}\$"); then + echo "${rc_file}: Cannot determine PREFIX." >&2 + echo "Please use the complete pathname." >&2 + exit 64 + fi + + echo "Don't use this script directly, uses the following one instead :" >&2 + echo " ${PREFIX}/etc/rc.d/${rc_file%.bin}.sh start" >&2 + exit 1 +fi + +# save this shell process ID +echo $$ > ${seti_wrkdir}/shpid.sah + +# setup handlers +trap setikill TERM +trap setirestart CHLD + +# startup setiathome client(s) +for dir in ${seti_wrksuff}; do + setistart ${seti_wrkdir}/${dir} +done + +# wait for them until death +while [ -n "${setipids}" ]; do + wait +done +#!/bin/sh -T + +# $FreeBSD$ + +# Copyright (c) 2003 Cyrille Lefevre. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The name of the authors and contributors may not be used to +# endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +setistart () { # dir + local dir + dir=$1 + + # goto the startup dir + cd ${dir} || return + + # don't start a dying client + [ -f stop_after_send.txt ] && return + + # fire up a setiathome client + ${program_path} ${program_args} > /dev/null & + + # memorize the startup dir + eval pid_$!=${dir} + # and the client process ID + setipids="${setipids} $!" +} + +setikill () { # SIGTERM handler + local pids pid + + # save pids to kill + pids="${sleeppid} ${setipids}" + # avoid futher setiathome startup + unset setipids + + # kill'em all if any + for pid in ${pids}; do + ps p ${pid} > /dev/null && kill ${pid} + done +} + +setirestart () { # SIGCHLD handler + local pids pid dir + + # killing in progress + [ -n "${setipids}" ] || return + # restart in process + [ -n "${sleeppids}" ] && return + + # wait for setiathome servers to come up + sleep ${seti_sleep_time} & + + # wait even if more than one setiathome client dies + sleeppid=$! + while ps p ${sleeppid} > /dev/null; do + wait ${sleeppid} + done + unset sleeppid + + # killing while sleeping + [ -n "${setipids}" ] || return + + # save pids to restart + pids=${setipids} + # reset the process ID list + unset setipids + + for pid in ${pids}; do + if ps p ${pid} > /dev/null; then + # still alive + setipids="${setipids} ${pid}" + else + # backup the startup dir + eval dir=\${pid_${pid}} + # clean the old one + unset pid_${pid} + # launch the dead client + eval setistart ${dir} + fi + done +} + +if [ -z "${program_path}" ]; then + case $0 in + /*) rc_dir=${0%/*} ;; + *) rc_dir=${PWD:-$(pwd)} ;; + esac + rc_file=${0##*/} + rc_path=${rc_dir}/${rc_file} + + if ! PREFIX=$(expr ${rc_path} : "\(/.*\)/libexec/${rc_file}\$"); then + echo "${rc_file}: Cannot determine PREFIX." >&2 + echo "Please use the complete pathname." >&2 + exit 64 + fi + + echo "Don't use this script directly, uses the following one instead :" >&2 + echo " ${PREFIX}/etc/rc.d/${rc_file%.bin}.sh start" >&2 + exit 1 +fi + +# save this shell process ID +echo $$ > ${seti_wrkdir}/shpid.sah + +# setup handlers +trap setikill TERM +trap setirestart CHLD + +# startup setiathome client(s) +for dir in ${seti_wrksuff}; do + setistart ${seti_wrkdir}/${dir} +done + +# wait for them until death +while [ -n "${setipids}" ]; do + wait +done +#!/bin/sh -T + +# $FreeBSD$ + +# Copyright (c) 2003 Cyrille Lefevre. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The name of the authors and contributors may not be used to +# endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +setistart () { # dir + local dir + dir=$1 + + # goto the startup dir + cd ${dir} || return + + # don't start a dying client + [ -f stop_after_send.txt ] && return + + # fire up a setiathome client + ${program_path} ${program_args} > /dev/null & + + # memorize the startup dir + eval pid_$!=${dir} + # and the client process ID + setipids="${setipids} $!" +} + +setikill () { # SIGTERM handler + local pids pid + + # save pids to kill + pids="${sleeppid} ${setipids}" + # avoid futher setiathome startup + unset setipids + + # kill'em all if any + for pid in ${pids}; do + ps p ${pid} > /dev/null && kill ${pid} + done +} + +setirestart () { # SIGCHLD handler + local pids pid dir + + # killing in progress + [ -n "${setipids}" ] || return + # restart in process + [ -n "${sleeppids}" ] && return + + # wait for setiathome servers to come up + sleep ${seti_sleep_time} & + + # wait even if more than one setiathome client dies + sleeppid=$! + while ps p ${sleeppid} > /dev/null; do + wait ${sleeppid} + done + unset sleeppid + + # killing while sleeping + [ -n "${setipids}" ] || return + + # save pids to restart + pids=${setipids} + # reset the process ID list + unset setipids + + for pid in ${pids}; do + if ps p ${pid} > /dev/null; then + # still alive + setipids="${setipids} ${pid}" + else + # backup the startup dir + eval dir=\${pid_${pid}} + # clean the old one + unset pid_${pid} + # launch the dead client + eval setistart ${dir} + fi + done +} + +if [ -z "${program_path}" ]; then + case $0 in + /*) rc_dir=${0%/*} ;; + *) rc_dir=${PWD:-$(pwd)} ;; + esac + rc_file=${0##*/} + rc_path=${rc_dir}/${rc_file} + + if ! PREFIX=$(expr ${rc_path} : "\(/.*\)/libexec/${rc_file}\$"); then + echo "${rc_file}: Cannot determine PREFIX." >&2 + echo "Please use the complete pathname." >&2 + exit 64 + fi + + echo "Don't use this script directly, uses the following one instead :" >&2 + echo " ${PREFIX}/etc/rc.d/${rc_file%.bin}.sh start" >&2 + exit 1 +fi + +# save this shell process ID +echo $$ > ${seti_wrkdir}/shpid.sah + +# setup handlers +trap setikill TERM +trap setirestart CHLD + +# startup setiathome client(s) +for dir in ${seti_wrksuff}; do + setistart ${seti_wrkdir}/${dir} +done + +# wait for them until death +while [ -n "${setipids}" ]; do + wait +done diff --git a/astro/setiathome/files/setiathome.sh b/astro/setiathome/files/setiathome.sh index 57b4a55d22aa..4e6b7e7fe061 100644 --- a/astro/setiathome/files/setiathome.sh +++ b/astro/setiathome/files/setiathome.sh @@ -14,15 +14,20 @@ rc_path=${rc_dir}/${rc_file} rc_arg=$1 # override these variables in ${PREFIX}/etc/rc.setiathome.conf +set -a seti_wrkdir=/var/db/${rc_file%.sh} # primary working directory -seti_std_args=-email # command arguments for standard mode -seti_reg_args=-login # command arguments for register mode -seti_proxy_args= # proxy arguments -seti_user=setiathome # user id to run as -seti_group=${seti_user} # group id to run as +seti_std_args="-email -graphics" # startup command line arguments +seti_reg_args=-login # command line arguments to register +seti_proxy_server= # HTTP proxy server (hostname:port) +seti_socks_server= # SOCKS proxy server (hostname:port) +seti_socks_user= # SOCKS proxy user name +seti_socks_passwd= # SOCKS proxy password +seti_user=setiathome # user name to run as +seti_group=${seti_user} # group name to run as seti_nice=15 # nice level to run at seti_maxprocs=$(sysctl -n hw.ncpu) # max. number of processes to start -seti_sleep=21600 # time to sleep between restarts +seti_sleep_time=21600 # time to sleep between restarts +set +a if ! PREFIX=$(expr ${rc_path} : "\(/.*\)/etc/rc\.d/${rc_file}\$"); then echo "${rc_file}: Cannot determine PREFIX." >&2 @@ -35,12 +40,30 @@ rcconf_file=rc.${rc_file%.sh}.conf rcconf_path=${rcconf_dir}/${rcconf_file} if [ -f ${rcconf_path} ]; then + set -a . ${rcconf_path} + set +a fi program_dir=${PREFIX}/sbin program_file=${rc_file%.sh} program_path=${program_dir}/${program_file} +export program_path + +program_args="\ +${seti_std_args} \ +${seti_proxy_server:+-proxy} ${seti_proxy_server} \ +${seti_socks_server:+-socks_server} ${seti_socks_server} \ +${seti_socks_user:+-socks_user} ${seti_socks_user} \ +${seti_socks_passwd:+-socks_passwd} ${seti_socks_passwd} \ +${seti_nice:+-nice} ${seti_nice} \ +" +export program_args + + +wrapper_dir=${PREFIX}/libexec +wrapper_file=${rc_file%.sh}.bin +wrapper_path=${wrapper_dir}/${wrapper_file} syslog_facility=daemon.err @@ -50,6 +73,7 @@ while [ ${i} -gt 1 ]; do seti_wrksuff="${seti_wrksuff} ${i}" i=$((${i} - 1)) done +export seti_wrksuff case "$rc_arg" in start) @@ -73,38 +97,44 @@ start) exit 72 fi done - for i in ${seti_wrksuff}; do - su -fm ${seti_user} -c "exec /bin/sh -T" << EOF > /dev/null & - cd ${seti_wrkdir}/${i} || exit - echo \$\$ > shpid.sah - trap 'kill \$pid;exit' 15 - while :; do - ${program_path} \ - ${seti_std_args} ${seti_proxy_args} \ - ${seti_nice:+-nice} ${seti_nice} & - pid=\$!; wait \$pid - sleep ${seti_sleep} & - pid=\$!; wait \$pid - done -EOF - done + if ps axo comm | egrep ${program_file}; then + logger -sp ${syslog_facility} -t ${program_file} \ + "unable to start: ${program_file} is already running." + exit 72 + fi + su -fm ${seti_user} -c "exec ${wrapper_path} > /dev/null &" echo -n " SETI@home" ;; stop) + pid_path=${seti_wrkdir}/shpid.sah + if [ -f ${pid_path} ]; then + pid=$(cat ${pid_path}) + [ -n "${pid}" ] && ps p ${pid} > /dev/null && kill ${pid} + rm -f ${pid_path} + fi for i in ${seti_wrksuff}; do - for pid_path in ${seti_wrkdir}/${i}/pid.sah \ - ${seti_wrkdir}/${i}/shpid.sah; do - if [ -f ${pid_path} ]; then - kill $(cat ${pid_path}) 2> /dev/null - fi - done + pid_path=${seti_wrkdir}/${i}/pid.sah + if [ -f ${pid_path} ]; then + pid=$(cat ${pid_path}) + [ -n "${pid}" ] && ps p ${pid} > /dev/null && kill ${pid} + fi done if [ ! -f ${seti_wrkdir}/pid.sah ]; then killall ${program_file} 2> /dev/null fi ;; +gracefull) + for i in ${seti_wrksuff}; do + pid_path=${seti_wrkdir}/${i}/pid.sah + stop_path=${seti_wrkdir}/${i}/stop_after_send.txt + if [ -f ${pid_path} ]; then + touch ${stop_path} + fi + done + ;; + restart) $0 stop $0 start @@ -187,7 +217,7 @@ register) ;; *) - echo "usage: ${rc_file} {start|stop|restart|status|register}" >&2 + echo "usage: ${rc_file} {start|stop|gracefull|restart|status|register}" >&2 exit 64 ;; esac diff --git a/astro/setiathome/pkg-install b/astro/setiathome/pkg-install index f77e51636a02..f8a894900587 100644 --- a/astro/setiathome/pkg-install +++ b/astro/setiathome/pkg-install @@ -33,37 +33,54 @@ ncpu=$(sysctl -n hw.ncpu) case "${PKG_ACTION}" in POST-INSTALL) - + if [ -f ${seti_wrkdir}/user_info.sah ]; then +echo "**** SETI@home already has a working directory for temporary files and" +echo " you seem to be already registered with SETI@home." +echo +echo -n " Would you like repeat the registration with SETI@home? [y/N] " + read ans +echo + if [ "X${ans}" = "XY" -o "X${ans}" = "Xy" ]; then + register=yes + else + register=no + fi + else echo "**** SETI@home requires a working directory for temporary files and a" echo " brief registration process." echo echo " Would you like to set up a working directory in ${seti_wrkdir}," - if [ ${seti_maxprocs} -gt 1 ]; then + if [ ${seti_maxprocs} -gt 1 ]; then echo " register with SETI@home, and let me arrange for ${ncpu} setiathome" - if [ ${ncpu} -eq ${seti_maxprocs} ]; then + if [ ${ncpu} -eq ${seti_maxprocs} ]; then echo " processes (one for each of your ${ncpu} CPUs) to be started" echo -n " automatically as user \`${seti_user}'? [Y/n] " - else + else echo " processes (as configured) to be started automatically as user" echo -n " \`${seti_user}'? [Y/n] " - fi - else + fi + else echo " register with SETI@home, and let me arrange for setiathome to be" echo -n " started automatically as user \`${seti_user}'? [Y/n] " - fi - read a + fi + read ans echo - if [ "X$a" = "XN" -o "X$a" = "Xn" ]; then + if [ "X${ans}" = "XN" -o "X${ans}" = "Xn" ]; then echo "**** Please set up the working directory yourself. You may use" echo " ${rc_path} register" echo " to do so. See setiathome(1) for details." - exit 0 + exit 0 + else + register=yes + fi fi - ${rc_path} register - if [ ! -f ${seti_wrkdir}/user_info.sah ]; then + if [ "${register}" = "yes" ]; then + ${rc_path} register + if [ ! -f ${seti_wrkdir}/user_info.sah ]; then echo "unable to start setiathome: it seems registration or login failed." echo "See setiathome(1) for details." - exit 0 + exit 0 + fi fi ${rc_path} start > /dev/null echo diff --git a/astro/setiathome/pkg-message b/astro/setiathome/pkg-message index 1188ce50da02..b3f0e0f96ffd 100644 --- a/astro/setiathome/pkg-message +++ b/astro/setiathome/pkg-message @@ -1,8 +1,7 @@ **** %%PREFIX%%/etc/rc.%%PREFX%%setiathome%%SUFX%%.conf may be edited to tune some startup variables such as `seti_nice' defaulted to 15 and `seti_maxprocs' defaulted to your number of processors. -**** NOTE: unlike previous versions, FreeBSD 5.x for i386 doesn't - support a.out binaries by default. To run setiathome, you have - to add the following line to your kernel configuration file - (/sys/i386/conf/<YOUR_KERNEL>) : - options COMPAT_AOUT # Enable i386 a.out binary support +**** NOTE: FreeBSD 5.x does support FreeBSD 4.0 binaries by default. + To run setiathome, you must have the following line to your + kernel configuration file (/sys/i386/conf/<YOUR_KERNEL>) : + options COMPAT_FREEBSD4 # Compatible with FreeBSD 4.x diff --git a/astro/setiathome/pkg-plist b/astro/setiathome/pkg-plist index 61991ecca6da..8ce3de3307e0 100644 --- a/astro/setiathome/pkg-plist +++ b/astro/setiathome/pkg-plist @@ -1,3 +1,5 @@ +@comment $FreeBSD$ +libexec/%%PREFX%%setiathome%%SUFX%%.bin sbin/%%PREFX%%setiathome%%SUFX%% @unexec if cmp -s %D/etc/rc.%%PREFX%%setiathome%%SUFX%%.conf %D/etc/rc.%%PREFX%%setiathome%%SUFX%%.conf.sample; then rm -f %D/etc/rc.%%PREFX%%setiathome%%SUFX%%.conf; fi etc/rc.%%PREFX%%setiathome%%SUFX%%.conf.sample |