summaryrefslogtreecommitdiffstats
path: root/source3/script/tests/test_dfree_quota.sh
blob: 91510165029d309195b5c3a2ca420f6ef549781c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
#!/bin/sh
#
# Blackbox test for disk-free, quota, and their interaction
#

if [ $# -lt 6 ]; then
	cat <<EOF
Usage: test_dfree_quota.sh SERVER DOMAIN USERNAME PASSWORD LOCAL_PATH SMBCLIENT SMBCQUOTAS SMBCACLS
EOF
	exit 1
fi

SERVER=$1
DOMAIN=$2
USERNAME=$3
PASSWORD=$4
ENVDIR=$(dirname $5)
WORKDIR=$5/dfree
smbclient=$6
smbcquotas=$7
smbcacls=$8
protocol=$9
shift 9
failed=0

CONFFILE=$ENVDIR/lib/dfq.conf

incdir=$(dirname $0)/../../../testprogs/blackbox
. $incdir/subunit.sh

sighup_smbd()
{
	kill -HUP -$(cat $ENVDIR/pid/smbd.pid)
}

conf_lines()
{
	local uid
	local gid
	uid=$(id -u $USERNAME)
	gid=$(id -g $USERNAME)
	uid1=$(id -u user1)
	uid2=$(id -u user2)
	cat <<ABC
conf1:df:block size = 512:disk free = 10:disk size = 20
conf2:df:block size = 1024:disk free = 10:disk size = 20
conf3:df:block size = 4096:disk free = 750:disk size = 281474976710656
confq1:u$uid:block size = 4096:hard limit = 750:soft limit = 1000:cur blocks = 10
confdfq1:df:block size = 4096:disk free = 10:disk size = 20
confdfq1:u$uid:block size = 4096:hard limit = 750:soft limit = 1000:cur blocks = 10
confdfq2:df:block size = 4096:disk free = 10:disk size = 20
confdfq2:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
confdfq3:df:block size = 4096:disk free = 10:disk size = 80
confdfq3:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 0
confdfq4:df:block size = 4096:disk free = 10:disk size = 80
confdfq4:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
slimit:df:block size = 4096:disk free = 10:disk size = 80
slimit:u$uid:block size = 4096:hard limit = 44:soft limit = 40:cur blocks = 42
hlimit:df:block size = 4096:disk free = 10:disk size = 80
hlimit:u$uid:block size = 4096:hard limit = 44:soft limit = 0:cur blocks = 45
islimit:df:block size = 4096:disk free = 10:disk size = 80
islimit:u$uid:block size = 4096:hard limit = 44:soft limit = 40:cur blocks = 37:inode soft limit = 30:inode hard limit = 35:cur inodes = 32
ihlimit:df:block size = 4096:disk free = 10:disk size = 80
ihlimit:u$uid:block size = 4096:hard limit = 44:soft limit = 40:cur blocks = 37:inode soft limit = 0:inode hard limit = 35:cur inodes = 36
trygrp1:df:block size = 4096:disk free = 10:disk size = 80
trygrp1:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 41:err = 1
trygrp1:g$gid:block size = 4096:hard limit = 60:soft limit = 60:cur blocks = 55
trygrp2:df:block size = 4096:disk free = 10:disk size = 80
trygrp2:u$uid:block size = 4096:hard limit = 0:soft limit = 0:cur blocks = 41
trygrp2:g$gid:block size = 4096:hard limit = 60:soft limit = 60:cur blocks = 56
blksize:df:block size = 512:disk free = 614400:disk size = 614400
blksize:u$uid:block size = 1024:hard limit = 512000:soft limit = 0:cur blocks = 0
notenforce:df:block size = 4096:disk free = 10:disk size = 80
notenforce:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
notenforce:udflt:block size = 4096:qflags = 0
nfs:df:block size = 4096:disk free = 10:disk size = 80
nfs:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
nfs:udflt:nosys = 1
confdfqp:df:block size = 4096:disk free = 10:disk size = 80
confdfqp:u$uid1:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 36
confdfqp:u$uid2:block size = 4096:hard limit = 41:soft limit = 41:cur blocks = 36
sgid:stat:sgid = 98765
sgid:u$uid:block size = 4096:hard limit = 0:soft limit = 0:cur blocks = 80
sgid:g98765:block size = 4096:hard limit = 50:soft limit = 50:cur blocks = 40
ABC
}

setup_1_conf()
{
	conf_name="$1"
	subdir="$2"
	absdir=$(readlink -f $WORKDIR/$subdir)
	conf_lines | sed -rn "s/^$conf_name:(.*)/\1/p" | tr ":" "\n" |
		awk -F '=' -v atdir=$absdir 'NF==1 {section=$1} NF==2 {sub(/\s*$/, "", $1); printf "\tfake_dfq:%s/%s/%s =%s\n", section, $1, atdir, $2}'
}

setup_conf()
{
	rm $CONFFILE
	touch $CONFFILE

	until [ -z "$1" ]; do
		setup_1_conf $1 $2 >>$CONFFILE
		shift
		shift
	done
	sighup_smbd
	#let it load...
	sleep .5
}

test_smbclient_dfree()
{
	name="$1"
	share="$2"
	dir="$3"
	confs="$4"
	expected="$5"
	shift
	shift
	shift
	shift
	subunit_start_test "$name"
	setup_conf $confs
	output=$($VALGRIND $smbclient //$SERVER/$share -c "cd $dir; l" "$@" 2>&1)
	status=$?
	if [ "$status" = "0" ]; then
		received=$(echo "$output" | awk '/blocks of size/ {print $1, $5, $6}')
		if [ "$expected" = "$received" ]; then
			subunit_pass_test "$name"
			return 0
		else
			echo "$output" | subunit_fail_test "$name"
			return 1
		fi
	else
		echo "$output" | subunit_fail_test "$name"
		return $status
	fi
}

# Issue two queries to different directories in one session to test
# caching effects
test_smbclient_dfree_2()
{
	name="$1"
	share="$2"
	dir1="$3"
	dir2="$4"
	confs="$5"
	expected="$6"
	subunit_start_test "$name"
	setup_conf $confs
	output=$($VALGRIND $smbclient //$SERVER/$share \
		-c "cd $dir1; du; cd ..; cd $dir2 ; du" "$@" 2>&1)
	status=$?
	if [ "$status" = "0" ]; then
		received=$(echo "$output" |
			awk '/blocks of size/ {print $1, $5, $6}' |
			tr '\n' ' ')
		if [ "$expected" = "$received" ]; then
			subunit_pass_test "$name"
			return 0
		else
			echo "$output" | subunit_fail_test "$name"
			return 1
		fi
	else
		echo "$output" | subunit_fail_test "$name"
		return $status
	fi
}

test_smbcquotas()
{
	name="$1"
	conf="$2"
	user="$3"
	expected="$4"
	proto="$5"
	shift
	shift
	shift
	shift
	shift
	subunit_start_test "$name"
	setup_conf "$conf" "."
	if [ "$proto" = "smb2" ]; then
		mproto="-m SMB2"
	else
		mproto="-m SMB1"
	fi

	output=$($VALGRIND $smbcquotas $mproto //$SERVER/dfq "$@" 2>/dev/null | tr '\\' '/')
	status=$?
	if [ "$status" = "0" ]; then
		received=$(echo "$output" | awk "/$SERVER\\/$user/ {printf \"%s%s%s\", \$3, \$4, \$5}")
		if [ "$expected" = "$received" ]; then
			subunit_pass_test "$name"
			return 0
		else
			echo "$output" | subunit_fail_test "$name"
			return 1
		fi
	else
		echo "$output" | subunit_fail_test "$name"
		return $status
	fi
}

if [ $protocol != "SMB3" ] && [ $protocol != "NT1" ]; then
	echo "unsupported protocol $protocol" | subunit_fail_test "Test dfree quota"
	failed=$(expr $failed + 1)
fi

if [ $protocol = "NT1" ]; then
	setup_conf
	#basic quota test (SMB1 only)
	test_smbcquotas "Test user quota" confq1 $USERNAME "40960/4096000/3072000" "smb1" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=NT1 || failed=$(expr $failed + 1)
	exit $failed
fi

#basic disk-free tests
test_smbclient_dfree "Test dfree share root SMB3 no quota" dfq "." "conf1 ." "10 1024. 5" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test dfree subdir SMB3 no quota" dfq "subdir1" "conf1 . conf2 subdir1" "20 1024. 10" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test large disk" dfq "." "conf3 ." "1125899906842624 1024. 3000" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
#basic quota test (SMB2 only)
test_smbcquotas "Test user quota" confq1 $USERNAME "40960/4096000/3072000" "smb2" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB2 || failed=$(expr $failed + 1)

# Test dfree cache through queries in two different directories
test_smbclient_dfree_2 "Test dfree cache" dfq_cache "." "subdir1" \
	"conf1 . conf2 subdir1" "10 1024. 5 20 1024. 10 " \
	-U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 ||
	failed=$(expr $failed + 1)

#quota limit > disk size, remaining quota > disk free
test_smbclient_dfree "Test dfree share root df vs quota case 1" dfq "." "confdfq1 ." "80 1024. 40" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
#quota limit > disk size, remaining quota < disk free
test_smbclient_dfree "Test dfree share root df vs quota case 2" dfq "." "confdfq2 ." "80 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
#quota limit < disk size, remaining quota > disk free
test_smbclient_dfree "Test dfree share root df vs quota case 3" dfq "." "confdfq3 ." "160 1024. 40" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
#quota limit < disk size, remaining quota < disk free
test_smbclient_dfree "Test dfree share root df vs quota case 4" dfq "." "confdfq4 ." "160 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test dfree subdir df vs quota case 4" dfq "subdir1" "confdfq4 subdir1" "160 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)

#quota-->disk free special cases
test_smbclient_dfree "Test quota->dfree soft limit" dfq "subdir1" "slimit subdir1" "168 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test quota->dfree hard limit" dfq "subdir1" "hlimit subdir1" "180 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test quota->dfree inode soft limit" dfq "subdir1" "islimit subdir1" "148 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test quota->dfree inode hard limit" dfq "subdir1" "ihlimit subdir1" "148 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test quota->dfree err try group" dfq "subdir1" "trygrp1 subdir1" "240 1024. 20" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test quota->dfree no-quota try group" dfq "subdir1" "trygrp2 subdir1" "240 1024. 16" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)

# sgid on directory
test_smbclient_dfree "Test quota on sgid directory" dfq "subdir1" \
	"sgid subdir1" "200 1024. 40" -U$USERNAME%$PASSWORD \
	--option=clientmaxprotocol=SMB3 ||
	failed=$(expr $failed + 1)

#block size different in quota and df systems
test_smbclient_dfree "Test quota->dfree different block size" dfq "subdir1" "blksize subdir1" "307200 1024. 307200" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)

#quota configured but not enforced
test_smbclient_dfree "Test dfree share root quota not enforced" dfq "." "notenforce ." "320 1024. 40" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)

#FS quota not implemented (NFS case)
test_smbclient_dfree "Test dfree share root FS quota not implemented" dfq "." "nfs ." "160 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)

#test for dfree when owner is inherited
#setup two folders with different owners
rm -rf $WORKDIR/subdir3/*
for d in / subdir3; do
	$VALGRIND $smbcacls -U$USERNAME%$PASSWORD -D "ACL:$SERVER\user1:ALLOWED/0x0/FULL" //$SERVER/dfq $d >/dev/null 2>&1
	$VALGRIND $smbcacls -U$USERNAME%$PASSWORD -a "ACL:$SERVER\user1:ALLOWED/0x0/FULL" //$SERVER/dfq $d || failed=$(expr $failed + 1)
	$VALGRIND $smbcacls -U$USERNAME%$PASSWORD -D "ACL:$SERVER\user2:ALLOWED/0x0/FULL" //$SERVER/dfq $d >/dev/null 2>&1
	$VALGRIND $smbcacls -U$USERNAME%$PASSWORD -a "ACL:$SERVER\user2:ALLOWED/0x0/FULL" //$SERVER/dfq $d || failed=$(expr $failed + 1)
done

$VALGRIND $smbclient //$SERVER/dfq -c "cd subdir3; mkdir user1" -Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 >/dev/null 2>&1 || failed=$(expr $failed + 1)
$VALGRIND $smbclient //$SERVER/dfq -c "cd subdir3; mkdir user2" -Uuser2%$PASSWORD --option=clientmaxprotocol=SMB3 >/dev/null 2>&1 || failed=$(expr $failed + 1)
#test quotas
test_smbclient_dfree "Test dfree without inherit owner - user1 at user1" \
	dfq "subdir3/user1" "confdfqp subdir3/user1 confdfqp subdir3/user2" "160 1024. 16" \
	-Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test dfree without inherit owner - user1 at user2" \
	dfq "subdir3/user2" "confdfqp subdir3/user1 confdfqp subdir3/user2" "160 1024. 16" \
	-Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test dfree with inherit owner - user1 at user1" \
	dfq_owner "subdir3/user1" "confdfqp subdir3/user1 confdfqp subdir3/user2" "160 1024. 16" \
	-Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)
test_smbclient_dfree "Test dfree with inherit owner - user1 at user2" \
	dfq_owner "subdir3/user2" "confdfqp subdir3/user1 confdfqp subdir3/user2" "164 1024. 20" \
	-Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=$(expr $failed + 1)

setup_conf
exit $failed