Script de service (rc) pour Readeck sur FreeBSD

[lienbillet seul]

Salut et bonne année 2025 à tous.

Il m'est venu à l'esprit que jusque ici, je n'avais pas localement mise en place une manière d'archiver les pages Web qui me plaisent et m'ont plues.

Rien n'est éternel, et un marque-page suit la même logique: un beau jour, vous allez cliquer pour revisiter un étrange mais intéressant site web et là c'est le drame. Le domaine a été vendu, l'auteur n'avait plus envie de le maintenir, 404 Not Found... Les raisons peuvent être multiples.

Une solution existe depuis un bon bout de temps sur l'Internet: Archive.org. La WayBack machine m'a sauvé (et me sauve encore) pour trouver de vieux exécutables Windows et morceaux d'informations disparus de l'Internet.

Je me suis donc dit "Est-ce qu'il existe un projet libre et open source équivalent et pas trop dur à lancer?" et fichtrement que oui! J'ai trouvé ma joie avec Readeck : écrit en Go, il suffit de télécharger le binaire pour la bonne plateforme, le rendre exécutable, créer un utilisateur puis enfin démarrer le serveur. Ne pas oublier télécharger l'extension de navigateur (Firefox, Chrome) pour envoyer une page à Readeck en 3 clics!

Dans mon cas, la page de documentation concernant le déploiement de Readeck n'avait pas de mention de script rc.d de service pour FreeBSD: c'est embêtant car si je redémarre, Readeck ne sera pas démarré en même temps que le serveur ! Et pas de possibilité de voir le status ou stopper Readeck via la commande native service.

Voici donc ci-dessous un script de service rc.d que j'ai créé et testé. D'abord, créez l'utilisateur readeck avec les commandes suivantes:

mkdir /home/readeck
pw useradd -d /home/readeck -w no -s /usr/sbin/nologin -n readeck
chown readeck /home/readeck
sysrc readeck_enable="YES"

/etc/rc.d/readeck:

#!/bin/sh
# PROVIDE: readeck
# REQUIRE: FILESYSTEMS networking
# KEYWORDS: web archiving

. /etc/rc.subr

name="readeck"
program_name="readeck"
procname="${name}"
rcvar=readeck_enable
readeck_user="root"

load_rc_config $name
: ${readeck_enable="NO"}
: ${readeck_launch_user="readeck"}
: ${readeck_chdir="/home/readeck"}
: ${readeck_config="${readeck_chdir}/config.toml"}
: ${readeck_exec="${readeck_chdir}/${program_name}"}
: ${readeck_logfile="${readeck_chdir}/${program_name}.log"}

required_files="${readeck_config}"
exec_path=${readeck_exec}
status_cmd="readeck_status"
stop_cmd="readeck_stop"

pidfile="${readeck_chdir}/${program_name}.pid"

command="/usr/local/bin/daemonize"
command_args="-u ${readeck_launch_user} -c ${readeck_chdir} -o ${readeck_logfile} -e ${readeck_logfile}.err -p ${pidfile} -l ${exec_path}.lck ${exec_path} serve"


readeck_status()
{
	${exec_path} healthcheck -config ${required_files} > /dev/null 2>&1
	if [ $? = 0 ]; then
		echo "Readeck is running and it's PID is `cat ${pidfile}`."
	else
		echo "Readeck is not running:"
		${exec_path} healthcheck -config ${required_files}
	fi
}

readeck_stop()
{
	echo Stopping readeck...
	${exec_path} healthcheck -config ${required_files} > /dev/null 2>&1
	if [ $? = 0 ]; then
		${exec_path} cleanup -config ${required_files}
		kill `cat ${pidfile}`
		rm -f ${pidfile}
		rm -f ${exec_path}.lck
		echo Stopped readeck.
	else
		echo Server is stopped 
	fi 
}

run_rc_command "$1"

Et un grand merci à Olivier Meunier et leurs contributeurs pour avoir créé Readeck.