xref: /freebsd/libexec/nuageinit/tests/addsudo.lua (revision a49b3b10aae2db1f4a4ecf310fdedc80eb6bb7e2)
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