#!/usr/bin/env python3 import sys import os import subprocess p = os.path.join pUp = os.path.dirname s = False if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): s = os.path.realpath(sys.executable) else: s = os.path.realpath(__file__) sd = pUp(s) def runCode(st,name,glb = False): if glb == False: glb = {} code = compile(st,name,"exec") exec(code,glb) def runFile(path,glb = False): return runCode(open(path,encoding="utf-8").read(),path,glb) def getScriptFiles(paths): sfiles = {} for path in paths: for root,dirs,files in os.walk(path): for file in sorted(files): ffile = p(root,file) lfile = ffile.replace(root + os.path.sep,"",1) if not lfile in sfiles: sfiles[lfile] = ffile break return sfiles def runStage(d,stage,env = False): if env == False: env = {} env["dir"] = d env["stage"] = stage glb = {} glb["_g"] = globals() glb["_chroot"] = env sdirs = [] sdir = p(d,"opt","mfchroot","scripts",stage) if os.path.isdir(sdir): sdirs.append(sdir) sdir = p(sd,"scripts",stage) if os.path.isdir(sdir): sdirs.append(sdir) sfiles = getScriptFiles(sdirs) for sfile in sorted(sfiles.keys()): runFile(sfiles[sfile],glb) def call(cmd,*args,**kwargs): proc = subprocess.Popen(cmd,*args,**kwargs) rtn = proc.wait() if rtn != 0: raise subprocess.CalledProcessError(rtn,cmd) return proc def callRtn(cmd,*args,**kwargs): proc = subprocess.Popen(cmd,*args,**kwargs) return proc.wait() def mountBind(start,end): if callRtn(["mountpoint","-q",end]) == 0: return if not os.path.isdir(end): os.makedirs(end) call(["mount","-o","x-gvfs-hide","--bind",start,end]) def umount(end): if callRtn(["mountpoint","-q",end]) != 0: return call(["umount","-lR",end]) def main(): env = {} env["args"] = sys.argv[2:] if sys.argv[1] == "-u": runStage(sys.argv[2],"all-pre",env) runStage(sys.argv[2],"umount",env) runStage(sys.argv[2],"all-post",env) return if sys.argv[1] == "-m": runStage(sys.argv[2],"all-pre",env) runStage(sys.argv[2],"mount",env) runStage(sys.argv[2],"all-post",env) return runStage(sys.argv[1],"all-pre",env) runStage(sys.argv[1],"mount",env) runStage(sys.argv[1],"all-post",env) runStage(sys.argv[1],"all-pre",env) runStage(sys.argv[1],"chroot",env) runStage(sys.argv[1],"all-post",env) return main()