1*a49b3b10SBaptiste Daroussin#!/usr/libexec/flua 2*a49b3b10SBaptiste Daroussin--- 3*a49b3b10SBaptiste Daroussin-- SPDX-License-Identifier: BSD-2-Clause 4*a49b3b10SBaptiste Daroussin-- 5*a49b3b10SBaptiste Daroussin-- Copyright (c) 2026 Baptiste Daroussin <bapt@FreeBSD.org> 6*a49b3b10SBaptiste Daroussin 7*a49b3b10SBaptiste Daroussinlocal n = require("nuage") 8*a49b3b10SBaptiste Daroussin 9*a49b3b10SBaptiste Daroussinlocal root = os.getenv("NUAGE_FAKE_ROOTDIR") 10*a49b3b10SBaptiste Daroussinif not root then 11*a49b3b10SBaptiste Daroussin root = "" 12*a49b3b10SBaptiste Daroussinend 13*a49b3b10SBaptiste Daroussin 14*a49b3b10SBaptiste Daroussinlocal function get_localbase() 15*a49b3b10SBaptiste Daroussin local f = io.popen("sysctl -in user.localbase 2> /dev/null") 16*a49b3b10SBaptiste Daroussin local lb = f:read("*l") 17*a49b3b10SBaptiste Daroussin f:close() 18*a49b3b10SBaptiste Daroussin if lb == nil or lb:len() == 0 then 19*a49b3b10SBaptiste Daroussin lb = "/usr/local" 20*a49b3b10SBaptiste Daroussin end 21*a49b3b10SBaptiste Daroussin return lb 22*a49b3b10SBaptiste Daroussinend 23*a49b3b10SBaptiste Daroussin 24*a49b3b10SBaptiste Daroussinlocal function read_sudoers() 25*a49b3b10SBaptiste Daroussin local path = root .. get_localbase() .. "/etc/sudoers.d/90-nuageinit-users" 26*a49b3b10SBaptiste Daroussin local f = io.open(path, "r") 27*a49b3b10SBaptiste Daroussin if not f then 28*a49b3b10SBaptiste Daroussin return nil 29*a49b3b10SBaptiste Daroussin end 30*a49b3b10SBaptiste Daroussin local content = f:read("*a") 31*a49b3b10SBaptiste Daroussin f:close() 32*a49b3b10SBaptiste Daroussin return content 33*a49b3b10SBaptiste Daroussinend 34*a49b3b10SBaptiste Daroussin 35*a49b3b10SBaptiste Daroussin-- test with a single string rule 36*a49b3b10SBaptiste Daroussinn.addsudo({ name = "testuser", sudo = "ALL=(ALL) NOPASSWD:ALL" }) 37*a49b3b10SBaptiste Daroussinlocal content = read_sudoers() 38*a49b3b10SBaptiste Daroussinif not content then 39*a49b3b10SBaptiste Daroussin n.err("sudoers file not created") 40*a49b3b10SBaptiste Daroussinend 41*a49b3b10SBaptiste Daroussinif content ~= "testuser ALL=(ALL) NOPASSWD:ALL\n" then 42*a49b3b10SBaptiste Daroussin n.err("unexpected sudoers content for string rule: '" .. content .. "'") 43*a49b3b10SBaptiste Daroussinend 44*a49b3b10SBaptiste Daroussin 45*a49b3b10SBaptiste Daroussin-- remove file for next test 46*a49b3b10SBaptiste Daroussinos.remove(root .. get_localbase() .. "/etc/sudoers.d/90-nuageinit-users") 47*a49b3b10SBaptiste Daroussin 48*a49b3b10SBaptiste Daroussin-- test with a table of rules 49*a49b3b10SBaptiste Daroussinn.addsudo({ 50*a49b3b10SBaptiste Daroussin name = "testuser", 51*a49b3b10SBaptiste Daroussin sudo = { "ALL=(ALL) NOPASSWD:/usr/sbin/pw", "ALL=(ALL) ALL" } 52*a49b3b10SBaptiste Daroussin}) 53*a49b3b10SBaptiste Daroussincontent = read_sudoers() 54*a49b3b10SBaptiste Daroussinif not content then 55*a49b3b10SBaptiste Daroussin n.err("sudoers file not created for table") 56*a49b3b10SBaptiste Daroussinend 57*a49b3b10SBaptiste Daroussinif content ~= "testuser ALL=(ALL) NOPASSWD:/usr/sbin/pw\ntestuser ALL=(ALL) ALL\n" then 58*a49b3b10SBaptiste Daroussin n.err("unexpected sudoers content for table: '" .. content .. "'") 59*a49b3b10SBaptiste Daroussinend 60*a49b3b10SBaptiste Daroussin 61*a49b3b10SBaptiste Daroussinos.exit(0) 62