summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sci-misc/boinc/files/boinc.init')
-rw-r--r--sci-misc/boinc/files/boinc.init103
1 files changed, 70 insertions, 33 deletions
diff --git a/sci-misc/boinc/files/boinc.init b/sci-misc/boinc/files/boinc.init
index 8a2543faae3b..55ebfd4398ff 100644
--- a/sci-misc/boinc/files/boinc.init
+++ b/sci-misc/boinc/files/boinc.init
@@ -3,49 +3,85 @@
opts="${opts} attach"
depend() {
- use dns
- need net
+ # we can use dns and net, but we can also in most cases live without them
+ use dns net
}
-start() {
- ebegin "Starting BOINC"
- if [ ! -d ${RUNTIMEDIR} ]; then
- einfo "Directory ${RUNTIMEDIR} not existing, creating now."
- /bin/mkdir ${RUNTIMEDIR}
- /bin/chown ${USER}:${GROUP} ${RUNTIMEDIR}
- if [ ! -d ${RUNTIMEDIR} ]; then
- eerror "Directory ${RUNTIMEDIR} could not be created!"
+create_work_directory() {
+ if [[ ! -d $RUNTIMEDIR ]]; then
+ einfo "Directory $RUNTIMEDIR not existing, creating now."
+ mkdir $RUNTIMEDIR
+ chown ${USER}:${GROUP} $RUNTIMEDIR
+ if [[ ! -d $RUNTIMEDIR ]]; then
+ eeror "Directory $RUNTIMEDIR could not be created!"
return 1
fi
+ ln -s /etc/ssl/certs/ca-certificates.crt $RUNTIMEDIR/ca-bundle.crt
fi
+}
- cd ${RUNTIMEDIR}
+generate_logs() {
+ if [[ ! -f $LOGFILE ]]; then
+ einfo "No $LOGFILE around. Creating new..."
+ einfo "For good log rotation is great tool app-admin/logrotate"
+ touch $LOGFILE
+ chown ${USER}:${GROUP} $LOGFILE
+ fi
+}
- if [ ! -f lockfile ]; then
- einfo "File ${RUNTIMEDIR}/lockfile does not exist, assuming first run."
- einfo "You need to setup an account on the BOINC project homepage beforehand! Go to http://boinc.berkeley.edu/ and locate your project."
- einfo "Then either run /etc/init.d/boinc attach or connect with a gui client and attach to a project with that."
+cuda_check() {
+ if [[ -f /opt/cuda/lib/libcudart.so ]]; then
+ # symlink wont harm :]
+ ln -snf /opt/cuda/lib/libcudart.so $RUNTIMEDIR/libcudart.so
fi
+}
- # if the log file doesn't exist, create it with root privs, then change ownership to boinc
- if [ ! -f ${LOGFILE} ]; then
- touch ${LOGFILE}
- chown ${USER}:${GROUP} ${LOGFILE}
- else
- mv ${LOGFILE} ${LOGFILE}.old
- touch ${LOGFILE}
- chown ${USER}:${GROUP} ${LOGFILE}
+start() {
+ ebegin "Starting BOINC"
+
+ create_work_directory
+ cuda_check
+
+ cd $RUNTIMEDIR
+
+ if [[ ! -f lockfile ]]; then
+ einfo "File $RUNTIMEDIR/lockfile does not exist, assuming first run."
+ einfo "You need to setup an account on the BOINC project homepage beforehand!"
+ einfo "Go to http://boinc.berkeley.edu/ and locate your project."
+ einfo "Then either run /etc/init.d/boinc attach or connect with a gui client"
+ einfo "and attach to a project with that."
+ echo
+ ewarn "Note that for attaching to some project you need your network up and running."
+ ewarn "network is needed only for jobs fetching afterwards"
fi
- if [ ${ALLOW_REMOTE_RPC} = "yes" ]; then
+ generate_logs
+
+ if [[ ${ALLOW_REMOTE_RPC} = "yes" ]]; then
ARGS="${ARGS} -allow_remote_gui_rpc"
fi
+
+ # sys-apps/util-linux
+ CHRT="/usr/bin/chrt ${SCHED_PARAM}"
- setsid start-stop-daemon --quiet --start --chdir ${RUNTIMEDIR} \
+ ${CHRT} start-stop-daemon \
+ --quiet --start --chdir ${RUNTIMEDIR} \
--exec ${BOINCBIN} --chuid ${USER}:${GROUP} \
- --nicelevel ${NICELEVEL} -- ${ARGS} > ${LOGFILE} 2>&1 &
+ --background --stdout ${LOGFILE} --stderr ${LOGFILE} \
+ --nicelevel ${NICELEVEL} -- ${ARGS}
- eend $?
+ RESULT=$?
+
+ if [ "${CPU_SHARE}" -a -d /sys/kernel/uids ]; then
+ BUID=`id -u ${USER}`
+ # It might take a moment for start-stop-daemon to chuid
+ [[ -d /sys/kernel/uids/${BUID} ]] || sleep 5 # 5 was working always here
+ if [[ -w /sys/kernel/uids/${BUID}/cpu_share ]]; then
+ echo ${CPU_SHARE} > /sys/kernel/uids/${BUID}/cpu_share
+ fi
+ fi
+
+ eend $RESULT
}
attach() {
@@ -55,26 +91,27 @@ attach() {
read key
RC_QUIET_STDOUT="yes" svc_status
- if [ $? == 1 ]; then
+ if [[ $? = 1 ]]; then
svc_start
fi
ebegin "Attaching to project"
- # boinc cmd does not return 1 when it fails currently
- boinc_cmd --project_attach ${url} ${key} &> /dev/null
+ # we have to work in runtime directory
+ cd $RUNTIMEDIR
+ # boinc does not return 1 when it fails currently
+ $BOINCBIN --attach_project $url $key &> /dev/null
eend $?
sleep 10
- tail ${LOGFILE}
+ tail $LOGFILE
}
stop() {
ebegin "Stopping BOINC"
- start-stop-daemon --stop --quiet --exec ${BOINCBIN}
+ start-stop-daemon --stop --retry 3 --quiet --exec $BOINCBIN
eend $?
}
restart() {
svc_stop
- sleep 6
svc_start
}