From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms8.migadu.com with LMTPS id aMR+GF4dYWUiPgAAauVa8A:P1 (envelope-from ) for ; Fri, 24 Nov 2023 23:02:06 +0100 Received: from aspmx1.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id aMR+GF4dYWUiPgAAauVa8A (envelope-from ) for ; Fri, 24 Nov 2023 23:02:06 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 0182B41B64 for ; Fri, 24 Nov 2023 23:02:04 +0100 (CET) Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=beaver-labs.com header.s=zoho header.b=N4SNDhfo; dmarc=none; arc=pass ("zohomail.eu:s=zohoarc:i=1"); spf=pass (aspmx1.migadu.com: domain of "guix-devel-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-devel-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=2; s=key1; d=yhetil.org; t=1700863326; a=rsa-sha256; cv=pass; b=TYyLV2UcEFAmos11c3Tt68jx2l3XhyXdaA3MLM2wfAGrKg20eNOxCI/W2bwc4mxwkd40Gh gf688fCaciz4/iAm/Ovy47IwRxS/WAXkj+llnisL5HdShtsirFHxeQCNz7XVOpbPby70uG 9XzpdUPigKVyttxSDw3G1aosL5db/0SbYtuZuo35+gi22clXzQ2NjoEDoxPzO8naWb0ENr v4vqcffUDgid/YzL0N6rVbPOl46HE58Aw0m2jGezvlWPVuyjV/fGASq3EcoZNnFbluakW0 6RMKN9BVKGgaft55cgMb4lvGxFPVPHnZAj4HY1s+S7l6pUHItAuWRjevCG7cng== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1700863326; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=/1Jl+P4oXftkL8gffq+X2l1NlpX2tnZrr+92C1sTBXI=; b=fuCgJopvl3lhXnqHGfd1KcPUEPFOAVrPkojc5OYgjvQQdNlhL2M5RoEHFh0dkVGGgN4Buw FZRo8qTbfP+kA28VCUcOwfRUGlgQ7FiJK3xXQxNZ8XDt7yQI5Yyhejk3co28YhXnG8c1PQ 47QAVKBDLPUHsdcmvSpSNXAS5PMryEO+9bEj7gN25yPtyWMnsAxGqjnIMD0ew0xYCvskbj strvnIPN3PAJtsn/J1R/4mzWgHi9O/4fzSNklolx1DnmCZtPSxyNdYXLh4Xj6Gn4vzyZt2 0yNY+L1eYcA9CRiJApVNoG+H8jUzrrDITidgMFdK5aQP3iFG7FJZX41uQ7sGLA== ARC-Authentication-Results: i=2; aspmx1.migadu.com; dkim=pass header.d=beaver-labs.com header.s=zoho header.b=N4SNDhfo; dmarc=none; arc=pass ("zohomail.eu:s=zohoarc:i=1"); spf=pass (aspmx1.migadu.com: domain of "guix-devel-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-devel-bounces+larch=yhetil.org@gnu.org" Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r6eEq-0003sy-Sa; Fri, 24 Nov 2023 17:01:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r6eEi-0003qt-25 for guix-devel@gnu.org; Fri, 24 Nov 2023 17:01:23 -0500 Received: from sender11-op-o11.zoho.eu ([31.186.226.225]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r6eEe-0001sr-1t; Fri, 24 Nov 2023 17:01:19 -0500 ARC-Seal: i=1; a=rsa-sha256; t=1700863267; cv=none; d=zohomail.eu; s=zohoarc; b=AlG71J2Dml9VLRenDJzeXW2uAYmPg7j3/jxrWMwTvtlegjVB5Bwb6flXrkKWrD9H6EfMrJtyQAFrh2JDcAABTmeaK/+mVOYgXyG2Gj5wZoXiAFHuNlbjIQJRu87p22wcBwLZFssmTCZgWoaWW3DNK1S3DEAmh5p80YPIgoV0Kn0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1700863267; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=/1Jl+P4oXftkL8gffq+X2l1NlpX2tnZrr+92C1sTBXI=; b=BikUkYphGcD9aSeNlQVMJjvtXjywreYuD30LDtyLCQGi2a8sbndAUa9uuBlzhBWO6+O6lO3WTogpVhgFmDrQ2UFyeFbF+VpADlIWmZJq1mKq6MLJJQRLu3N2pl5pGbBreqr94tgvT6scqZfybgPdMV7+9WhuOu7uLgDqZEZWG+k= ARC-Authentication-Results: i=1; mx.zohomail.eu; dkim=pass header.i=beaver-labs.com; spf=pass smtp.mailfrom=edk@beaver-labs.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1700863267; s=zoho; d=beaver-labs.com; i=edk@beaver-labs.com; h=References:From:From:To:To:Subject:Subject:Date:Date:CC:In-reply-to:Message-ID:MIME-Version:Content-Type:Message-Id:Reply-To:Cc; bh=/1Jl+P4oXftkL8gffq+X2l1NlpX2tnZrr+92C1sTBXI=; b=N4SNDhfo0DUq3lP3k+ZQG3Pl8fAKVF9usYeUwoECNe7cZgi//YngAwcOunExKAEH iFrrst4m/Dp01XGgcb7v5d90UFmnRqlcNl/rsHriSGaW8Zkw7bMgn6nWQwtHatDQqah 5Z5ovkFzdDwBOlgZqkQRFA7orH2EcqAM455xbcAv/s9YI5we889T4tlt9nflvf3rXEL bfqF0XPd6vPFqNXbz7w+aMvwdHD42TX5ME87/RWsgpo0MJtYxtgWACbvJZZltHwrs0c 71RHNy9nmZ/Cuxb9V0cJLghb1c2q60a3s76SuO7UhWIq1r7p80vcIlS1OU6LHGnT1n6 JDTO/BOZWw== Received: from schwarzy (lfbn-idf3-1-667-244.w86-252.abo.wanadoo.fr [86.252.237.244]) by mx.zoho.eu with SMTPS id 1700863264699159.25799479535237; Fri, 24 Nov 2023 23:01:04 +0100 (CET) References: <87wn377rst.fsf@rdklein.fr> User-agent: mu4e 1.10.2; emacs 28.2 From: Edouard Klein To: guix-devel@gnu.org Subject: Syntactic Diabetes (was Re: A friendlier API for operating-system declarations) Date: Fri, 24 Nov 2023 22:43:31 +0100 CC: Ludovic =?utf-8?Q?Court=C3=A8s?= , Josselin Poiret , Liliana Marie Prikler In-reply-to: <87wn377rst.fsf@rdklein.fr> Message-ID: <877cm6reum.fsf@rdklein.fr> MIME-Version: 1.0 Content-Type: text/plain X-ZohoMailClient: External Received-SPF: pass client-ip=31.186.226.225; envelope-from=edk@beaver-labs.com; helo=sender11-op-o11.zoho.eu X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guix-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+larch=yhetil.org@gnu.org Sender: guix-devel-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Scanner: mx11.migadu.com X-Spam-Score: -7.82 X-Migadu-Queue-Id: 0182B41B64 X-Migadu-Spam-Score: -7.82 X-TUID: LLDuE8789tdJ Dear Guixers, Here is a quick status update on my proposition to expose composable functions to change operating-system declarations. Thank you all for the feedback you gave me :) It's very nice to not be talking in the void. After Liliana opined that these functions should not put too much burden on the maintainers, a position with which I wholeheartedly agree, here is what I came up with: https://gitlab.com/edouardklein/guix/-/blob/beaverlabs/beaver/functional-services.scm (file copied at the end of this email to make the list self-content instead of relying on external services) That's a macro-writing macro called "define-os-macros-for" that, for any service (for example nginx), defines five forms. They all evaluate to a modified os: (.nginx os) ;; Add nginx in its default configuration (.nginx os toto titi tutu... ) ;; Add nginx, with toto... given as arguments to nginx-configuration (+nginx os toto titi tutu...) ;; Extend an existing nginx service, giving toto... as arguments to simple-service (~nginx os toto...) ;; Edit an existing nginx service, passing toto... as arguments to modify-service (-nginx os) ;; Removes nginx You can see all of them used in: https://gitlab.com/edouardklein/guix/-/blob/beaverlabs/beaver/system.scm?ref_type=heads e.g. the mkdir-p function is a (+activation ...), all web server functions use (+nginx...), mumble is (.mumble... ), os/git uses (~openssh... ). I've use (-foo) forms while testing, but not in production. The others are currently running in prod on guix-hosting.com and the-dam.org. That'll be the meat of the first half of my presentation during the informal Paris meetup in december. Do you folks think something like that could one day make it in the mainline ? Cheers, Edouard. -----------------functional-services.scm---------------- (define-module (beaver functional-services) #:use-module (gnu system) #:export (*-append)) (define (syntax->string s) "Shorthand to convert a piece of syntax to a string" (symbol->string (syntax->datum s))) (define (*->string s) "Convert into a string any symbol-like type we may encounter in a macro" (cond [(string? s) s] [(symbol? s) (symbol->string s)] [else (syntax->string s)])) ;; assume syntax (define* (*-append #:rest args) "Return a symbol which is a concatenation of the given symbol-like args" (string->symbol (apply string-append (map *->string args)))) (define-syntax define-os-macros-for ;; This macro, called like e.g. (define-os-macros-for foo) will define four ;; forms, .foo, +foo, ~foo and -foo ;; ;; These forms take an operating-system as their first argument, and ;; evaluate to an operating-system, which allows one to compose them ;; (e.g. (foo (bar os))). (lambda (x) (syntax-case x () [(_ foo) (with-syntax ([dot-foo (datum->syntax x (*-append "." #'foo))] [plus-foo (datum->syntax x (*-append "+" #'foo))] [tilde-foo (datum->syntax x (*-append "~" #'foo))] [minus-foo (datum->syntax x (*-append "-" #'foo))] [foo-service-type (datum->syntax x (*-append #'foo "-service-type"))] [foo-configuration (datum->syntax x (*-append #'foo "-configuration"))]) #'(begin ;; The fist macro is .foo (define-syntax dot-foo (syntax-rules () ;; Its simplest form is (.foo os), which will add an instance ;; of service foo to os. [(dot-foo os) ((lambda (x) ;; It is wrapped in a lamba to make sure os is ;; evaluated once only. It it wasn't in a labmda, whatever ;; form os is in the calling code would be repeated ;; multiple times, and so if the form was e.g. (some-func ;; os), then some-func would be called multiple times, ;; which may not be desirable. (operating-system (inherit x) (services (cons (service foo-service-type) (operating-system-user-services x))))) os)] ;; This other form, (.foo os something bar baz...) takes ;; multiple forms as arguments, which are reproduced as is to ;; construct the foo-configuration [(dot-foo os forms (... ...)) ((lambda (x) ;; Wrapping in a lambda for the same reasons as above (operating-system (inherit x) (services (cons (service foo-service-type (foo-configuration forms (... ...))) (operating-system-user-services x))))) os)])) ;; The second one is +foo. It extends a service, reproducing the ;; given forms as arguments to the simple-service procedure (define-syntax plus-foo (syntax-rules () [(plus-foo os forms (... ...)) ((lambda (x) (operating-system (inherit x) (services (cons (simple-service (format #f "A ~a extension" (*->string #'foo)) foo-service-type forms (... ...)) (operating-system-user-services x))))) os)])) ;; The third one is ~foo. It modifies existing instances of a service, ;; passing the given forms as arguments to the modify-service macro (define-syntax tilde-foo (syntax-rules () [(tilde-foo os forms (... ...)) ((lambda (x) (operating-system (inherit x) (services (modify-services (operating-system-user-services x) (foo-service-type config => (foo-configuration (inherit config) forms (... ...))))))) os)])) ;; The fourth one is -foo. It removes foo-service-type from the ;; os' services (define-syntax minus-foo (syntax-rules () [(minus-foo os) ((lambda (x) (operating-system (inherit x) (services (modify-services (operating-system-user-services x) (delete foo-service-type))))) os)])) ;;Don't forget to make .foo, +foo, ~foo, and -foo visible (export dot-foo plus-foo tilde-foo minus-foo)))]))) ;; What follows is generated by running the following fish command in the ;; guix repo : ;; grep -E "define[^\(]*-service-type" **.scm | sort | uniq | sed 's|/| |g' | sed -E 's/(gnu|guix)/\(use-modules \(\1/' | sed -E 's/.scm/\)\)/' | sed -E 's/:\(define(-public|-syntax)* / \(define-os-macros-for /' | grep -v define-record-type | grep -Ev 'lookup.*-service-types' | grep -v python-os-service-types | sed -E 's/([^ ]*)-service-type/\1\)/' (use-modules (gnu home services)) (define-os-macros-for home-activation) (use-modules (gnu home services)) (define-os-macros-for home-environment-variables) (use-modules (gnu home services)) (define-os-macros-for home-files) (use-modules (gnu home services)) (define-os-macros-for home-profile) (use-modules (gnu home services)) (define-os-macros-for home-provenance) (use-modules (gnu home services)) (define-os-macros-for home-run-on-change) (use-modules (gnu home services)) (define-os-macros-for home-run-on-first-login) (use-modules (gnu home services)) (define-os-macros-for home) (use-modules (gnu home services)) (define-os-macros-for home-xdg-configuration-files) (use-modules (gnu home services)) (define-os-macros-for home-xdg-data-files) (use-modules (gnu home services desktop)) (define-os-macros-for home-dbus) (use-modules (gnu home services desktop)) (define-os-macros-for home-redshift) (use-modules (gnu home services desktop)) (define-os-macros-for home-unclutter) (use-modules (gnu home services desktop)) (define-os-macros-for home-xmodmap) (use-modules (gnu home services fontutils)) (define-os-macros-for home-fontconfig) (use-modules (gnu home services gnupg)) (define-os-macros-for home-gpg-agent) (use-modules (gnu home services guix)) (define-os-macros-for home-channels) (use-modules (gnu home services mail)) (define-os-macros-for home-msmtp) (use-modules (gnu home services mcron)) (define-os-macros-for home-mcron) (use-modules (gnu home services media)) (define-os-macros-for home-kodi) (use-modules (gnu home services messaging)) (define-os-macros-for home-znc) (use-modules (gnu home services pm)) (define-os-macros-for home-batsignal) (use-modules (gnu home services shells)) (define-os-macros-for home-bash) (use-modules (gnu home services shells)) (define-os-macros-for home-fish) (use-modules (gnu home services shells)) (define-os-macros-for home-shell-profile) (use-modules (gnu home services shells)) (define-os-macros-for home-zsh) (use-modules (gnu home services shepherd)) (define-os-macros-for home-shepherd) (use-modules (gnu home services sound)) (define-os-macros-for home-pulseaudio-rtp-sink) (use-modules (gnu home services sound)) (define-os-macros-for home-pulseaudio-rtp-source) (use-modules (gnu home services ssh)) (define-os-macros-for home-openssh) (use-modules (gnu home services ssh)) (define-os-macros-for home-ssh-agent) (use-modules (gnu home services symlink-manager)) (define-os-macros-for home-symlink-manager) (use-modules (gnu home services xdg)) (define-os-macros-for home-xdg-base-directories) (use-modules (gnu home services xdg)) (define-os-macros-for home-xdg-mime-applications) (use-modules (gnu home services xdg)) (define-os-macros-for home-xdg-user-directories) (use-modules (gnu services)) (define-os-macros-for activation) (use-modules (gnu services)) (define-os-macros-for boot) (use-modules (gnu services)) (define-os-macros-for cleanup) (use-modules (gnu services)) (define-os-macros-for etc) (use-modules (gnu services)) (define-os-macros-for firmware) (use-modules (gnu services)) (define-os-macros-for gc-root) (use-modules (gnu services)) (define-os-macros-for hurd-startup) (use-modules (gnu services)) (define-os-macros-for linux-builder) (use-modules (gnu services)) (define-os-macros-for linux-loadable-module) (use-modules (gnu services)) (define-os-macros-for profile) (use-modules (gnu services)) (define-os-macros-for provenance) (use-modules (gnu services)) (define-os-macros-for setuid-program) (use-modules (gnu services)) (define-os-macros-for special-files) (use-modules (gnu services)) (define-os-macros-for system) (use-modules (gnu services admin)) (define-os-macros-for log-cleanup) (use-modules (gnu services admin)) (define-os-macros-for rottlog) (use-modules (gnu services admin)) (define-os-macros-for unattended-upgrade) (use-modules (gnu services audio)) (define-os-macros-for mpd) (use-modules (gnu services audio)) (define-os-macros-for mympd) (use-modules (gnu services auditd)) (define-os-macros-for auditd) (use-modules (gnu services authentication)) (define-os-macros-for fprintd) (use-modules (gnu services authentication)) (define-os-macros-for nslcd) (use-modules (gnu services avahi)) (define-os-macros-for avahi) (use-modules (gnu services base)) (define-os-macros-for agetty) (use-modules (gnu services base)) (define-os-macros-for console-font) (use-modules (gnu services base)) (define-os-macros-for file-system) (use-modules (gnu services base)) (define-os-macros-for fstab) (use-modules (gnu services base)) (define-os-macros-for gpm) (use-modules (gnu services base)) (define-os-macros-for greetd) (use-modules (gnu services base)) (define-os-macros-for guix-publish) (use-modules (gnu services base)) (define-os-macros-for guix) (use-modules (gnu services base)) (define-os-macros-for host-name) (use-modules (gnu services base)) (define-os-macros-for hosts) (use-modules (gnu services base)) (define-os-macros-for kmscon) (use-modules (gnu services base)) (define-os-macros-for login) (use-modules (gnu services base)) (define-os-macros-for mingetty) (use-modules (gnu services base)) (define-os-macros-for nscd) (use-modules (gnu services base)) (define-os-macros-for pam-limits) (use-modules (gnu services base)) (define-os-macros-for rngd) (use-modules (gnu services base)) (define-os-macros-for root-file-system) (use-modules (gnu services base)) (define-os-macros-for static-networking) (use-modules (gnu services base)) (define-os-macros-for swap) (use-modules (gnu services base)) (define-os-macros-for syslog) (use-modules (gnu services base)) (define-os-macros-for udev) (use-modules (gnu services base)) (define-os-macros-for urandom-seed) (use-modules (gnu services base)) (define-os-macros-for virtual-terminal) (use-modules (gnu services certbot)) (define-os-macros-for certbot) (use-modules (gnu services cgit)) (define-os-macros-for cgit) (use-modules (gnu services ci)) (define-os-macros-for laminar) (use-modules (gnu services cuirass)) (define-os-macros-for cuirass-remote-worker) (use-modules (gnu services cuirass)) (define-os-macros-for cuirass) (use-modules (gnu services cups)) (define-os-macros-for cups) (use-modules (gnu services databases)) (define-os-macros-for memcached) (use-modules (gnu services databases)) (define-os-macros-for mysql) (use-modules (gnu services databases)) (define-os-macros-for postgresql-role) (use-modules (gnu services databases)) (define-os-macros-for postgresql) (use-modules (gnu services databases)) (define-os-macros-for redis) (use-modules (gnu services dbus)) (define-os-macros-for dbus-root) (use-modules (gnu services dbus)) (define-os-macros-for polkit) (use-modules (gnu services desktop)) (define-os-macros-for accountsservice) (use-modules (gnu services desktop)) (define-os-macros-for bluetooth) (use-modules (gnu services desktop)) (define-os-macros-for colord) (use-modules (gnu services desktop)) (define-os-macros-for cups-pk-helper) (use-modules (gnu services desktop)) (define-os-macros-for elogind) (use-modules (gnu services desktop)) (define-os-macros-for enlightenment-desktop) (use-modules (gnu services desktop)) (define-os-macros-for geoclue) (use-modules (gnu services desktop)) (define-os-macros-for gnome-desktop) (use-modules (gnu services desktop)) (define-os-macros-for gnome-keyring) (use-modules (gnu services desktop)) (define-os-macros-for inputattach) (use-modules (gnu services desktop)) (define-os-macros-for lxqt-desktop) (use-modules (gnu services desktop)) (define-os-macros-for mate-desktop) (use-modules (gnu services desktop)) (define-os-macros-for sane) (use-modules (gnu services desktop)) (define-os-macros-for seatd) (use-modules (gnu services desktop)) (define-os-macros-for sugar-desktop) (use-modules (gnu services desktop)) (define-os-macros-for udisks) (use-modules (gnu services desktop)) (define-os-macros-for upower) (use-modules (gnu services desktop)) (define-os-macros-for x11-socket-directory) (use-modules (gnu services desktop)) (define-os-macros-for xfce-desktop) (use-modules (gnu services dict)) (define-os-macros-for dicod) (use-modules (gnu services dns)) (define-os-macros-for ddclient) (use-modules (gnu services dns)) (define-os-macros-for dnsmasq) (use-modules (gnu services dns)) (define-os-macros-for knot-resolver) (use-modules (gnu services dns)) (define-os-macros-for knot) (use-modules (gnu services docker)) (define-os-macros-for docker) (use-modules (gnu services docker)) (define-os-macros-for singularity) (use-modules (gnu services file-sharing)) (define-os-macros-for transmission-daemon) (use-modules (gnu services games)) (define-os-macros-for joycond) (use-modules (gnu services games)) (define-os-macros-for wesnothd) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-cleaner) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-confd) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-kvmd) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-luxid) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-metad) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-mond) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-noded) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-rapi) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-watcher) (use-modules (gnu services ganeti)) (define-os-macros-for ganeti-wconfd) (use-modules (gnu services getmail)) (define-os-macros-for getmail) (use-modules (gnu services guix)) (define-os-macros-for guix-build-coordinator-agent) (use-modules (gnu services guix)) (define-os-macros-for guix-build-coordinator-queue-builds) (use-modules (gnu services guix)) (define-os-macros-for guix-build-coordinator) (use-modules (gnu services guix)) (define-os-macros-for guix-data) (use-modules (gnu services guix)) (define-os-macros-for nar-herder) (use-modules (gnu services hurd)) (define-os-macros-for hurd-console) (use-modules (gnu services hurd)) (define-os-macros-for hurd-getty) (use-modules (gnu services kerberos)) (define-os-macros-for krb5) (use-modules (gnu services kerberos)) (define-os-macros-for pam-krb5) (use-modules (gnu services ldap)) (define-os-macros-for directory-server) (use-modules (gnu services lightdm)) (define-os-macros-for lightdm) (use-modules (gnu services linux)) (define-os-macros-for earlyoom) (use-modules (gnu services linux)) (define-os-macros-for fstrim) (use-modules (gnu services linux)) (define-os-macros-for kernel-module-loader) (use-modules (gnu services linux)) (define-os-macros-for rasdaemon) (use-modules (gnu services linux)) (define-os-macros-for zram-device) (use-modules (gnu services lirc)) (define-os-macros-for lirc) (use-modules (gnu services mail)) (define-os-macros-for dovecot) (use-modules (gnu services mail)) (define-os-macros-for exim) (use-modules (gnu services mail)) (define-os-macros-for imap4d) (use-modules (gnu services mail)) (define-os-macros-for mail-aliases) (use-modules (gnu services mail)) (define-os-macros-for opensmtpd) (use-modules (gnu services mail)) (define-os-macros-for radicale) (use-modules (gnu services mcron)) (define-os-macros-for mcron) (use-modules (gnu services messaging)) (define-os-macros-for bitlbee) (use-modules (gnu services messaging)) (define-os-macros-for prosody) (use-modules (gnu services messaging)) (define-os-macros-for quassel) (use-modules (gnu services monitoring)) (define-os-macros-for darkstat) (use-modules (gnu services monitoring)) (define-os-macros-for prometheus-node-exporter) (use-modules (gnu services monitoring)) (define-os-macros-for vnstat) (use-modules (gnu services monitoring)) (define-os-macros-for zabbix-agent) (use-modules (gnu services monitoring)) (define-os-macros-for zabbix-front-end) (use-modules (gnu services monitoring)) (define-os-macros-for zabbix-server) (use-modules (gnu services networking)) (define-os-macros-for block-facebook-hosts) (use-modules (gnu services networking)) (define-os-macros-for connman) (use-modules (gnu services networking)) (define-os-macros-for dhcp-client) (use-modules (gnu services networking)) (define-os-macros-for dhcpd) (use-modules (gnu services networking)) (define-os-macros-for hostapd) (use-modules (gnu services networking)) (define-os-macros-for ipfs) (use-modules (gnu services networking)) (define-os-macros-for iptables) (use-modules (gnu services networking)) (define-os-macros-for keepalived) (use-modules (gnu services networking)) (define-os-macros-for modem-manager) (use-modules (gnu services networking)) (define-os-macros-for network-manager) (use-modules (gnu services networking)) (define-os-macros-for nftables) (use-modules (gnu services networking)) (define-os-macros-for ntp) (use-modules (gnu services networking)) (define-os-macros-for opendht) (use-modules (gnu services networking)) (define-os-macros-for openntpd) (use-modules (gnu services networking)) (define-os-macros-for openvswitch) (use-modules (gnu services networking)) (define-os-macros-for pagekite) (use-modules (gnu services networking)) (define-os-macros-for simulated-wifi) (use-modules (gnu services networking)) (define-os-macros-for tor) (use-modules (gnu services networking)) (define-os-macros-for usb-modeswitch) (use-modules (gnu services networking)) (define-os-macros-for wpa-supplicant) (use-modules (gnu services networking)) (define-os-macros-for yggdrasil) (use-modules (gnu services networking)) (define-os-macros-for inetd) (use-modules (gnu services nfs)) (define-os-macros-for gss) (use-modules (gnu services nfs)) (define-os-macros-for idmap) (use-modules (gnu services nfs)) (define-os-macros-for nfs) (use-modules (gnu services nfs)) (define-os-macros-for pipefs) (use-modules (gnu services nfs)) (define-os-macros-for rpcbind) (use-modules (gnu services nix)) (define-os-macros-for nix) (use-modules (gnu services pam-mount)) (define-os-macros-for pam-mount) (use-modules (gnu services pm)) (define-os-macros-for thermald) (use-modules (gnu services pm)) (define-os-macros-for tlp) (use-modules (gnu services rsync)) (define-os-macros-for rsync) (use-modules (gnu services samba)) (define-os-macros-for samba) (use-modules (gnu services samba)) (define-os-macros-for wsdd) (use-modules (gnu services science)) (define-os-macros-for rshiny) (use-modules (gnu services sddm)) (define-os-macros-for sddm) (use-modules (gnu services security-token)) (define-os-macros-for pcscd) (use-modules (gnu services security)) (define-os-macros-for fail2ban) (use-modules (gnu services shepherd)) (define-os-macros-for shepherd-root) (use-modules (gnu services shepherd)) (define-os-macros-for user-processes) (use-modules (gnu services shepherd)) (define-os-macros-for shepherd) (use-modules (gnu services sound)) (define-os-macros-for alsa) (use-modules (gnu services sound)) (define-os-macros-for ladspa) (use-modules (gnu services sound)) (define-os-macros-for pulseaudio) (use-modules (gnu services spice)) (define-os-macros-for spice-vdagent) (use-modules (gnu services ssh)) (define-os-macros-for autossh) (use-modules (gnu services ssh)) (define-os-macros-for dropbear) (use-modules (gnu services ssh)) (define-os-macros-for lsh) (use-modules (gnu services ssh)) (define-os-macros-for openssh) (use-modules (gnu services ssh)) (define-os-macros-for webssh) (use-modules (gnu services syncthing)) (define-os-macros-for syncthing) (use-modules (gnu services sysctl)) (define-os-macros-for sysctl) (use-modules (gnu services telephony)) (define-os-macros-for jami) (use-modules (gnu services telephony)) (define-os-macros-for mumble-server) (use-modules (gnu services version-control)) (define-os-macros-for git-daemon) (use-modules (gnu services version-control)) (define-os-macros-for gitile) (use-modules (gnu services version-control)) (define-os-macros-for gitolite) (use-modules (gnu services virtualization)) (define-os-macros-for hurd-vm) (use-modules (gnu services virtualization)) (define-os-macros-for libvirt) (use-modules (gnu services virtualization)) (define-os-macros-for qemu-binfmt) (use-modules (gnu services virtualization)) (define-os-macros-for qemu-guest-agent) (use-modules (gnu services virtualization)) (define-os-macros-for secret) (use-modules (gnu services virtualization)) (define-os-macros-for virtlog) (use-modules (gnu services vnc)) (define-os-macros-for xvnc) (use-modules (gnu services vpn)) (define-os-macros-for openvpn-client) (use-modules (gnu services vpn)) (define-os-macros-for openvpn-server) (use-modules (gnu services vpn)) (define-os-macros-for strongswan) (use-modules (gnu services vpn)) (define-os-macros-for wireguard) (use-modules (gnu services vpn)) (define-os-macros-for bitmask) (use-modules (gnu services web)) (define-os-macros-for agate) (use-modules (gnu services web)) (define-os-macros-for anonip) (use-modules (gnu services web)) (define-os-macros-for fcgiwrap) (use-modules (gnu services web)) (define-os-macros-for gmnisrv) (use-modules (gnu services web)) (define-os-macros-for hpcguix-web) (use-modules (gnu services web)) (define-os-macros-for httpd) (use-modules (gnu services web)) (define-os-macros-for mumi) (use-modules (gnu services web)) (define-os-macros-for nginx) (use-modules (gnu services web)) (define-os-macros-for patchwork) (use-modules (gnu services web)) (define-os-macros-for php-fpm) (use-modules (gnu services web)) (define-os-macros-for tailon) (use-modules (gnu services web)) (define-os-macros-for varnish) (use-modules (gnu services xorg)) (define-os-macros-for dconf) (use-modules (gnu services xorg)) (define-os-macros-for gdm) (use-modules (gnu services xorg)) (define-os-macros-for localed) (use-modules (gnu services xorg)) (define-os-macros-for screen-locker) (use-modules (gnu services xorg)) (define-os-macros-for slim) (use-modules (gnu services xorg)) (define-os-macros-for xorg-server) (use-modules (gnu system install)) (define-os-macros-for configuration-template) (use-modules (gnu system install)) (define-os-macros-for cow-store) (use-modules (gnu system install)) (define-os-macros-for documentation) (use-modules (gnu system install)) (define-os-macros-for uvesafb) (use-modules (gnu system linux-container)) (define-os-macros-for dummy-networking) (use-modules (gnu system mapped-devices)) (define-os-macros-for device-mapping) (use-modules (gnu system pam)) (define-os-macros-for pam-root) (use-modules (gnu system pam)) (define-os-macros-for session-environment) (use-modules (gnu system shadow)) (define-os-macros-for account) (use-modules (gnu tests)) (define-os-macros-for marionette) (use-modules (guix scripts publish)) (define-os-macros-for publish) Edouard Klein writes: > Dear Guixers, > > For my clients and my own use, I use a layer on top of operating-system > declarations in which I create functions that take an os as a first > argument, and return an os. > > With the help of the handy -> macro, I can chain them, thus allowing an > easy stacking of multiple "roles" or "functionalities" on the same > machine, and an easy transfer of said functionality to another machine: > just cut and paste one line from one declaration to the other. > > I have written a tutorial for my clients here: > > https://guix-hosting.com/docs/tuto/getting-started.html > > that gives an example of what an os configuration may look like: > > #+begin_src scheme > (-> > (minimal-ovh "ssh-rsa AAASomethingSomething== root@minimal-ovh") > (http-static-content "sub2.example.com" #:to-dir "/srv/sub2") > (http-static-content "sub1.example.com" #:to-dir "/srv/sub1/") > (add-services my-db)) > #+end_src > > The code of the function is on my channel: > https://gitlab.com/edouardklein/guix/-/blob/beaverlabs/beaver/system.scm > > After a few months of experience, and positive feedback from my clients, > my question to you guys is: would you be interested in mainlining this, > or should I keep my development efforts separate in my channel ? > > I do think this API is easier than manipulating services, and although > extendable services are awesome and a very nifty piece of engineering, > they require quite a good knowledge of scheme and take a while to be > used to, while this new API, while way less powerful, lowers the barrier > to entry for newcomers. > > They are an easy way to maintain a declarative whole operating system > configuration, with a syntax similar enough to docker and ansible that > sysadmins familiar with it can quickly get up and running, thus exposing > more people to Guix. > > What do you think ? > > Cheers, > > Edouard.