nfs.subr revision 253333
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: head/usr.sbin/bsdconfig/share/media/nfs.subr 253333 2013-07-14 03:08:52Z 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 && 96247280Sdteske f_device_shutdown network 97247280Sdteske f_device_select_tcp || return $FAILURE 98247280Sdteske local dev 99247280Sdteske f_getvar $VAR_NETWORK_DEVICE dev 100247280Sdteske f_struct_copy "device_$dev" device_network 101247280Sdteske fi 102247280Sdteske f_device_init network || 103247280Sdteske f_dprintf "%s: $msg_net_device_init_failed\n" f_media_set_nfs 104247280Sdteske 105247280Sdteske local hostname="${nfs%%:*}" 106251268Sdteske if f_isset $VAR_NAMESERVER && ! { 107251268Sdteske f_validate_ipaddr "$hostname" || f_validate_ipaddr6 "$hostname" 108247280Sdteske }; then 109247280Sdteske f_show_info "$msg_looking_up_host" "$hostname" 110247280Sdteske f_dprintf "%s Looking up hostname, %s, using host(1)" \ 111247280Sdteske "f_media_set_nfs" "$hostname" 112247280Sdteske if ! f_quietly f_host_lookup "$hostname"; then 113247280Sdteske f_show_msg "$msg_cannot_resolve_hostname" "$hostname" 114247280Sdteske f_struct device_network && 115247280Sdteske f_device_shutdown network 116247280Sdteske f_struct_free device_network 117247280Sdteske unset $VAR_NFS_PATH 118247280Sdteske return $FAILURE 119247280Sdteske fi 120247280Sdteske f_dprintf "Found DNS entry for %s successfully." "$hostname" 121247280Sdteske fi 122247280Sdteske 123247280Sdteske setvar $VAR_NFS_HOST "$hostname" 124247280Sdteske 125247280Sdteske device_nfs set type $DEVICE_TYPE_NFS 126247280Sdteske device_nfs set init f_media_init_nfs 127247280Sdteske device_nfs set get f_media_get_nfs 128247280Sdteske device_nfs set shutdown f_media_shutdown_nfs 129247280Sdteske device_nfs set private device_network # in name only (deref'd later) 130247280Sdteske 131247280Sdteske f_struct_copy device_nfs device_media 132247280Sdteske f_struct_free device_nfs 133247280Sdteske 134247280Sdteske return $SUCCESS 135247280Sdteske} 136247280Sdteske 137247280Sdteske# f_media_init_nfs $device 138247280Sdteske# 139247280Sdteske# Initializes the NFS media device. Returns success if able to mount the NFS 140247280Sdteske# device using mount_nfs(1). 141247280Sdteske# 142247280Sdteske# The variables (from variable.subr) used to initialize the NFS mount are as 143247280Sdteske# follows (all of which are configured manually/optionally from the options 144247280Sdteske# menu): 145247280Sdteske# 146247280Sdteske# VAR_NFS_TCP [Optional] 147247280Sdteske# If non-NULL, adds the "tcp" option via `-o' to mount_nfs(8). 148247280Sdteske# VAR_NFS_V3 [Optional] 149247280Sdteske# If non-NULL, adds the "nfsv3" option via `-o' to mount_nfs(8). 150247280Sdteske# VAR_NFS_SECURE [Optional] 151247280Sdteske# If non-NULL, adds the "-P" flag to mount_nfs(8). 152247280Sdteske# VAR_SLOW_ETHER [Optional] 153247280Sdteske# If non-NULL, adjusts the read/write size to avoid timeouts. 154247280Sdteske# 155247280Sdteskef_media_init_nfs() 156247280Sdteske{ 157247280Sdteske local dev="$1" name err 158247280Sdteske 159247280Sdteske device_$dev get name name || return $FAILURE 160247280Sdteske f_dprintf "Init routine called for NFS device. name=[%s]" \ 161247280Sdteske "$name" 162247280Sdteske 163247280Sdteske if [ "$NFS_MOUNTED" ]; then 164247280Sdteske f_dprintf "NFS device already mounted." 165247280Sdteske return $SUCCESS 166247280Sdteske fi 167247280Sdteske 168247280Sdteske if ! f_device_init network; then 169247280Sdteske f_dprintf "f_media_init_nfs: %s" "$msg_net_device_init_failed" 170247280Sdteske return $FAILURE 171247280Sdteske fi 172247280Sdteske 173247280Sdteske if [ ! -e "$MOUNTPOINT" ] && 174247280Sdteske ! err=$( mkdir -p "$MOUNTPOINT" 2>&1 ) 175247280Sdteske then 176247280Sdteske f_dialog_msgbox "$err" 177247280Sdteske 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 194247280Sdteske if ! err=$( mount_nfs \ 195247280Sdteske ${secure:+-P} -o "$options" "$name" "$MOUNTPOINT" 2>&1 ) 196247280Sdteske then 197247280Sdteske err="${err#mount_nfs: }" 198247280Sdteske f_show_msg "$msg_error_mounting_device" \ 199247280Sdteske "$name" "$MOUNTPOINT" "$err" 200247280Sdteske f_struct device_network && 201247280Sdteske f_device_shutdown network 202247280Sdteske return $FAILURE 203247280Sdteske fi 204247280Sdteske NFS_MOUNTED=1 205247280Sdteske 206247280Sdteske f_dprintf "Mounted NFS device %s onto %s" "$name" "$MOUNTPOINT" 207247280Sdteske 208247280Sdteske return $SUCCESS 209247280Sdteske} 210247280Sdteske 211253333Sdteske# f_media_get_nfs $device $file [$probe_type] 212247280Sdteske# 213252721Sdteske# Returns data from $file on a mounted NFS device. Similar to cat(1). If 214253333Sdteske# $probe_type is present and non-NULL, returns success if $file exists. If 215253333Sdteske# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to 216253333Sdteske# standard-out. 217247280Sdteske# 218247280Sdteskef_media_get_nfs() 219247280Sdteske{ 220253333Sdteske local dev="$1" file="$2" probe_type="$3" 221247280Sdteske 222253333Sdteske f_dprintf "f_media_get_nfs: dev=[%s] file=[%s] probe_type=%s" \ 223253333Sdteske "$dev" "$file" "$probe_type" 224247280Sdteske 225253333Sdteske f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" 226247280Sdteske} 227247280Sdteske 228247280Sdteske# f_media_shutdown_nfs $device 229247280Sdteske# 230247280Sdteske# Shuts down the NFS device using umount(8). Return status should be ignored. 231247280Sdteske# 232247280Sdteskef_media_shutdown_nfs() 233247280Sdteske{ 234247280Sdteske local dev="$1" err 235247280Sdteske 236247280Sdteske [ "$NFS_MOUNTED" ] || return 237247280Sdteske 238247280Sdteske f_dprintf "Unmounting NFS partition on %s" "$MOUNTPOINT" 239247280Sdteske if ! err=$( umount -f "$MOUNTPOINT" 2>&1 ); then 240247280Sdteske err="${err#umount: }"; err="${err#*: }" 241247280Sdteske f_show_msg "$msg_could_not_unmount_the_nfs_partition" \ 242247280Sdteske "$MOUNTPOINT" "$err" 243247280Sdteske else 244247280Sdteske NFS_MOUNTED= 245247280Sdteske fi 246247280Sdteske} 247247280Sdteske 248247280Sdteske############################################################ MAIN 249247280Sdteske 250247280Sdteskef_dprintf "%s: Successfully loaded." media/nfs.subr 251247280Sdteske 252247280Sdteskefi # ! $_MEDIA_NFS_SUBR 253