From 1784234385b3823e5f171f1375700e5e4040063a Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Sun, 26 Jan 2025 14:30:04 +0000 Subject: [PATCH] Implement apt interceptors --- examples/ubuntu.scm | 17 +++++++++++ modules/ordo/action/apt.scm | 42 --------------------------- modules/ordo/connection.scm | 5 ++-- modules/ordo/interceptor/apt.scm | 49 ++++++++++++++++++++++++++++++++ modules/ordo/inventory.scm | 7 +++-- 5 files changed, 72 insertions(+), 48 deletions(-) create mode 100644 examples/ubuntu.scm delete mode 100644 modules/ordo/action/apt.scm create mode 100644 modules/ordo/interceptor/apt.scm diff --git a/examples/ubuntu.scm b/examples/ubuntu.scm new file mode 100644 index 0000000..eb6ede4 --- /dev/null +++ b/examples/ubuntu.scm @@ -0,0 +1,17 @@ +(use-modules + (ordo playbook) + (ordo play) + (ordo interceptor) + (ordo interceptor apt)) + +(playbook + #:name "APT operations" + #:plays (list + (play + #:name "Test APT operations" + ;;#:host '(tagged #:ubuntu) + #:host "localhost" + #:interceptors (list + (apt:update) + (apt:dist-upgrade) + (map apt:install (list "curl" "ca-certificates")))))) diff --git a/modules/ordo/action/apt.scm b/modules/ordo/action/apt.scm deleted file mode 100644 index 6a19462..0000000 --- a/modules/ordo/action/apt.scm +++ /dev/null @@ -1,42 +0,0 @@ -(define-module (ordo action apt) - #:use-module ((ordo connection) #:select (run))) - -(define noninteractive-env '(("DEBIAN_FRONTEND" . "noninteractive") - ("APT_LISTCHANGES_FRONTEND" . "none"))) - -(define-syntax define-apt-operation - (syntax-rules () - ((define-apt-operation (name args ...) apt-args ...) - (define-public (name conn args ...) - (run conn "apt-get" "-q" "-y" apt-args ... args ... #:env noninteractive-env))) - ((define-apt-operation name apt-args ...) - (define-public (name conn) - (run conn "apt-get" "-q" "-y" apt-args ... #:env noninteractive-env))))) - -(define-apt-operation apt:update "update") - -(define-apt-operation apt:upgrade "upgrade") - -(define-apt-operation apt:dist-upgrade "dist-upgrade") - -(define-apt-operation (apt:install package-name) "install") - -(define-apt-operation (apt:install-minimal package-name) "install" "--no-install-recommends") - -(define-apt-operation (apt:reinstall package-name) "reinstall") - -(define-apt-operation (apt:remove package-name) "remove") - -(define-apt-operation (apt:purge package-name) "purge") - -(define-apt-operation (apt:build-dep package-name) "build-dep") - -(define-apt-operation apt:clean "clean") - -(define-apt-operation apt:autoclean "autoclean") - -(define-apt-operation apt:distclean "distclean") - -(define-apt-operation apt:autoremove "autoremove") - -(define-apt-operation apt:autopurge "autopurge") diff --git a/modules/ordo/connection.scm b/modules/ordo/connection.scm index d5e3223..0c75ac9 100644 --- a/modules/ordo/connection.scm +++ b/modules/ordo/connection.scm @@ -49,9 +49,8 @@ (string-join xs " "))) (define (run conn prog . args) - (let* ((args (flatten args)) - (args kwargs (break keyword? args)) - (args (remove unspecified? args)) + (let* ((args kwargs (break keyword? args)) + (args (remove unspecified? (flatten args))) (pwd (keyword-arg kwargs #:pwd)) (env (keyword-arg kwargs #:env)) (return (keyword-arg kwargs #:return identity)) diff --git a/modules/ordo/interceptor/apt.scm b/modules/ordo/interceptor/apt.scm new file mode 100644 index 0000000..88d85c5 --- /dev/null +++ b/modules/ordo/interceptor/apt.scm @@ -0,0 +1,49 @@ +(define-module (ordo interceptor apt) + #:use-module (ordo interceptor) + #:use-module ((ordo connection) #:select (run))) + +(define noninteractive-env '(("DEBIAN_FRONTEND" . "noninteractive") + ("APT_LISTCHANGES_FRONTEND" . "none"))) + +(define-syntax define-apt-interceptor + (syntax-rules () + ((define-apt-interceptor (name arg) apt-args ...) + (define-public (name arg) + (interceptor + (string-append (symbol->string 'name) " " arg) + #:enter (lambda (ctx) + (run (context-connection ctx) "apt-get" "-q" "-y" apt-args ... arg #:env noninteractive-env #:check? #t))))) + ((define-apt-interceptor name apt-args ...) + (define-public (name) + (interceptor + (symbol->string 'name) + #:enter (lambda (ctx) + (run (context-connection ctx) "apt-get" "-q" "-y" apt-args ... #:env noninteractive-env #:check? #t))))))) + +(define-apt-interceptor apt:update "update") + +(define-apt-interceptor apt:upgrade "upgrade") + +(define-apt-interceptor apt:dist-upgrade "dist-upgrade") + +(define-apt-interceptor (apt:install package-name) "install") + +(define-apt-interceptor (apt:install-minimal package-name) "install" "--no-install-recommends") + +(define-apt-interceptor (apt:reinstall package-name) "reinstall") + +(define-apt-interceptor (apt:remove package-name) "remove") + +(define-apt-interceptor (apt:purge package-name) "purge") + +(define-apt-interceptor (apt:build-dep package-name) "build-dep") + +(define-apt-interceptor apt:clean "clean") + +(define-apt-interceptor apt:autoclean "autoclean") + +(define-apt-interceptor apt:distclean "distclean") + +(define-apt-interceptor apt:autoremove "autoremove") + +(define-apt-interceptor apt:autopurge "autopurge") diff --git a/modules/ordo/inventory.scm b/modules/ordo/inventory.scm index 37294f2..47924ea 100644 --- a/modules/ordo/inventory.scm +++ b/modules/ordo/inventory.scm @@ -24,7 +24,7 @@ (set! *inventory* (cons (make-host name connection tags) *inventory*))) -(define (tagged-all? wanted-tags) +(define (tagged-every? wanted-tags) (lambda (h) (lset= equal? wanted-tags (lset-intersection equal? (host-tags h) wanted-tags)))) @@ -42,5 +42,6 @@ (make-host "localhost" (local-connection) '())))) ((? string? hostname) (filter (named? hostname) *inventory*)) ('all *inventory*) - (('every-tag tag . tags) (filter (tagged-all? (cons tag tags)) *inventory*)) - (('any-tag tag . tags) (filter (tagged-any? (cons tag tags)) *inventory*)))) + (('tagged tag) (filter (tagged-every? (list tag)) *inventory*)) + (('tagged/every tag . tags) (filter (tagged-every? (cons tag tags)) *inventory*)) + (('tagged/any tag . tags) (filter (tagged-any? (cons tag tags)) *inventory*))))