I’m trying to consolidate some of the references in my source code. I have package names kinda everywhere, so i thought i’d bundle things using service-type. However, I’m running into some weird issues as I do
I thought I could just pass service config values to service-extension. This is just a record. I figured out how to get past the udev issues, but for some reason, nothing I pass as a service extension to shepherd-root-service-type gets past Wrong type to apply
;;; Copyright � 2025 David Conner <aionfork@gmail.com>
(define-module (ellipsis services security-token)
;;#:use-module (ellipsis config)
#:use-module (gnu home services)
#:use-module (gnu)
#:use-module (gnu packages)
#:use-module (gnu packages gnupg)
#:use-module (gnu packages libusb)
#:use-module (gnu packages security-token)
#:use-module (gnu services base)
#:use-module (gnu services configuration)
#:use-module (gnu services security-token)
#:use-module (gnu services shepherd)
#:use-module (gnu services)
#:use-module (ellipsis packages golang-crypto)
#:use-module (ellipsis packages security-token)
#:use-module (ellipsis packages tls)
#:use-module (guix gexp)
#:use-module (guix records)
#:use-module (srfi srfi-1)
#:use-module (ice-9 pretty-print)
#:export (yubikey-udev-rules))
;;; Commentary:
;;;
;;; This module provides a service definition for system services related to
;;; security tokens.
;;;
;;; yubikey-udev-rules
;;;
(define-public yubikey-udev-rules
;; needs plugdev, but warns if multiple instantiations create using #:groups
(list
(udev-rules-service 'fido2 libfido2 #:groups '("plugdev"))
(udev-rules-service 'u2f libu2f-host)
(udev-rules-service 'yubikey yubikey-personalization)))
;; hidapi: HID Devices for FIDO/OTP
(define pkgs-smartcard
(list opensc pinentry-tty hidapi libu2f-host libfido2))
(define pkgs-yubikey
(list yubico-piv-tool yubikey-personalization python-yubikey-manager))
(define svc-pcscd
(service pcscd-service-type))
(define-public ellipsis-smartcard-service-type
(service-type
(name 'ellipsis-smartcard)
(extensions
(list
;; pcsc-lite, ccid provided by service/activation
(service-extension shepherd-root-service-type svc-pcscd)
(service-extension udev-service-type (lambda (config) yubikey-udev-rules))
(service-extension profile-service-type
(lambda (config) (append pkgs-yubikey pkgs-smartcard)))))
(default-value '())
(description "Sets up some common services")))
;;; security-token.scm ends here
Here’s the error:
guix/ui.scm:1030:18: Wrong type to apply: #<<service> type: #<service-type pcscd 7ba08bebb800> value: #<<pcscd-configuration> pcsc-lite: #<package pcsc-lite@2.4.1 gnu/packages/security-token.scm:256 7ba090679580> usb-drivers: (#<package ccid@1.7.0 gnu/packages/security-token.scm:105 7ba090679840>)>>
In guix-hpc/guix-hpc-non-free ./hacky/services-gitlab.scm, they use:
(define gitlab-runner-service-type
(service-type
(name 'gitlab-runner)
(description
"Run gitlab-runner daemon @command{gitlab-runner run}.")
(extensions
(list (service-extension account-service-type
(const %gitlab-runner-accounts))
(service-extension shepherd-root-service-type
(compose list gitlab-runner-shepherd-service))
(service-extension activation-service-type
%gitlab-runner-activation)
;; 'gitlab-runner' wants to run Git, but since it runs its scripts
;; with 'bash --login', PATH is essentially limited to
;; /run/current-system/profile/bin. So put Git in there.
(service-extension profile-service-type
(const (list git-minimal)))))
(default-value (gitlab-runner-configuration))))
Where gitlab-runner-shepherd-service is a match-lambda, but otherwise returns the result of (shepherd-service ...). What does compose do in (compose list gitlab-runner-shepherd-service), specifically?
In other codebases, I often see (lambda (config) ...) passed in. It’s a block that returns something that the service-type definition would know how to compose/apply. Why does that not work here?