nfs.py 1.4 KB

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