[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[shepherd] 03/05: support: Rename user-dmddir to %user-config-dir.
From: |
Ludovic Courtès |
Subject: |
[shepherd] 03/05: support: Rename user-dmddir to %user-config-dir. |
Date: |
Mon, 18 Jan 2016 22:10:58 +0000 |
civodul pushed a commit to branch master
in repository shepherd.
commit 65349a5b0e67b90a74f17d6d6a9934fbccebd375
Author: Mathieu Lirzin <address@hidden>
Date: Sat Jan 16 22:22:26 2016 +0100
support: Rename user-dmddir to %user-config-dir.
* modules/shepherd/support.scm (user-dmddir): Rename to ...
(%user-config-dir): ... this. Honor XDG_CONFIG_HOME and use
'$HOME/.config/shepherd' as default value. All consumers changed.
(mkdir-p): New procedure. Export it.
(default-config-file): Use it.
(verify-dir): Likewise.
* shepherd.texi (Jump Start, Invoking shepherd): Document the new user
configuration directory.
* tests/basic.sh: Check if XDG_CONFIG_HOME is honored.
* Makefile.am (AM_TESTS_ENVIRONMENT): Unset it.
Signed-off-by: Ludovic Courtès <address@hidden>
---
Makefile.am | 3 +-
modules/shepherd/support.scm | 47 ++++++++++++++++++++++++++++++++++-------
shepherd.texi | 16 ++++++++------
tests/basic.sh | 31 +++++++++++++++++++++++++++
4 files changed, 81 insertions(+), 16 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 7b3e59f..7eb2a27 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -148,7 +148,8 @@ TEST_EXTENSIONS = .sh
EXTRA_DIST += $(TESTS)
AM_TESTS_ENVIRONMENT = \
- PATH="$(abs_top_builddir):$$PATH" LC_ALL=C \
+ unset XDG_CONFIG_HOME; LC_ALL=C \
+ PATH="$(abs_top_builddir):$$PATH" \
SHELL="$(SHELL)" GUILE="$(GUILE)" \
GUILE_LOAD_PATH="$(abs_top_srcdir)/modules:$(abs_top_builddir)/modules:$$GUILE_LOAD_PATH"
\
GUILE_LOAD_COMPILED_PATH="$(abs_top_srcdir)/modules:$(abs_top_builddir)/modules:$$GUILE_LOAD_COMPILED_PATH"
diff --git a/modules/shepherd/support.scm b/modules/shepherd/support.scm
index 5b1ca7e..319fa91 100644
--- a/modules/shepherd/support.scm
+++ b/modules/shepherd/support.scm
@@ -32,6 +32,7 @@
with-system-error-handling
EINTR-safe
with-atomic-file-output
+ mkdir-p
l10n
local-output
@@ -155,6 +156,33 @@ output port, and PROC's result is returned."
(lambda (key . args)
(catch-system-error (delete-file template))))))
+(define* (mkdir-p dir #:optional mode) ;copied from Guix
+ "Create directory DIR and all its ancestors."
+ (define absolute?
+ (string-prefix? "/" dir))
+
+ (define not-slash
+ (char-set-complement (char-set #\/)))
+
+ (let loop ((components (string-tokenize dir not-slash))
+ (root (if absolute?
+ ""
+ ".")))
+ (match components
+ ((head tail ...)
+ (let ((path (string-append root "/" head)))
+ (catch 'system-error
+ (lambda ()
+ (if mode
+ (mkdir path mode)
+ (mkdir path))
+ (loop tail path))
+ (lambda args
+ (if (= EEXIST (system-error-errno args))
+ (loop tail path)
+ (apply throw args))))))
+ (() #t))))
+
;; Localized version of STR.
@@ -186,8 +214,11 @@ There is NO WARRANTY, to the extent permitted by law.")))
(false-if-exception (passwd:dir (getpwuid (getuid))))
"/"))
-;; dmd default subdirectory if dmd is run as a normal user.
-(define user-dmddir (string-append user-homedir "/.dmd.d"))
+(define %user-config-dir
+ ;; Default config directory if shepherd is run as a normal user.
+ (string-append (or (getenv "XDG_CONFIG_HOME")
+ (string-append user-homedir "/.config"))
+ "/shepherd"))
(define (make-bare-init-file target)
"Return #t if a bare init file was created at TARGET; #f otherwise.
@@ -216,7 +247,7 @@ TARGET should be a string representing a filepath + name."
(define default-logfile
(if (zero? (getuid))
(string-append %localstatedir "/log/shepherd.log")
- (string-append user-dmddir "/shepherd.log")))
+ (string-append %user-config-dir "/shepherd.log")))
;; Configuration file.
(define (default-config-file)
@@ -225,8 +256,8 @@ global system configuration file when running as 'root'.
As a side effect,
create a template configuration file if non exists."
(if (zero? (getuid))
(string-append %sysconfdir "/dmdconf.scm")
- (let ((config-file (string-append user-dmddir "/init.scm")))
- (catch-system-error (mkdir user-dmddir))
+ (let ((config-file (string-append %user-config-dir "/init.scm")))
+ (mkdir-p %user-config-dir #o700)
(if (not (file-exists? config-file))
(make-bare-init-file config-file))
config-file)))
@@ -239,7 +270,7 @@ create a template configuration file if non exists."
(define default-socket-dir
(if (zero? (getuid))
%system-socket-dir
- (string-append user-dmddir "/run")))
+ (string-append %user-config-dir "/run")))
;; Unix domain socket for receiving commands in dmd.
(define default-socket-file
@@ -253,7 +284,7 @@ create a template configuration file if non exists."
(define default-persistency-state-file
(if (zero? (getuid))
(string-append %localstatedir "/lib/misc/dmd-state")
- (string-append user-dmddir "/dmd-state")))
+ (string-append %user-config-dir "/dmd-state")))
;; Global variables set from (dmd).
(define persistency #f)
@@ -284,7 +315,7 @@ directory are not checked."
(and (string=? dir default-socket-dir)
;; If it exists already, this is fine, thus ignore errors.
(catch-system-error
- (mkdir default-socket-dir #o700)))
+ (mkdir-p default-socket-dir #o700)))
;; Check for permissions.
(when secure?
(let ((dir-stat (stat dir)))
diff --git a/shepherd.texi b/shepherd.texi
index 6cca61c..4628209 100644
--- a/shepherd.texi
+++ b/shepherd.texi
@@ -139,12 +139,14 @@ instead, add this directory name in front of the absolute
file names
mentioned below.
@cindex Configuration file
-When @command{shepherd} gets started, it reads and evaluates a configuration
file. When it is
-started with superuser priviledges, it tries to use
address@hidden/etc/dmdconf.scm}, when started as normal user, it looks for a
-file called @code{.dmd.d/init.scm} in the user's home directory. With the
-option @code{--config} (or, for short, @code{-c}), you can specify
-where to look instead. So if you want to start @command{shepherd} with an
+When @command{shepherd} gets started, it reads and evaluates a
+configuration file. When it is started with superuser priviledges, it
+tries to use @code{/etc/dmdconf.scm}. When started as normal user, it
+looks for a file called @code{$XDG_CONFIG_HOME/shepherd/init.scm}. If
+the @code{XDG_CONFIG_HOME} environment variable is not defined,
address@hidden/.config/shepherd/init.scm} is used instead. With the option
address@hidden (or, for short, @code{-c}), you can specify where to
+look instead. So if you want to start @command{shepherd} with an
alternative file, use one of the following commands:
@example
@@ -402,7 +404,7 @@ permissions are not as expected.
@cindex log file
Log output into @var{file}, or if @var{file} is not given,
@code{/var/log/shepherd.log} when running as superuser,
address@hidden/.dmd.d/shepherd.log} otherwise.
address@hidden/shepherd/shepherd.log} otherwise.
@item address@hidden
When @command{shepherd} is ready to accept connections, write its PID to
@var{file} or
diff --git a/tests/basic.sh b/tests/basic.sh
index dfe5d18..3e500df 100644
--- a/tests/basic.sh
+++ b/tests/basic.sh
@@ -1,5 +1,6 @@
# GNU Shepherd --- Test basic communication capabilities.
# Copyright © 2013, 2014, 2016 Ludovic Courtès <address@hidden>
+# Copyright © 2016 Mathieu Lirzin <address@hidden>
# Copyright © 2014 Alex Sassmannshausen <address@hidden>
#
# This file is part of the GNU Shepherd.
@@ -22,6 +23,7 @@ herd --version
socket="t-socket-$$"
conf="t-conf-$$"
+confdir="t-confdir-$$"
log="t-log-$$"
stamp="t-stamp-$$"
pid="t-pid-$$"
@@ -97,3 +99,32 @@ $herd stop dmd
! kill -0 $dmd_pid
test -f "$log"
+
+## ------------------------ ##
+## Usage of XDG variables. ##
+## ------------------------ ##
+
+# Set XDG_CONFIG_HOME for configuration files.
+export XDG_CONFIG_HOME=$confdir
+mkdir -p $confdir/shepherd
+mv $conf $confdir/shepherd/init.scm
+rm -f "$pid"
+shepherd -I -s "$socket" --pid="$pid" &
+
+# Wait till it's ready.
+while ! test -f "$pid" ; do : ; done
+
+# Launch a service from $confdir/shepherd/init.scm.
+$herd start test
+test -f "$stamp"
+$herd status test | grep started
+
+$herd stop test
+! test -f "$stamp"
+
+dmd_pid="`cat $pid`"
+
+$herd stop dmd
+! kill -0 $dmd_pid
+
+rm -rf $confdir