Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/libexec/nuageinit/tests/nuageinit.sh
104014 views
1
#-
2
# Copyright (c) 2022-2025 Baptiste Daroussin <[email protected]>
3
# Copyright (c) 2025 Jesús Daniel Colmenares Oviedo <[email protected]>
4
#
5
# SPDX-License-Identifier: BSD-2-Clause
6
#
7
8
export NUAGE_FAKE_ROOTDIR="$PWD"
9
10
atf_test_case args
11
atf_test_case nocloud
12
atf_test_case nocloud_userdata_script
13
atf_test_case nocloud_user_data_script
14
atf_test_case nocloud_userdata_cloudconfig_users
15
atf_test_case nocloud_network
16
atf_test_case config2
17
atf_test_case config2_pubkeys
18
atf_test_case config2_pubkeys_user_data
19
atf_test_case config2_pubkeys_meta_data
20
atf_test_case config2_network
21
atf_test_case config2_network_static_v4
22
atf_test_case config2_ssh_keys
23
atf_test_case nocloud_userdata_cloudconfig_ssh_pwauth
24
atf_test_case nocloud_userdata_cloudconfig_chpasswd
25
atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
26
atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
27
atf_test_case config2_userdata_runcmd
28
atf_test_case config2_userdata_packages
29
atf_test_case config2_userdata_update_packages
30
atf_test_case config2_userdata_upgrade_packages
31
atf_test_case config2_userdata_shebang
32
atf_test_case config2_userdata_fqdn_and_hostname
33
atf_test_case config2_userdata_write_files
34
35
setup_test_adduser()
36
{
37
here=$(pwd)
38
export NUAGE_FAKE_ROOTDIR=$(pwd)
39
mkdir -p etc/ssh
40
cat > etc/master.passwd << EOF
41
root:*:0:0::0:0:Charlie &:/root:/bin/csh
42
sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
43
EOF
44
pwd_mkdb -d etc ${here}/etc/master.passwd
45
cat > etc/group << EOF
46
wheel:*:0:root
47
users:*:1:
48
EOF
49
}
50
51
args_body()
52
{
53
atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit
54
atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla
55
atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla meh plop
56
atf_check -s exit:1 -e inline:"nuageinit: Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh
57
}
58
59
nocloud_body()
60
{
61
mkdir -p media/nuageinit
62
setup_test_adduser
63
atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit/ nocloud
64
printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > "${PWD}"/media/nuageinit/meta-data
65
atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
66
atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
67
cat > media/nuageinit/meta-data << EOF
68
instance-id: iid-local01
69
hostname: myhost
70
EOF
71
atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
72
atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname
73
}
74
75
nocloud_userdata_script_body()
76
{
77
mkdir -p media/nuageinit
78
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
79
printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user-data
80
chmod 755 "${PWD}"/media/nuageinit/user-data
81
atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
82
atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data
83
}
84
85
nocloud_user_data_script_body()
86
{
87
mkdir -p media/nuageinit
88
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
89
printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user_data
90
chmod 755 "${PWD}"/media/nuageinit/user_data
91
atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
92
atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data
93
}
94
95
nocloud_userdata_cloudconfig_users_head()
96
{
97
atf_set "require.user" root
98
}
99
nocloud_userdata_cloudconfig_users_body()
100
{
101
mkdir -p media/nuageinit
102
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
103
mkdir -p etc
104
cat > etc/master.passwd << EOF
105
root:*:0:0::0:0:Charlie &:/root:/bin/sh
106
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
107
EOF
108
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
109
cat > etc/group << EOF
110
wheel:*:0:root
111
users:*:1:
112
EOF
113
cat > media/nuageinit/user-data << 'EOF'
114
#cloud-config
115
groups:
116
- admingroup: [root,sys]
117
- cloud-users
118
users:
119
- default
120
- name: foobar
121
gecos: Foo B. Bar
122
primary_group: foobar
123
sudo: ALL=(ALL) NOPASSWD:ALL
124
doas: permit persist %u as root
125
groups: users
126
passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
127
- name: bla
128
sudo:
129
- "ALL=(ALL) NOPASSWD:/usr/sbin/pw"
130
- "ALL=(ALL) ALL"
131
doas:
132
- "deny %u as foobar"
133
- "permit persist %u as root cmd whoami"
134
EOF
135
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
136
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
137
cat > expectedgroup << EOF
138
wheel:*:0:root,freebsd
139
users:*:1:foobar
140
admingroup:*:1001:root,sys
141
cloud-users:*:1002:
142
freebsd:*:1003:
143
foobar:*:1004:
144
bla:*:1005:
145
EOF
146
cat > expectedpasswd << 'EOF'
147
root:*:0:0::0:0:Charlie &:/root:/bin/sh
148
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
149
freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh
150
foobar:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh
151
bla::1003:1005::0:0:bla User:/home/bla:/bin/sh
152
EOF
153
sed -i "" "s/freebsd:.*:1001/freebsd:freebsd:1001/" "${PWD}"/etc/master.passwd
154
atf_check -o file:expectedpasswd cat "${PWD}"/etc/master.passwd
155
atf_check -o file:expectedgroup cat "${PWD}"/etc/group
156
localbase=`sysctl -ni user.localbase 2> /dev/null`
157
if [ -z "${localbase}" ]; then
158
# fallback
159
localbase="/usr/local"
160
fi
161
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"
162
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"
163
}
164
165
nocloud_network_head()
166
{
167
atf_set "require.user" root
168
}
169
nocloud_network_body()
170
{
171
mkdir -p media/nuageinit
172
mkdir -p etc
173
cat > etc/master.passwd << EOF
174
root:*:0:0::0:0:Charlie &:/root:/bin/sh
175
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
176
EOF
177
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
178
cat > etc/group << EOF
179
wheel:*:0:root
180
users:*:1:
181
EOF
182
mynetworks=$(ifconfig -l ether)
183
if [ -z "$mynetworks" ]; then
184
atf_skip "a network interface is needed"
185
fi
186
set -- $mynetworks
187
myiface=$1
188
myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
189
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
190
cat > media/nuageinit/user-data << EOF
191
#cloud-config
192
network:
193
version: 2
194
ethernets:
195
# opaque ID for physical interfaces, only referred to by other stanzas
196
id0:
197
match:
198
macaddress: "$myaddr"
199
addresses:
200
- 192.0.2.2/24
201
- 2001:db8::2/64
202
gateway4: 192.0.2.1
203
gateway6: 2001:db8::1
204
EOF
205
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
206
cat > network << EOF
207
ifconfig_${myiface}="inet 192.0.2.2/24"
208
ifconfig_${myiface}_ipv6="inet6 2001:db8::2/64"
209
ipv6_network_interfaces="${myiface}"
210
ipv6_default_interface="${myiface}"
211
EOF
212
cat > routing << EOF
213
defaultrouter="192.0.2.1"
214
ipv6_defaultrouter="2001:db8::1"
215
ipv6_route_${myiface}="2001:db8::1 -prefixlen 128 -interface ${myiface}"
216
EOF
217
atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
218
atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
219
}
220
221
config2_body()
222
{
223
mkdir -p media/nuageinit
224
setup_test_adduser
225
atf_check -s exit:1 -e match:"nuageinit: error parsing config-2 meta_data.json:.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
226
printf "{}" > media/nuageinit/meta_data.json
227
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
228
cat > media/nuageinit/meta_data.json << EOF
229
{
230
"hostname": "cloudimg"
231
}
232
EOF
233
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
234
atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
235
}
236
237
config2_pubkeys_head()
238
{
239
atf_set "require.user" root
240
}
241
config2_pubkeys_body()
242
{
243
mkdir -p media/nuageinit
244
touch media/nuageinit/meta_data.json
245
cat > media/nuageinit/user-data << EOF
246
#cloud-config
247
ssh_authorized_keys:
248
- "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
249
EOF
250
mkdir -p etc
251
cat > etc/master.passwd << EOF
252
root:*:0:0::0:0:Charlie &:/root:/bin/sh
253
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
254
EOF
255
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
256
cat > etc/group << EOF
257
wheel:*:0:root
258
users:*:1:
259
EOF
260
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
261
atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
262
}
263
264
config2_pubkeys_user_data_head()
265
{
266
atf_set "require.user" root
267
}
268
config2_pubkeys_user_data_body()
269
{
270
mkdir -p media/nuageinit
271
touch media/nuageinit/meta_data.json
272
cat > media/nuageinit/user_data << EOF
273
#cloud-config
274
ssh_authorized_keys:
275
- "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
276
EOF
277
mkdir -p etc
278
cat > etc/master.passwd << EOF
279
root:*:0:0::0:0:Charlie &:/root:/bin/sh
280
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
281
EOF
282
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
283
cat > etc/group << EOF
284
wheel:*:0:root
285
users:*:1:
286
EOF
287
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
288
atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
289
}
290
291
config2_pubkeys_meta_data_body()
292
{
293
here=$(pwd)
294
export NUAGE_FAKE_ROOTDIR=$(pwd)
295
if [ $(id -u) -ne 0 ]; then
296
atf_skip "root required"
297
fi
298
mkdir -p media/nuageinit
299
cat > media/nuageinit/meta_data.json << EOF
300
{
301
"uuid": "uuid_for_this_instance",
302
"admin_pass": "a_generated_password",
303
"public_keys": {
304
"tdb": "ssh-ed25519 my_key_id tdb@host"
305
},
306
"keys": [
307
{
308
"name": "tdb",
309
"type": "ssh",
310
"data": "ssh-ed25519 my_key_id tdb@host"
311
}
312
],
313
"hostname": "freebsd-14-test.novalocal",
314
"name": "freebsd-14-test",
315
"launch_index": 0,
316
"availability_zone": "nova",
317
"random_seed": "long_random_seed",
318
"project_id": "my_project_id",
319
"devices": [],
320
"dedicated_cpus": []
321
}
322
EOF
323
mkdir -p etc
324
cat > etc/master.passwd << EOF
325
root:*:0:0::0:0:Charlie &:/root:/bin/csh
326
sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
327
EOF
328
pwd_mkdb -d etc ${here}/etc/master.passwd
329
cat > etc/group << EOF
330
wheel:*:0:root
331
users:*:1:
332
EOF
333
atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
334
atf_check -o inline:"ssh-ed25519 my_key_id tdb@host\n" cat home/freebsd/.ssh/authorized_keys
335
}
336
337
config2_network_body()
338
{
339
mkdir -p media/nuageinit
340
setup_test_adduser
341
printf "{}" > media/nuageinit/meta_data.json
342
mynetworks=$(ifconfig -l ether)
343
if [ -z "$mynetworks" ]; then
344
atf_skip "a network interface is needed"
345
fi
346
set -- $mynetworks
347
myiface=$1
348
myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
349
cat > media/nuageinit/network_data.json << EOF
350
{
351
"links": [
352
{
353
"ethernet_mac_address": "$myaddr",
354
"id": "iface0",
355
"mtu": null
356
}
357
],
358
"networks": [
359
{
360
"id": "network0",
361
"link": "iface0",
362
"type": "ipv4_dhcp"
363
},
364
{ // IPv6
365
"id": "private-ipv4",
366
"type": "ipv6",
367
"link": "iface0",
368
// supports condensed IPv6 with CIDR netmask
369
"ip_address": "2001:db8::3257:9652/64",
370
"gateway": "fd00::1",
371
"routes": [
372
{
373
"network": "::",
374
"netmask": "::",
375
"gateway": "fd00::1"
376
},
377
{
378
"network": "::",
379
"netmask": "ffff:ffff:ffff::",
380
"gateway": "fd00::1:1"
381
}
382
],
383
"network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"
384
}
385
]
386
}
387
EOF
388
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
389
cat > network << EOF
390
ifconfig_${myiface}="DHCP"
391
ifconfig_${myiface}_ipv6="inet6 2001:db8::3257:9652/64"
392
ipv6_network_interfaces="${myiface}"
393
ipv6_default_interface="${myiface}"
394
EOF
395
cat > routing << EOF
396
ipv6_defaultrouter="fd00::1"
397
ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"
398
ipv6_static_routes="${myiface}"
399
EOF
400
atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
401
atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
402
}
403
404
config2_network_static_v4_body()
405
{
406
mkdir -p media/nuageinit
407
setup_test_adduser
408
printf "{}" > media/nuageinit/meta_data.json
409
mynetworks=$(ifconfig -l ether)
410
if [ -z "$mynetworks" ]; then
411
atf_skip "a network interface is needed"
412
fi
413
set -- $mynetworks
414
myiface=$1
415
myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
416
cat > media/nuageinit/network_data.json << EOF
417
{
418
"links": [
419
{
420
"ethernet_mac_address": "$myaddr",
421
"id": "iface0",
422
"mtu": null
423
}
424
],
425
"networks": [
426
{
427
"id": "network0",
428
"link": "iface0",
429
"type": "ipv4",
430
"ip_address": "10.184.0.244",
431
"netmask": "255.255.240.0",
432
"routes": [
433
{
434
"network": "10.0.0.0",
435
"netmask": "255.0.0.0",
436
"gateway": "11.0.0.1"
437
},
438
{
439
"network": "0.0.0.0",
440
"netmask": "0.0.0.0",
441
"gateway": "23.253.157.1"
442
}
443
]
444
}
445
]
446
}
447
EOF
448
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
449
cat > network << EOF
450
ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"
451
EOF
452
cat > routing << EOF
453
route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"
454
defaultrouter="23.253.157.1"
455
static_routes="cloudinit1_${myiface}"
456
EOF
457
atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network
458
atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing
459
}
460
461
config2_ssh_keys_head()
462
{
463
atf_set "require.user" root
464
}
465
config2_ssh_keys_body()
466
{
467
here=$(pwd)
468
export NUAGE_FAKE_ROOTDIR=$(pwd)
469
mkdir -p media/nuageinit
470
touch media/nuageinit/meta_data.json
471
cat > media/nuageinit/user-data << EOF
472
#cloud-config
473
ssh_keys:
474
rsa_private: |
475
-----BEGIN RSA PRIVATE KEY-----
476
MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
477
...
478
-----END RSA PRIVATE KEY-----
479
rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...
480
ed25519_private: |
481
-----BEGIN OPENSSH PRIVATE KEY-----
482
blabla
483
...
484
-----END OPENSSH PRIVATE KEY-----
485
ed25519_public: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+
486
EOF
487
mkdir -p etc/ssh
488
cat > etc/master.passwd << EOF
489
root:*:0:0::0:0:Charlie &:/root:/bin/csh
490
sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
491
EOF
492
pwd_mkdb -d etc ${here}/etc/master.passwd
493
cat > etc/group << EOF
494
wheel:*:0:root
495
users:*:1:
496
EOF
497
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
498
_expected="-----BEGIN RSA PRIVATE KEY-----
499
MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco
500
...
501
-----END RSA PRIVATE KEY-----
502
503
"
504
atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key
505
_expected="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...\n"
506
atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key.pub
507
_expected="-----BEGIN OPENSSH PRIVATE KEY-----
508
blabla
509
...
510
-----END OPENSSH PRIVATE KEY-----
511
512
"
513
atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key
514
_expected="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+\n"
515
atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key.pub
516
}
517
518
519
nocloud_userdata_cloudconfig_ssh_pwauth_head()
520
{
521
atf_set "require.user" root
522
}
523
nocloud_userdata_cloudconfig_ssh_pwauth_body()
524
{
525
mkdir -p etc
526
cat > etc/master.passwd << EOF
527
root:*:0:0::0:0:Charlie &:/root:/bin/sh
528
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
529
EOF
530
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
531
cat > etc/group << EOF
532
wheel:*:0:root
533
users:*:1:
534
EOF
535
mkdir -p media/nuageinit
536
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
537
cat > media/nuageinit/user-data << 'EOF'
538
#cloud-config
539
ssh_pwauth: true
540
EOF
541
mkdir -p etc/ssh/
542
touch etc/ssh/sshd_config
543
544
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
545
atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
546
547
# Same value we don't touch anything
548
printf " PasswordAuthentication yes # I want password\n" > etc/ssh/sshd_config
549
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
550
atf_check -o inline:" PasswordAuthentication yes # I want password\n" cat etc/ssh/sshd_config
551
552
printf " PasswordAuthentication no # Should change\n" > etc/ssh/sshd_config
553
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
554
atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config
555
556
cat > media/nuageinit/user-data << 'EOF'
557
#cloud-config
558
ssh_pwauth: false
559
EOF
560
561
printf " PasswordAuthentication no # no passwords\n" > etc/ssh/sshd_config
562
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
563
atf_check -o inline:" PasswordAuthentication no # no passwords\n" cat etc/ssh/sshd_config
564
565
printf " PasswordAuthentication yes # Should change\n" > etc/ssh/sshd_config
566
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
567
atf_check -o inline:"PasswordAuthentication no\n" cat etc/ssh/sshd_config
568
}
569
570
nocloud_userdata_cloudconfig_chpasswd_head()
571
{
572
atf_set "require.user" root
573
}
574
nocloud_userdata_cloudconfig_chpasswd_body()
575
{
576
mkdir -p etc
577
cat > etc/master.passwd << EOF
578
root:*:0:0::0:0:Charlie &:/root:/bin/sh
579
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
580
user:*:1:0::0:0:Sys:/home/sys:/bin/sh
581
EOF
582
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
583
cat > etc/group << EOF
584
wheel:*:0:root
585
users:*:1:
586
EOF
587
mkdir -p media/nuageinit
588
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
589
cat > media/nuageinit/user-data << 'EOF'
590
#cloud-config
591
chpasswd:
592
expire: true
593
users:
594
- { user: "sys", password: RANDOM }
595
EOF
596
597
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
598
atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'name'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
599
# nothing modified
600
atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
601
602
cat > media/nuageinit/user-data << 'EOF'
603
#cloud-config
604
chpasswd:
605
expire: true
606
users:
607
- { name: "sys", pwd: RANDOM }
608
EOF
609
atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'password'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
610
# nothing modified
611
atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys
612
613
cat > media/nuageinit/user-data << 'EOF'
614
#cloud-config
615
chpasswd:
616
expire: false
617
users:
618
- { name: "sys", password: RANDOM }
619
EOF
620
# not empty because the password is printed to stdout
621
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
622
atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
623
624
cat > media/nuageinit/user-data << 'EOF'
625
#cloud-config
626
chpasswd:
627
expire: true
628
users:
629
- { name: "sys", password: RANDOM }
630
EOF
631
# not empty because the password is printed to stdout
632
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
633
atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
634
635
cat > media/nuageinit/user-data << 'EOF'
636
#cloud-config
637
chpasswd:
638
expire: true
639
users:
640
- { name: "user", password: "$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/" }
641
EOF
642
# not empty because the password is printed to stdout
643
atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
644
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
645
}
646
647
648
nocloud_userdata_cloudconfig_chpasswd_list_string_head()
649
{
650
atf_set "require.user" root
651
}
652
nocloud_userdata_cloudconfig_chpasswd_list_string_body()
653
{
654
mkdir -p etc
655
cat > etc/master.passwd << EOF
656
root:*:0:0::0:0:Charlie &:/root:/bin/sh
657
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
658
user:*:1:0::0:0:Sys:/home/sys:/bin/sh
659
EOF
660
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
661
cat > etc/group << EOF
662
wheel:*:0:root
663
users:*:1:
664
EOF
665
mkdir -p media/nuageinit
666
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
667
cat > media/nuageinit/user-data << 'EOF'
668
#cloud-config
669
chpasswd:
670
expire: true
671
list: |
672
sys:RANDOM
673
EOF
674
675
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
676
atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
677
atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
678
679
cat > media/nuageinit/user-data << 'EOF'
680
#cloud-config
681
chpasswd:
682
expire: false
683
list: |
684
sys:plop
685
user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
686
root:R
687
EOF
688
689
atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
690
atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
691
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
692
atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
693
}
694
695
nocloud_userdata_cloudconfig_chpasswd_list_list_head()
696
{
697
atf_set "require.user" root
698
}
699
nocloud_userdata_cloudconfig_chpasswd_list_list_body()
700
{
701
mkdir -p etc
702
cat > etc/master.passwd << EOF
703
root:*:0:0::0:0:Charlie &:/root:/bin/sh
704
sys:*:1:0::0:0:Sys:/home/sys:/bin/sh
705
user:*:1:0::0:0:Sys:/home/sys:/bin/sh
706
EOF
707
pwd_mkdb -d etc "${PWD}"/etc/master.passwd
708
cat > etc/group << EOF
709
wheel:*:0:root
710
users:*:1:
711
EOF
712
mkdir -p media/nuageinit
713
printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data
714
cat > media/nuageinit/user-data << 'EOF'
715
#cloud-config
716
chpasswd:
717
expire: true
718
list:
719
- sys:RANDOM
720
EOF
721
722
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud
723
atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
724
atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
725
726
cat > media/nuageinit/user-data << 'EOF'
727
#cloud-config
728
chpasswd:
729
expire: false
730
list:
731
- sys:plop
732
- user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
733
- root:R
734
EOF
735
736
atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
737
atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys
738
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
739
atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root
740
}
741
742
config2_userdata_runcmd_head()
743
{
744
atf_set "require.user" root
745
}
746
config2_userdata_runcmd_body()
747
{
748
mkdir -p media/nuageinit
749
setup_test_adduser
750
printf "{}" > media/nuageinit/meta_data.json
751
cat > media/nuageinit/user_data << 'EOF'
752
#cloud-config
753
runcmd:
754
EOF
755
chmod 755 "${PWD}"/media/nuageinit/user_data
756
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
757
cat > media/nuageinit/user_data << 'EOF'
758
#cloud-config
759
runcmd:
760
- plop
761
EOF
762
chmod 755 "${PWD}"/media/nuageinit/user_data
763
atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
764
test -f var/cache/nuageinit/runcmds || atf_fail "File not created"
765
test -x var/cache/nuageinit/runcmds || atf_fail "Missing execution permission"
766
atf_check -o inline:"#!/bin/sh\nplop\n" cat var/cache/nuageinit/runcmds
767
768
cat > media/nuageinit/user_data << 'EOF'
769
#cloud-config
770
runcmd:
771
- echo "yeah!"
772
- uname -s
773
EOF
774
chmod 755 "${PWD}"/media/nuageinit/user_data
775
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
776
atf_check -o inline:"#!/bin/sh\necho \"yeah!\"\nuname -s\n" cat var/cache/nuageinit/runcmds
777
}
778
779
config2_userdata_packages_head()
780
{
781
atf_set "require.user" root
782
}
783
784
config2_userdata_packages_body()
785
{
786
mkdir -p media/nuageinit
787
setup_test_adduser
788
export NUAGE_RUN_TESTS=1
789
printf "{}" > media/nuageinit/meta_data.json
790
cat > media/nuageinit/user_data << 'EOF'
791
#cloud-config
792
packages:
793
EOF
794
chmod 755 "${PWD}"/media/nuageinit/user_data
795
atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
796
cat > media/nuageinit/user_data << 'EOF'
797
#cloud-config
798
packages:
799
- yeah/plop
800
EOF
801
chmod 755 "${PWD}"/media/nuageinit/user_data
802
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
803
804
cat > media/nuageinit/user_data << 'EOF'
805
#cloud-config
806
packages:
807
- curl
808
EOF
809
chmod 755 "${PWD}"/media/nuageinit/user_data
810
atf_check -o inline:"pkg install -y curl\npkg info -q curl\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
811
812
cat > media/nuageinit/user_data << 'EOF'
813
#cloud-config
814
packages:
815
- curl
816
- meh: bla
817
EOF
818
chmod 755 "${PWD}"/media/nuageinit/user_data
819
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
820
}
821
822
config2_userdata_update_packages_body()
823
{
824
mkdir -p media/nuageinit
825
setup_test_adduser
826
export NUAGE_RUN_TESTS=1
827
printf "{}" > media/nuageinit/meta_data.json
828
cat > media/nuageinit/user_data << 'EOF'
829
#cloud-config
830
package_update: true
831
EOF
832
chmod 755 "${PWD}"/media/nuageinit/user_data
833
atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg update\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
834
}
835
836
config2_userdata_upgrade_packages_body()
837
{
838
mkdir -p media/nuageinit
839
setup_test_adduser
840
export NUAGE_RUN_TESTS=1
841
printf "{}" > media/nuageinit/meta_data.json
842
cat > media/nuageinit/user_data << 'EOF'
843
#cloud-config
844
package_upgrade: true
845
EOF
846
chmod 755 "${PWD}"/media/nuageinit/user_data
847
atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg upgrade\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
848
}
849
850
config2_userdata_shebang_body()
851
{
852
mkdir -p media/nuageinit
853
setup_test_adduser
854
printf "{}" > media/nuageinit/meta_data.json
855
cat > media/nuageinit/user_data <<EOF
856
#!/we/dont/care
857
anything
858
EOF
859
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
860
test -f var/cache/nuageinit/user_data || atf_fail "File not created"
861
test -x var/cache/nuageinit/user_data || atf_fail "Missing execution permission"
862
atf_check -o inline:"#!/we/dont/care\nanything\n" cat var/cache/nuageinit/user_data
863
cat > media/nuageinit/user_data <<EOF
864
/we/dont/care
865
EOF
866
rm var/cache/nuageinit/user_data
867
if [ -f var/cache/nuageinit/user_data ]; then
868
atf_fail "File should not have been created"
869
fi
870
}
871
872
config2_userdata_write_files_body()
873
{
874
mkdir -p media/nuageinit
875
setup_test_adduser
876
printf "{}" > media/nuageinit/meta_data.json
877
cat > media/nuageinit/user_data <<EOF
878
#cloud-config
879
write_files:
880
- content: "plop"
881
path: /file1
882
- path: /emptyfile
883
- content: !!binary |
884
YmxhCg==
885
path: /file_base64
886
encoding: b64
887
permissions: '0755'
888
owner: nobody
889
- content: "bob"
890
path: "/foo"
891
defer: true
892
EOF
893
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
894
atf_check -o inline:"plop" cat file1
895
atf_check -o inline:"" cat emptyfile
896
atf_check -o inline:"bla\n" cat file_base64
897
test -f foo && atf_fail "foo creation should have been deferred"
898
atf_check -o match:"^-rwxr-xr-x.*nobody" ls -l file_base64
899
rm file1 emptyfile file_base64
900
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
901
test -f file1 -o -f emptyfile -o -f file_base64 && atf_fail "defer not working properly"
902
atf_check -o inline:"bob" cat foo
903
}
904
905
config2_userdata_fqdn_and_hostname_body()
906
{
907
mkdir -p media/nuageinit
908
setup_test_adduser
909
printf "{}" > media/nuageinit/meta_data.json
910
cat > media/nuageinit/user_data <<EOF
911
#cloud-config
912
fqdn: host.domain.tld
913
hostname: host
914
EOF
915
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
916
atf_check -o inline:"hostname=\"host.domain.tld\"\n" cat ${PWD}/etc/rc.conf.d/hostname
917
cat > media/nuageinit/user_data <<EOF
918
#cloud-config
919
hostname: host
920
EOF
921
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
922
atf_check -o inline:"hostname=\"host\"\n" cat ${PWD}/etc/rc.conf.d/hostname
923
}
924
925
atf_init_test_cases()
926
{
927
atf_add_test_case args
928
atf_add_test_case nocloud
929
atf_add_test_case nocloud_userdata_script
930
atf_add_test_case nocloud_user_data_script
931
atf_add_test_case nocloud_userdata_cloudconfig_users
932
atf_add_test_case nocloud_network
933
atf_add_test_case config2
934
atf_add_test_case config2_pubkeys
935
atf_add_test_case config2_pubkeys_user_data
936
atf_add_test_case config2_pubkeys_meta_data
937
atf_add_test_case config2_network
938
atf_add_test_case config2_network_static_v4
939
atf_add_test_case config2_ssh_keys
940
atf_add_test_case nocloud_userdata_cloudconfig_ssh_pwauth
941
atf_add_test_case nocloud_userdata_cloudconfig_chpasswd
942
atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
943
atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
944
atf_add_test_case config2_userdata_runcmd
945
atf_add_test_case config2_userdata_packages
946
atf_add_test_case config2_userdata_update_packages
947
atf_add_test_case config2_userdata_upgrade_packages
948
atf_add_test_case config2_userdata_shebang
949
atf_add_test_case config2_userdata_fqdn_and_hostname
950
atf_add_test_case config2_userdata_write_files
951
}
952
953