Hilton Chain <hako@ultrarare.space> writes:

> Hilton Chain <hako@ultrarare.space> writes:
>
>> On Wed, 02 Apr 2025 23:46:51 +0800,
>> Rutherther wrote:
>>>
>>>
>>> Hello Hilton,
>>>
>>> Hilton Chain <hako@ultrarare.space> writes:
>>>
>>> >
>>> > 2. Need of manually exposing interfaces.  e.g. those from 
>>> > shepherd-service.
>>> >
>>>
>>> I feel like this has been a topic mentioned multiple times in the last
>>> few weeks on this mailing list. Here I have e-mail from Carlo Zancanaro
>>> in mind, "Configuring shepherd services belonging to system services" (I
>>> don't know how to 'mention' e-mails in a good way, if you have tips,
>>> please do share them),
>>> where also this patch https://issues.guix.gnu.org/27155 has been
>>> mentioned.
>>>
>>> I think it's a pity we don't have a generic solution merged yet,
>>> especially given the patch that is 8 years old and Ludo mentions in it
>>> "It was long overdue.", I agree.
>>> The general finalizer approach would allow for exposing further
>>> procedures that would alter the services after they are made, things
>>> like this would become possible to do easily and we could build on it
>>> further, functions like '(finalize-shepherd-service "service" (lambda
>>> (config) (.. (inherit (config)))))' and more specific ones like
>>> (shepherd-override-auto-start? #f)'.
>>>
>>> Regards,
>>> Rutherther
>>
> Instead of alist, I tried to use the current configuration interface,
> but with service extensions exposed.

Actually it can be turned into a procedure (and maybe a macro like
modify-services) which avoids the repetitive task.  This approach has
its own issues, I added them as comments below:

--8<---------------cut here---------------start------------->8---
(define (modify-extension kind target transformer services)
  (map (lambda (%service)
         (if (eq? kind (service-kind %service))
             (service
                 ;; XXX: This creates new service type objects and may break
                 ;; current ‘modify-services’.
                 (service-type
                   (inherit kind)
                   (extensions
                    (map (lambda (%extension)
                           (if (eq? target (service-extension-target 
%extension))
                               (service-extension
                                target
                                ;; XXX: Transformed extensions won't honor
                                ;; modifications to the configuration fields.
                                (transformer
                                 ((service-extension-compute %extension)
                                  (service-value %service))))
                               %extension))
                         (service-type-extensions kind))))
               (service-value %service))
             %service))
       services))
--8<---------------cut here---------------end--------------->8---

--8<---------------cut here---------------start------------->8---
(modify-extension guix-service-type
    shepherd-root-service-type
  (lambda (extension)
    (const
     (map (lambda (service)
            (if (member 'guix-daemon (shepherd-service-provision service))
                (shepherd-service
                  (inherit service)
                  (provision (cons 'test (shepherd-service-provision service)))
                  (auto-start? #f))
                service))
          extension)))
  %desktop-services)
--8<---------------cut here---------------end--------------->8---

Reply via email to