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