#!/usr/bin/python3 """ Inputs for individual files Provides all the files, named via their content hash, specified via `references` in a new directory. The returned data in `refs` is a dictionary where the keys are the content hash of a file and the values dictionaries with metadata for it. The input itself currently does not set any metadata itself, but will forward any metadata set via the `metadata` property. Keys in that must start with a prefix, like `rpm.` to avoid namespace clashes. This is enforced via schema validation. """ import sys import subprocess from osbuild import inputs SCHEMA = r""" "additionalProperties": false, "definitions": { "metadata": { "description": "Additional metadata to forward to the stage", "type": "object", "additionalProperties": false, "patternProperties": { "^\\w+[.]{1}\\w+$": { "additionalProperties": false } } }, "plain-ref": { "type": "array", "items": { "type": "string" } }, "object-ref": { "type": "object", "additionalProperties": false, "minProperties": 1, "patternProperties": { ".*": { "type": "object", "additionalProperties": false, "properties": { "metadata": {"$ref": "#/definitions/metadata"} } } } } }, "required": ["type", "origin", "references"], "properties": { "type": { "enum": ["org.osbuild.files"] }, "origin": { "description": "The origin of the input (must be 'org.osbuild.source')", "type": "string", "enum": ["org.osbuild.source"] }, "references": { "description": "Checksums of files to use as files input", "oneOf": [ {"$ref": "#/definitions/plain-ref"}, {"$ref": "#/definitions/object-ref"} ] } } """ class FilesInput(inputs.InputService): def map(self, store, _origin, refs, target, _options): source = store.source("org.osbuild.files") for checksum in refs: subprocess.run( [ "ln", f"{source}/{checksum}", f"{target}/{checksum}", ], check=True, ) reply = { "path": target, "data": { "refs": refs } } return reply def main(): service = FilesInput.from_args(sys.argv[1:]) service.main() if __name__ == '__main__': main()