You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
5.2 KiB
222 lines
5.2 KiB
#!/sbin/openrc-run
|
|
# Copyright 1999-2017 Gentoo Foundation
|
|
# Distributed under the terms of the GNU General Public License v2
|
|
|
|
extra_started_commands="attach resume suspend"
|
|
|
|
depend() {
|
|
# we can use dns and net, but we can also in most cases live without them
|
|
use dns net ntp-client ntpd
|
|
}
|
|
|
|
create_work_directory() {
|
|
local sslcrt="/etc/ssl/certs/ca-certificates.crt"
|
|
|
|
if [ ! -d "${RUNTIMEDIR}" ]; then
|
|
einfo "Directory ${RUNTIMEDIR} does not exist, creating now."
|
|
if ! mkdir -p "${RUNTIMEDIR}"; then
|
|
eerror "Directory ${RUNTIMEDIR} could not be created!"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
# ensure proper ownership
|
|
if ! chown "${USER}:${GROUP}" "${RUNTIMEDIR}"; then
|
|
eerror "Changing ownership of '${RUNTIMEDIR}' to '${USER}:${GROUP}' failed!"
|
|
return 1
|
|
fi
|
|
|
|
if [ ! -e "${RUNTIMEDIR}"/ca-bundle.crt ]; then
|
|
if [ ! -f "${sslcrt}" ]; then
|
|
eerror "'${sslcrt}' does not exist!"
|
|
return 1
|
|
fi
|
|
|
|
if ! ln -s "${sslcrt}" "${RUNTIMEDIR}"/ca-bundle.crt; then
|
|
eerror "Symlinking '${sslcrt}' failed!"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
fix_lib_symlinks() {
|
|
local src="$1"
|
|
local tgt="$2"
|
|
|
|
# If the source does not exist, we can not do anything
|
|
if [ ! -f "${src}" ] ; then
|
|
return 1
|
|
fi
|
|
|
|
# Check whether the symlink is already there and in order
|
|
if [ -L "${tgt}" ] ; then
|
|
if [ -f "${tgt}" ] ; then
|
|
return 0
|
|
fi
|
|
|
|
# Remove broken symlink
|
|
if ! rm -f "${tgt}"; then
|
|
eerror "Removing '${tgt}' failed!"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
# symlink the correct path
|
|
if ! ln -snf "${src}" "${tgt}"; then
|
|
eerror "Symlinking '${src}' to '${tgt}' failed!"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
cuda_check() {
|
|
local libsource="/opt/cuda/@libdir@/libcudart.so"
|
|
local libtarget="${RUNTIMEDIR}/libcudart.so"
|
|
|
|
fix_lib_symlinks "${libsource}" "${libtarget}" || return 1
|
|
return 0
|
|
}
|
|
|
|
opencl_check() {
|
|
local libsource="/usr/@libdir@/libOpenCL.so"
|
|
local libtarget="${RUNTIMEDIR}/libOpenCL.so"
|
|
|
|
fix_lib_symlinks "${libsource}" "${libtarget}" || return 1
|
|
return 0
|
|
}
|
|
|
|
env_check() {
|
|
# Make sure the configuration is sane
|
|
: ${USER:="boinc"}
|
|
: ${GROUP:="boinc"}
|
|
: ${RUNTIMEDIR:="/var/lib/boinc"}
|
|
: ${BOINCBIN:="$(which boinc_client)"}
|
|
: ${BOINC_PIDFILE:="/var/run/boinc_client.pid"}
|
|
: ${BOINCCMD:="$(which /usr/bin/boinccmd)"}
|
|
: ${ALLOW_REMOTE_RPC:="yes"}
|
|
: ${NICELEVEL:="19"}
|
|
# ARGS is not checked, it could have been explicitly set
|
|
# to be empty by the user.
|
|
|
|
# If the client was not found (how?) something is seriously wrong
|
|
if [ ! -x "${BOINCBIN}" ]; then
|
|
eerror "No boinc_client found!"
|
|
return 1
|
|
fi
|
|
|
|
# The boinccmd is crucial, or we can not attach, suspend or resume
|
|
# the boinc client
|
|
if [ ! -x "${BOINCCMD}" ]; then
|
|
eerror "No boinccmd program found!"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
start_pre() {
|
|
env_check || return 1
|
|
create_work_directory || return 1
|
|
cuda_check || einfo "CUDA not supported"
|
|
opencl_check || einfo "OpenCL not supported"
|
|
|
|
if [ ! -f "${RUNTIMEDIR}/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 ${RC_SERVICE} attach or connect with a gui client"
|
|
einfo "and attach to a project with that."
|
|
einfo ""
|
|
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
|
|
|
|
return 0
|
|
}
|
|
|
|
start() {
|
|
if [ "${ALLOW_REMOTE_RPC}" = "yes" ]; then
|
|
ARGS="${ARGS} --allow_remote_gui_rpc"
|
|
fi
|
|
|
|
ARGS="${ARGS} --dir "${RUNTIMEDIR}" --redirectio"
|
|
|
|
ebegin "Starting ${RC_SVCNAME}"
|
|
start-stop-daemon --start --nicelevel ${NICELEVEL} \
|
|
--user "${USER}:${GROUP}" --quiet --make-pidfile \
|
|
--pidfile "${BOINC_PIDFILE}" --background \
|
|
--exec "${BOINCBIN}" -- ${ARGS}
|
|
eend $?
|
|
}
|
|
|
|
attach() {
|
|
local url=""
|
|
local key=""
|
|
|
|
env_check || return 1
|
|
|
|
einfo "If you can't find your account key just try to obtain it by using:"
|
|
einfo " boinccmd --passwd PASSWORD_FROM_GUI_RPC_AUTH --lookup_account URL EMAIL PASSWORD"
|
|
|
|
printf " Enter the Project URL: "
|
|
read url
|
|
printf " Enter your Account Key: "
|
|
read key
|
|
|
|
if ! service_started; then
|
|
"${RC_SERVICE}" start
|
|
fi
|
|
|
|
ebegin "${RC_SVCNAME}: Attaching to project"
|
|
start-stop-daemon --user "${USER}:${GROUP}" --quiet \
|
|
--chdir "${RUNTIMEDIR}" --exec "${BOINCCMD}" \
|
|
-- --project_attach ${url} ${key}
|
|
eend $?
|
|
|
|
sleep 10
|
|
tail "${RUNTIMEDIR}/stdoutdae.txt"
|
|
}
|
|
|
|
stop() {
|
|
local stop_timeout="SIGTERM/60/SIGTERM/30/SIGKILL/30"
|
|
|
|
env_check || return 1
|
|
|
|
ebegin "Stopping ${RC_SVCNAME}"
|
|
start-stop-daemon --stop --quiet --progress \
|
|
--retry ${stop_timeout} \
|
|
--pidfile "${BOINC_PIDFILE}"
|
|
eend $?
|
|
}
|
|
|
|
resume() {
|
|
env_check || return 1
|
|
|
|
for url in $(cd "${RUNTIMEDIR}" ; \
|
|
"${BOINCCMD}" --get_project_status | \
|
|
sed -n 's/\s*master URL: //p'); do
|
|
ebegin "Resuming ${url}"
|
|
start-stop-daemon --user "${USER}:${GROUP}" --quiet \
|
|
--chdir "${RUNTIMEDIR}" --exec "${BOINCCMD}" \
|
|
-- --project ${url} resume
|
|
eend $?
|
|
done
|
|
}
|
|
|
|
suspend() {
|
|
env_check || return 1
|
|
|
|
for url in $(cd "${RUNTIMEDIR}" ; \
|
|
"${BOINCCMD}" --get_project_status | \
|
|
sed -n 's/\s*master URL: //p'); do
|
|
ebegin "Suspending ${url}"
|
|
start-stop-daemon --user "${USER}:${GROUP}" --quiet \
|
|
--chdir "${RUNTIMEDIR}" --exec "${BOINCCMD}" \
|
|
-- --project ${url} suspend
|
|
eend $?
|
|
done
|
|
}
|