#!/usr/bin/env python3 import os import sys from posix_parity import fail from posix_parity import mergerfs_get_option from posix_parity import mergerfs_mount from posix_parity import mergerfs_set_option def main(): try: with mergerfs_mount() as (mount, _): try: orig_statfs = mergerfs_get_option(mount, "statfs") orig_ignore = mergerfs_get_option(mount, "statfs-ignore") except (PermissionError, FileNotFoundError, OSError): return 0 try: mergerfs_set_option(mount, "statfs", "base") mergerfs_set_option(mount, "statfs-ignore", "none") s_none = os.statvfs(mount) mergerfs_set_option(mount, "statfs-ignore", "nc") s_nc = os.statvfs(mount) mergerfs_set_option(mount, "statfs-ignore", "ro") s_ro = os.statvfs(mount) if s_nc.f_bavail > s_none.f_bavail: return fail( f"statfs-ignore=nc increased bavail unexpectedly nc={s_nc.f_bavail} none={s_none.f_bavail}" ) if s_ro.f_bavail > s_nc.f_bavail: return fail( f"statfs-ignore=ro increased bavail unexpectedly ro={s_ro.f_bavail} nc={s_nc.f_bavail}" ) mergerfs_set_option(mount, "statfs", "full") s_full = os.statvfs(mount) if s_full.f_bsize <= 0 or s_full.f_frsize <= 0: return fail( f"statfs=full invalid block sizes bsize={s_full.f_bsize} frsize={s_full.f_frsize}" ) except (PermissionError, FileNotFoundError, OSError): return 0 finally: try: mergerfs_set_option(mount, "statfs", orig_statfs) mergerfs_set_option(mount, "statfs-ignore", orig_ignore) except OSError: pass return 0 except RuntimeError as exc: print(str(exc), end="") return 77 if __name__ == "__main__": raise SystemExit(main())