From 1db0d67adffb07b7684aa34d83ec83c02ce77b4f Mon Sep 17 00:00:00 2001 From: Gerald Pinder Date: Mon, 22 Dec 2025 11:50:52 -0500 Subject: [PATCH 1/4] feat: Create basic apt module --- modules/apt/README.md | 33 ++++++++++++++++++++ modules/apt/apt.nu | 69 ++++++++++++++++++++++++++++++++++++++++++ modules/apt/apt.tsp | 32 ++++++++++++++++++++ modules/apt/module.yml | 11 +++++++ 4 files changed, 145 insertions(+) create mode 100644 modules/apt/README.md create mode 100644 modules/apt/apt.nu create mode 100644 modules/apt/apt.tsp create mode 100644 modules/apt/module.yml diff --git a/modules/apt/README.md b/modules/apt/README.md new file mode 100644 index 00000000..e1ffa9dc --- /dev/null +++ b/modules/apt/README.md @@ -0,0 +1,33 @@ +# **`apt` Module** + +The `apt` module offers pseudo-declarative package and repository management using [`apt`](https://salsa.debian.org/apt-team/apt). + +## Features + +This module is capable of: + +- Package Management + - Installing packages + - Removing packages + +## Package Management + +### Installing + +```yaml +type: apt +install: + packages: + - package-1 + - package-2 +``` + +### Removing Packages + +```yaml +type: apt +remove: + packages: + - package-1 + - package-2 +``` diff --git a/modules/apt/apt.nu b/modules/apt/apt.nu new file mode 100644 index 00000000..38b40391 --- /dev/null +++ b/modules/apt/apt.nu @@ -0,0 +1,69 @@ +#!/usr/bin/env nu + +# Remove packages. +def remove_pkgs [remove: record]: nothing -> nothing { + let remove = $remove + | default [] packages + + let remove_list = $remove.packages + | str trim + + if ($remove.packages | is-not-empty) { + print $'(ansi green)Removing packages:(ansi reset)' + $remove_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + + try { + ^apt-get -y remove ...($remove_list) + } catch {|err| + return (error make { + msg: $"Failed to remove packages\n($err.msg)" + }) + } + } +} + +# Install packages. +# +# You can specify a list of packages to install, and you can +# specify a list of packages for a specific repo to install. +def install_pkgs [install: record]: nothing -> nothing { + let install = $install + | default [] packages + + # Gather lists of the various ways a package is installed + # to report back to the user. + let install_list = $install.packages + | str trim + + if ($install_list | is-not-empty) { + print $'(ansi green)Installing packages:(ansi reset)' + $install_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + try { + ^apt-get -y install ...($install_list) + } catch {|err| + return (error make { + msg: $"Failed to install packages\n($err.msg)" + }) + } + } +} + +def main [config: string]: nothing -> nothing { + let config = $config + | from json + | default {} remove + | default {} install + + $env.DEBIAN_FRONTEND = 'noninteractive' + + ^apt-get update + + remove_pkgs $config.remove + install_pkgs $config.install +} diff --git a/modules/apt/apt.tsp b/modules/apt/apt.tsp new file mode 100644 index 00000000..3c852843 --- /dev/null +++ b/modules/apt/apt.tsp @@ -0,0 +1,32 @@ +import "@typespec/json-schema"; +using TypeSpec.JsonSchema; + +@jsonSchema("/modules/apt-latest.json") +model AptModuleLatest { + ...AptModuleV1; +} + +@jsonSchema("/modules/apt-v1.json") +model AptModuleV1 { + /** + * The apt module offers pseudo-declarative package and repository management using apt. + * https://blue-build.org/reference/modules/apt/ + */ + type: "apt" | "apt@v1" | "apt@latest"; + + /** Configuration of packages removal. */ + remove?: Remove; + + /** Configuration of packages install. */ + install?: Install; +} + +model Install { + /** List of packages to install. */ + packages: Array; +} + +model Remove { + /** List of packages to remove. */ + packages: Array; +} diff --git a/modules/apt/module.yml b/modules/apt/module.yml new file mode 100644 index 00000000..6bf7ab0e --- /dev/null +++ b/modules/apt/module.yml @@ -0,0 +1,11 @@ +name: apt +shortdesc: The apt module offers pseudo-declarative package and repository management using apt. +example: | + type: apt + install: + packages: + - git + remove: + packages: + - firefox + - firefox-langpacks From 3613887babd0addd025b85a29d5a810b5c24fad5 Mon Sep 17 00:00:00 2001 From: Gerald Pinder Date: Mon, 22 Dec 2025 12:18:35 -0500 Subject: [PATCH 2/4] feat: Add zypper module --- modules/zypper/README.md | 33 ++++++++++++++++++++ modules/zypper/module.yml | 11 +++++++ modules/zypper/zypper.nu | 65 +++++++++++++++++++++++++++++++++++++++ modules/zypper/zypper.tsp | 32 +++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 modules/zypper/README.md create mode 100644 modules/zypper/module.yml create mode 100644 modules/zypper/zypper.nu create mode 100644 modules/zypper/zypper.tsp diff --git a/modules/zypper/README.md b/modules/zypper/README.md new file mode 100644 index 00000000..833c7661 --- /dev/null +++ b/modules/zypper/README.md @@ -0,0 +1,33 @@ +# **`zypper` Module** + +The `zypper` module offers pseudo-declarative package and repository management using [`zypper`](https://github.com/openSUSE/zypper). + +## Features + +This module is capable of: + +- Package Management + - Installing packages + - Removing packages + +## Package Management + +### Installing + +```yaml +type: zypper +install: + packages: + - package-1 + - package-2 +``` + +### Removing Packages + +```yaml +type: zypper +remove: + packages: + - package-1 + - package-2 +``` diff --git a/modules/zypper/module.yml b/modules/zypper/module.yml new file mode 100644 index 00000000..1af1710f --- /dev/null +++ b/modules/zypper/module.yml @@ -0,0 +1,11 @@ +name: zypper +shortdesc: The zypper module offers pseudo-declarative package and repository management using apt. +example: | + type: zypper + install: + packages: + - git + remove: + packages: + - firefox + - firefox-langpacks diff --git a/modules/zypper/zypper.nu b/modules/zypper/zypper.nu new file mode 100644 index 00000000..b08a447c --- /dev/null +++ b/modules/zypper/zypper.nu @@ -0,0 +1,65 @@ +#!/usr/bin/env nu + +# Remove packages. +def remove_pkgs [remove: record]: nothing -> nothing { + let remove = $remove + | default [] packages + + let remove_list = $remove.packages + | str trim + + if ($remove.packages | is-not-empty) { + print $'(ansi green)Removing packages:(ansi reset)' + $remove_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + + try { + ^zypper --non-interactive remove ...($remove_list) + } catch {|err| + return (error make { + msg: $"Failed to remove packages\n($err.msg)" + }) + } + } +} + +# Install packages. +# +# You can specify a list of packages to install, and you can +# specify a list of packages for a specific repo to install. +def install_pkgs [install: record]: nothing -> nothing { + let install = $install + | default [] packages + + # Gather lists of the various ways a package is installed + # to report back to the user. + let install_list = $install.packages + | str trim + + if ($install_list | is-not-empty) { + print $'(ansi green)Installing packages:(ansi reset)' + $install_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + try { + ^zypper --non-interactive install --auto-agree-with-licenses ...($install_list) + } catch {|err| + return (error make { + msg: $"Failed to install packages\n($err.msg)" + }) + } + } +} + +def main [config: string]: nothing -> nothing { + let config = $config + | from json + | default {} remove + | default {} install + + remove_pkgs $config.remove + install_pkgs $config.install +} diff --git a/modules/zypper/zypper.tsp b/modules/zypper/zypper.tsp new file mode 100644 index 00000000..a7794c39 --- /dev/null +++ b/modules/zypper/zypper.tsp @@ -0,0 +1,32 @@ +import "@typespec/json-schema"; +using TypeSpec.JsonSchema; + +@jsonSchema("/modules/zypper-latest.json") +model ZypperModuleLatest { + ...ZypperModuleV1; +} + +@jsonSchema("/modules/zypper-v1.json") +model ZypperModuleV1 { + /** + * The zypper module offers pseudo-declarative package and repository management using zypper. + * https://blue-build.org/reference/modules/zypper/ + */ + type: "zypper" | "zypper@v1" | "zypper@latest"; + + /** Configuration of packages removal. */ + remove?: Remove; + + /** Configuration of packages install. */ + install?: Install; +} + +model Install { + /** List of packages to install. */ + packages: Array; +} + +model Remove { + /** List of packages to remove. */ + packages: Array; +} From 5531a1f44d88466b7d1f20616443f3cd63f0487e Mon Sep 17 00:00:00 2001 From: Gerald Pinder Date: Mon, 22 Dec 2025 12:18:47 -0500 Subject: [PATCH 3/4] feat: Add apk module --- modules/apk/README.md | 33 +++++++++++++++++++++ modules/apk/apk.nu | 65 ++++++++++++++++++++++++++++++++++++++++++ modules/apk/apk.tsp | 32 +++++++++++++++++++++ modules/apk/module.yml | 11 +++++++ 4 files changed, 141 insertions(+) create mode 100644 modules/apk/README.md create mode 100644 modules/apk/apk.nu create mode 100644 modules/apk/apk.tsp create mode 100644 modules/apk/module.yml diff --git a/modules/apk/README.md b/modules/apk/README.md new file mode 100644 index 00000000..4fdb62b9 --- /dev/null +++ b/modules/apk/README.md @@ -0,0 +1,33 @@ +# **`apk` Module** + +The `apk` module offers pseudo-declarative package and repository management using [`apk`](https://github.com/alpinelinux/apk-tools). + +## Features + +This module is capable of: + +- Package Management + - Installing packages + - Removing packages + +## Package Management + +### Installing + +```yaml +type: apk +install: + packages: + - package-1 + - package-2 +``` + +### Removing Packages + +```yaml +type: apk +remove: + packages: + - package-1 + - package-2 +``` diff --git a/modules/apk/apk.nu b/modules/apk/apk.nu new file mode 100644 index 00000000..f8e86954 --- /dev/null +++ b/modules/apk/apk.nu @@ -0,0 +1,65 @@ +#!/usr/bin/env nu + +# Remove packages. +def remove_pkgs [remove: record]: nothing -> nothing { + let remove = $remove + | default [] packages + + let remove_list = $remove.packages + | str trim + + if ($remove.packages | is-not-empty) { + print $'(ansi green)Removing packages:(ansi reset)' + $remove_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + + try { + ^apk remove ...($remove_list) + } catch {|err| + return (error make { + msg: $"Failed to remove packages\n($err.msg)" + }) + } + } +} + +# Install packages. +# +# You can specify a list of packages to install, and you can +# specify a list of packages for a specific repo to install. +def install_pkgs [install: record]: nothing -> nothing { + let install = $install + | default [] packages + + # Gather lists of the various ways a package is installed + # to report back to the user. + let install_list = $install.packages + | str trim + + if ($install_list | is-not-empty) { + print $'(ansi green)Installing packages:(ansi reset)' + $install_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + try { + ^apk add ...($install_list) + } catch {|err| + return (error make { + msg: $"Failed to install packages\n($err.msg)" + }) + } + } +} + +def main [config: string]: nothing -> nothing { + let config = $config + | from json + | default {} remove + | default {} install + + remove_pkgs $config.remove + install_pkgs $config.install +} diff --git a/modules/apk/apk.tsp b/modules/apk/apk.tsp new file mode 100644 index 00000000..c8b2b013 --- /dev/null +++ b/modules/apk/apk.tsp @@ -0,0 +1,32 @@ +import "@typespec/json-schema"; +using TypeSpec.JsonSchema; + +@jsonSchema("/modules/apk-latest.json") +model ApkModuleLatest { + ...ApkModuleV1; +} + +@jsonSchema("/modules/apk-v1.json") +model ApkModuleV1 { + /** + * The apk module offers pseudo-declarative package and repository management using apk. + * https://blue-build.org/reference/modules/apk/ + */ + type: "apk" | "apk@v1" | "apk@latest"; + + /** Configuration of packages removal. */ + remove?: Remove; + + /** Configuration of packages install. */ + install?: Install; +} + +model Install { + /** List of packages to install. */ + packages: Array; +} + +model Remove { + /** List of packages to remove. */ + packages: Array; +} diff --git a/modules/apk/module.yml b/modules/apk/module.yml new file mode 100644 index 00000000..027982f5 --- /dev/null +++ b/modules/apk/module.yml @@ -0,0 +1,11 @@ +name: apk +shortdesc: The apk module offers pseudo-declarative package and repository management using apt. +example: | + type: apk + install: + packages: + - git + remove: + packages: + - firefox + - firefox-langpacks From 0df7d5ac765261904f855755133d0eba6b46318d Mon Sep 17 00:00:00 2001 From: Gerald Pinder Date: Mon, 22 Dec 2025 12:19:03 -0500 Subject: [PATCH 4/4] feat: Add pacman module --- modules/pacman/README.md | 33 ++++++++++++++++++++ modules/pacman/module.yml | 11 +++++++ modules/pacman/pacman.nu | 65 +++++++++++++++++++++++++++++++++++++++ modules/pacman/pacman.tsp | 32 +++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 modules/pacman/README.md create mode 100644 modules/pacman/module.yml create mode 100644 modules/pacman/pacman.nu create mode 100644 modules/pacman/pacman.tsp diff --git a/modules/pacman/README.md b/modules/pacman/README.md new file mode 100644 index 00000000..701a75ee --- /dev/null +++ b/modules/pacman/README.md @@ -0,0 +1,33 @@ +# **`pacman` Module** + +The `pacman` module offers pseudo-declarative package and repository management using [`pacman`](https://gitlab.archlinux.org/pacman/pacman/). + +## Features + +This module is capable of: + +- Package Management + - Installing packages + - Removing packages + +## Package Management + +### Installing + +```yaml +type: pacman +install: + packages: + - package-1 + - package-2 +``` + +### Removing Packages + +```yaml +type: pacman +remove: + packages: + - package-1 + - package-2 +``` diff --git a/modules/pacman/module.yml b/modules/pacman/module.yml new file mode 100644 index 00000000..90400029 --- /dev/null +++ b/modules/pacman/module.yml @@ -0,0 +1,11 @@ +name: pacman +shortdesc: The pacman module offers pseudo-declarative package and repository management using apt. +example: | + type: pacman + install: + packages: + - git + remove: + packages: + - firefox + - firefox-langpacks diff --git a/modules/pacman/pacman.nu b/modules/pacman/pacman.nu new file mode 100644 index 00000000..e3dd5f59 --- /dev/null +++ b/modules/pacman/pacman.nu @@ -0,0 +1,65 @@ +#!/usr/bin/env nu + +# Remove packages. +def remove_pkgs [remove: record]: nothing -> nothing { + let remove = $remove + | default [] packages + + let remove_list = $remove.packages + | str trim + + if ($remove.packages | is-not-empty) { + print $'(ansi green)Removing packages:(ansi reset)' + $remove_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + + try { + ^pacman --remove --noconfirm --recursive --unneeded ...($remove_list) + } catch {|err| + return (error make { + msg: $"Failed to remove packages\n($err.msg)" + }) + } + } +} + +# Install packages. +# +# You can specify a list of packages to install, and you can +# specify a list of packages for a specific repo to install. +def install_pkgs [install: record]: nothing -> nothing { + let install = $install + | default [] packages + + # Gather lists of the various ways a package is installed + # to report back to the user. + let install_list = $install.packages + | str trim + + if ($install_list | is-not-empty) { + print $'(ansi green)Installing packages:(ansi reset)' + $install_list + | each { + print $'- (ansi cyan)($in)(ansi reset)' + } + try { + ^pacman --sync --noconfirm --refresh --sysupgrade ...($install_list) + } catch {|err| + return (error make { + msg: $"Failed to install packages\n($err.msg)" + }) + } + } +} + +def main [config: string]: nothing -> nothing { + let config = $config + | from json + | default {} remove + | default {} install + + remove_pkgs $config.remove + install_pkgs $config.install +} diff --git a/modules/pacman/pacman.tsp b/modules/pacman/pacman.tsp new file mode 100644 index 00000000..be04541e --- /dev/null +++ b/modules/pacman/pacman.tsp @@ -0,0 +1,32 @@ +import "@typespec/json-schema"; +using TypeSpec.JsonSchema; + +@jsonSchema("/modules/pacman-latest.json") +model PacmanModuleLatest { + ...PacmanModuleV1; +} + +@jsonSchema("/modules/pacman-v1.json") +model PacmanModuleV1 { + /** + * The pacman module offers pseudo-declarative package and repository management using pacman. + * https://blue-build.org/reference/modules/pacman/ + */ + type: "pacman" | "pacman@v1" | "pacman@latest"; + + /** Configuration of packages removal. */ + remove?: Remove; + + /** Configuration of packages install. */ + install?: Install; +} + +model Install { + /** List of packages to install. */ + packages: Array; +} + +model Remove { + /** List of packages to remove. */ + packages: Array; +}