git: eb677a598e68 - stable/15 - nuageinit: implement final_message support
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 28 Jun 2026 18:40:48 UTC
The branch stable/15 has been updated by bapt:
URL: https://cgit.FreeBSD.org/src/commit/?id=eb677a598e68f3e52066089a4d2a6f7b06fb43b8
commit eb677a598e68f3e52066089a4d2a6f7b06fb43b8
Author: Baptiste Daroussin <bapt@FreeBSD.org>
AuthorDate: 2026-06-05 21:03:45 +0000
Commit: Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2026-06-28 18:34:06 +0000
nuageinit: implement final_message support
(cherry picked from commit e01f202ecf9344bd6658869a869f36c5b3790384)
---
libexec/nuageinit/nuageinit | 25 +++++++++++++++++++++++++
libexec/nuageinit/tests/nuageinit.sh | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/libexec/nuageinit/nuageinit b/libexec/nuageinit/nuageinit
index 8a9c5c022862..1391aff13bd6 100755
--- a/libexec/nuageinit/nuageinit
+++ b/libexec/nuageinit/nuageinit
@@ -784,6 +784,30 @@ local function power_state_change(obj)
os.execute(cmd)
end
+local function get_uptime()
+ -- Get system uptime in seconds
+ local f = io.popen("sysctl -n kern.boottime 2>/dev/null")
+ local boottime = f:read("*a")
+ f:close()
+ local sec = boottime:match("sec = (%d+)")
+ if sec then
+ return os.time() - tonumber(sec)
+ end
+ return 0
+end
+
+local function final_message(obj)
+ if obj.final_message == nil then return end
+ local msg = obj.final_message
+ if type(msg) ~= "string" then
+ nuage.warn("final_message must be a string")
+ return
+ end
+ local uptime = tostring(math.floor(get_uptime()))
+ msg = msg:gsub("%$UPTIME", uptime)
+ nuage.warn(msg, false)
+end
+
local function chpasswd(obj)
if obj.chpasswd == nil then return end
nuage.chpasswd(obj.chpasswd)
@@ -1090,6 +1114,7 @@ elseif line == "#cloud-config" then
users,
chpasswd,
write_files_deferred,
+ final_message,
power_state_change,
}
diff --git a/libexec/nuageinit/tests/nuageinit.sh b/libexec/nuageinit/tests/nuageinit.sh
index 21cd2e8f17c5..2b4d316fd5ff 100644
--- a/libexec/nuageinit/tests/nuageinit.sh
+++ b/libexec/nuageinit/tests/nuageinit.sh
@@ -45,6 +45,8 @@ atf_test_case config2_userdata_power_state
atf_test_case config2_userdata_locale
atf_test_case config2_userdata_fqdn_and_hostname
atf_test_case config2_userdata_write_files
+atf_test_case config2_userdata_encode_base64
+atf_test_case config2_userdata_final_message
setup_test_adduser()
{
@@ -1382,6 +1384,38 @@ EOF
atf_check -o inline:"hostname=\"host\"\n" cat ${PWD}/etc/rc.conf.d/hostname
}
+config2_userdata_encode_base64_body()
+{
+ mkdir -p media/nuageinit
+ setup_test_adduser
+ atf_check -o inline:"dGVzdA==\n" \
+ /usr/libexec/flua -e "print(require('nuage').encode_base64('test'))"
+ atf_check -o inline:"dA==\n" \
+ /usr/libexec/flua -e "print(require('nuage').encode_base64('t'))"
+ atf_check -o inline:"dGU=\n" \
+ /usr/libexec/flua -e "print(require('nuage').encode_base64('te'))"
+ # Roundtrip test
+ atf_check -o inline:"hello world\n" \
+ /usr/libexec/flua -e "print(require('nuage').decode_base64(require('nuage').encode_base64('hello world')))"
+ # Empty input
+ atf_check -o inline:"\n" \
+ /usr/libexec/flua -e "print(require('nuage').encode_base64(''))"
+}
+
+config2_userdata_final_message_body()
+{
+ mkdir -p media/nuageinit
+ setup_test_adduser
+ export NUAGE_RUN_TESTS=1
+ printf "{}" > media/nuageinit/meta_data.json
+ cat > media/nuageinit/user_data << 'EOF'
+#cloud-config
+final_message: "System ready after $UPTIME seconds"
+EOF
+ atf_check -e match:"System ready after [0-9]+ seconds" \
+ /usr/libexec/nuageinit "${PWD}"/media/nuageinit postnet
+}
+
atf_init_test_cases()
{
atf_add_test_case args
@@ -1422,4 +1456,6 @@ atf_init_test_cases()
atf_add_test_case config2_userdata_locale
atf_add_test_case config2_userdata_fqdn_and_hostname
atf_add_test_case config2_userdata_write_files
+ atf_add_test_case config2_userdata_encode_base64
+ atf_add_test_case config2_userdata_final_message
}