stages: add new org.osbuild.crypttab stage
New stage to configure /etc/crypttab to setup encrypted block devices. See the documentation of the stage for more information.
This commit is contained in:
parent
2801c17730
commit
d8a4f9d063
1 changed files with 91 additions and 0 deletions
91
stages/org.osbuild.crypttab
Executable file
91
stages/org.osbuild.crypttab
Executable file
|
|
@ -0,0 +1,91 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Create /etc/crypttab entries for encrypted block devices
|
||||||
|
|
||||||
|
See crypttab(5) for a detailed description of the format but in brief:
|
||||||
|
each item in the list of `volumes` describes an encrypted block device
|
||||||
|
and how it should it should be setup. The block device is identified
|
||||||
|
either by `uuid` or by `path` (device node path). The volume will be
|
||||||
|
named as `volume`, i.e. made available as `/dev/mapper/$volume`.
|
||||||
|
Additionally, a keyfile can (optionally) be specified via `keyfile`.
|
||||||
|
Specific device options can be specified via `options`.
|
||||||
|
|
||||||
|
This stage replaces /etc/crypttab, removing any existing entries.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import osbuild.api
|
||||||
|
|
||||||
|
|
||||||
|
SCHEMA = """
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": ["volumes"],
|
||||||
|
"properties": {
|
||||||
|
"volumes": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "array of volume objects",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"oneOf": [{
|
||||||
|
"required": ["uuid", "volume"]
|
||||||
|
}, {
|
||||||
|
"required": ["path", "volume"]
|
||||||
|
}],
|
||||||
|
"properties": {
|
||||||
|
"volume": {
|
||||||
|
"description": "volume mountpoint",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uuid": {
|
||||||
|
"description": "device UUID",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"description": "device path",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"keyfile": {
|
||||||
|
"description": "",
|
||||||
|
"type": "string",
|
||||||
|
"default": "none"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"description": "options (comma-separated)",
|
||||||
|
"type": "string",
|
||||||
|
"default": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def main(tree, options):
|
||||||
|
volumes = options["volumes"]
|
||||||
|
|
||||||
|
with open(f"{tree}/etc/crypttab", "w") as f:
|
||||||
|
for volume in volumes:
|
||||||
|
name = volume["volume"]
|
||||||
|
uuid = volume.get("uuid")
|
||||||
|
path = volume.get("path")
|
||||||
|
options = volume.get("options", "")
|
||||||
|
keyfile = volume.get("keyfile", "none")
|
||||||
|
|
||||||
|
if uuid:
|
||||||
|
device = f"UUID={uuid}"
|
||||||
|
elif path:
|
||||||
|
device = path
|
||||||
|
else:
|
||||||
|
raise ValueError("Need 'uuid' or 'label'")
|
||||||
|
|
||||||
|
f.write(
|
||||||
|
f"{name}\t{device}\t{keyfile}\t{options}\n")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
args = osbuild.api.arguments()
|
||||||
|
r = main(args["tree"], args["options"])
|
||||||
|
sys.exit(r)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue