1*b3a49969Shannken# $NetBSD: t_rquotad.sh,v 1.10 2023/05/28 08:17:00 hannken Exp $ 2fa4ca53dSbouyer# 3fa4ca53dSbouyer# Copyright (c) 2011 Manuel Bouyer 4fa4ca53dSbouyer# All rights reserved. 5fa4ca53dSbouyer# 6fa4ca53dSbouyer# Redistribution and use in source and binary forms, with or without 7fa4ca53dSbouyer# modification, are permitted provided that the following conditions 8fa4ca53dSbouyer# are met: 9fa4ca53dSbouyer# 1. Redistributions of source code must retain the above copyright 10fa4ca53dSbouyer# notice, this list of conditions and the following disclaimer. 11fa4ca53dSbouyer# 2. Redistributions in binary form must reproduce the above copyright 12fa4ca53dSbouyer# notice, this list of conditions and the following disclaimer in the 13fa4ca53dSbouyer# documentation and/or other materials provided with the distribution. 14fa4ca53dSbouyer# 15fa4ca53dSbouyer# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16fa4ca53dSbouyer# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17fa4ca53dSbouyer# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18fa4ca53dSbouyer# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19fa4ca53dSbouyer# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20fa4ca53dSbouyer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21fa4ca53dSbouyer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22fa4ca53dSbouyer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23fa4ca53dSbouyer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24fa4ca53dSbouyer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25fa4ca53dSbouyer# POSSIBILITY OF SUCH DAMAGE. 26fa4ca53dSbouyer# 27b134f0a3Sgson 28b134f0a3Sgson# Like test_case_root() in ../ffs/ffs_common.sh, plus cleanup of both 29b134f0a3Sgson# rump servers. 30b134f0a3Sgson 31b134f0a3Sgsontest_case_rquotad() 32b134f0a3Sgson{ 33b134f0a3Sgson local name="${1}"; shift 34b134f0a3Sgson local check_function="${1}"; shift 35b134f0a3Sgson local descr="${1}"; shift 36b134f0a3Sgson 37b134f0a3Sgson atf_test_case "${name}" cleanup 38b134f0a3Sgson 39b134f0a3Sgson eval "${name}_head() { \ 40b134f0a3Sgson atf_set "descr" "${descr}" 41b134f0a3Sgson atf_set "require.user" "root" 42b134f0a3Sgson atf_set "timeout" "360" 43b134f0a3Sgson }" 44b134f0a3Sgson eval "${name}_body() { \ 45b134f0a3Sgson RUMP_SOCKETS_LIST=\${RUMP_SOCKET}; \ 46b134f0a3Sgson export RUMP_SERVER=unix://\${RUMP_SOCKET}; \ 47b134f0a3Sgson ${check_function} " "${@}" "; \ 48b134f0a3Sgson }" 49b134f0a3Sgson # Can't use RUMP_SOCKETS_LIST here because it is not set in 50b134f0a3Sgson # the cleanup shell. 51b134f0a3Sgson eval "${name}_cleanup() { \ 52b134f0a3Sgson for s in \${RUMP_SOCKET} clientsock; do \ 53b134f0a3Sgson RUMP_SERVER=unix://\${s} rump.halt 2>/dev/null || true; \ 54b134f0a3Sgson done; \ 55b134f0a3Sgson }" 56b134f0a3Sgson tests="${tests} ${name}" 57b134f0a3Sgson} 58b134f0a3Sgson 59fa4ca53dSbouyerfor e in le be; do 60fa4ca53dSbouyer for v in 1; do 61fa4ca53dSbouyer for q in "user" "group" "both"; do 62b134f0a3Sgson test_case_rquotad get_nfs_${e}_${v}_${q} get_nfs_quota \ 63fa4ca53dSbouyer "get NFS quota with ${q} enabled" ${e} ${v} ${q} 64fa4ca53dSbouyer done 65fa4ca53dSbouyer done 66fa4ca53dSbouyerdone 67fa4ca53dSbouyer 68fa4ca53dSbouyerget_nfs_quota() 69fa4ca53dSbouyer{ 705ba1d99fSbouyer create_ffs $* 71fa4ca53dSbouyer local q=$3 72fa4ca53dSbouyer local expect 73fa4ca53dSbouyer 74fa4ca53dSbouyer case ${q} in 75fa4ca53dSbouyer user) 76fa4ca53dSbouyer expect=u 77fa4ca53dSbouyer ;; 78fa4ca53dSbouyer group) 79fa4ca53dSbouyer expect=g 80fa4ca53dSbouyer ;; 81fa4ca53dSbouyer both) 82fa4ca53dSbouyer expect="u g" 83fa4ca53dSbouyer ;; 84fa4ca53dSbouyer *) 85fa4ca53dSbouyer atf_fail "wrong quota type" 86fa4ca53dSbouyer ;; 87fa4ca53dSbouyer esac 88fa4ca53dSbouyer 89659e7a3cSmsaitoh#start a nfs server 90fa4ca53dSbouyer 91fa4ca53dSbouyer atf_check -s exit:0 rump_server -lrumpvfs -lrumpdev -lrumpnet \ 92d34c9aa5Sgson -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6 \ 93d34c9aa5Sgson -lrumpnet_local -lrumpnet_shmif -lrumpdev_disk -lrumpfs_ffs \ 94d34c9aa5Sgson -lrumpfs_nfs -lrumpfs_nfsserver \ 95fa4ca53dSbouyer -d key=/dk,hostpath=${IMG},size=host ${RUMP_SERVER} 96fa4ca53dSbouyer 97fa4ca53dSbouyer atf_check -s exit:0 rump.ifconfig shmif0 create 98fa4ca53dSbouyer atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus 99fa4ca53dSbouyer atf_check -s exit:0 rump.ifconfig shmif0 inet 10.1.1.1 100fa4ca53dSbouyer 101fa4ca53dSbouyer export RUMPHIJACK_RETRYCONNECT=die 102fa4ca53dSbouyer export LD_PRELOAD=/usr/lib/librumphijack.so 103fa4ca53dSbouyer 104fa4ca53dSbouyer atf_check -s exit:0 mkdir /rump/etc 105fa4ca53dSbouyer atf_check -s exit:0 mkdir /rump/export 106fa4ca53dSbouyer atf_check -s exit:0 mkdir -p /rump/var/run 107fa4ca53dSbouyer atf_check -s exit:0 mkdir -p /rump/var/db 108fa4ca53dSbouyer atf_check -s exit:0 touch /rump/var/db/mountdtab 109fa4ca53dSbouyer 110fa4ca53dSbouyer /bin/echo "/export -noresvport -noresvmnt 10.1.1.100" | \ 111fa4ca53dSbouyer dd of=/rump/etc/exports 2> /dev/null 112fa4ca53dSbouyer 113*b3a49969Shannken atf_check -s exit:0 -e ignore env RUMPHIJACK='path=/rump,blanket=/dk' \ 114*b3a49969Shannken mount_ffs /dk /rump/export 115fa4ca53dSbouyer 116fa4ca53dSbouyer#set a quota limit (and check that we can read it back) 117fa4ca53dSbouyer for q in ${expect} ; do 118fa4ca53dSbouyer local id=$(id -${q}) 119fa4ca53dSbouyer atf_check -s exit:0 \ 120fa4ca53dSbouyer env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/export edquota -$q -s10k/20 -h40M/50k \ 121fa4ca53dSbouyer -t 2W/3D ${id} 122fa4ca53dSbouyer atf_check -s exit:0 \ 123fa4ca53dSbouyer-o "match:0 10 40960 2weeks 1 20 51200 3days" \ 124fa4ca53dSbouyer-o "match:Disk quotas for .*: $" \ 125fa4ca53dSbouyer env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/export quota -${q} -v 126fa4ca53dSbouyer done 127fa4ca53dSbouyer 128fa4ca53dSbouyer # start rpcbind. we want /var/run/rpcbind.sock 129fa4ca53dSbouyer export RUMPHIJACK='blanket=/var/run,socket=all' 130fa4ca53dSbouyer atf_check -s exit:0 rpcbind 131fa4ca53dSbouyer 132fa4ca53dSbouyer # ok, then we want mountd in the similar fashion 133fa4ca53dSbouyer export RUMPHIJACK='blanket=/var/run:/var/db:/export,socket=all,path=/rump,vfs=all' 134fa4ca53dSbouyer atf_check -s exit:0 mountd /rump/etc/exports 135fa4ca53dSbouyer 136fa4ca53dSbouyer # and nfs 137fa4ca53dSbouyer export RUMPHIJACK='blanket=/var/run,socket=all,vfs=all' 1384d0da3bbSpgoyette atf_check -s exit:0 nfsd 139fa4ca53dSbouyer 140fa4ca53dSbouyer #finally, rpc.rquotad 141fa4ca53dSbouyer export RUMPHIJACK='blanket=/var/run:/export,vfs=getvfsstat,socket=all' 142fa4ca53dSbouyer atf_check -s exit:0 /usr/libexec/rpc.rquotad 143fa4ca53dSbouyer 144fa4ca53dSbouyer # now start a client server 145fa4ca53dSbouyer export RUMP_SERVER=unix://clientsock 146fa4ca53dSbouyer RUMP_SOCKETS_LIST="${RUMP_SOCKETS_LIST} clientsock" 147fa4ca53dSbouyer unset RUMPHIJACK 148fa4ca53dSbouyer unset LD_PRELOAD 149fa4ca53dSbouyer 15048e354a3Sbad atf_check -s exit:0 rump_server -lrumpvfs -lrumpnet \ 151fa4ca53dSbouyer -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpfs_nfs\ 152fa4ca53dSbouyer ${RUMP_SERVER} 153fa4ca53dSbouyer 154fa4ca53dSbouyer atf_check -s exit:0 rump.ifconfig shmif0 create 155fa4ca53dSbouyer atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus 156fa4ca53dSbouyer atf_check -s exit:0 rump.ifconfig shmif0 inet 10.1.1.100 157fa4ca53dSbouyer 158fa4ca53dSbouyer export LD_PRELOAD=/usr/lib/librumphijack.so 159fa4ca53dSbouyer 160fa4ca53dSbouyer atf_check -s exit:0 mkdir /rump/mnt 161fa4ca53dSbouyer atf_check -s exit:0 mount_nfs 10.1.1.1:/export /rump/mnt 162fa4ca53dSbouyer 163fa4ca53dSbouyer #now try a quota(8) call 164fa4ca53dSbouyer export RUMPHIJACK='blanket=/mnt,socket=all,path=/rump,vfs=getvfsstat' 165fa4ca53dSbouyer for q in ${expect} ; do 166fa4ca53dSbouyer local id=$(id -${q}) 167fa4ca53dSbouyer atf_check -s exit:0 \ 168fa4ca53dSbouyer-o "match:/mnt 0 10 40960 1 20 51200 " \ 169fa4ca53dSbouyer-o "match:Disk quotas for .*: $" \ 170fa4ca53dSbouyer quota -${q} -v 171fa4ca53dSbouyer done 172fa4ca53dSbouyer 173fa4ca53dSbouyer unset LD_PRELOAD 1745ba1d99fSbouyer rump_quota_shutdown 175fa4ca53dSbouyer} 176