import (
"fmt"
+ "io/fs"
"net"
"os"
"os/exec"
t.Fatal(err)
}
+ var userStr, groupStr string
+ {
+ u, uid, g, gid := ft.CurrentUserAndGroup()
+ userStr = fmt.Sprintf("%s(%d)", u, uid)
+ groupStr = fmt.Sprintf("%s(%d)", g, gid)
+ }
+
+ changesPath := "/tmp/kjn8W3OR4LFwo4Iw7YLY5"
+ _, err = os.Stat(changesPath)
+ if err == nil {
+ // Very unlikely, but just in case
+ t.Fatalf("%q already exists, aborting to prevent data loss",
+ changesPath)
+ }
+
var suffix string
// Needs different options in sshd_config
if runtime.GOOS == "openbsd" {
ft.CreateFile("no-changes.example.org/permissions.yaml",
noChangePermissions, 0644)
+ changesPermissions := `
+/: 0755 root root
+/tmp: 1777 root root
+/tmp/kjn8W3OR4LFwo4Iw7YLY5/file: 0604
+/tmp/kjn8W3OR4LFwo4Iw7YLY5/template: 0400
+`
+ if runtime.GOOS == "openbsd" || runtime.GOOS == "freebsd" {
+ changesPermissions = `
+/: 0755 root wheel
+/tmp: 1777 root wheel
+/tmp/kjn8W3OR4LFwo4Iw7YLY5/file: 0604
+/tmp/kjn8W3OR4LFwo4Iw7YLY5/template: 0400
+`
+ }
+ ft.CreateFile("changes.example.org/permissions.yaml",
+ changesPermissions, 0644)
+
ciRun := len(os.Getenv("SAFCM_CI_RUN")) != 0
isRoot := os.Getuid() == 0
skipUnlessHarmless := !(ciRun || !isRoot)
nil,
},
+ {
+ "changes",
+ skipUnlessHarmless,
+ false,
+ []string{"changes.example.org"},
+ `<LOG>[info] [changes.example.org]
+changed 7 file(s):
+"/tmp/kjn8W3OR4LFwo4Iw7YLY5": created, dir, USER GROUP, 0755
+"/tmp/kjn8W3OR4LFwo4Iw7YLY5/dir": created, dir, USER GROUP, 0755
+"/tmp/kjn8W3OR4LFwo4Iw7YLY5/dir/.gitignore": created, file, USER GROUP, 0644
+"/tmp/kjn8W3OR4LFwo4Iw7YLY5/executable": created, file, USER GROUP, 0755
+"/tmp/kjn8W3OR4LFwo4Iw7YLY5/file": created, file, USER GROUP, 0604
+"/tmp/kjn8W3OR4LFwo4Iw7YLY5/symlink": created, symlink, USER GROUP, 0777
+"/tmp/kjn8W3OR4LFwo4Iw7YLY5/template": created, file, USER GROUP, 0400
+`,
+ nil,
+ },
+ {
+ "changes (up-to-date)",
+ skipUnlessHarmless,
+ false,
+ []string{"changes.example.org"},
+ `<LOG>[info] [changes.example.org] no changes
+`,
+ nil,
+ },
+
{
"no effect commands (dry-run)",
false,
tmp = append(tmp, x)
}
res := strings.Join(tmp, "\n")
+ // Adapt output to current user/group
+ tc.exp = strings.ReplaceAll(tc.exp, "USER", userStr)
+ tc.exp = strings.ReplaceAll(tc.exp, "GROUP", groupStr)
testutil.AssertEqual(t, "res", res, tc.exp)
testutil.AssertErrorEqual(t, "err", err, tc.expErr)
})
}
+ if !skipUnlessHarmless {
+ t.Run("check result of changes.example.org", func(t *testing.T) {
+ exp := []ft.File{
+ {
+ Path: ".",
+ Mode: fs.ModeDir | 0755,
+ },
+ {
+ Path: "dir",
+ Mode: fs.ModeDir | 0755,
+ },
+ {
+ Path: "dir/.gitignore",
+ Mode: 0644,
+ Data: []byte{},
+ },
+ {
+ Path: "executable",
+ Mode: 0755,
+ Data: []byte("#!/bin/sh\n\necho 'Hello World!'\n"),
+ },
+ {
+ Path: "file",
+ Mode: 0604,
+ Data: []byte("just\na\nsmall\ntext\nfile\n"),
+ },
+ {
+ Path: "symlink",
+ Mode: fs.ModeSymlink | 0777,
+ Data: []byte("file"),
+ },
+ {
+ Path: "template",
+ Mode: 0400,
+ Data: []byte("\n>> changes\n\n"),
+ },
+ }
+
+ files, err := ft.WalkDir(changesPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+ testutil.AssertEqual(t, "files", files, exp)
+ })
+ }
+
err = os.RemoveAll(remotePath)
if err != nil {
t.Fatal(err)
}
+ err = os.RemoveAll(changesPath)
+ if err != nil {
+ t.Fatal(err)
+ }
}
// vi: set noet ts=4 sw=4 sts=4: