#!/sbin/openrc-run # Copyright 1999-2022 Gentoo Authors # 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 } env_check() { # Make sure the configuration is sane : ${USER:="boinc"} : ${GROUP:="$(id -ng ${USER})"} : ${RUNTIMEDIR:="/var/lib/boinc"} : ${BOINCBIN:="$(which boinc_client)"} : ${BOINC_PIDFILE:="/var/run/boinc_client.pid"} : ${BOINCCMD:="$(which /usr/bin/boinccmd)"} : ${ALLOW_REMOTE_RPC:="no"} : ${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 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 }