import errno, json, os, stat, sys, threading, time
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from fuse import FUSE, Operations, FuseOSError
release = threading.Event(); release.set()
entered = threading.Event()
class Control(BaseHTTPRequestHandler):
    def log_message(self, *args): pass
    def do_GET(self):
        if self.path == '/arm':
            entered.clear(); release.clear()
            threading.Timer(45, release.set).start()
        elif self.path == '/entered':
            entered.wait(20)
        elif self.path == '/release': release.set()
        self.send_response(200); self.end_headers()
        self.wfile.write(json.dumps({'entered':entered.is_set(), 'held':not release.is_set()}).encode())
class Delayed(Operations):
    def getattr(self, path, fh=None):
        if path == '/': return dict(st_mode=stat.S_IFDIR|0o755, st_nlink=2, st_uid=os.getuid(), st_gid=os.getgid())
        if path == '/git' and not release.is_set():
            entered.set()
            print('git executable lookup held', flush=True)
            release.wait(45)
            print('git executable lookup released', flush=True)
        raise FuseOSError(errno.ENOENT)
    def readdir(self, path, fh): return ['.', '..']
threading.Thread(target=ThreadingHTTPServer(('127.0.0.1',18938),Control).serve_forever,daemon=True).start()
FUSE(Delayed(), sys.argv[1], foreground=True, nothreads=False, attr_timeout=0, entry_timeout=0, negative_timeout=0)
