pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client.bash - simple Cygwin frontent for the msnfsv41 NFSv4.1 filesystem driver
Posted by Anonymous on Fri 29th Sep 2023 17:26
raw | new post
view followups (newest first): msnfs41client.bash - simple Cygwin frontent for the msnfsv41 NFSv4.1 filesystem driver by Anonymous
modification of post by Anonymous (view diff)

  1. #!/bin/bash
  2.  
  3. #
  4. # msnfs41client.bash - simple Cygwin frontent for the msnfsv41
  5. # NFSv4.1 filesystem driver
  6. #
  7.  
  8. #
  9. # Written by Roland Mainz <roland.mainz@nrubsig.org>
  10. #
  11.  
  12. #
  13. # Examples:
  14. #
  15. # 1. Mount for current users:
  16. # (requires PsExec from https://download.sysinternals.com/files/PSTools.zip
  17. # in /home/roland_mainz/work/win_pstools/)
  18. # * Usage:
  19. # Shell1: cd /cygdrive/c/Users/roland_mainz/Downloads/ms-nfs41-client-x64/ms-nfs41-client-x64 && bash ../msnfs41client.bash run_deamon
  20. # Shell2: cd /cygdrive/c/Users/roland_mainz/Downloads/ms-nfs41-client-x64/ms-nfs41-client-x64 && bash ../msnfs41client.bash mount_homedir
  21. #
  22. # 2. Mount for all users:
  23. # * Requires:
  24. # - Windows admin rights (Cygwin --> Run terminal as Adminstrator)
  25. # - PsExec from https://download.sysinternals.com/files/PSTools.zip in /home/roland_mainz/work/win_pstools/)
  26. # * Usage:
  27. # Shell1: cd /cygdrive/c/Users/roland_mainz/Downloads/ms-nfs41-client-x64/ms-nfs41-client-x64 && bash ../msnfs41client.bash sys_run_deamon
  28. # Shell2: cd /cygdrive/c/Users/roland_mainz/Downloads/ms-nfs41-client-x64/ms-nfs41-client-x64 && bash ../msnfs41client.bash sys_mount_homedir
  29. #
  30.  
  31. function is_windows_admin_account
  32. {
  33.         #
  34.         # Test whether we have the Windows permissions to install DLLs
  35.         # and the kernel module
  36.         #
  37.         # Usually Windows Adminstrator rights are indicated by the
  38.         # membership in group "544(Administratoren)" (Cygwin maps
  39.         # "SID S-1-5-32-544" to GID 544)
  40.         #
  41.         if [[ "$(id -G)" =~ (^|[[:space:]]+)544([[:space:]]+|$) ]] ; then
  42.                 return 0
  43.         fi
  44.         return 1
  45. }
  46.  
  47. function nfsclient_install
  48. {
  49.         set -o nounset
  50.         set -o xtrace
  51.         set -o errexit
  52.  
  53.         if ! is_windows_admin_account ; then
  54.                 printf $"%s: Install requires Windows Adminstator permissions.\n" "$0"
  55.                 return 1
  56.         fi
  57.  
  58.         # make sure all binaries are executable, Windows cmd does
  59.         # not care, but Cygwin&bash do.
  60.         # If *.ddl are not executable nfs*.exe fail with 0xc0000022
  61.         chmod a+x *.exe *.dll
  62.  
  63.         if false ; then
  64.                 # install.bat needs PATH to include $PWD
  65.                 PATH="$PWD:$PATH" cmd /c install.bat
  66.         else
  67.                 nfs_install
  68.                 rundll32 setupapi.dll,InstallHinfSection DefaultInstall 132 ./nfs41rdr.inf
  69.         fi
  70.  
  71.         mkdir -p /cygdrive/c/etc
  72.         cp etc_netconfig /cygdrive/c/etc/netconfig
  73.         cp ms-nfs41-idmap.conf /cygdrive/c/etc/.
  74.  
  75.         bcdedit /set testsigning on
  76.         regtool -s set '/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Domain' 'GLOBAL.LOC'
  77.  
  78.         sc query Dfsc
  79.         sc stop Dfsc || true
  80.         sc config Dfsc start=disabled
  81.  
  82.         sc query nfs41_driver
  83.         domainname
  84.  
  85.         # check whether the driver really has been installed
  86.         md5sum \
  87.                 "$PWD/nfs41_driver.sys" \
  88.                 '/cygdrive/c/Windows/System32/drivers/nfs41_driver.sys'
  89.  
  90.         return 0
  91. }
  92.  
  93. function nfsclient_rundeamon
  94. {
  95.         set -o xtrace
  96.         set -o nounset
  97.  
  98.         nfsd_debug -d 0 --noldap --gid 1616 --uid 1616
  99.         return $?
  100. }
  101.  
  102. function nfsclient_system_rundeamon
  103. {
  104.         set -o xtrace
  105.         set -o nounset
  106.  
  107.         su_system nfsd_debug -d 0 --noldap --gid 1616 --uid 1616
  108.         return $?
  109. }
  110.  
  111. function nfsclient_mount_homedir
  112. {
  113.         set -o xtrace
  114.         set -o nounset
  115.         set -o errexit
  116.  
  117.         #nfs_mount -p -o sec=sys H 'derfwpc5131:/export/home/rmainz'
  118.         # fixme: Specifying IPv6 addresses do not work yet, as soon as
  119.         # they come as UNC paths (e.g.
  120.         # $ cd '//[fe80::219:99ff:feae:73ce]@2049/nfs4/export/home/rmainz' #
  121.         # they get corrupted once they arrive in nfsd_debug.exe)
  122.         #nfs_mount -p -o sec=sys H '[fe80::219:99ff:feae:73ce]:/export/home/rmainz'
  123.         nfs_mount -p -o sec=sys H 'derfwpc5131_ipv6:/export/home/rmainz'
  124.         mkdir -p '/home/rmainz'
  125.         mount -o bind,posix=1 '/cygdrive/h' '/home/rmainz'
  126.         return $?
  127. }
  128.  
  129. function nfsclient_system_mount_homedir
  130. {
  131.         set -o xtrace
  132.         set -o nounset
  133.         set -o errexit
  134.  
  135.         # purge any leftover persistent mappings to device H:
  136.         su_system net use H: /delete || true
  137.  
  138.         #su_system nfs_mount -p -o sec=sys H 'derfwpc5131:/export/home/rmainz'
  139.         # fixme: Specifying IPv6 addresses do not work yet, as soon as
  140.         # they come as UNC paths (e.g.
  141.         # $ cd '//[fe80::219:99ff:feae:73ce]@2049/nfs4/export/home/rmainz' #
  142.         # they get corrupted once they arrive in nfsd_debug.exe)
  143.         #su_system nfs_mount -p -o sec=sys H '[fe80::219:99ff:feae:73ce]:/export/home/rmainz'
  144.         su_system nfs_mount -p -o sec=sys H 'derfwpc5131_ipv6:/export/home/rmainz'
  145.  
  146.         return $?
  147. }
  148.  
  149. function nfsclient_umount_homedir
  150. {
  151.         set -o xtrace
  152.         set -o nounset
  153.         typeset -i res
  154.  
  155.         nfs_mount -d H
  156.         (( res=$? ))
  157.  
  158.         if (( res == 0 )) ; then
  159.                 # remove bind mount
  160.                 umount '/home/rmainz' && rmdir '/home/rmainz'
  161.         fi
  162.  
  163.         return $res
  164. }
  165.  
  166. function require_cmd
  167. {
  168.         typeset cmd="$1"
  169.  
  170.         if ! which "$cmd" >'/dev/null' 2>&1 ; then
  171.                 printf $"%s: %q not found in %q\n" "$0" "$cmd" "$PWD" 1>&2
  172.                 return 1
  173.         fi
  174.         return 0
  175. }
  176.  
  177. # execute cmd as Windows user "SYSTEM"
  178. function su_system
  179. {
  180.         typeset cmd="$1"
  181.         shift
  182.        
  183.         typeset abspath_cmd="$(which "$cmd")"
  184.         if [[ ! -x "$abspath_cmd" ]] ; then
  185.                 printf "%s: Command %q not found." $"su_system" "$abspath_cmd" 1>&2
  186.                 return 127
  187.         fi
  188.  
  189.         PsExec \
  190.                 -accepteula -nobanner \
  191.                 -s \
  192.                 -w "$(cygpath -w "$PWD")" \
  193.                 "$(cygpath -w "$abspath_cmd")" "$@"
  194. }
  195.  
  196. function sys_terminal
  197. {
  198.         # su_system does not work, mintty requires PsExec -i
  199.         PsExec -accepteula -nobanner \
  200.                 -i \
  201.                 -s -w "$(cygpath -w "$PWD")" \
  202.                 'C:\cygwin64\bin\mintty.exe'
  203. }
  204.  
  205. function main
  206. {
  207.         typeset cmd="$1"
  208.  
  209.         # "$PATH:/usr/bin:/bin" is used for PsExec where $PATH might be empty
  210.         export PATH="$PWD:$PATH:/usr/bin:/bin"
  211.        
  212.         # my own path to pstools
  213.         PATH+=':/home/roland_mainz/work/win_pstools/'
  214.  
  215.         case "$cmd" in
  216.                 'install')
  217.                         nfsclient_install
  218.                         return $?
  219.                         ;;
  220.                 'run_deamon' | 'run_daemon')
  221.                         require_cmd 'nfsd.exe' || return 1
  222.                         require_cmd 'nfsd_debug.exe' || return 1
  223.                         require_cmd 'nfs_mount.exe' || return 1
  224.                         nfsclient_rundeamon
  225.                         return $?
  226.                         ;;
  227.                 'sys_run_deamon' | 'sys_run_daemon')
  228.                         require_cmd 'PsExec.exe' || return 1
  229.                         require_cmd 'nfsd.exe' || return 1
  230.                         require_cmd 'nfsd_debug.exe' || return 1
  231.                         require_cmd 'nfs_mount.exe' || return 1
  232.                         if ! is_windows_admin_account ; then
  233.                                 printf $"%s: %q requires Windows Adminstator permissions.\n" "$0" "$cmd"
  234.                                 return 1
  235.                         fi
  236.                         nfsclient_system_rundeamon
  237.                         return $?
  238.                         ;;
  239.                 'sys_mount_homedir')
  240.                         require_cmd 'nfs_mount.exe' || return 1
  241.                         if ! is_windows_admin_account ; then
  242.                                 printf $"%s: %q requires Windows Adminstator permissions.\n" "$0" "$cmd"
  243.                                 return 1
  244.                         fi
  245.                         nfsclient_system_mount_homedir
  246.                         return $?
  247.                         ;;
  248.                 'mount_homedir')
  249.                         require_cmd 'nfs_mount.exe' || return 1
  250.                         nfsclient_mount_homedir
  251.                         return $?
  252.                         ;;
  253.                 'umount_homedir')
  254.                         require_cmd 'nfs_mount.exe' || return 1
  255.                         nfsclient_umount_homedir
  256.                         return $?
  257.                         ;;
  258.                 # misc
  259.                 'sys_terminal')
  260.                         require_cmd 'mintty.exe' || return 1
  261.                         if ! is_windows_admin_account ; then
  262.                                 printf $"%s: %q requires Windows Adminstator permissions.\n" "$0" "$cmd"
  263.                                 return 1
  264.                         fi
  265.                         sys_terminal
  266.                         return $?
  267.                         ;;
  268.                 *)
  269.                         printf $"%s: Unknown cmd %q\n" "$0" "$cmd" 1>&2
  270.                         return 1
  271.                         ;;
  272.         esac
  273.         return 1
  274. }
  275.  
  276.  
  277. #
  278. # main
  279. #
  280. main "$@"
  281. exit $?
  282.  
  283. # EOF.

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at