1#
2# CDDL HEADER START
3#
4# This file and its contents are supplied under the terms of the
5# Common Development and Distribution License ("CDDL"), version 1.0.
6# You may only use this file in accordance with the terms of version
7# 1.0 of the CDDL.
8#
9# A full copy of the text of the CDDL should have accompanied this
10# source.  A copy of the CDDL is also available via the Internet at
11# http://www.illumos.org/license/CDDL.
12#
13# CDDL HEADER END
14#
15
16#
17# Copyright (c) 2017 Datto, Inc. All rights reserved.
18#
19
20. $STF_SUITE/include/libtest.shlib
21. $STF_SUITE/tests/functional/cli_root/zfs_load-key/zfs_load-key.cfg
22
23# Return 0 is a dataset key is available, 1 otherwise
24#
25# $1 - dataset
26#
27function key_available
28{
29	typeset ds=$1
30
31	datasetexists $ds || return 1
32
33	typeset val=$(get_prop keystatus $ds)
34	if [[ "$val" == "none" ]]; then
35		log_note "Dataset $ds is not encrypted"
36	elif [[ "$val" == "available" ]]; then
37		return 0
38	fi
39
40	return 1
41}
42
43function key_unavailable
44{
45	! key_available $1
46}
47
48function verify_keyformat
49{
50	typeset ds=$1
51	typeset format=$2
52	typeset fmt=$(get_prop keyformat $ds)
53
54	if [[ "$fmt" != "$format" ]]; then
55		log_fail "Expected keyformat $format, got $fmt"
56	fi
57
58	return 0
59}
60
61function verify_keylocation
62{
63	typeset ds=$1
64	typeset location=$2
65	typeset keyloc=$(get_prop keylocation $ds)
66
67	if [[ "$keyloc" != "$location" ]]; then
68		log_fail "Expected keylocation $location, got $keyloc"
69	fi
70
71	return 0
72}
73
74function verify_encryption_root
75{
76	typeset ds=$1
77	typeset val=$2
78	typeset eroot=$(get_prop encryptionroot $ds)
79
80	if [[ "$eroot" != "$val" ]]; then
81		log_note "Expected encryption root '$val', got '$eroot'"
82		return 1
83	fi
84
85	return 0
86}
87
88function verify_origin
89{
90	typeset ds=$1
91	typeset val=$2
92	typeset orig=$(get_prop origin $ds)
93
94	if [[ "$orig" != "$val" ]]; then
95		log_note "Expected origin '$val', got '$orig'"
96		return 1
97	fi
98
99	return 0
100}
101
102function setup_https
103{
104	log_must openssl req -x509 -newkey rsa:4096 -sha256 -days 1 -nodes -keyout "/$TESTPOOL/snakeoil.key" -out "$SSL_CA_CERT_FILE" -subj "/CN=$HTTPS_HOSTNAME"
105
106	python3 -uc "
107import http.server, ssl, sys, os, time, random
108
109sys.stdin.close()
110
111httpd, err, port = None, None, None
112for i in range(1, 100):
113	port = random.randint(0xC000, 0xFFFF) # ephemeral range
114	try:
115		httpd = http.server.HTTPServer(('$HTTPS_HOSTNAME', port), http.server.SimpleHTTPRequestHandler)
116		break
117	except:
118		err = sys.exc_info()[1]
119		time.sleep(i / 100)
120if not httpd:
121	raise err
122
123with open('$HTTPS_PORT_FILE', 'w') as portf:
124	print(port, file=portf)
125
126sslctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
127sslctx.check_hostname = False
128sslctx.load_cert_chain(certfile='$SSL_CA_CERT_FILE', keyfile='/$TESTPOOL/snakeoil.key')
129httpd.socket = httpd.socket = sslctx.wrap_socket(httpd.socket, server_side=True)
130
131os.chdir('$STF_SUITE/tests/functional/cli_root/zfs_load-key')
132
133with open('/$TESTPOOL/snakeoil.pid', 'w') as pidf:
134	if os.fork() != 0:
135	  os._exit(0)
136	print(os.getpid(), file=pidf)
137
138sys.stdout.close()
139sys.stderr.close()
140try:
141	sys.stdout = sys.stderr = open('/tmp/ZTS-snakeoil.log', 'w', buffering=1) # line
142except:
143	sys.stdout = sys.stderr = open('/dev/null', 'w')
144
145print('{} start on {}'.format(os.getpid(), port))
146httpd.serve_forever()
147" || log_fail
148
149	typeset https_pid=
150	for d in $(seq 0 0.1 5); do
151		read -r https_pid 2>/dev/null < "/$TESTPOOL/snakeoil.pid" && [ -n "$https_pid" ] && break
152		sleep "$d"
153	done
154	[ -z "$https_pid" ] && log_fail "Couldn't start HTTPS server"
155	log_note "Started HTTPS server as $https_pid on port $(get_https_port)"
156}
157
158function cleanup_https
159{
160	typeset https_pid=
161	read -r https_pid 2>/dev/null < "/$TESTPOOL/snakeoil.pid" || return 0
162
163	log_must kill "$https_pid"
164	cat /tmp/ZTS-snakeoil.log
165	rm -f "/$TESTPOOL/snakeoil.pid" "/tmp/ZTS-snakeoil.log"
166}
167