diff options
Diffstat (limited to 'sci-misc/boinc/files/boinc.init')
-rw-r--r-- | sci-misc/boinc/files/boinc.init | 103 |
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 } |