[HS] systemd service utilisateur
Le
Alexandre Hoïde

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
_@>
Voici un bidule systemd pour créer un répertoire temporaire à la
connexion utilisateur initiale. C'est ma première incursion dans
systemd : remarques bienvenues (celles concernant le script ou d'autres
manières de faire seront également méditées).
Fichiers :
/usr/local/bin/usertmp
~/.config/systemd/user/usertmp.service
Activation :
$ systemclt --user enable usertmp.service
--
 ___________________
| $ post_tenebras ↲ |       waouh !
|Â GNUÂ Â Â Â Â Â Â Â Â /Â Â Â Â |Â Â Â Â Â Â /
|Â Â Â Â Â Â Â Â Â Â --Â *Â --Â Â |Â Â Â Â Â o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -
--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename=usertmp
#!/bin/sh
start() {
tDir=/tmp/${USER}.$$
userLink=/home/${USER}/tmp${USER}
(umask 077 && mkdir ${tDir}) &&
ln -f -s ${tDir} ${userLink} ||
exit 1
}
stop() {
userLink=/home/${USER}/tmp${USER}
tDir=$(readlink ${userLink})
rm -rf ${tDir}
rm -f ${userLink}
}
case $1 in
start|stop) "$1" ;;
esac
--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usertmp.service"
[Unit]
Description=Create user tmp dir and symblink in home user
[Service]
Type=oneshot
ExecStart=/usr/local/bin/usertmp start
ExecStop=/usr/local/bin/usertmp stop
RemainAfterExit=yes
[Install]
WantedByÞfault.target
--BOKacYhQ+x31HxR3--
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
_@>
Voici un bidule systemd pour créer un répertoire temporaire à la
connexion utilisateur initiale. C'est ma première incursion dans
systemd : remarques bienvenues (celles concernant le script ou d'autres
manières de faire seront également méditées).
Fichiers :
/usr/local/bin/usertmp
~/.config/systemd/user/usertmp.service
Activation :
$ systemclt --user enable usertmp.service
--
 ___________________
| $ post_tenebras ↲ |       waouh !
|Â GNUÂ Â Â Â Â Â Â Â Â /Â Â Â Â |Â Â Â Â Â Â /
|Â Â Â Â Â Â Â Â Â Â --Â *Â --Â Â |Â Â Â Â Â o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -
--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename=usertmp
#!/bin/sh
start() {
tDir=/tmp/${USER}.$$
userLink=/home/${USER}/tmp${USER}
(umask 077 && mkdir ${tDir}) &&
ln -f -s ${tDir} ${userLink} ||
exit 1
}
stop() {
userLink=/home/${USER}/tmp${USER}
tDir=$(readlink ${userLink})
rm -rf ${tDir}
rm -f ${userLink}
}
case $1 in
start|stop) "$1" ;;
esac
--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usertmp.service"
[Unit]
Description=Create user tmp dir and symblink in home user
[Service]
Type=oneshot
ExecStart=/usr/local/bin/usertmp start
ExecStop=/usr/local/bin/usertmp stop
RemainAfterExit=yes
[Install]
WantedByÞfault.target
--BOKacYhQ+x31HxR3--
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
On Tue, Oct 20, 2015 at 06:49:51AM +0200, Alexandre Hoïde wrote:
Modifiés selon mes premières auto-critiques.
Fichiers :
/usr/local/bin/usrtmp
~/.config/systemd/user/usrtmp.service
Activation :
$ systemctl --user usrtmp.service
--
 ___________________
