1*4882a593Smuzhiyun# SPDX-License-Identifier: MIT 2*4882a593Smuzhiyunimport os 3*4882a593Smuzhiyunimport sys 4*4882a593Smuzhiyunimport tempfile 5*4882a593Smuzhiyunimport contextlib 6*4882a593Smuzhiyunimport socket 7*4882a593Smuzhiyunfrom oeqa.utils.commands import bitbake, get_bb_var, Command 8*4882a593Smuzhiyunfrom oeqa.utils.network import get_free_port 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun@contextlib.contextmanager 11*4882a593Smuzhiyundef unfs_server(directory, logger = None): 12*4882a593Smuzhiyun unfs_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "unfs3-native") 13*4882a593Smuzhiyun if not os.path.exists(os.path.join(unfs_sysroot, "usr", "bin", "unfsd")): 14*4882a593Smuzhiyun # build native tool 15*4882a593Smuzhiyun bitbake("unfs3-native -c addto_recipe_sysroot") 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun exports = None 18*4882a593Smuzhiyun cmd = None 19*4882a593Smuzhiyun try: 20*4882a593Smuzhiyun # create the exports file 21*4882a593Smuzhiyun with tempfile.NamedTemporaryFile(delete = False) as exports: 22*4882a593Smuzhiyun exports.write("{0} (rw,no_root_squash,no_all_squash,insecure)\n".format(directory).encode()) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun # find some ports for the server 25*4882a593Smuzhiyun nfsport, mountport = get_free_port(udp = True), get_free_port(udp = True) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun nenv = dict(os.environ) 28*4882a593Smuzhiyun nenv['PATH'] = "{0}/sbin:{0}/usr/sbin:{0}/usr/bin:".format(unfs_sysroot) + nenv.get('PATH', '') 29*4882a593Smuzhiyun cmd = Command(["unfsd", "-d", "-p", "-N", "-e", exports.name, "-n", str(nfsport), "-m", str(mountport)], 30*4882a593Smuzhiyun bg = True, env = nenv, output_log = logger) 31*4882a593Smuzhiyun cmd.run() 32*4882a593Smuzhiyun yield nfsport, mountport 33*4882a593Smuzhiyun finally: 34*4882a593Smuzhiyun if cmd is not None: 35*4882a593Smuzhiyun cmd.stop() 36*4882a593Smuzhiyun if exports is not None: 37*4882a593Smuzhiyun # clean up exports file 38*4882a593Smuzhiyun os.unlink(exports.name) 39*4882a593Smuzhiyun 40