1247280Sdteskeif [ ! "$_MEDIA_NFS_SUBR" ]; then _MEDIA_NFS_SUBR=1 2247280Sdteske# 3247280Sdteske# Copyright (c) 2012-2013 Devin Teske 4252980Sdteske# All rights reserved. 5247280Sdteske# 6247280Sdteske# Redistribution and use in source and binary forms, with or without 7247280Sdteske# modification, are permitted provided that the following conditions 8247280Sdteske# are met: 9247280Sdteske# 1. Redistributions of source code must retain the above copyright 10247280Sdteske# notice, this list of conditions and the following disclaimer. 11247280Sdteske# 2. Redistributions in binary form must reproduce the above copyright 12247280Sdteske# notice, this list of conditions and the following disclaimer in the 13247280Sdteske# documentation and/or other materials provided with the distribution. 14247280Sdteske# 15247280Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16252987Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17247280Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18247280Sdteske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19247280Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20252987Sdteske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21247280Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22247280Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23247280Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24247280Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25247280Sdteske# SUCH DAMAGE. 26247280Sdteske# 27247280Sdteske# $FreeBSD: releng/10.3/usr.sbin/bsdconfig/share/media/nfs.subr 266290 2014-05-17 03:28:43Z dteske $ 28247280Sdteske# 29247280Sdteske############################################################ INCLUDES 30247280Sdteske 31247280SdteskeBSDCFG_SHARE="/usr/share/bsdconfig" 32247280Sdteske. $BSDCFG_SHARE/common.subr || exit 1 33247280Sdteskef_dprintf "%s: loading includes..." media/nfs.subr 34247280Sdteskef_include $BSDCFG_SHARE/device.subr 35247280Sdteskef_include $BSDCFG_SHARE/dialog.subr 36247280Sdteskef_include $BSDCFG_SHARE/media/common.subr 37252077Sdteskef_include $BSDCFG_SHARE/media/network.subr 38247280Sdteskef_include $BSDCFG_SHARE/media/tcpip.subr 39252077Sdteskef_include $BSDCFG_SHARE/struct.subr 40252077Sdteskef_include $BSDCFG_SHARE/variable.subr 41247280Sdteske 42247280SdteskeBSDCFG_LIBE="/usr/libexec/bsdconfig" 43247280Sdteskef_include_lang $BSDCFG_LIBE/include/messages.subr 44247280Sdteske 45247280Sdteske############################################################ GLOBALS 46247280Sdteske 47247280SdteskeNFS_MOUNTED= 48247280Sdteske 49247280Sdteske############################################################ FUNCTIONS 50247280Sdteske 51247280Sdteske# f_media_set_nfs 52247280Sdteske# 53247280Sdteske# Return success if we both found and set the media type to be an NFS server. 54247280Sdteske# Variables from variable.subr that can be used to script user input: 55247280Sdteske# 56247280Sdteske# VAR_NFS_PATH 57247280Sdteske# The NFS path specification (host:path) to use when mounting the 58247280Sdteske# remote repository. 59247280Sdteske# VAR_NAMESERVER [Optional] 60247280Sdteske# Automatically populated from resolv.conf(5) but can be 61247280Sdteske# overridden. If set, the host portion of VAR_NFS_PATH is 62247280Sdteske# looked up using f_host_lookup() from `tcpip.subr'. 63247280Sdteske# 64247280Sdteske# Meanwhile, the following variables from variable.subr are set after 65247280Sdteske# successful execution: 66247280Sdteske# 67247280Sdteske# VAR_NFS_HOST 68247280Sdteske# The host portion of the NFS path specification, parsed from 69247280Sdteske# VAR_NFS_PATH. 70247280Sdteske# 71247280Sdteskef_media_set_nfs() 72247280Sdteske{ 73247280Sdteske local nfs 74247280Sdteske 75247280Sdteske f_media_close 76247280Sdteske 77247280Sdteske f_variable_get_value $VAR_NFS_PATH \ 78247280Sdteske "$msg_please_enter_the_full_nfs_file_specification" 79247280Sdteske f_getvar $VAR_NFS_PATH nfs 80247280Sdteske [ "$nfs" ] || return $FAILURE 81247280Sdteske 82247280Sdteske case "$nfs" in 83247280Sdteske *:*) : valid NFS path ;; 84247280Sdteske *) 85252795Sdteske f_show_msg "$msg_invalid_nfs_path_specification" 86247280Sdteske return $FAILURE 87247280Sdteske esac 88247280Sdteske 89247280Sdteske f_struct_new DEVICE device_nfs 90247280Sdteske device_nfs set name "$nfs" 91247280Sdteske 92247280Sdteske if ! f_struct device_network || 93247280Sdteske ! f_dialog_yesno "$msg_youve_already_done_the_network_configuration" 94247280Sdteske then 95247280Sdteske f_struct device_network && 96266290Sdteske f_device_shutdown device_network 97247280Sdteske f_device_select_tcp || return $FAILURE 98266290Sdteske local dev if 99266290Sdteske f_getvar $VAR_NETWORK_DEVICE if 100266290Sdteske f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev 101266290Sdteske f_struct_copy "$dev" device_network 102247280Sdteske fi 103266290Sdteske f_device_init device_network || 104247280Sdteske f_dprintf "%s: $msg_net_device_init_failed\n" f_media_set_nfs 105247280Sdteske 106247280Sdteske local hostname="${nfs%%:*}" 107251268Sdteske if f_isset $VAR_NAMESERVER && ! { 108251268Sdteske f_validate_ipaddr "$hostname" || f_validate_ipaddr6 "$hostname" 109247280Sdteske }; then 110247280Sdteske f_show_info "$msg_looking_up_host" "$hostname" 111247280Sdteske f_dprintf "%s Looking up hostname, %s, using host(1)" \ 112247280Sdteske "f_media_set_nfs" "$hostname" 113247280Sdteske if ! f_quietly f_host_lookup "$hostname"; then 114247280Sdteske f_show_msg "$msg_cannot_resolve_hostname" "$hostname" 115247280Sdteske f_struct device_network && 116266290Sdteske f_device_shutdown device_network 117247280Sdteske f_struct_free device_network 118247280Sdteske unset $VAR_NFS_PATH 119247280Sdteske return $FAILURE 120247280Sdteske fi 121247280Sdteske f_dprintf "Found DNS entry for %s successfully." "$hostname" 122247280Sdteske fi 123247280Sdteske 124247280Sdteske setvar $VAR_NFS_HOST "$hostname" 125247280Sdteske 126247280Sdteske device_nfs set type $DEVICE_TYPE_NFS 127247280Sdteske device_nfs set init f_media_init_nfs 128247280Sdteske device_nfs set get f_media_get_nfs 129247280Sdteske device_nfs set shutdown f_media_shutdown_nfs 130247280Sdteske device_nfs set private device_network # in name only (deref'd later) 131247280Sdteske 132247280Sdteske f_struct_copy device_nfs device_media 133247280Sdteske f_struct_free device_nfs 134247280Sdteske 135247280Sdteske return $SUCCESS 136247280Sdteske} 137247280Sdteske 138247280Sdteske# f_media_init_nfs $device 139247280Sdteske# 140247280Sdteske# Initializes the NFS media device. Returns success if able to mount the NFS 141247280Sdteske# device using mount_nfs(1). 142247280Sdteske# 143247280Sdteske# The variables (from variable.subr) used to initialize the NFS mount are as 144247280Sdteske# follows (all of which are configured manually/optionally from the options 145247280Sdteske# menu): 146247280Sdteske# 147247280Sdteske# VAR_NFS_TCP [Optional] 148247280Sdteske# If non-NULL, adds the "tcp" option via `-o' to mount_nfs(8). 149247280Sdteske# VAR_NFS_V3 [Optional] 150247280Sdteske# If non-NULL, adds the "nfsv3" option via `-o' to mount_nfs(8). 151247280Sdteske# VAR_NFS_SECURE [Optional] 152247280Sdteske# If non-NULL, adds the "-P" flag to mount_nfs(8). 153247280Sdteske# VAR_SLOW_ETHER [Optional] 154247280Sdteske# If non-NULL, adjusts the read/write size to avoid timeouts. 155247280Sdteske# 156247280Sdteskef_media_init_nfs() 157247280Sdteske{ 158260678Sdteske local funcname=f_media_init_nfs 159247280Sdteske local dev="$1" name err 160247280Sdteske 161266290Sdteske $dev get name name || return $FAILURE 162247280Sdteske f_dprintf "Init routine called for NFS device. name=[%s]" \ 163247280Sdteske "$name" 164247280Sdteske 165247280Sdteske if [ "$NFS_MOUNTED" ]; then 166247280Sdteske f_dprintf "NFS device already mounted." 167247280Sdteske return $SUCCESS 168247280Sdteske fi 169247280Sdteske 170266290Sdteske if ! f_device_init device_network; then 171247280Sdteske f_dprintf "f_media_init_nfs: %s" "$msg_net_device_init_failed" 172247280Sdteske return $FAILURE 173247280Sdteske fi 174247280Sdteske 175260678Sdteske if [ ! -e "$MOUNTPOINT" ]; then 176260678Sdteske f_eval_catch $funcname mkdir 'mkdir -p "%s"' "$MOUNTPOINT" || 177260678Sdteske return $FAILURE 178247280Sdteske fi 179247280Sdteske 180247280Sdteske local cp tcp="" use3="" secure="" readsize=4096 writesize=4096 181247280Sdteske f_getvar $VAR_NFS_TCP cp 182247280Sdteske [ "$cp" = "YES" ] && tcp=1 183247280Sdteske f_getvar $VAR_NFS_V3 cp 184247280Sdteske [ "$cp" = "YES" ] && use3=1 185247280Sdteske f_getvar $VAR_NFS_SECURE cp 186247280Sdteske [ "$cp" = "YES" ] && secure=1 187247280Sdteske f_getvar $VAR_SLOW_ETHER cp 188247280Sdteske [ "$cp" = "YES" ] && readsize=1024 writesize=1024 189247280Sdteske 190247280Sdteske local options="rsize=$readsize,wsize=$writesize" 191247280Sdteske [ "$use3" ] && options="$options,nfsv3" 192247280Sdteske [ "$tcp" ] && options="$options,tcp" 193247280Sdteske 194260678Sdteske if ! f_eval_catch -dk err $funcname mount_nfs \ 195260678Sdteske 'mount_nfs %s -o "%s" "%s" "%s"' \ 196260678Sdteske "${secure:+-P}" "$options" "$name" "$MOUNTPOINT" 197247280Sdteske then 198247280Sdteske err="${err#mount_nfs: }" 199247280Sdteske f_show_msg "$msg_error_mounting_device" \ 200247280Sdteske "$name" "$MOUNTPOINT" "$err" 201247280Sdteske f_struct device_network && 202266290Sdteske f_device_shutdown device_network 203247280Sdteske return $FAILURE 204247280Sdteske fi 205247280Sdteske NFS_MOUNTED=1 206247280Sdteske 207247280Sdteske f_dprintf "Mounted NFS device %s onto %s" "$name" "$MOUNTPOINT" 208247280Sdteske 209247280Sdteske return $SUCCESS 210247280Sdteske} 211247280Sdteske 212253333Sdteske# f_media_get_nfs $device $file [$probe_type] 213247280Sdteske# 214252721Sdteske# Returns data from $file on a mounted NFS device. Similar to cat(1). If 215253333Sdteske# $probe_type is present and non-NULL, returns success if $file exists. If 216253333Sdteske# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to 217253333Sdteske# standard-out. 218247280Sdteske# 219247280Sdteskef_media_get_nfs() 220247280Sdteske{ 221253333Sdteske local dev="$1" file="$2" probe_type="$3" 222266290Sdteske local name 223247280Sdteske 224266290Sdteske $dev get name name 225253333Sdteske f_dprintf "f_media_get_nfs: dev=[%s] file=[%s] probe_type=%s" \ 226266290Sdteske "$name" "$file" "$probe_type" 227247280Sdteske 228253333Sdteske f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" 229247280Sdteske} 230247280Sdteske 231247280Sdteske# f_media_shutdown_nfs $device 232247280Sdteske# 233247280Sdteske# Shuts down the NFS device using umount(8). Return status should be ignored. 234247280Sdteske# 235247280Sdteskef_media_shutdown_nfs() 236247280Sdteske{ 237260678Sdteske local funcname=f_media_shutdown_nfs 238247280Sdteske local dev="$1" err 239247280Sdteske 240256181Sdteske [ "$NFS_MOUNTED" ] || return $FAILURE 241247280Sdteske 242247280Sdteske f_dprintf "Unmounting NFS partition on %s" "$MOUNTPOINT" 243260678Sdteske if ! f_eval_catch -dk err $funcname umount \ 244260678Sdteske 'umount -f "%s"' "$MOUNTPOINT" 245260678Sdteske then 246247280Sdteske err="${err#umount: }"; err="${err#*: }" 247247280Sdteske f_show_msg "$msg_could_not_unmount_the_nfs_partition" \ 248247280Sdteske "$MOUNTPOINT" "$err" 249247280Sdteske else 250247280Sdteske NFS_MOUNTED= 251247280Sdteske fi 252247280Sdteske} 253247280Sdteske 254247280Sdteske############################################################ MAIN 255247280Sdteske 256247280Sdteskef_dprintf "%s: Successfully loaded." media/nfs.subr 257247280Sdteske 258247280Sdteskefi # ! $_MEDIA_NFS_SUBR 259