Path: blob/main/libexec/nuageinit/tests/nuageinit.sh
104014 views
#-1# Copyright (c) 2022-2025 Baptiste Daroussin <[email protected]>2# Copyright (c) 2025 Jesús Daniel Colmenares Oviedo <[email protected]>3#4# SPDX-License-Identifier: BSD-2-Clause5#67export NUAGE_FAKE_ROOTDIR="$PWD"89atf_test_case args10atf_test_case nocloud11atf_test_case nocloud_userdata_script12atf_test_case nocloud_user_data_script13atf_test_case nocloud_userdata_cloudconfig_users14atf_test_case nocloud_network15atf_test_case config216atf_test_case config2_pubkeys17atf_test_case config2_pubkeys_user_data18atf_test_case config2_pubkeys_meta_data19atf_test_case config2_network20atf_test_case config2_network_static_v421atf_test_case config2_ssh_keys22atf_test_case nocloud_userdata_cloudconfig_ssh_pwauth23atf_test_case nocloud_userdata_cloudconfig_chpasswd24atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_string25atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_list26atf_test_case config2_userdata_runcmd27atf_test_case config2_userdata_packages28atf_test_case config2_userdata_update_packages29atf_test_case config2_userdata_upgrade_packages30atf_test_case config2_userdata_shebang31atf_test_case config2_userdata_fqdn_and_hostname32atf_test_case config2_userdata_write_files3334setup_test_adduser()35{36here=$(pwd)37export NUAGE_FAKE_ROOTDIR=$(pwd)38mkdir -p etc/ssh39cat > etc/master.passwd << EOF40root:*:0:0::0:0:Charlie &:/root:/bin/csh41sys:*:1:0::0:0:Sys:/home/sys:/bin/csh42EOF43pwd_mkdb -d etc ${here}/etc/master.passwd44cat > etc/group << EOF45wheel:*:0:root46users:*:1:47EOF48}4950args_body()51{52atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit53atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla54atf_check -s exit:1 -e inline:"Usage: /usr/libexec/nuageinit <cloud-init-directory> (<config-2> | <nocloud>)\n" /usr/libexec/nuageinit bla meh plop55atf_check -s exit:1 -e inline:"nuageinit: Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh56}5758nocloud_body()59{60mkdir -p media/nuageinit61setup_test_adduser62atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit/ nocloud63printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > "${PWD}"/media/nuageinit/meta-data64atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud65atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname66cat > media/nuageinit/meta-data << EOF67instance-id: iid-local0168hostname: myhost69EOF70atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud71atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname72}7374nocloud_userdata_script_body()75{76mkdir -p media/nuageinit77printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data78printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user-data79chmod 755 "${PWD}"/media/nuageinit/user-data80atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud81atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data82}8384nocloud_user_data_script_body()85{86mkdir -p media/nuageinit87printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data88printf "#!/bin/sh\necho yeah\n" > "${PWD}"/media/nuageinit/user_data89chmod 755 "${PWD}"/media/nuageinit/user_data90atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud91atf_check -o inline:"#!/bin/sh\necho yeah\n" cat var/cache/nuageinit/user_data92}9394nocloud_userdata_cloudconfig_users_head()95{96atf_set "require.user" root97}98nocloud_userdata_cloudconfig_users_body()99{100mkdir -p media/nuageinit101printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data102mkdir -p etc103cat > etc/master.passwd << EOF104root:*:0:0::0:0:Charlie &:/root:/bin/sh105sys:*:1:0::0:0:Sys:/home/sys:/bin/sh106EOF107pwd_mkdb -d etc "${PWD}"/etc/master.passwd108cat > etc/group << EOF109wheel:*:0:root110users:*:1:111EOF112cat > media/nuageinit/user-data << 'EOF'113#cloud-config114groups:115- admingroup: [root,sys]116- cloud-users117users:118- default119- name: foobar120gecos: Foo B. Bar121primary_group: foobar122sudo: ALL=(ALL) NOPASSWD:ALL123doas: permit persist %u as root124groups: users125passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/126- name: bla127sudo:128- "ALL=(ALL) NOPASSWD:/usr/sbin/pw"129- "ALL=(ALL) ALL"130doas:131- "deny %u as foobar"132- "permit persist %u as root cmd whoami"133EOF134atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud135atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet136cat > expectedgroup << EOF137wheel:*:0:root,freebsd138users:*:1:foobar139admingroup:*:1001:root,sys140cloud-users:*:1002:141freebsd:*:1003:142foobar:*:1004:143bla:*:1005:144EOF145cat > expectedpasswd << 'EOF'146root:*:0:0::0:0:Charlie &:/root:/bin/sh147sys:*:1:0::0:0:Sys:/home/sys:/bin/sh148freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh149foobar:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh150bla::1003:1005::0:0:bla User:/home/bla:/bin/sh151EOF152sed -i "" "s/freebsd:.*:1001/freebsd:freebsd:1001/" "${PWD}"/etc/master.passwd153atf_check -o file:expectedpasswd cat "${PWD}"/etc/master.passwd154atf_check -o file:expectedgroup cat "${PWD}"/etc/group155localbase=`sysctl -ni user.localbase 2> /dev/null`156if [ -z "${localbase}" ]; then157# fallback158localbase="/usr/local"159fi160atf_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"161atf_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"162}163164nocloud_network_head()165{166atf_set "require.user" root167}168nocloud_network_body()169{170mkdir -p media/nuageinit171mkdir -p etc172cat > etc/master.passwd << EOF173root:*:0:0::0:0:Charlie &:/root:/bin/sh174sys:*:1:0::0:0:Sys:/home/sys:/bin/sh175EOF176pwd_mkdb -d etc "${PWD}"/etc/master.passwd177cat > etc/group << EOF178wheel:*:0:root179users:*:1:180EOF181mynetworks=$(ifconfig -l ether)182if [ -z "$mynetworks" ]; then183atf_skip "a network interface is needed"184fi185set -- $mynetworks186myiface=$1187myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')188printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data189cat > media/nuageinit/user-data << EOF190#cloud-config191network:192version: 2193ethernets:194# opaque ID for physical interfaces, only referred to by other stanzas195id0:196match:197macaddress: "$myaddr"198addresses:199- 192.0.2.2/24200- 2001:db8::2/64201gateway4: 192.0.2.1202gateway6: 2001:db8::1203EOF204atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud205cat > network << EOF206ifconfig_${myiface}="inet 192.0.2.2/24"207ifconfig_${myiface}_ipv6="inet6 2001:db8::2/64"208ipv6_network_interfaces="${myiface}"209ipv6_default_interface="${myiface}"210EOF211cat > routing << EOF212defaultrouter="192.0.2.1"213ipv6_defaultrouter="2001:db8::1"214ipv6_route_${myiface}="2001:db8::1 -prefixlen 128 -interface ${myiface}"215EOF216atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network217atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing218}219220config2_body()221{222mkdir -p media/nuageinit223setup_test_adduser224atf_check -s exit:1 -e match:"nuageinit: error parsing config-2 meta_data.json:.*" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2225printf "{}" > media/nuageinit/meta_data.json226atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2227cat > media/nuageinit/meta_data.json << EOF228{229"hostname": "cloudimg"230}231EOF232atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2233atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname234}235236config2_pubkeys_head()237{238atf_set "require.user" root239}240config2_pubkeys_body()241{242mkdir -p media/nuageinit243touch media/nuageinit/meta_data.json244cat > media/nuageinit/user-data << EOF245#cloud-config246ssh_authorized_keys:247- "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"248EOF249mkdir -p etc250cat > etc/master.passwd << EOF251root:*:0:0::0:0:Charlie &:/root:/bin/sh252sys:*:1:0::0:0:Sys:/home/sys:/bin/sh253EOF254pwd_mkdb -d etc "${PWD}"/etc/master.passwd255cat > etc/group << EOF256wheel:*:0:root257users:*:1:258EOF259atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2260atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys261}262263config2_pubkeys_user_data_head()264{265atf_set "require.user" root266}267config2_pubkeys_user_data_body()268{269mkdir -p media/nuageinit270touch media/nuageinit/meta_data.json271cat > media/nuageinit/user_data << EOF272#cloud-config273ssh_authorized_keys:274- "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"275EOF276mkdir -p etc277cat > etc/master.passwd << EOF278root:*:0:0::0:0:Charlie &:/root:/bin/sh279sys:*:1:0::0:0:Sys:/home/sys:/bin/sh280EOF281pwd_mkdb -d etc "${PWD}"/etc/master.passwd282cat > etc/group << EOF283wheel:*:0:root284users:*:1:285EOF286atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2287atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys288}289290config2_pubkeys_meta_data_body()291{292here=$(pwd)293export NUAGE_FAKE_ROOTDIR=$(pwd)294if [ $(id -u) -ne 0 ]; then295atf_skip "root required"296fi297mkdir -p media/nuageinit298cat > media/nuageinit/meta_data.json << EOF299{300"uuid": "uuid_for_this_instance",301"admin_pass": "a_generated_password",302"public_keys": {303"tdb": "ssh-ed25519 my_key_id tdb@host"304},305"keys": [306{307"name": "tdb",308"type": "ssh",309"data": "ssh-ed25519 my_key_id tdb@host"310}311],312"hostname": "freebsd-14-test.novalocal",313"name": "freebsd-14-test",314"launch_index": 0,315"availability_zone": "nova",316"random_seed": "long_random_seed",317"project_id": "my_project_id",318"devices": [],319"dedicated_cpus": []320}321EOF322mkdir -p etc323cat > etc/master.passwd << EOF324root:*:0:0::0:0:Charlie &:/root:/bin/csh325sys:*:1:0::0:0:Sys:/home/sys:/bin/csh326EOF327pwd_mkdb -d etc ${here}/etc/master.passwd328cat > etc/group << EOF329wheel:*:0:root330users:*:1:331EOF332atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2333atf_check -o inline:"ssh-ed25519 my_key_id tdb@host\n" cat home/freebsd/.ssh/authorized_keys334}335336config2_network_body()337{338mkdir -p media/nuageinit339setup_test_adduser340printf "{}" > media/nuageinit/meta_data.json341mynetworks=$(ifconfig -l ether)342if [ -z "$mynetworks" ]; then343atf_skip "a network interface is needed"344fi345set -- $mynetworks346myiface=$1347myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')348cat > media/nuageinit/network_data.json << EOF349{350"links": [351{352"ethernet_mac_address": "$myaddr",353"id": "iface0",354"mtu": null355}356],357"networks": [358{359"id": "network0",360"link": "iface0",361"type": "ipv4_dhcp"362},363{ // IPv6364"id": "private-ipv4",365"type": "ipv6",366"link": "iface0",367// supports condensed IPv6 with CIDR netmask368"ip_address": "2001:db8::3257:9652/64",369"gateway": "fd00::1",370"routes": [371{372"network": "::",373"netmask": "::",374"gateway": "fd00::1"375},376{377"network": "::",378"netmask": "ffff:ffff:ffff::",379"gateway": "fd00::1:1"380}381],382"network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"383}384]385}386EOF387atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2388cat > network << EOF389ifconfig_${myiface}="DHCP"390ifconfig_${myiface}_ipv6="inet6 2001:db8::3257:9652/64"391ipv6_network_interfaces="${myiface}"392ipv6_default_interface="${myiface}"393EOF394cat > routing << EOF395ipv6_defaultrouter="fd00::1"396ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"397ipv6_static_routes="${myiface}"398EOF399atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network400atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing401}402403config2_network_static_v4_body()404{405mkdir -p media/nuageinit406setup_test_adduser407printf "{}" > media/nuageinit/meta_data.json408mynetworks=$(ifconfig -l ether)409if [ -z "$mynetworks" ]; then410atf_skip "a network interface is needed"411fi412set -- $mynetworks413myiface=$1414myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')415cat > media/nuageinit/network_data.json << EOF416{417"links": [418{419"ethernet_mac_address": "$myaddr",420"id": "iface0",421"mtu": null422}423],424"networks": [425{426"id": "network0",427"link": "iface0",428"type": "ipv4",429"ip_address": "10.184.0.244",430"netmask": "255.255.240.0",431"routes": [432{433"network": "10.0.0.0",434"netmask": "255.0.0.0",435"gateway": "11.0.0.1"436},437{438"network": "0.0.0.0",439"netmask": "0.0.0.0",440"gateway": "23.253.157.1"441}442]443}444]445}446EOF447atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2448cat > network << EOF449ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"450EOF451cat > routing << EOF452route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"453defaultrouter="23.253.157.1"454static_routes="cloudinit1_${myiface}"455EOF456atf_check -o file:network cat "${PWD}"/etc/rc.conf.d/network457atf_check -o file:routing cat "${PWD}"/etc/rc.conf.d/routing458}459460config2_ssh_keys_head()461{462atf_set "require.user" root463}464config2_ssh_keys_body()465{466here=$(pwd)467export NUAGE_FAKE_ROOTDIR=$(pwd)468mkdir -p media/nuageinit469touch media/nuageinit/meta_data.json470cat > media/nuageinit/user-data << EOF471#cloud-config472ssh_keys:473rsa_private: |474-----BEGIN RSA PRIVATE KEY-----475MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco476...477-----END RSA PRIVATE KEY-----478rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...479ed25519_private: |480-----BEGIN OPENSSH PRIVATE KEY-----481blabla482...483-----END OPENSSH PRIVATE KEY-----484ed25519_public: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+485EOF486mkdir -p etc/ssh487cat > etc/master.passwd << EOF488root:*:0:0::0:0:Charlie &:/root:/bin/csh489sys:*:1:0::0:0:Sys:/home/sys:/bin/csh490EOF491pwd_mkdb -d etc ${here}/etc/master.passwd492cat > etc/group << EOF493wheel:*:0:root494users:*:1:495EOF496atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2497_expected="-----BEGIN RSA PRIVATE KEY-----498MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qco499...500-----END RSA PRIVATE KEY-----501502"503atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key504_expected="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7Xd ...\n"505atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_rsa_key.pub506_expected="-----BEGIN OPENSSH PRIVATE KEY-----507blabla508...509-----END OPENSSH PRIVATE KEY-----510511"512atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key513_expected="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+MH4E8KO32N5CXRvXVqvyZVl0+6ue4DobdhU0FqFd+\n"514atf_check -o inline:"${_expected}" cat ${PWD}/etc/ssh/ssh_host_ed25519_key.pub515}516517518nocloud_userdata_cloudconfig_ssh_pwauth_head()519{520atf_set "require.user" root521}522nocloud_userdata_cloudconfig_ssh_pwauth_body()523{524mkdir -p etc525cat > etc/master.passwd << EOF526root:*:0:0::0:0:Charlie &:/root:/bin/sh527sys:*:1:0::0:0:Sys:/home/sys:/bin/sh528EOF529pwd_mkdb -d etc "${PWD}"/etc/master.passwd530cat > etc/group << EOF531wheel:*:0:root532users:*:1:533EOF534mkdir -p media/nuageinit535printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data536cat > media/nuageinit/user-data << 'EOF'537#cloud-config538ssh_pwauth: true539EOF540mkdir -p etc/ssh/541touch etc/ssh/sshd_config542543atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud544atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config545546# Same value we don't touch anything547printf " PasswordAuthentication yes # I want password\n" > etc/ssh/sshd_config548atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud549atf_check -o inline:" PasswordAuthentication yes # I want password\n" cat etc/ssh/sshd_config550551printf " PasswordAuthentication no # Should change\n" > etc/ssh/sshd_config552atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud553atf_check -o inline:"PasswordAuthentication yes\n" cat etc/ssh/sshd_config554555cat > media/nuageinit/user-data << 'EOF'556#cloud-config557ssh_pwauth: false558EOF559560printf " PasswordAuthentication no # no passwords\n" > etc/ssh/sshd_config561atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud562atf_check -o inline:" PasswordAuthentication no # no passwords\n" cat etc/ssh/sshd_config563564printf " PasswordAuthentication yes # Should change\n" > etc/ssh/sshd_config565atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud566atf_check -o inline:"PasswordAuthentication no\n" cat etc/ssh/sshd_config567}568569nocloud_userdata_cloudconfig_chpasswd_head()570{571atf_set "require.user" root572}573nocloud_userdata_cloudconfig_chpasswd_body()574{575mkdir -p etc576cat > etc/master.passwd << EOF577root:*:0:0::0:0:Charlie &:/root:/bin/sh578sys:*:1:0::0:0:Sys:/home/sys:/bin/sh579user:*:1:0::0:0:Sys:/home/sys:/bin/sh580EOF581pwd_mkdb -d etc "${PWD}"/etc/master.passwd582cat > etc/group << EOF583wheel:*:0:root584users:*:1:585EOF586mkdir -p media/nuageinit587printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data588cat > media/nuageinit/user-data << 'EOF'589#cloud-config590chpasswd:591expire: true592users:593- { user: "sys", password: RANDOM }594EOF595596atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud597atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'name'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet598# nothing modified599atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys600601cat > media/nuageinit/user-data << 'EOF'602#cloud-config603chpasswd:604expire: true605users:606- { name: "sys", pwd: RANDOM }607EOF608atf_check -o empty -e inline:"nuageinit: Invalid entry for chpasswd.users: missing 'password'\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet609# nothing modified610atf_check -o inline:"sys:*:1:0::0:0:Sys:/home/sys:/bin/sh\n" pw -R $(pwd) usershow sys611612cat > media/nuageinit/user-data << 'EOF'613#cloud-config614chpasswd:615expire: false616users:617- { name: "sys", password: RANDOM }618EOF619# not empty because the password is printed to stdout620atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet621atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys622623cat > media/nuageinit/user-data << 'EOF'624#cloud-config625chpasswd:626expire: true627users:628- { name: "sys", password: RANDOM }629EOF630# not empty because the password is printed to stdout631atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet632atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys633634cat > media/nuageinit/user-data << 'EOF'635#cloud-config636chpasswd:637expire: true638users:639- { name: "user", password: "$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/" }640EOF641# not empty because the password is printed to stdout642atf_check -o empty -e empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet643atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::1:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user644}645646647nocloud_userdata_cloudconfig_chpasswd_list_string_head()648{649atf_set "require.user" root650}651nocloud_userdata_cloudconfig_chpasswd_list_string_body()652{653mkdir -p etc654cat > etc/master.passwd << EOF655root:*:0:0::0:0:Charlie &:/root:/bin/sh656sys:*:1:0::0:0:Sys:/home/sys:/bin/sh657user:*:1:0::0:0:Sys:/home/sys:/bin/sh658EOF659pwd_mkdb -d etc "${PWD}"/etc/master.passwd660cat > etc/group << EOF661wheel:*:0:root662users:*:1:663EOF664mkdir -p media/nuageinit665printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data666cat > media/nuageinit/user-data << 'EOF'667#cloud-config668chpasswd:669expire: true670list: |671sys:RANDOM672EOF673674atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud675atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet676atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys677678cat > media/nuageinit/user-data << 'EOF'679#cloud-config680chpasswd:681expire: false682list: |683sys:plop684user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/685root:R686EOF687688atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet689atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys690atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user691atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root692}693694nocloud_userdata_cloudconfig_chpasswd_list_list_head()695{696atf_set "require.user" root697}698nocloud_userdata_cloudconfig_chpasswd_list_list_body()699{700mkdir -p etc701cat > etc/master.passwd << EOF702root:*:0:0::0:0:Charlie &:/root:/bin/sh703sys:*:1:0::0:0:Sys:/home/sys:/bin/sh704user:*:1:0::0:0:Sys:/home/sys:/bin/sh705EOF706pwd_mkdb -d etc "${PWD}"/etc/master.passwd707cat > etc/group << EOF708wheel:*:0:root709users:*:1:710EOF711mkdir -p media/nuageinit712printf "instance-id: iid-local01\n" > "${PWD}"/media/nuageinit/meta-data713cat > media/nuageinit/user-data << 'EOF'714#cloud-config715chpasswd:716expire: true717list:718- sys:RANDOM719EOF720721atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit nocloud722atf_check -o empty -e inline:"nuageinit: chpasswd.list is deprecated consider using chpasswd.users\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet723atf_check -o match:'sys:\$.*:1:0::1:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys724725cat > media/nuageinit/user-data << 'EOF'726#cloud-config727chpasswd:728expire: false729list:730- sys:plop731- user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/732- root:R733EOF734735atf_check -o empty -e ignore /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet736atf_check -o match:'sys:\$.*:1:0::0:0:Sys:/home/sys:/bin/sh$' pw -R $(pwd) usershow sys737atf_check -o inline:'user:$6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1:0::0:0:Sys:/home/sys:/bin/sh\n' pw -R $(pwd) usershow user738atf_check -o match:'root:\$.*:0:0::0:0:Charlie &:/root:/bin/sh$' pw -R $(pwd) usershow root739}740741config2_userdata_runcmd_head()742{743atf_set "require.user" root744}745config2_userdata_runcmd_body()746{747mkdir -p media/nuageinit748setup_test_adduser749printf "{}" > media/nuageinit/meta_data.json750cat > media/nuageinit/user_data << 'EOF'751#cloud-config752runcmd:753EOF754chmod 755 "${PWD}"/media/nuageinit/user_data755atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2756cat > media/nuageinit/user_data << 'EOF'757#cloud-config758runcmd:759- plop760EOF761chmod 755 "${PWD}"/media/nuageinit/user_data762atf_check -s exit:0 /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2763test -f var/cache/nuageinit/runcmds || atf_fail "File not created"764test -x var/cache/nuageinit/runcmds || atf_fail "Missing execution permission"765atf_check -o inline:"#!/bin/sh\nplop\n" cat var/cache/nuageinit/runcmds766767cat > media/nuageinit/user_data << 'EOF'768#cloud-config769runcmd:770- echo "yeah!"771- uname -s772EOF773chmod 755 "${PWD}"/media/nuageinit/user_data774atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2775atf_check -o inline:"#!/bin/sh\necho \"yeah!\"\nuname -s\n" cat var/cache/nuageinit/runcmds776}777778config2_userdata_packages_head()779{780atf_set "require.user" root781}782783config2_userdata_packages_body()784{785mkdir -p media/nuageinit786setup_test_adduser787export NUAGE_RUN_TESTS=1788printf "{}" > media/nuageinit/meta_data.json789cat > media/nuageinit/user_data << 'EOF'790#cloud-config791packages:792EOF793chmod 755 "${PWD}"/media/nuageinit/user_data794atf_check /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet795cat > media/nuageinit/user_data << 'EOF'796#cloud-config797packages:798- yeah/plop799EOF800chmod 755 "${PWD}"/media/nuageinit/user_data801atf_check -s exit:0 -o inline:"pkg install -y yeah/plop\npkg info -q yeah/plop\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet802803cat > media/nuageinit/user_data << 'EOF'804#cloud-config805packages:806- curl807EOF808chmod 755 "${PWD}"/media/nuageinit/user_data809atf_check -o inline:"pkg install -y curl\npkg info -q curl\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet810811cat > media/nuageinit/user_data << 'EOF'812#cloud-config813packages:814- curl815- meh: bla816EOF817chmod 755 "${PWD}"/media/nuageinit/user_data818atf_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 postnet819}820821config2_userdata_update_packages_body()822{823mkdir -p media/nuageinit824setup_test_adduser825export NUAGE_RUN_TESTS=1826printf "{}" > media/nuageinit/meta_data.json827cat > media/nuageinit/user_data << 'EOF'828#cloud-config829package_update: true830EOF831chmod 755 "${PWD}"/media/nuageinit/user_data832atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg update\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet833}834835config2_userdata_upgrade_packages_body()836{837mkdir -p media/nuageinit838setup_test_adduser839export NUAGE_RUN_TESTS=1840printf "{}" > media/nuageinit/meta_data.json841cat > media/nuageinit/user_data << 'EOF'842#cloud-config843package_upgrade: true844EOF845chmod 755 "${PWD}"/media/nuageinit/user_data846atf_check -o inline:"env ASSUME_ALWAYS_YES=yes pkg upgrade\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet847}848849config2_userdata_shebang_body()850{851mkdir -p media/nuageinit852setup_test_adduser853printf "{}" > media/nuageinit/meta_data.json854cat > media/nuageinit/user_data <<EOF855#!/we/dont/care856anything857EOF858atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2859test -f var/cache/nuageinit/user_data || atf_fail "File not created"860test -x var/cache/nuageinit/user_data || atf_fail "Missing execution permission"861atf_check -o inline:"#!/we/dont/care\nanything\n" cat var/cache/nuageinit/user_data862cat > media/nuageinit/user_data <<EOF863/we/dont/care864EOF865rm var/cache/nuageinit/user_data866if [ -f var/cache/nuageinit/user_data ]; then867atf_fail "File should not have been created"868fi869}870871config2_userdata_write_files_body()872{873mkdir -p media/nuageinit874setup_test_adduser875printf "{}" > media/nuageinit/meta_data.json876cat > media/nuageinit/user_data <<EOF877#cloud-config878write_files:879- content: "plop"880path: /file1881- path: /emptyfile882- content: !!binary |883YmxhCg==884path: /file_base64885encoding: b64886permissions: '0755'887owner: nobody888- content: "bob"889path: "/foo"890defer: true891EOF892atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2893atf_check -o inline:"plop" cat file1894atf_check -o inline:"" cat emptyfile895atf_check -o inline:"bla\n" cat file_base64896test -f foo && atf_fail "foo creation should have been deferred"897atf_check -o match:"^-rwxr-xr-x.*nobody" ls -l file_base64898rm file1 emptyfile file_base64899atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet900test -f file1 -o -f emptyfile -o -f file_base64 && atf_fail "defer not working properly"901atf_check -o inline:"bob" cat foo902}903904config2_userdata_fqdn_and_hostname_body()905{906mkdir -p media/nuageinit907setup_test_adduser908printf "{}" > media/nuageinit/meta_data.json909cat > media/nuageinit/user_data <<EOF910#cloud-config911fqdn: host.domain.tld912hostname: host913EOF914atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2915atf_check -o inline:"hostname=\"host.domain.tld\"\n" cat ${PWD}/etc/rc.conf.d/hostname916cat > media/nuageinit/user_data <<EOF917#cloud-config918hostname: host919EOF920atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2921atf_check -o inline:"hostname=\"host\"\n" cat ${PWD}/etc/rc.conf.d/hostname922}923924atf_init_test_cases()925{926atf_add_test_case args927atf_add_test_case nocloud928atf_add_test_case nocloud_userdata_script929atf_add_test_case nocloud_user_data_script930atf_add_test_case nocloud_userdata_cloudconfig_users931atf_add_test_case nocloud_network932atf_add_test_case config2933atf_add_test_case config2_pubkeys934atf_add_test_case config2_pubkeys_user_data935atf_add_test_case config2_pubkeys_meta_data936atf_add_test_case config2_network937atf_add_test_case config2_network_static_v4938atf_add_test_case config2_ssh_keys939atf_add_test_case nocloud_userdata_cloudconfig_ssh_pwauth940atf_add_test_case nocloud_userdata_cloudconfig_chpasswd941atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string942atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list943atf_add_test_case config2_userdata_runcmd944atf_add_test_case config2_userdata_packages945atf_add_test_case config2_userdata_update_packages946atf_add_test_case config2_userdata_upgrade_packages947atf_add_test_case config2_userdata_shebang948atf_add_test_case config2_userdata_fqdn_and_hostname949atf_add_test_case config2_userdata_write_files950}951952953