xref: /freebsd/libexec/nuageinit/tests/nuageinit.sh (revision ddf6fad0295aa92af5eed2a4b2fa0bd02f47d94d)
1#-
2# Copyright (c) 2022-2025 Baptiste Daroussin <bapt@FreeBSD.org>
3# Copyright (c) 2025 Jesús Daniel Colmenares Oviedo <dtxdf@FreeBSD.org>
4#
5# SPDX-License-Identifier: BSD-2-Clause
6#
7
8export NUAGE_FAKE_ROOTDIR="$PWD"
9
10atf_test_case args
11atf_test_case nocloud
12atf_test_case nocloud_userdata_script
13atf_test_case nocloud_user_data_script
14atf_test_case nocloud_userdata_cloudconfig_users
15atf_test_case nocloud_network
16atf_test_case config2
17atf_test_case config2_pubkeys
18atf_test_case config2_pubkeys_user_data
19atf_test_case config2_pubkeys_meta_data
20atf_test_case config2_network
21atf_test_case config2_network_static_v4
22atf_test_case config2_network_dns
23atf_test_case config2_ssh_keys
24atf_test_case nocloud_userdata_cloudconfig_ssh_pwauth
25atf_test_case nocloud_userdata_cloudconfig_chpasswd
26atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
27atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
28atf_test_case config2_userdata_runcmd
29atf_test_case config2_userdata_packages
30atf_test_case config2_userdata_update_packages
31atf_test_case config2_userdata_upgrade_packages
32atf_test_case config2_userdata_shebang
33atf_test_case config2_userdata_ssh_deletekeys
34atf_test_case config2_userdata_disable_root
35atf_test_case config2_userdata_bootcmd
36atf_test_case config2_userdata_manage_etc_hosts
37atf_test_case config2_userdata_mounts
38atf_test_case config2_userdata_resolv_conf
39atf_test_case config2_userdata_keyboard
40atf_test_case config2_userdata_ssh_authkey_fingerprints
41atf_test_case config2_userdata_fqdn_and_hostname
42atf_test_case config2_userdata_write_files
43
44setup_test_adduser()
45{
46	here=$(pwd)
47	export NUAGE_FAKE_ROOTDIR=$(pwd)
48	mkdir -p etc/ssh
49	cat > etc/master.passwd << EOF
50root:*:0:0::0:0:Charlie &:/root:/bin/csh
51sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
52EOF
53	pwd_mkdb -d etc ${here}/etc/master.passwd
54	cat > etc/group << EOF
55wheel:*:0:root
56users:*:1:
57EOF
58}
59
60args_body()
61{
62	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit
63	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla
64	atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla meh plop
65	atf_check -s exit:1 -e inline:"nuageinit: Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh
66}
67
68nocloud_body()
69{
70	mkdir -p media/nuageinit
71	setup_test_adduser
72	atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit/ nocloud
73	printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > "${PWD}"/media/nuageinit/meta-data
74	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
75	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
76	cat > media/nuageinit/meta-data << EOF
77instance-id: iid-local01
78hostname: myhost
79EOF
80	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
81	atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname
82}
83
84nocloud_userdata_script_body()
85{
86	mkdir -p media/nuageinit
87	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
88	# ensure this is an invalid when parsed with the yaml parser
89	printf "#!/bin/sh\n: ${test:-yes}\necho $test\n" > "${PWD}"/media/nuageinit/user-data
90	chmod 644 "${PWD}"/media/nuageinit/user-data
91	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
92	atf_check test -x var/cache/nuageinit/user_data
93	atf_check -o inline:"#!/bin/sh\n: ${test:-yes}\necho $test\n" cat var/cache/nuageinit/user_data
94}
95
96nocloud_user_data_script_body()
97{
98	mkdir -p media/nuageinit
99	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
100	printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user_data
101	chmod 755 "${PWD}"/media/nuageinit/user_data
102	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
103	atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data
104}
105
106nocloud_userdata_cloudconfig_users_head()
107{
108	atf_set "require.user" root
109}
110nocloud_userdata_cloudconfig_users_body()
111{
112	mkdir -p media/nuageinit
113	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
114	mkdir -p etc
115	cat > etc/master.passwd << EOF
116root:*:0:0::0:0:Charlie &:/root:/bin/sh
117sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
118EOF
119	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
120	cat > etc/group << EOF
121wheel:*:0:root
122users:*:1:
123EOF
124	cat > media/nuageinit/user-data << 'EOF'
125#cloud-config
126groups:
127  - admingroup: [root,sys]
128  - cloud-users
129users:
130  - default
131  - name: foobar
132    gecos: Foo B. Bar
133    primary_group: foobar
134    sudo: ALL=(ALL) NOPASSWD:ALL
135    doas: permit persist %u as root
136    groups: users
137    passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
138  - name: bla
139    sudo:
140    - "ALL=(ALL) NOPASSWD:/usr/sbin/pw"
141    - "ALL=(ALL) ALL"
142    doas:
143    - "deny %u as foobar"
144    - "permit persist %u as root cmd whoami"
145EOF
146	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
147	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
148	cat > expectedgroup << EOF
149wheel:*:0:root,freebsd
150users:*:1:foobar
151admingroup:*:1001:root,sys
152cloud-users:*:1002:
153freebsd:*:1003:
154foobar:*:1004:
155bla:*:1005:
156EOF
157	cat > expectedpasswd << 'EOF'
158root:*:0:0::0:0:Charlie &:/root:/bin/sh
159sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
160freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh
161foobar:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh
162bla::1003:1005::0:0:bla User:/home/bla:/bin/sh
163EOF
164	sed -i "" "s/freebsd:.*:1001/freebsd:freebsd:1001/" "${PWD}"/etc/master.passwd
165	atf_check -o file:expectedpasswd cat "${PWD}"/etc/master.passwd
166	atf_check -o file:expectedgroup cat "${PWD}"/etc/group
167	localbase=`sysctl -ni user.localbase 2> /dev/null`
168	if [ -z "${localbase}" ]; then
169		# fallback
170		localbase="/usr/local"
171	fi
172	atf_check -o inline:"foobar ALL=(ALL) NOPASSWD:ALL\nbla ALL=(ALL) NOPASSWD:/usr/sbin/pw\nbla ALL=(ALL) ALL\n" cat "${PWD}/${localbase}/etc/sudoers.d/90-nuageinit-users"
173	atf_check -o inline:"permit persist foobar as root\ndeny bla as foobar\npermit persist bla as root cmd whoami\n" cat "${PWD}/${localbase}/etc/doas.conf"
174}
175
176nocloud_network_head()
177{
178	atf_set "require.user" root
179}
180nocloud_network_body()
181{
182	mkdir -p media/nuageinit
183	mkdir -p etc
184	cat > etc/master.passwd << EOF
185root:*:0:0::0:0:Charlie &:/root:/bin/sh
186sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
187EOF
188	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
189	cat > etc/group << EOF
190wheel:*:0:root
191users:*:1:
192EOF
193	mynetworks=$(ifconfig -l ether)
194	if [ -z "$mynetworks" ]; then
195		atf_skip "a network interface is needed"
196	fi
197	set -- $mynetworks
198	myiface=$1
199	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
200	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
201	cat > media/nuageinit/user-data << EOF
202#cloud-config
203network:
204  version: 2
205  ethernets:
206    # opaque ID for physical interfaces, only referred to by other stanzas
207    id0:
208      match:
209        macaddress: "$myaddr"
210      addresses:
211        - 192.0.2.2/24
212        - 2001:db8::2/64
213      gateway4: 192.0.2.1
214      gateway6: 2001:db8::1
215EOF
216	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
217	cat > network << EOF
218ifconfig_${myiface}="inet 192.0.2.2/24"
219ifconfig_${myiface}_ipv6="inet6 2001:db8::2/64"
220ipv6_network_interfaces="${myiface}"
221ipv6_default_interface="${myiface}"
222EOF
223	cat > routing << EOF
224defaultrouter="192.0.2.1"
225ipv6_defaultrouter="2001:db8::1"
226ipv6_route_${myiface}="2001:db8::1 -prefixlen 128 -interface ${myiface}"
227EOF
228	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
229	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
230}
231
232config2_body()
233{
234	mkdir -p media/nuageinit
235	setup_test_adduser
236	atf_check -s exit:1 -e match:"nuageinit: error parsing config-2 meta_data.json:.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
237	printf "{}" > media/nuageinit/meta_data.json
238	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
239	cat > media/nuageinit/meta_data.json << EOF
240{
241    "hostname": "cloudimg"
242}
243EOF
244	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
245	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
246}
247
248config2_pubkeys_head()
249{
250	atf_set "require.user" root
251}
252config2_pubkeys_body()
253{
254	mkdir -p media/nuageinit
255	touch media/nuageinit/meta_data.json
256	cat > media/nuageinit/user-data << EOF
257#cloud-config
258ssh_authorized_keys:
259  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
260EOF
261	mkdir -p etc
262	cat > etc/master.passwd << EOF
263root:*:0:0::0:0:Charlie &:/root:/bin/sh
264sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
265EOF
266	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
267	cat > etc/group << EOF
268wheel:*:0:root
269users:*:1:
270EOF
271	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
272	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
273}
274
275config2_pubkeys_user_data_head()
276{
277	atf_set "require.user" root
278}
279config2_pubkeys_user_data_body()
280{
281	mkdir -p media/nuageinit
282	touch media/nuageinit/meta_data.json
283	cat > media/nuageinit/user_data << EOF
284#cloud-config
285ssh_authorized_keys:
286  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
287EOF
288	mkdir -p etc
289	cat > etc/master.passwd << EOF
290root:*:0:0::0:0:Charlie &:/root:/bin/sh
291sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
292EOF
293	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
294	cat > etc/group << EOF
295wheel:*:0:root
296users:*:1:
297EOF
298	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
299	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
300}
301
302config2_pubkeys_meta_data_body()
303{
304	here=$(pwd)
305	export NUAGE_FAKE_ROOTDIR=$(pwd)
306	if [ $(id -u) -ne 0 ]; then
307		atf_skip "root required"
308	fi
309	mkdir -p media/nuageinit
310	cat > media/nuageinit/meta_data.json << EOF
311{
312    "uuid": "uuid_for_this_instance",
313    "admin_pass": "a_generated_password",
314    "public_keys": {
315        "tdb": "ssh-ed25519 my_key_id tdb@host"
316    },
317    "keys": [
318        {
319            "name": "tdb",
320            "type": "ssh",
321            "data": "ssh-ed25519 my_key_id tdb@host"
322        }
323    ],
324    "hostname": "freebsd-14-test.novalocal",
325    "name": "freebsd-14-test",
326    "launch_index": 0,
327    "availability_zone": "nova",
328    "random_seed": "long_random_seed",
329    "project_id": "my_project_id",
330    "devices": [],
331    "dedicated_cpus": []
332}
333EOF
334	mkdir -p etc
335	cat > etc/master.passwd << EOF
336root:*:0:0::0:0:Charlie &:/root:/bin/csh
337sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
338EOF
339	pwd_mkdb -d etc ${here}/etc/master.passwd
340	cat > etc/group << EOF
341wheel:*:0:root
342users:*:1:
343EOF
344	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
345	atf_check -o inline:"ssh-ed25519 my_key_id tdb@host\n" cat home/freebsd/.ssh/authorized_keys
346}
347
348config2_network_body()
349{
350	mkdir -p media/nuageinit
351	setup_test_adduser
352	printf "{}" > media/nuageinit/meta_data.json
353	mynetworks=$(ifconfig -l ether)
354	if [ -z "$mynetworks" ]; then
355		atf_skip "a network interface is needed"
356	fi
357	set -- $mynetworks
358	myiface=$1
359	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
360cat > media/nuageinit/network_data.json << EOF
361{
362    "links": [
363        {
364            "ethernet_mac_address": "$myaddr",
365            "id": "iface0",
366            "mtu": null
367        }
368    ],
369    "networks": [
370        {
371            "id": "network0",
372            "link": "iface0",
373            "type": "ipv4_dhcp"
374        },
375        { // IPv6
376            "id": "private-ipv4",
377            "type": "ipv6",
378            "link": "iface0",
379            // supports condensed IPv6 with CIDR netmask
380            "ip_address": "2001:db8::3257:9652/64",
381            "gateway": "fd00::1",
382            "routes": [
383                {
384                    "network": "::",
385                    "netmask": "::",
386                    "gateway": "fd00::1"
387                },
388                {
389                    "network": "::",
390                    "netmask": "ffff:ffff:ffff::",
391                    "gateway": "fd00::1:1"
392                }
393            ],
394            "network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"
395        }
396    ]
397}
398EOF
399	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
400	cat > network << EOF
401ifconfig_${myiface}="DHCP"
402ifconfig_${myiface}_ipv6="inet6 2001:db8::3257:9652/64"
403ipv6_network_interfaces="${myiface}"
404ipv6_default_interface="${myiface}"
405EOF
406	cat > routing << EOF
407ipv6_defaultrouter="fd00::1"
408ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"
409ipv6_static_routes="${myiface}"
410EOF
411	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
412	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
413}
414
415config2_network_static_v4_body()
416{
417	mkdir -p media/nuageinit
418	setup_test_adduser
419	printf "{}" > media/nuageinit/meta_data.json
420	mynetworks=$(ifconfig -l ether)
421	if [ -z "$mynetworks" ]; then
422		atf_skip "a network interface is needed"
423	fi
424	set -- $mynetworks
425	myiface=$1
426	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
427cat > media/nuageinit/network_data.json << EOF
428{
429    "links": [
430        {
431            "ethernet_mac_address": "$myaddr",
432            "id": "iface0",
433            "mtu": null
434        }
435    ],
436    "networks": [
437        {
438            "id": "network0",
439            "link": "iface0",
440            "type": "ipv4",
441            "ip_address": "10.184.0.244",
442            "netmask": "255.255.240.0",
443            "routes": [
444                {
445                    "network": "10.0.0.0",
446                    "netmask": "255.0.0.0",
447                    "gateway": "11.0.0.1"
448                },
449                {
450                    "network": "0.0.0.0",
451                    "netmask": "0.0.0.0",
452                    "gateway": "23.253.157.1"
453                }
454            ]
455        }
456    ]
457}
458EOF
459	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
460	cat > network << EOF
461ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"
462EOF
463	cat > routing << EOF
464route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"
465defaultrouter="23.253.157.1"
466static_routes="cloudinit1_${myiface}"
467EOF
468	atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
469	atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
470}
471
472config2_network_dns_body()
473{
474	mkdir -p media/nuageinit
475	setup_test_adduser
476	printf "{}" > media/nuageinit/meta_data.json
477	mynetworks=$(ifconfig -l ether)
478	if [ -z "$mynetworks" ]; then
479		atf_skip "a network interface is needed"
480	fi
481	set -- $mynetworks
482	myiface=$1
483	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
484cat > media/nuageinit/network_data.json << EOF
485{
486    "links": [
487        {
488            "ethernet_mac_address": "$myaddr",
489            "id": "iface0",
490            "mtu": null
491        }
492    ],
493    "networks": [
494        {
495            "id": "network0",
496            "link": "iface0",
497            "type": "ipv4_dhcp"
498        }
499    ],
500    "services": [
501        {
502            "type": "dns",
503            "address": "9.9.9.9"
504        },
505        {
506            "type": "dns",
507            "address": "149.112.112.112"
508        }
509    ]
510}
511EOF
512	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
513	atf_check -o inline:'name_servers="9.9.9.9 149.112.112.112"\n' \
514		cat "${PWD}"/etc/resolvconf.conf
515}
516
517config2_ssh_keys_head()
518{
519	atf_set "require.user" root
520}
521config2_ssh_keys_body()
522{
523	here=$(pwd)
524	export NUAGE_FAKE_ROOTDIR=$(pwd)
525	mkdir -p media/nuageinit
526	touch media/nuageinit/meta_data.json
527	cat > media/nuageinit/user-data << EOF
528#cloud-config
529ssh_keys:
530  rsa_private: |
531    -----BEGIN RSA PRIVATE KEY-----
532    MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
533    ...
534    -----END RSA PRIVATE KEY-----
535  rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...
536  ed25519_private: |
537    -----BEGIN OPENSSH PRIVATE KEY-----
538    blabla
539    ...
540    -----END OPENSSH PRIVATE KEY-----
541  ed25519_public: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+
542EOF
543	mkdir -p etc/ssh
544	cat > etc/master.passwd << EOF
545root:*:0:0::0:0:Charlie &:/root:/bin/csh
546sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
547EOF
548	pwd_mkdb -d etc ${here}/etc/master.passwd
549	cat > etc/group << EOF
550wheel:*:0:root
551users:*:1:
552EOF
553	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
554	_expected="-----BEGIN RSA PRIVATE KEY-----
555MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
556...
557-----END RSA PRIVATE KEY-----
558
559"
560	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key
561	_expected="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...\n"
562	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key.pub
563	_expected="-----BEGIN OPENSSH PRIVATE KEY-----
564blabla
565...
566-----END OPENSSH PRIVATE KEY-----
567
568"
569	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key
570	_expected="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+\n"
571	atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key.pub
572}
573
574
575nocloud_userdata_cloudconfig_ssh_pwauth_head()
576{
577	atf_set "require.user" root
578}
579nocloud_userdata_cloudconfig_ssh_pwauth_body()
580{
581	mkdir -p etc
582	cat > etc/master.passwd << EOF
583root:*:0:0::0:0:Charlie &:/root:/bin/sh
584sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
585EOF
586	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
587	cat > etc/group << EOF
588wheel:*:0:root
589users:*:1:
590EOF
591	mkdir -p media/nuageinit
592	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
593	cat > media/nuageinit/user-data << 'EOF'
594#cloud-config
595ssh_pwauth: true
596EOF
597	mkdir -p etc/ssh/
598	touch etc/ssh/sshd_config
599
600	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
601	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
602
603	# Same value we don't touch anything
604	printf "   PasswordAuthentication yes # I want password\n" > etc/ssh/sshd_config
605	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
606	atf_check -o inline:"   PasswordAuthentication yes # I want password\n" cat etc/ssh/sshd_config
607
608	printf "   PasswordAuthentication no # Should change\n" > etc/ssh/sshd_config
609	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
610	atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
611
612	cat > media/nuageinit/user-data << 'EOF'
613#cloud-config
614ssh_pwauth: false
615EOF
616
617	printf "   PasswordAuthentication no # no passwords\n" > etc/ssh/sshd_config
618	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
619	atf_check -o inline:"   PasswordAuthentication no # no passwords\n" cat etc/ssh/sshd_config
620
621	printf "   PasswordAuthentication yes # Should change\n" > etc/ssh/sshd_config
622	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
623	atf_check -o inline:"PasswordAuthentication no\n" cat etc/ssh/sshd_config
624}
625
626nocloud_userdata_cloudconfig_chpasswd_head()
627{
628	atf_set "require.user" root
629}
630nocloud_userdata_cloudconfig_chpasswd_body()
631{
632	mkdir -p etc
633	cat > etc/master.passwd << EOF
634root:*:0:0::0:0:Charlie &:/root:/bin/sh
635sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
636user:*:1:0::0:0:Sys:/home/sys:/bin/sh
637EOF
638	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
639	cat > etc/group << EOF
640wheel:*:0:root
641users:*:1:
642EOF
643	mkdir -p media/nuageinit
644	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
645	cat > media/nuageinit/user-data << 'EOF'
646#cloud-config
647chpasswd:
648  expire: true
649  users:
650  - { user: "sys", password: RANDOM }
651EOF
652
653	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
654	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'name'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
655	# nothing modified
656	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
657
658	cat > media/nuageinit/user-data << 'EOF'
659#cloud-config
660chpasswd:
661  expire: true
662  users:
663  - { name: "sys", pwd: RANDOM }
664EOF
665	atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'password'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
666	# nothing modified
667	atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
668
669	cat > media/nuageinit/user-data << 'EOF'
670#cloud-config
671chpasswd:
672  expire: false
673  users:
674  - { name: "sys", password: RANDOM }
675EOF
676	# not empty because the password is printed to stdout
677	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
678	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
679
680	cat > media/nuageinit/user-data << 'EOF'
681#cloud-config
682chpasswd:
683  expire: true
684  users:
685  - { name: "sys", password: RANDOM }
686EOF
687	# not empty because the password is printed to stdout
688	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
689	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
690
691	cat > media/nuageinit/user-data << 'EOF'
692#cloud-config
693chpasswd:
694  expire: true
695  users:
696  - { name: "user", password: "$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/" }
697EOF
698	# not empty because the password is printed to stdout
699	atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
700	atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::1:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user
701}
702
703
704nocloud_userdata_cloudconfig_chpasswd_list_string_head()
705{
706	atf_set "require.user" root
707}
708nocloud_userdata_cloudconfig_chpasswd_list_string_body()
709{
710	mkdir -p etc
711	cat > etc/master.passwd << EOF
712root:*:0:0::0:0:Charlie &:/root:/bin/sh
713sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
714user:*:1:0::0:0:Sys:/home/sys:/bin/sh
715EOF
716	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
717	cat > etc/group << EOF
718wheel:*:0:root
719users:*:1:
720EOF
721	mkdir -p media/nuageinit
722	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
723	cat > media/nuageinit/user-data << 'EOF'
724#cloud-config
725chpasswd:
726  expire: true
727  list: |
728     sys:RANDOM
729EOF
730
731	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
732	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
733	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
734
735	cat > media/nuageinit/user-data << 'EOF'
736#cloud-config
737chpasswd:
738  expire: false
739  list: |
740     sys:plop
741     user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
742     root:R
743EOF
744
745	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
746	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
747	atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user
748	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
749}
750
751nocloud_userdata_cloudconfig_chpasswd_list_list_head()
752{
753	atf_set "require.user" root
754}
755nocloud_userdata_cloudconfig_chpasswd_list_list_body()
756{
757	mkdir -p etc
758	cat > etc/master.passwd << EOF
759root:*:0:0::0:0:Charlie &:/root:/bin/sh
760sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
761user:*:1:0::0:0:Sys:/home/sys:/bin/sh
762EOF
763	pwd_mkdb -d etc "${PWD}"/etc/master.passwd
764	cat > etc/group << EOF
765wheel:*:0:root
766users:*:1:
767EOF
768	mkdir -p media/nuageinit
769	printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
770	cat > media/nuageinit/user-data << 'EOF'
771#cloud-config
772chpasswd:
773  expire: true
774  list:
775  - sys:RANDOM
776EOF
777
778	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
779	atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
780	atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
781
782	cat > media/nuageinit/user-data << 'EOF'
783#cloud-config
784chpasswd:
785  expire: false
786  list:
787  - sys:plop
788  - user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
789  - root:R
790EOF
791
792	atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
793	atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
794	atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user
795	atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
796}
797
798config2_userdata_runcmd_head()
799{
800	atf_set "require.user" root
801}
802config2_userdata_runcmd_body()
803{
804	mkdir -p media/nuageinit
805	setup_test_adduser
806	printf "{}" > media/nuageinit/meta_data.json
807	cat > media/nuageinit/user_data << 'EOF'
808#cloud-config
809runcmd:
810EOF
811	chmod 755 "${PWD}"/media/nuageinit/user_data
812	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
813	cat > media/nuageinit/user_data << 'EOF'
814#cloud-config
815runcmd:
816  - plop
817EOF
818	chmod 755 "${PWD}"/media/nuageinit/user_data
819	atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
820	test -f var/cache/nuageinit/runcmds || atf_fail "File not created"
821	test -x var/cache/nuageinit/runcmds || atf_fail "Missing execution permission"
822	atf_check -o inline:"#!/bin/sh\nplop\n" cat var/cache/nuageinit/runcmds
823
824	cat > media/nuageinit/user_data << 'EOF'
825#cloud-config
826runcmd:
827  - echo "yeah!"
828  - uname -s
829EOF
830	chmod 755 "${PWD}"/media/nuageinit/user_data
831	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
832	atf_check -o inline:"#!/bin/sh\necho \"yeah!\"\nuname -s\n" cat var/cache/nuageinit/runcmds
833}
834
835config2_userdata_packages_head()
836{
837	atf_set "require.user" root
838}
839
840config2_userdata_packages_body()
841{
842	mkdir -p media/nuageinit
843	setup_test_adduser
844	export NUAGE_RUN_TESTS=1
845	printf "{}" > media/nuageinit/meta_data.json
846	cat > media/nuageinit/user_data << 'EOF'
847#cloud-config
848packages:
849EOF
850	chmod 755 "${PWD}"/media/nuageinit/user_data
851	atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
852	cat > media/nuageinit/user_data << 'EOF'
853#cloud-config
854packages:
855  - yeah/plop
856EOF
857	chmod 755 "${PWD}"/media/nuageinit/user_data
858	atf_check -s exit:0 -o inline:"pkg install -y 'yeah/plop'\npkg info -q 'yeah/plop'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
859
860	cat > media/nuageinit/user_data << 'EOF'
861#cloud-config
862packages:
863  - curl
864EOF
865	chmod 755 "${PWD}"/media/nuageinit/user_data
866	atf_check -o inline:"pkg install -y 'curl'\npkg info -q 'curl'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
867
868	cat > media/nuageinit/user_data << 'EOF'
869#cloud-config
870packages:
871  - curl
872  - meh: bla
873EOF
874	chmod 755 "${PWD}"/media/nuageinit/user_data
875	atf_check -o inline:"pkg install -y 'curl'\npkg info -q 'curl'\n" -e inline:"nuageinit: Invalid type: table for packages entry number 2\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
876}
877
878config2_userdata_update_packages_body()
879{
880	mkdir -p media/nuageinit
881	setup_test_adduser
882	export NUAGE_RUN_TESTS=1
883	printf "{}" > media/nuageinit/meta_data.json
884	cat > media/nuageinit/user_data << 'EOF'
885#cloud-config
886package_update: true
887EOF
888	chmod 755 "${PWD}"/media/nuageinit/user_data
889	atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg update\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
890}
891
892config2_userdata_upgrade_packages_body()
893{
894	mkdir -p media/nuageinit
895	setup_test_adduser
896	export NUAGE_RUN_TESTS=1
897	printf "{}" > media/nuageinit/meta_data.json
898	cat > media/nuageinit/user_data << 'EOF'
899#cloud-config
900package_upgrade: true
901EOF
902	chmod 755 "${PWD}"/media/nuageinit/user_data
903	atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg upgrade\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
904}
905
906config2_userdata_shebang_body()
907{
908	mkdir -p media/nuageinit
909	setup_test_adduser
910	printf "{}" > media/nuageinit/meta_data.json
911	cat > media/nuageinit/user_data <<EOF
912#!/we/dont/care
913anything
914EOF
915	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
916	test -f var/cache/nuageinit/user_data || atf_fail "File not created"
917	test -x var/cache/nuageinit/user_data || atf_fail "Missing execution permission"
918	atf_check -o inline:"#!/we/dont/care\nanything\n" cat var/cache/nuageinit/user_data
919	cat > media/nuageinit/user_data <<EOF
920/we/dont/care
921EOF
922	rm var/cache/nuageinit/user_data
923	if [ -f var/cache/nuageinit/user_data ]; then
924		atf_fail "File should not have been created"
925	fi
926}
927
928config2_userdata_write_files_body()
929{
930	mkdir -p media/nuageinit
931	setup_test_adduser
932	printf "{}" > media/nuageinit/meta_data.json
933	cat > media/nuageinit/user_data <<EOF
934#cloud-config
935write_files:
936- content: "plop"
937  path: /file1
938- path: /emptyfile
939- content: !!binary |
940    YmxhCg==
941  path: /file_base64
942  encoding: b64
943  permissions: '0755'
944  owner: nobody
945- content: "bob"
946  path: "/foo"
947  defer: true
948EOF
949	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
950	atf_check -o inline:"plop" cat file1
951	atf_check -o inline:"" cat emptyfile
952	atf_check -o inline:"bla\n" cat file_base64
953	test -f foo && atf_fail "foo creation should have been deferred"
954	atf_check -o match:"^-rwxr-xr-x.*nobody" ls -l file_base64
955	rm file1 emptyfile file_base64
956	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
957	test -f file1 -o -f emptyfile -o -f file_base64 && atf_fail "defer not working properly"
958	atf_check -o inline:"bob" cat foo
959}
960
961config2_userdata_ssh_deletekeys_head()
962{
963	atf_set "require.user" root
964}
965config2_userdata_ssh_deletekeys_body()
966{
967	mkdir -p media/nuageinit
968	setup_test_adduser
969	printf "{}" > media/nuageinit/meta_data.json
970	cat > media/nuageinit/user_data <<EOF
971#cloud-config
972ssh_deletekeys: true
973EOF
974	mkdir -p etc/ssh
975	touch etc/ssh/ssh_host_rsa_key
976	touch etc/ssh/ssh_host_rsa_key.pub
977	touch etc/ssh/ssh_host_ed25519_key
978	touch etc/ssh/ssh_host_ed25519_key.pub
979	touch etc/ssh/ssh_host_ecdsa_key
980	touch etc/ssh/ssh_host_ecdsa_key.pub
981	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
982	test -f etc/ssh/ssh_host_rsa_key && atf_fail "ssh_host_rsa_key not deleted"
983	test -f etc/ssh/ssh_host_rsa_key.pub && atf_fail "ssh_host_rsa_key.pub not deleted"
984	test -f etc/ssh/ssh_host_ed25519_key && atf_fail "ssh_host_ed25519_key not deleted"
985	test -f etc/ssh/ssh_host_ed25519_key.pub && atf_fail "ssh_host_ed25519_key.pub not deleted"
986	test -f etc/ssh/ssh_host_ecdsa_key && atf_fail "ssh_host_ecdsa_key not deleted"
987	test -f etc/ssh/ssh_host_ecdsa_key.pub && atf_fail "ssh_host_ecdsa_key.pub not deleted"
988	true
989}
990
991config2_userdata_disable_root_head()
992{
993	atf_set "require.user" root
994}
995config2_userdata_disable_root_body()
996{
997	mkdir -p media/nuageinit
998	setup_test_adduser
999	printf "{}" > media/nuageinit/meta_data.json
1000	cat > media/nuageinit/user_data <<EOF
1001#cloud-config
1002disable_root: true
1003EOF
1004	mkdir -p etc/ssh
1005	touch etc/ssh/sshd_config
1006	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1007	atf_check -o inline:"PermitRootLogin no\n" cat etc/ssh/sshd_config
1008	cat > media/nuageinit/user_data <<EOF
1009#cloud-config
1010disable_root: true
1011disable_root_opts: "without-password"
1012EOF
1013	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1014	atf_check -o inline:"PermitRootLogin without-password\n" cat etc/ssh/sshd_config
1015	cat > media/nuageinit/user_data <<EOF
1016#cloud-config
1017disable_root: true
1018disable_root_opts:
1019  - "prohibit-password"
1020EOF
1021	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1022	atf_check -o inline:"PermitRootLogin prohibit-password\n" cat etc/ssh/sshd_config
1023	cat > media/nuageinit/user_data <<EOF
1024#cloud-config
1025disable_root: false
1026EOF
1027	echo "PermitRootLogin yes" > etc/ssh/sshd_config
1028	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1029	atf_check -o inline:"PermitRootLogin yes\n" cat etc/ssh/sshd_config
1030}
1031
1032config2_userdata_bootcmd_head()
1033{
1034	atf_set "require.user" root
1035}
1036config2_userdata_bootcmd_body()
1037{
1038	mkdir -p media/nuageinit
1039	setup_test_adduser
1040	printf "{}" > media/nuageinit/meta_data.json
1041	cat > media/nuageinit/user_data <<EOF
1042#cloud-config
1043bootcmd:
1044  - kldload if_bridge
1045EOF
1046	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1047	test -f var/cache/nuageinit/bootcmds || atf_fail "bootcmds file not created"
1048	atf_check -o inline:"#!/bin/sh\nkldload if_bridge\n" cat var/cache/nuageinit/bootcmds
1049	cat > media/nuageinit/user_data <<EOF
1050#cloud-config
1051bootcmd:
1052  - sysctl net.inet.ip.forwarding=1
1053  - kldload if_bridge
1054EOF
1055	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1056	atf_check -o inline:"#!/bin/sh\nsysctl net.inet.ip.forwarding=1\nkldload if_bridge\n" cat var/cache/nuageinit/bootcmds
1057	# Test 3: empty list (clean up from previous tests first)
1058	rm -f var/cache/nuageinit/bootcmds
1059	cat > media/nuageinit/user_data <<EOF
1060#cloud-config
1061bootcmd: []
1062EOF
1063	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1064	test -f var/cache/nuageinit/bootcmds && atf_fail "bootcmds should not have been created for empty list"
1065	true
1066}
1067
1068config2_userdata_manage_etc_hosts_head()
1069{
1070	atf_set "require.user" root
1071}
1072config2_userdata_manage_etc_hosts_body()
1073{
1074	mkdir -p media/nuageinit
1075	setup_test_adduser
1076	printf "{}" > media/nuageinit/meta_data.json
1077	# Test 1: manage_etc_hosts adds hostname when /etc/hosts does not exist
1078	cat > media/nuageinit/user_data <<EOF
1079#cloud-config
1080hostname: mycloud
1081EOF
1082	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1083	atf_check -o inline:"::1\t\tlocalhost mycloud\n127.0.0.1\t\tlocalhost mycloud\n" cat etc/hosts
1084	# Test 2: manage_etc_hosts appends hostname to existing localhost lines
1085	cat > etc/hosts <<EOF
1086::1		localhost
1087127.0.0.1		localhost
1088EOF
1089	cat > media/nuageinit/user_data <<EOF
1090#cloud-config
1091hostname: myvm
1092EOF
1093	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1094	atf_check -o inline:"::1\t\tlocalhost myvm\n127.0.0.1\t\tlocalhost myvm\n" cat etc/hosts
1095	# Test 3: hostname already present in /etc/hosts, no change
1096	cat > etc/hosts <<EOF
1097::1		localhost myvm
1098127.0.0.1		localhost myvm
1099EOF
1100	cat > media/nuageinit/user_data <<EOF
1101#cloud-config
1102hostname: myvm
1103EOF
1104	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1105	atf_check -o inline:"::1\t\tlocalhost myvm\n127.0.0.1\t\tlocalhost myvm\n" cat etc/hosts
1106	# Test 4: manage_etc_hosts: false disables the behaviour
1107	cat > etc/hosts <<EOF
1108::1		localhost
1109127.0.0.1		localhost
1110EOF
1111	cat > media/nuageinit/user_data <<EOF
1112#cloud-config
1113hostname: nope
1114manage_etc_hosts: false
1115EOF
1116	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1117	atf_check -o inline:"::1\t\tlocalhost\n127.0.0.1\t\tlocalhost\n" cat etc/hosts
1118}
1119
1120config2_userdata_mounts_head()
1121{
1122	atf_set "require.user" root
1123}
1124config2_userdata_mounts_body()
1125{
1126	mkdir -p media/nuageinit
1127	setup_test_adduser
1128	printf "{}" > media/nuageinit/meta_data.json
1129	cat > media/nuageinit/user_data <<EOF
1130#cloud-config
1131mounts:
1132  - [ /dev/ada1p1, /mnt/data, ufs, rw, 0, 2 ]
1133  - device: tmpfs
1134    mountpoint: /mnt/tmp
1135    fstype: tmpfs
1136    options: "size=256M"
1137EOF
1138	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1139	atf_check -o match:"/dev/ada1p1.*/mnt/data.*ufs.*rw.*0.*2" cat etc/fstab
1140	atf_check -o match:"tmpfs.*/mnt/tmp.*tmpfs.*size=256M.*0.*0" cat etc/fstab
1141	test -d mnt/data || atf_fail "/mnt/data directory not created"
1142	test -d mnt/tmp || atf_fail "/mnt/tmp directory not created"
1143	true
1144}
1145
1146config2_userdata_resolv_conf_head()
1147{
1148	atf_set "require.user" root
1149}
1150config2_userdata_resolv_conf_body()
1151{
1152	mkdir -p media/nuageinit
1153	setup_test_adduser
1154	printf "{}" > media/nuageinit/meta_data.json
1155	cat > media/nuageinit/user_data <<EOF
1156#cloud-config
1157resolv_conf:
1158  nameservers:
1159    - 9.9.9.9
1160    - 149.112.112.112
1161  searchdomains:
1162    - example.com
1163    - test.local
1164  domain: mydomain.local
1165  options:
1166    timeout: "1"
1167    attempts: "2"
1168  sortlist:
1169    - 192.168.1.0/255.255.255.0
1170EOF
1171	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1172	atf_check -o match:"domain mydomain.local" cat etc/resolv.conf
1173	atf_check -o match:"search example.com test.local" cat etc/resolv.conf
1174	atf_check -o match:"sortlist 192.168.1.0/255.255.255.0" cat etc/resolv.conf
1175	atf_check -o match:"nameserver 9.9.9.9" cat etc/resolv.conf
1176	atf_check -o match:"nameserver 149.112.112.112" cat etc/resolv.conf
1177	atf_check -o match:"options.*timeout:1" cat etc/resolv.conf
1178	atf_check -o match:"options.*attempts:2" cat etc/resolv.conf
1179	true
1180}
1181
1182config2_userdata_keyboard_head()
1183{
1184	atf_set "require.user" root
1185}
1186config2_userdata_keyboard_body()
1187{
1188	mkdir -p media/nuageinit
1189	setup_test_adduser
1190	printf "{}" > media/nuageinit/meta_data.json
1191	cat > media/nuageinit/user_data <<EOF
1192#cloud-config
1193keyboard:
1194  layout: fr
1195  variant: acc
1196EOF
1197	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1198	atf_check -o inline:'keymap="fr.acc"\n' cat etc/rc.conf.d/keymap
1199	true
1200}
1201
1202config2_userdata_ssh_authkey_fingerprints_head()
1203{
1204	atf_set "require.user" root
1205}
1206config2_userdata_ssh_authkey_fingerprints_body()
1207{
1208	mkdir -p media/nuageinit
1209	setup_test_adduser
1210	printf "{}" > media/nuageinit/meta_data.json
1211	mkdir -p etc/ssh
1212	ssh-keygen -t ed25519 -f etc/ssh/ssh_host_ed25519_key -N "" -q 2>/dev/null
1213	cat > media/nuageinit/user_data <<EOF
1214#cloud-config
1215ssh_authkey_fingerprints: true
1216EOF
1217	atf_check -s exit:0 -e match:"SHA256:" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1218	true
1219}
1220
1221config2_userdata_fqdn_and_hostname_body()
1222{
1223	mkdir -p media/nuageinit
1224	setup_test_adduser
1225	printf "{}" > media/nuageinit/meta_data.json
1226	cat > media/nuageinit/user_data <<EOF
1227#cloud-config
1228fqdn: host.domain.tld
1229hostname: host
1230EOF
1231	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1232	atf_check -o inline:"hostname=\"host.domain.tld\"\n" cat ${PWD}/etc/rc.conf.d/hostname
1233	cat > media/nuageinit/user_data <<EOF
1234#cloud-config
1235hostname: host
1236EOF
1237	atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
1238	atf_check -o inline:"hostname=\"host\"\n" cat ${PWD}/etc/rc.conf.d/hostname
1239}
1240
1241atf_init_test_cases()
1242{
1243	atf_add_test_case args
1244	atf_add_test_case nocloud
1245	atf_add_test_case nocloud_userdata_script
1246	atf_add_test_case nocloud_user_data_script
1247	atf_add_test_case nocloud_userdata_cloudconfig_users
1248	atf_add_test_case nocloud_network
1249	atf_add_test_case config2
1250	atf_add_test_case config2_pubkeys
1251	atf_add_test_case config2_pubkeys_user_data
1252	atf_add_test_case config2_pubkeys_meta_data
1253	atf_add_test_case config2_network
1254	atf_add_test_case config2_network_static_v4
1255	atf_add_test_case config2_network_dns
1256	atf_add_test_case config2_ssh_keys
1257	atf_add_test_case nocloud_userdata_cloudconfig_ssh_pwauth
1258	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd
1259	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
1260	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
1261	atf_add_test_case config2_userdata_runcmd
1262	atf_add_test_case config2_userdata_packages
1263	atf_add_test_case config2_userdata_update_packages
1264	atf_add_test_case config2_userdata_upgrade_packages
1265	atf_add_test_case config2_userdata_shebang
1266	atf_add_test_case config2_userdata_ssh_deletekeys
1267	atf_add_test_case config2_userdata_disable_root
1268	atf_add_test_case config2_userdata_bootcmd
1269	atf_add_test_case config2_userdata_manage_etc_hosts
1270	atf_add_test_case config2_userdata_mounts
1271	atf_add_test_case config2_userdata_resolv_conf
1272	atf_add_test_case config2_userdata_keyboard
1273	atf_add_test_case config2_userdata_ssh_authkey_fingerprints
1274	atf_add_test_case config2_userdata_fqdn_and_hostname
1275	atf_add_test_case config2_userdata_write_files
1276}
1277