From: Danny Milosavljevic <dannym@scratchpost.org>
To: guix-devel@gnu.org
Subject: Invoking user shepherd; Was: Re: Defining *user* services in Guix
Date: Sun, 11 Jun 2017 03:29:00 +0200 [thread overview]
Message-ID: <20170611032900.6ac194b9@scratchpost.org> (raw)
In-Reply-To: <87mvavk243.fsf@gnu.org>
Hi,
I'm revisiting this topic because I want to have a dbus user bus to be available as "${XDG_RUNTIME_DIR}/bus".
> > With the attached patch, it is possibe to use (gnu services herd) to
> > interact with a user shepherd instance.
Nice! It works!
But while testing it I noticed:
For a real user shepherd, it would be nice if when I logged in twice using the same user account (without logging out in-between - so resulting in two sessions of that user) it would still only have one shepherd instance for that user account in total - and if that instance (and remaining user processes for that matter) went away only when I logged out from *all* sessions of that user.
I thought I could fake that by just trying to invoke shepherd on each session start and have it fail on the second attempt - but apparently we will happily start an infinite number of shepherds for one user. Is that on purpose?
The relevant place (in shepherd) is:
(define (open-server-socket file-name)
"Open a socket at FILE-NAME, and listen for connections there."
(with-fluids ((%default-port-encoding "UTF-8"))
(let ((sock (socket PF_UNIX SOCK_STREAM 0))
(address (make-socket-address AF_UNIX file-name)))
(false-if-exception (delete-file file-name)) ; <===== [dannym: WTF. Would it be better to try to connect first?]
(bind sock address)
(listen sock 10)
sock)))
Probably not good.
Maybe better:
(define (server-present? file-name)
"Open a socket at FILE-NAME, and connect to the server, if any. Return #t if that worked."
(with-fluids ((%default-port-encoding "UTF-8"))
(let ((sock (socket PF_UNIX SOCK_STREAM 0))
(address (make-socket-address AF_UNIX file-name)))
(false-if-exception (connect sock address))))) ; probably missing a "[catch] close". How to do that best?
(define (open-server-socket file-name)
"Open a socket at FILE-NAME, and listen for connections there."
(if (server-present? file-name)
(exit 0) ; User's shepherd is already running, so let it do its work.
(with-fluids ((%default-port-encoding "UTF-8"))
(let ((sock (socket PF_UNIX SOCK_STREAM 0))
(address (make-socket-address AF_UNIX file-name)))
(false-if-exception (delete-file file-name)) ; we could get rid of that if we put the shepherd socket into /run/user/xxx (i.e. XDG_RUNTIME_DIR) instead, because that's on a tmpfs. That's also where it's supposed to go according to the standard.
(bind sock address)
(listen sock 10)
sock)))
elogind already sends a message to the dbus system bus whenever a user really stops or starts (all their sessions closed, one session opened, respectively):
p = "/org/freedesktop/login1/user/_"UID_FMT;
sd_bus_emit_signal( u->manager->bus,
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
new_user ? "UserNew" : "UserRemoved",
"uo", (uint32_t) u->uid, p);
I'm trying to find the right place to insert my "dbus-daemon" invocation for providing the user bus (note: not session bus)...
At first I thought of hard-coding the "dbus-daemon" invocation somewhere but then I thought the option with the most user freedom would be to only invoke the user shepherd [and nothing else] when the user logs in - and if he has a user service launching "dbus-daemon", good for him...
Should we make a system shepherd service that invokes the user shepherd service on behalf of users? Would that be that safe?
Or should we just expect the user to put a (shepherd with fix) invocation into their HOME startup scripts like .xinitrc ? Note that if we did that there's some session-specific stuff in the session's environment that shepherd will inherit. Probably not that bad if invoked early enough.
next prev parent reply other threads:[~2017-06-11 1:29 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-22 16:50 Defining user services in Guix Mathieu Othacehe
2017-04-22 18:31 ` Danny Milosavljevic
2017-04-22 23:06 ` Ludovic Courtès
2017-04-23 16:27 ` Mathieu Othacehe
2017-04-25 0:02 ` Mekeor Melire
2017-04-25 8:36 ` Ricardo Wurmus
2017-04-27 13:36 ` Ludovic Courtès
2017-04-28 15:22 ` Mathieu Othacehe
2017-05-02 10:02 ` Ludovic Courtès
2017-05-02 19:23 ` Mathieu Othacehe
2017-05-02 21:21 ` Ludovic Courtès
2017-05-02 21:44 ` Ricardo Wurmus
2017-05-03 9:43 ` Mathieu Othacehe
2017-06-11 1:29 ` Danny Milosavljevic [this message]
2017-06-11 8:33 ` Invoking user shepherd; Was: Re: Defining *user* " Mathieu Othacehe
2017-06-13 8:00 ` Ludovic Courtès
2017-06-13 8:06 ` Ludovic Courtès
2017-06-13 14:32 ` Danny Milosavljevic
2017-06-13 16:06 ` Ludovic Courtès
2017-05-02 21:22 ` Defining user " Ludovic Courtès
2017-04-22 23:53 ` Carlo Zancanaro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170611032900.6ac194b9@scratchpost.org \
--to=dannym@scratchpost.org \
--cc=guix-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).