# sloweb partie 1 : run_cmds
2024-03-13T13:42:23Z

C'est parti pour détailler tout ce que me permet de faire sloweb actuellement:
=> https://git.sr.ht/~prx/sloweb

## sloweb_online

Tout d'abord, sloweb vérifie que l'on a bien un accès en ligne, et appelle pour cela le script sloweb_online. Si tout va bien, ce dernier retourne 0, sinon il retourne une erreur.

On peut lire au tout début de ce script quelques lignes communes à tous les scripts sloweb_*. Cela concerne la configuration : 

```
# configuration
# if SLOWEB_DIR not set as ENV VARS, set default
test -z "${SLOWEB_DIR}" && SLOWEB_DIR=~/sloweb
config="${SLOWEB_DIR}/slowebrc"
if [ ! -f "${config}" ]; then
	printf "%s" "Configuration not found, copy slowebrc.example to ${config}"
	exit 1
fi
# import config
. "${config}"
```

On peut voir qu'à moins qu'une variable d'environnement soit déjà définie, on va aller chercher le fichier ~/sloweb/slowebrc comme configuration.
Utiliser une variable d'environnement facilite la possibilité de changer la structure des répertoires utilisés par sloweb sans se prendre la tête. Dans le fichier ~/.profile, on pourra écrire:

```
export SLOWEB_DIR=/var/sloweb/or/else
```

On retiendra donc que par défaut, la configuration de sloweb a lieu dans ~/sloweb/slowebrc. Un exemple est fourni, il est commenté pour expliquer à quoi servent chaque partie.

On trouve notamment dans ce fichier la partie relative à sloweb_online:

```
# sloweb_online
# connectivity check, multiple domains in case one of them is down
SLOWEB_ONLINE_DOMAINS="openbsd.org wikipedia.org www.nasa.gov"
SLOWEB_ONLINE_PORT=443
```

Voici une liste de domaines qu'on va chercher à atteindre via le port 443.
Si le premier échoue, alors on essaie le suivant : après tout, un site peut bien être en panne alors que vous êtes pourtant connecté.
Dès qu'un accès a réussi, alors sloweb_s'arrête et retourne 0.

Ça tient finalement en quelques lignes:

```
# check if currently connected
connected=0

for d in ${SLOWEB_ONLINE_DOMAINS}; do
	# uncomment to use ping instead of netcat
	# ping -c1 -w2 "$d" >/dev/null 2>&1
	nc -zw1 "${d}" $SLOWEB_ONLINE_PORT >/dev/null 2>&1

	if [ $? -eq 0 ]; then
		connected=1
		break
	fi
done

if [ $connected -eq 0 ]; then
	_err "It seems you cannot reach the Internet"
	exit 1
fi
exit 0
```

Vous aurez noté l'utilisation de netcat. Il est présent par défaut sous OpenBSD.

Certains préféreront décommenter l'appel à "ping" à la place. J'ai cependant lu à ce propos que certains fournisseurs bloquent le ping, pas tant le serveur que le point d'accès : pensez WiFi public, ce qui donnerait l'impression d'être hors ligne, alors que le port 443 protocole TCP utilisé pour les "accès https" est bien ouvert. J'avoue, je n'ai pas trop d'avis là-dessus, je n'ai jamais été confronté à ça.

Pour finir, vous aurez remarqué la fonction "_err", qu'on retrouvera dans d'autres scripts.
J'aurais pu l'écrire dans le fichier de configuration, mais je craignais de rentre les choses trop confuses en mélangeant fonctions et configuration.

## sloweb_run_cmds

le script sloweb_run_cmds va exécuter toutes les commandes présentes dans des fichiers, eux-même stockés dans le dossier SLOWEB_CMDS (~/sloweb/cmds par défaut).

```
find "${SLOWEB_CMDS}" -type f | while read -r cmd; do
	${SHELL:-"/bin/sh"} -e "${cmd}"

	if [ $? -ne 0 ]; then
		_err "'$(cat ${cmd})' in ${cmd} failed"
	else
		_log "'$(cat ${cmd})' successfully executed"
		rm -f "${cmd}"
	fi
done
```

"find" permet de lister tous les fichiers du dossier cité ci-dessus puis d'en exécuter le contenu comme un script. On passe ce fichier au shell par défaut et on informe l'utilisateur si tout s'est bien déroulé. Dans ce cas, on supprime le fichier.
On laisse le fichier présent pour que l'utilisateur puisse éventuellement corriger la commande.

On pourrait laisser l'utilisateur créer des fichiers dans ce dossier, mais autant l'aider avec un script qui va créer des fichiers uniques pour les commandes qu'il voudra exécuter lors de son retour en ligne. C'est ce que fait sloweb_cmd.

## sloweb_cmd

Ce script se charge de créer un fichier dont le nom est unique pour ne pas écraser un éventuel fichie déjà existant. Pour cela, la commande "mktemp" est parfaite.

```
# use mktemp for unique file, and a timestamp to keep order
cmd_file=$(mktemp "${SLOWEB_DIR}/cmds/$(date +%s).XXXXXXXX")
printf "%s\n" "$*" >> "${cmd_file}"
```

Le "printf" permet de conserver tous les caractères qui seraient sinon interprétés.

## Le mot de la fin

J'ai commencé par une partie un peu technique de sloweb.
Le prochain coup, je présenterai la partie sur les abonnements aux flux RSS/ATOM, qui utilise des outils déjà existants.

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:bla@bla.si3t.ch?subject=sloweb-part-1-run-cmds

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt