Blame stages/org.osbuild.fstab

Packit Service 863627
#!/usr/bin/python3
Packit Service 863627
"""
Packit Service 863627
Create /etc/fstab entries for filesystems
Packit Service 863627
Packit Service 863627
Create /etc/fstab entries for the given `filesystems`.
Packit Service 863627
Packit Service 863627
Each filesystem item must have at least `uuid` or `label` and
Packit Service 863627
a `path` (mount point).
Packit Service 863627
Packit Service 863627
This stage replaces /etc/fstab, removing any existing entries.
Packit Service 863627
"""
Packit Service 863627
Packit Service 863627
Packit Service 863627
import json
Packit Service 863627
import sys
Packit Service 863627
Packit Service 863627
SCHEMA = """
Packit Service 863627
"additionalProperties": false,
Packit Service 863627
"required": ["filesystems"],
Packit Service 863627
"properties": {
Packit Service 863627
  "filesystems": {
Packit Service 863627
    "type": "array",
Packit Service 863627
    "description": "array of filesystem objects",
Packit Service 863627
    "items": {
Packit Service 863627
      "type": "object",
Packit Service 863627
      "oneOf": [{
Packit Service 863627
        "required": ["uuid", "path"]
Packit Service 863627
      }, {
Packit Service 863627
        "required": ["label", "path"]
Packit Service 863627
      }],
Packit Service 863627
      "properties": {
Packit Service 863627
        "uuid": {
Packit Service 863627
          "description": "Filesystem UUID",
Packit Service 863627
          "type": "string"
Packit Service 863627
        },
Packit Service 863627
        "label": {
Packit Service 863627
          "description": "Filesystem label",
Packit Service 863627
          "type": "string"
Packit Service 863627
        },
Packit Service 863627
        "path": {
Packit Service 863627
          "description": "Filesystem mountpoint",
Packit Service 863627
          "type": "string"
Packit Service 863627
        },
Packit Service 863627
        "vfs_type": {
Packit Service 863627
          "description": "Filesystem type",
Packit Service 863627
          "type": "string",
Packit Service 863627
          "default": "none"
Packit Service 863627
        },
Packit Service 863627
        "options": {
Packit Service 863627
          "description": "Filesystem options (comma-separated)",
Packit Service 863627
          "type": "string",
Packit Service 863627
          "default": "defaults"
Packit Service 863627
        },
Packit Service 863627
        "freq": {
Packit Service 863627
          "description": "dump(8) period in days",
Packit Service 863627
          "type": "number",
Packit Service 863627
          "default": 0
Packit Service 863627
        },
Packit Service 863627
        "passno": {
Packit Service 863627
          "description": "pass number on parallel fsck(8)",
Packit Service 863627
          "type": "number",
Packit Service 863627
          "default": 0
Packit Service 863627
        }
Packit Service 863627
      }
Packit Service 863627
    }
Packit Service 863627
  }
Packit Service 863627
}
Packit Service 863627
"""
Packit Service 863627
Packit Service 863627
def main(tree, options):
Packit Service 863627
    filesystems = options["filesystems"]
Packit Service 863627
Packit Service 863627
    with open(f"{tree}/etc/fstab", "w") as f:
Packit Service 863627
        for filesystem in filesystems:
Packit Service 863627
            uuid = filesystem.get("uuid")
Packit Service 863627
            path = filesystem["path"]
Packit Service 863627
            label = filesystem.get("label")
Packit Service 863627
            vfs_type = filesystem.get("vfs_type", "none")
Packit Service 863627
            options = filesystem.get("options", "defaults")
Packit Service 863627
            freq = filesystem.get("freq", 0)
Packit Service 863627
            passno = filesystem.get("passno", 0)
Packit Service 863627
Packit Service 863627
            if uuid:
Packit Service 863627
                fs_spec = f"UUID={uuid}"
Packit Service 863627
            elif label:
Packit Service 863627
                fs_spec = f"LABEL={label}"
Packit Service 863627
            else:
Packit Service 863627
                raise ValueError("Need 'uuid' or 'label'")
Packit Service 863627
Packit Service 863627
            f.write(f"{fs_spec}\t{path}\t{vfs_type}\t{options}\t{freq}\t{passno}\n")
Packit Service 863627
Packit Service 863627
Packit Service 863627
if __name__ == '__main__':
Packit Service 863627
    args = json.load(sys.stdin)
Packit Service 863627
    r = main(args["tree"], args["options"])
Packit Service 863627
    sys.exit(r)