diff options
author | Sean Whitton <spwhitton@spwhitton.name> | 2021-10-06 11:36:25 -0700 |
---|---|---|
committer | Sean Whitton <spwhitton@spwhitton.name> | 2021-10-29 11:48:41 -0700 |
commit | 7e73746220aacc750c30340e9a960f839baa228e (patch) | |
tree | 1faf054619fa0f99966cdebe6846608657594b8b /src/property/service.lisp | |
parent | 8837b71e02d93787de60d454a493a8801a6427a5 (diff) | |
download | consfigurator-7e73746220aacc750c30340e9a960f839baa228e.tar.gz |
add & propagate :NO-SERVICES connattr and respect in LIBVIRT:STARTED
This change was prompted by the realisation that RECONNECTS nullifies any
enclosing SERVICE:WITHOUT-STARTING-SERVICES because *HOST* during RECONNECTS
is a distinct HOST value, computed at hostattrs time, which can't be affected
by an enclosing combinator that works by temporarily pushing hostattrs at
:APPLY time. So, for example, if we chroot and subsequently establish a
:SETUID connection, properties might try to start services as the non-root
user and there is no way for them to know they shouldn't.
We can avoid this problem by using a connattr instead because we have a
mechanism for propagating connattrs to subsequently established connections.
And as in most cases the reason for not starting services is solely due to the
way in which we're connecting to the host, a connattr is more appropriate.
Signed-off-by: Sean Whitton <spwhitton@spwhitton.name>
Diffstat (limited to 'src/property/service.lisp')
-rw-r--r-- | src/property/service.lisp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/property/service.lisp b/src/property/service.lisp index bf6900c..ad920c9 100644 --- a/src/property/service.lisp +++ b/src/property/service.lisp @@ -18,7 +18,11 @@ (in-package :consfigurator.property.service) (named-readtables:in-readtable :consfigurator) -;;;; Controlling services using service(1) +;;;; Controlling services using service(1), and the :NO-SERVICES hostattr and +;;;; connattr. A host has the :NO-SERVICES hostattr when it has static +;;;; configuration never to start services. The connattr is for when we +;;;; should not start any services because we're doing something like +;;;; chrooting in to the host's unbooted root filesystem. (define-constant +policyrcd+ #P"/usr/sbin/policy-rc.d" :test #'equal) @@ -48,8 +52,12 @@ not affect you." (os:etypecase (debianlike (%policy-rc.d)))) +(defun no-services-p () + "Returns true if no services should be started by the current deployment." + (or (get-hostattrs-car :no-service) (get-connattr :no-services))) + (defun service (service action) - (unless (get-hostattrs-car :no-services) + (unless (no-services-p) (run :may-fail "service" service action))) (defprop running :posix (service) @@ -72,7 +80,8 @@ properties." (:apply (service service "reload"))) (define-function-property-combinator without-starting-services (&rest propapps) - "Apply PROPAPPS with SERVICE:NO-SERVICES temporarily in effect." + "Apply PROPAPPS with the :NO-SERVICES connattr temporarily in effect. Also +disable starting services by the package manager." (let ((propapp (if (cdr propapps) (apply #'eseqprops propapps) (car propapps)))) (:retprop :type :lisp :hostattrs @@ -88,8 +97,7 @@ properties." ;; past. (SLEEP 1) is only approximately one second so ;; check that it's actually been a second. (loop do (sleep 1) until (> (get-universal-time) before)) - (unwind-protect (with-preserve-hostattrs - (push-hostattrs :no-services t) + (unwind-protect (with-connattrs (:no-services t) (propappapply propapp)) (if already-exists ;; Check whether some property we applied set the |