#!/bin/sh
# This file is part of BOINC.
# https://boinc.berkeley.edu
# Copyright (C) 2024 University of California
#
# BOINC is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License
# as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
#
# BOINC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with BOINC. If not, see .
set -e
BOINCUSER=boinc
BOINCGROUP=boinc
BOINCDIR=/var/lib/boinc
set_perm() {
chown $2:$3 "$1"
chmod $4 "$1"
}
set_perm_recursive() {
chown -R $2:$3 "$1"
chmod -R $4 "$1"
}
set_perm_dir() {
for file in $(ls "$1")
do
path="$1/${file}"
set_perm "${path}" $2 $3 $4
done
}
update_nested_dirs() {
chmod $2 "${1}"
for file in $(ls "$1")
do
if [ -d "${1}/${file}" ] ; then
update_nested_dirs "${1}/${file}" $2
fi
done
}
if ! getent group ${BOINCGROUP} >/dev/null; then
groupadd -r ${BOINCGROUP}
fi
if ! getent passwd ${BOINCUSER} >/dev/null; then
useradd -r -g ${BOINCGROUP} -d ${BOINCDIR} -s /usr/sbin/nologin -c "BOINC user" ${BOINCUSER}
fi
if ! getent group ${BOINCGROUP} | grep -q ${BOINCUSER}; then
usermod -a -G ${BOINCGROUP} ${BOINCUSER}
fi
if getent group video >/dev/null; then
if ! getent group video | grep -q ${BOINCUSER}; then
usermod -a -G video ${BOINCUSER}
fi
fi
if getent group render >/dev/null; then
if ! getent group render | grep -q ${BOINCUSER}; then
usermod -a -G render ${BOINCUSER}
fi
fi
if [ -n "$SUDO_USER" ]; then
if ! getent group ${BOINCGROUP} | grep -q $SUDO_USER; then
usermod -a -G ${BOINCGROUP} $SUDO_USER
fi
fi
if [ ! -d /etc/boinc-client ] ; then
mkdir -p /etc/boinc-client
fi
if [ ! -e ${BOINCDIR}/cc_config.xml ] ; then
echo """
""" > ${BOINCDIR}/cc_config.xml
fi
if [ ! -e /etc/boinc-client/cc_config.xml ] ; then
ln -s ${BOINCDIR}/cc_config.xml /etc/boinc-client/cc_config.xml
fi
if [ ! -e ${BOINCDIR}/global_prefs_override.xml ] ; then
echo """
""" > ${BOINCDIR}/global_prefs_override.xml
fi
if [ ! -e /etc/boinc-client/global_prefs_override.xml ] ; then
ln -s ${BOINCDIR}/global_prefs_override.xml /etc/boinc-client/global_prefs_override.xml
fi
if [ ! -e ${BOINCDIR}/gui_rpc_auth.cfg ] ; then
echo "" > ${BOINCDIR}/gui_rpc_auth.cfg
fi
if [ ! -e /etc/boinc-client/gui_rpc_auth.cfg ] ; then
ln -s ${BOINCDIR}/gui_rpc_auth.cfg /etc/boinc-client/gui_rpc_auth.cfg
fi
if [ ! -e ${BOINCDIR}/remote_hosts.cfg ] ; then
echo """
# This file contains a list of remote host names or IP addresses (one per line)
# that are allowed to connect to the BOINC client via the GUI RPC interface.
# Only the hosts listed in this file will be allowed to connect.
# Lines starting with '#' and ';' are comments and are ignored.
""" > ${BOINCDIR}/remote_hosts.cfg
fi
if [ ! -e /etc/boinc-client/remote_hosts.cfg ] ; then
ln -s ${BOINCDIR}/remote_hosts.cfg /etc/boinc-client/remote_hosts.cfg
fi
if [ ! -e ${BOINCDIR}/ca-bundle.crt ] ; then
ln -s /etc/ssl/certs/ca-certificates.crt ${BOINCDIR}/ca-bundle.crt
fi
set_perm_recursive ${BOINCDIR} ${BOINCUSER} ${BOINCGROUP} u+rw,g+rw,o+r-w
set_perm ${BOINCDIR} ${BOINCUSER} ${BOINCGROUP} 0775
if [ -e ${BOINCDIR}/gui_rpc_auth.cfg ] ; then
set_perm ${BOINCDIR}/gui_rpc_auth.cfg ${BOINCUSER} ${BOINCGROUP} 0660
fi
if [ -e ${BOINC_DIR}/remote_hosts.cfg ] ; then
set_perm ${BOINCDIR}/remote_hosts.cfg ${BOINCUSER} ${BOINCGROUP} 0660
fi
if [ -d ${BOINCDIR}/projects ] ; then
set_perm ${BOINCDIR}/projects ${BOINCUSER} ${BOINCGROUP} 0775
update_nested_dirs ${BOINCDIR}/projects u+x,g+x,o+x
fi
if [ -d ${BOINCDIR}/slots ] ; then
set_perm ${BOINCDIR}/slots ${BOINCUSER} ${BOINCGROUP} 0775
update_nested_dirs ${BOINCDIR}/slots u+x,g+x,o+x
fi
if [ -e /etc/boinc-client/cc_config.xml ] ; then
set_perm /etc/boinc-client/cc_config.xml ${BOINCUSER} ${BOINCGROUP} 0660
fi
if [ -e /etc/boinc-client/global_prefs_override.xml ] ; then
set_perm /etc/boinc-client/global_prefs_override.xml ${BOINCUSER} ${BOINCGROUP} 0660
fi
if [ -e /etc/boinc-client/gui_rpc_auth.cfg ] ; then
set_perm /etc/boinc-client/gui_rpc_auth.cfg ${BOINCUSER} ${BOINCGROUP} 0660
fi
if [ -e /etc/boinc-client/remote_hosts.cfg ] ; then
set_perm /etc/boinc-client/remote_hosts.cfg ${BOINCUSER} ${BOINCGROUP} 0660
fi
if [ -x /bin/systemctl ] ; then
systemctl enable --now boinc-client.service
fi