| $ post_tenebras ↲ |       waouh !
|Â GNUÂ Â Â Â Â Â Â Â Â /Â Â Â Â |Â Â Â Â Â Â /
|Â Â Â Â Â Â Â Â Â Â --Â *Â --Â Â |Â Â Â Â Â o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------
--vkogqOf2sHV7VnPd
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename=usrtmp
#!/bin/sh
userLink=/home/${USER}/tmpnp
start() {
tempDir=/tmp/${USER}.$$
(umask 077 && mkdir ${tempDir}) &&
ln -f -s ${tempDir} ${userLink} ||
exit 1
}
stop() {
tempDir=$(readlink ${userLink})
rm -rf ${tempDir}
rm -f ${userLink}
}
case $1 in
start|stop) "$1" ;;
esac
--vkogqOf2sHV7VnPd
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usrtmp.service"
[Unit]
Description=Create non persitant $USER /tmp dir and symblink in ~/.
[Service]
Type=oneshot
ExecStart=/usr/local/bin/usrtmp start
ExecStop=/usr/local/bin/usrtmp stop
RemainAfterExit=yes
[Install]
WantedByÞfault.target
--vkogqOf2sHV7VnPd--
ni moqueries semblerait indiquer que je monologue. Qu'à cela ne tienne.
Généralisation du bidule à tous les utilisateurs :
$ systemctl --user stop usrtmp.service
$ systemctl --user disable usrtmp.service
$ usrtmpS=~/.config/systemd/user/usrtmp.service
$ chmod 644 $usrtmpS
$ sudo chown root:root $usrtmpS
$ sudo mv $usrtmpS /etc/systemd/user/
Charge à chaque utilisateur de
$ systemctl --user enable usrtmp.service
pour un démarrage automatique à chaque première connexion ou
$ sudo systemctl --user start/stop usrtmp.service
pour une dés/activation à la demande.
Encore quelques petits doutes quant à la sécurité du bidule, mais bon,
peut-être que l'autocritique et quelques RTFM en viendront à bout. Sinon
ça marche.
--
___________________
| $ post_tenebras ↲ | waouh !
| GNU / | /
| -- * -- | o
| $ who ↲ / |_-- ~_|
| Alexandre Hoïde | _/| |
-------------------
Bonjour Alexandre,
de mon côté je tarde à répondre car il me semblait que systemd permettait
d'isoler les utilisateurs les uns des autres (dans des « slices » ?), y compris
au niveau des fichiers temporaires, mais je peine à retrouver où j'aurais pu
lire une chose pareille...
Si ce que j'ai écrit plus haut n'est pas faux, il serait donc plus naturel
de laisser sytemd donner son répertoire temporaire à chacun, et si nécessaire
créer un répertoire temporaire commun via « /etc/tmpfiles.d ».
Librement,
Charles
--
Charles Plessy
Tsurumi, Kanagawa, Japon
Salut Charles et merci,
Si je comprends bien¹ (mais rien n'est moins sûr), le « contexte »
user.slice est invoqué/utilisé en arrière plan par systemd, pour les
processus utilisateurs (tel que mon usrtmp.service, par exemple).
Mais au niveau où je l'exploite, il me semble que ce devrait être
« transparent ».
Grâce à toi j'ai donc découvert l'existence de [man] systemd-tmpfiles
et tmpfiles.d, dont je ne comprends pas encore la logique et la manière
de l'utiliser pour le substituer à mon usrtmp.service actuel. Je vais
creuser un peu et peut-être qu'une version « pure systemd » suivra.
Accessoirement[trollesquement], plus je découvre systemd, plus
l'impression d'enfermement, d'hégémonie et d'usine à gaz s'installe.
Mais bon, les dev's Debian se sont prononcés. Ainsi soit-il. Peut-être
n'est-ce que par ignorance que la claustro me gagne.
1. http://www.freedesktop.org/software/systemd/man/systemd.special.html
--
___________________
| $ post_tenebras ↲ | waouh !
| GNU / | /
| -- * -- | o
| $ who ↲ / |_-- ~_|
| Alexandre Hoïde | _/| |
-------------------
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
On Wed, Oct 21, 2015 at 06:20:56PM +0200, Alexandre Hoïde wrote:
Voici une petite version pure systemd-tmpfiles, écrite pour me motiver
un peu à lire les docs. Ça n'a probablement pas beaucoup de sens de le
faire ainsi et je n'ai pas trouvé d'autre moyen que d'écrire en dur un
fichier /etc/tmpfiles.d/usrtmp_<user>.conf (pas de substitutions,
variables, …). Je serais curieux de savoir si c'est possible et comment
(en restant pur systemd). Peut-être ne suis-je pas encore tombé sur le
bon bout de doc concernant les slices ^^
Fichier service générique :
/etc/systemd/user/usrtmp.service
Fichier tmpfiles.d pour chaque utilisateur :
/etc/tmpfiles.d/usrtmp_fictif.conf
(Toujours « systemctl --user enable usrtmp.service » pour activer
automatiquement à chaque première connexion)
--
 ___________________
| $ post_tenebras ↲ |       waouh !
|Â GNUÂ Â Â Â Â Â Â Â Â /Â Â Â Â |Â Â Â Â Â Â /
|Â Â Â Â Â Â Â Â Â Â --Â *Â --Â Â |Â Â Â Â Â o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------
--gBBFr7Ir9EOA20Yy
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usrtmp.service"
[Unit]
Description=Creates non persitant user /tmp dir and symblinks to ~/tmpnp.
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/systemd-tmpfiles --create /etc/tmpfiles.d/usrtmp_%u.conf
ExecStop=/bin/systemd-tmpfiles --remove /etc/tmpfiles.d/usrtmp_%u.conf
[Install]
WantedByÞfault.target
--gBBFr7Ir9EOA20Yy
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usrtmp_fictif.conf"
d /tmp/fictif_usrtmp 0700 fictif fictif
L /home/fictif/tmpnp - - - - /tmp/fictif_usrtmp
r /home/fictif/tmpnp
R /tmp/fictif_usrtmp
--gBBFr7Ir9EOA20Yy--
Certains monologues sont intéressants et ce n'est pas parce que tu monologues
qu'on ne t'écoute pas…
Sur ce, j'ai une autre réponse à poster dans ton fil.
Sébastien
J'ai compris son fonctionnement comme toi. Je n'ai pas encore lu trop de doc sur
le sujet et ce que j'en ai compris est surtout empirique. Si ton service est
lancé à l'ouverture de session par l'utilisateur (là je suppose puisque je n'ai
pas lu la doc), alors l'isolation a déjà eu lieu et les différentes commandes
lancées se trouvent dans le « slice ».
On voit tout ça à l'œuvre lorsqu'on ouvre une session (graphique ou non), des
messages apparaissent sur les consoles (mais c'est peut-être parce que j'ai
passé Systemd en debug), mais également lorsque des tâches cron sont lancées.
D'ailleurs ce second point me fait penser à un cas que tu devrais vérifier.
Est-ce que ton service utilisateur est lancé également lors du démarrage de
tâches cron d'un des utilisateurs qui l'aurait activé ?
Sébastien
Oui, hé hé : Voilà un empirisme exigeant ! Mon intuition bordélique
me dirait que cron n'est pas exécuté avec l'identité des contrab's des
utilisateurs [et donc, logind ne verrait pas de connexion qui déclencherait
le default.target de l'utilisateur]… mais la question valait bien un
test (après avoir « enabled » le usrtmp.service pour l'utilisateur
« fictif » et déconnecté fictif partout) :
$ sudo -u fictif contrab -l
10 18 27 10 * sleep 5 && [ -d /tmp/fictif_usrtmp ] && touch /tmp/test-cron-systemd-oui || touch /tmp/test-cron-systemd-non
et à 18h12 :
$ ls /tmp/test-cron-systemd-*
/tmp/test-cron-systemd-non
et en effet, journalctl ne montre aucun « starting » correspondant (ce
qui ne veut pas encore dire que mon intuition est la bonne… faudrait que
je RTFM cron comme il faut ^^).
C'est sympa d'être venu prêter main forte à Charles pour me
démonologuer. Merci Sébastien.
--
___________________
| $ post_tenebras ↲ | waouh !
| GNU / | /
| -- * -- | o
| $ who ↲ / |_-- ~_|
| Alexandre Hoïde | _/| |
-------------------
note : le même test réalisé avec « $ sudo -u fictif … » ou avec un
changement d'identifiant « su - fictif », depuis mon compte normal, ne
déclenchent pas plus le usrtmp.service que cron. Donc 1) mon intuition ne vaut
pas grand chose, et 2) il faudrait aussi RTFM logind et que sais-je encore.
D'ailleurs, lorsque j'essaie « systemctl --user start usrtmp.service »,
en su ou en sudo, j'obtiens :
Failed to connect to bus: Aucun fichier ou dossier de ce type
je suppose que su/sudo ne passent pas par logind. Ça ne fonctionne qu'à partir
d'une « vraie » connexion depuis la console/tty ou un gestionnaire d'affichage.
--
___________________
| $ post_tenebras ↲ | waouh !
| GNU / | /
| -- * -- | o
| $ who ↲ / |_-- ~_|
| Alexandre Hoïde | _/| |
-------------------
note 2 : installation du paquet « systemd-container ». Utilisation de
la commande « $ machinectl login » pour connecter mon utilisateur
« fictif » à partir de mon compte normal, et là, miracle! les commandes
systemctl fonctionnent.
[… je dis miracle, mais il commence à me les briser un peu le machin
de Lennart. À quand le s/GNU/LENNART/Linux ? Bon, restons positif et
continuons *burp* la découverte ]
--
___________________
| $ post_tenebras ↲ | waouh !
| GNU / | /
| -- * -- | o
| $ who ↲ / |_-- ~_|
| Alexandre Hoïde | _/| |
-------------------