xref: /openbmc/openbmc/poky/meta/lib/oeqa/utils/nfs.py (revision 2a25492c)
192b42cb3SPatrick Williams#
292b42cb3SPatrick Williams# Copyright OpenEmbedded Contributors
392b42cb3SPatrick Williams#
479641f25SBrad Bishop# SPDX-License-Identifier: MIT
592b42cb3SPatrick Williams#
679641f25SBrad Bishopimport os
779641f25SBrad Bishopimport sys
879641f25SBrad Bishopimport tempfile
979641f25SBrad Bishopimport contextlib
1079641f25SBrad Bishopimport socket
1179641f25SBrad Bishopfrom oeqa.utils.commands import bitbake, get_bb_var, Command
1279641f25SBrad Bishopfrom oeqa.utils.network import get_free_port
1379641f25SBrad Bishop
1479641f25SBrad Bishop@contextlib.contextmanager
15*2a25492cSPatrick Williamsdef unfs_server(directory, logger = None, udp = True):
1679641f25SBrad Bishop    unfs_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "unfs3-native")
1779641f25SBrad Bishop    if not os.path.exists(os.path.join(unfs_sysroot, "usr", "bin", "unfsd")):
1879641f25SBrad Bishop        # build native tool
1979641f25SBrad Bishop        bitbake("unfs3-native -c addto_recipe_sysroot")
2079641f25SBrad Bishop
2179641f25SBrad Bishop    exports = None
2279641f25SBrad Bishop    cmd = None
2379641f25SBrad Bishop    try:
2479641f25SBrad Bishop        # create the exports file
2579641f25SBrad Bishop        with tempfile.NamedTemporaryFile(delete = False) as exports:
2679641f25SBrad Bishop            exports.write("{0} (rw,no_root_squash,no_all_squash,insecure)\n".format(directory).encode())
2779641f25SBrad Bishop
2879641f25SBrad Bishop        # find some ports for the server
29*2a25492cSPatrick Williams        nfsport, mountport = get_free_port(udp), get_free_port(udp)
3079641f25SBrad Bishop
3179641f25SBrad Bishop        nenv = dict(os.environ)
3279641f25SBrad Bishop        nenv['PATH'] = "{0}/sbin:{0}/usr/sbin:{0}/usr/bin:".format(unfs_sysroot) + nenv.get('PATH', '')
33517393d9SAndrew Geissler        cmd = Command(["unfsd", "-d", "-p", "-e", exports.name, "-n", str(nfsport), "-m", str(mountport)],
3479641f25SBrad Bishop                bg = True, env = nenv, output_log = logger)
3579641f25SBrad Bishop        cmd.run()
3679641f25SBrad Bishop        yield nfsport, mountport
3779641f25SBrad Bishop    finally:
3879641f25SBrad Bishop        if cmd is not None:
3979641f25SBrad Bishop            cmd.stop()
4079641f25SBrad Bishop        if exports is not None:
4179641f25SBrad Bishop            # clean up exports file
4279641f25SBrad Bishop            os.unlink(exports.name)
4379641f25SBrad Bishop
44