#!/usr/bin/env python3 import os import sys from posix_parity import cleanup_dir from posix_parity import fail from posix_parity import join from posix_parity import mergerfs_branches from posix_parity import mergerfs_get_option from posix_parity import mergerfs_mount from posix_parity import mergerfs_set_option from posix_parity import temp_dir from posix_parity import touch def main(): try: with mergerfs_mount() as (mount, branches): ctrl = join(mount, ".mergerfs") if not os.path.exists(ctrl): return fail(".mergerfs control file not found") if not branches: return fail("no branches found") merge_base = temp_dir(mount) try: merge_file = join(merge_base, "api_test") touch(merge_file, b"test") try: fullpath = os.getxattr(merge_file, "user.mergerfs.fullpath") fullpath_str = fullpath.decode("utf-8", errors="surrogateescape") if not fullpath_str: return fail("fullpath xattr is empty") if not os.path.exists(fullpath_str): return fail(f"fullpath '{fullpath_str}' does not exist on disk") except OSError as exc: return fail(f"getxattr fullpath: errno={exc.errno}") try: relpath = os.getxattr(merge_file, "user.mergerfs.relpath") relpath_str = relpath.decode("utf-8", errors="surrogateescape") if not relpath_str: return fail("relpath xattr is empty") except OSError as exc: return fail(f"getxattr relpath: errno={exc.errno}") try: basepath = os.getxattr(merge_file, "user.mergerfs.basepath") basepath_str = basepath.decode("utf-8", errors="surrogateescape") if not basepath_str: return fail("basepath xattr is empty") except OSError as exc: return fail(f"getxattr basepath: errno={exc.errno}") try: allpaths = os.getxattr(merge_file, "user.mergerfs.allpaths") allpaths_str = allpaths.decode("utf-8", errors="surrogateescape") if not allpaths_str: return fail("allpaths xattr is empty") except OSError as exc: return fail(f"getxattr allpaths: errno={exc.errno}") return 0 finally: cleanup_dir(merge_base) except RuntimeError as exc: print(str(exc), end="") return 77 except Exception as exc: return fail(str(exc)) if __name__ == "__main__": raise SystemExit(main())