feat: OS Release Module (#417)

* feat: OS Release Module

* docs: clearer description

* chore: update shortdesc to match new description

---------

Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>
This commit is contained in:
Gerald Pinder 2025-07-14 12:51:21 -04:00 committed by GitHub
parent 5cd482353b
commit 1e6588c5dc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 69 additions and 0 deletions

View file

@ -11,6 +11,7 @@
"https://raw.githubusercontent.com/blue-build/modules/main/modules/justfiles/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/rpm-ostree/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/dnf/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/os-release/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/kargs/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/initramfs/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/script/module.yml",

View file

@ -0,0 +1,13 @@
# **`os-release` Module**
The `os-release` module offers a way to modify and set values in the [`/etc/os-release`](https://www.freedesktop.org/software/systemd/man/latest/os-release.html) file in your image. This file contains metadata about the running Linux operating system and is read by various programs.
## Example
```yaml
type: os-release
properties:
ID: blue_build
NAME: BlueBuild
PRETTY_NAME: BlueBuild Image
```

View file

@ -0,0 +1,8 @@
name: os-release
shortdesc: The `os-release` module offers a way to modify and set values in the /etc/os-release file in your image.
example: |
type: os-release
properties:
ID: blue_build
NAME: BlueBuild
PRETTY_NAME: BlueBuild Image

View file

@ -0,0 +1,34 @@
#!/usr/bin/env nu
def main [config: string]: nothing -> nothing {
let config = $config
| from json
| default {} properties
mut os_release = open --raw /etc/os-release
| lines
| parse '{key}={value}'
| transpose --ignore-titles -dr
| str trim -c '"'
| str trim -c "'"
print $'(ansi green)Original release:(ansi reset)'
print $os_release
for $item in ($config.properties | transpose key value) {
if $item.key in $os_release {
print $'(ansi green)Updating (ansi cyan)($item.key)(ansi green) with value (ansi yellow)($item.value)(ansi reset)'
$os_release = $os_release | update $item.key $item.value
} else {
print $'(ansi green)Adding (ansi cyan)($item.key)(ansi green) with value (ansi yellow)($item.value)(ansi reset)'
$os_release = $os_release | insert $item.key $item.value
}
}
print $'(ansi green)New release:(ansi reset)'
print $os_release
$os_release
| transpose key value
| each { $'($in.key)="($in.value)"' }
| str join "\n"
| save --force /etc/os-release
}

View file

@ -0,0 +1,13 @@
import "@typespec/json-schema";
using TypeSpec.JsonSchema;
@jsonSchema("/modules/os-release-latest.json")
model OsReleaseLatest {
...OsReleaseV1;
}
@jsonSchema("/modules/os-release-v1.json")
model OsReleaseV1 {
/** The properties of the `/etc/os-release` file to set. */
properties: Record<string>;
}