X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=cmd%2Fsafcm%2Fsync_sync_test.go;h=614b5b0c72254dc17240db2a5e6888d9d355547e;hb=HEAD;hp=a5f65811e0d82297f642f01dcf027dd175ff9da3;hpb=20686d0d25d7d22f577fc80df31c192b6a88d318;p=safcm%2Fsafcm.git diff --git a/cmd/safcm/sync_sync_test.go b/cmd/safcm/sync_sync_test.go index a5f6581..614b5b0 100644 --- a/cmd/safcm/sync_sync_test.go +++ b/cmd/safcm/sync_sync_test.go @@ -1,17 +1,5 @@ -// Copyright (C) 2021 Simon Ruderich -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2021-2024 Simon Ruderich package main @@ -33,28 +21,26 @@ func TestHostSyncReq(t *testing.T) { if err != nil { t.Fatal(err) } - defer os.Chdir(cwd) + defer os.Chdir(cwd) //nolint:errcheck tests := []struct { name string project string host string detected []string - level safcm.LogLevel exp safcm.MsgSyncReq expEvents []string expErr error }{ // NOTE: Also update MsgSyncReq in safcm-remote test cases - // when changing anything here! + // changing the MsgSyncReq struct! { "project: host1", "project", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{ Groups: []string{ "all", @@ -64,8 +50,9 @@ func TestHostSyncReq(t *testing.T) { "host1.example.org", }, Files: map[string]*safcm.File{ - "/": &safcm.File{Path: "/", + "/": { OrigGroup: "group", + Path: "/", Mode: fs.ModeDir | 0755 | fs.ModeSetgid, Uid: -1, Gid: -1, @@ -73,14 +60,14 @@ func TestHostSyncReq(t *testing.T) { "touch /.update", }, }, - "/etc": &safcm.File{ + "/etc": { OrigGroup: "group", Path: "/etc", Mode: fs.ModeDir | 0755, Uid: -1, Gid: -1, }, - "/etc/.hidden": &safcm.File{ + "/etc/.hidden": { OrigGroup: "group", Path: "/etc/.hidden", Mode: 0100 | fs.ModeSetuid | fs.ModeSetgid | fs.ModeSticky, @@ -88,7 +75,7 @@ func TestHostSyncReq(t *testing.T) { Gid: -1, Data: []byte("..."), }, - "/etc/motd": &safcm.File{ + "/etc/motd": { OrigGroup: "group", Path: "/etc/motd", Mode: 0644, @@ -96,7 +83,7 @@ func TestHostSyncReq(t *testing.T) { Gid: -1, Data: []byte("Welcome to Host ONE\n\n\n\n\n\nall\n\n\nhost1.example.org\n\n\n\n"), }, - "/etc/rc.local": &safcm.File{ + "/etc/rc.local": { OrigGroup: "group", Path: "/etc/rc.local", Mode: 0700, @@ -107,7 +94,7 @@ func TestHostSyncReq(t *testing.T) { "/etc/rc.local", }, }, - "/etc/resolv.conf": &safcm.File{ + "/etc/resolv.conf": { OrigGroup: "group", Path: "/etc/resolv.conf", Mode: 0641, @@ -120,7 +107,7 @@ func TestHostSyncReq(t *testing.T) { "echo resolv.conf updated", }, }, - "/etc/test": &safcm.File{ + "/etc/test": { OrigGroup: "group", Path: "/etc/test", Mode: os.ModeSymlink | 0777, @@ -148,126 +135,23 @@ func TestHostSyncReq(t *testing.T) { }, }, []string{ - "host1.example.org: 3 host groups: all group group3 host1.example.org remove", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org", + "3 false host groups: all group group3 host1.example.org remove", + "3 false host group priorities (descending): host1.example.org", }, nil, }, - { - "project: host1 (log level info)", - "project", - "host1.example.org", - nil, - safcm.LogInfo, - safcm.MsgSyncReq{ - Groups: []string{ - "all", - "group", - "group3", - "remove", - "host1.example.org", - }, - Files: map[string]*safcm.File{ - "/": &safcm.File{Path: "/", - OrigGroup: "group", - Mode: fs.ModeDir | 0755 | fs.ModeSetgid, - Uid: -1, - Gid: -1, - TriggerCommands: []string{ - "touch /.update", - }, - }, - "/etc": &safcm.File{ - OrigGroup: "group", - Path: "/etc", - Mode: fs.ModeDir | 0755, - Uid: -1, - Gid: -1, - }, - "/etc/.hidden": &safcm.File{ - OrigGroup: "group", - Path: "/etc/.hidden", - Mode: 0100 | fs.ModeSetuid | fs.ModeSetgid | fs.ModeSticky, - Uid: -1, - Gid: -1, - Data: []byte("..."), - }, - "/etc/motd": &safcm.File{ - OrigGroup: "group", - Path: "/etc/motd", - Mode: 0644, - Uid: -1, - Gid: -1, - Data: []byte("Welcome to Host ONE\n\n\n\n\n\nall\n\n\nhost1.example.org\n\n\n\n"), - }, - "/etc/rc.local": &safcm.File{ - OrigGroup: "group", - Path: "/etc/rc.local", - Mode: 0700, - Uid: -1, - Gid: -1, - Data: []byte("#!/bin/sh\n"), - TriggerCommands: []string{ - "/etc/rc.local", - }, - }, - "/etc/resolv.conf": &safcm.File{ - OrigGroup: "group", - Path: "/etc/resolv.conf", - Mode: 0641, - User: "user", - Uid: -1, - Group: "group", - Gid: -1, - Data: []byte("nameserver ::1\n"), - TriggerCommands: []string{ - "echo resolv.conf updated", - }, - }, - "/etc/test": &safcm.File{ - OrigGroup: "group", - Path: "/etc/test", - Mode: os.ModeSymlink | 0777, - Uid: -1, - Gid: -1, - Data: []byte("doesnt-exist"), - }, - }, - Packages: []string{ - "unbound", - "unbound-anchor", - }, - Services: []string{ - "unbound", - }, - Commands: []*safcm.Command{ - { - OrigGroup: "group", - Cmd: "echo command one", - }, - { - OrigGroup: "group", - Cmd: "echo -n command two", - }, - }, - }, - nil, - nil, - }, - { "conflict: file", "project-conflict-file", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host1.example.org: 3 host groups: all dns host1.example.org", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org", + "3 false host groups: all dns host1.example.org", + "3 false host group priorities (descending): host1.example.org", }, - fmt.Errorf("groups dns and all both provide file \"/etc/resolv.conf\"\nUse 'group_order' in config.yaml to declare preference"), + fmt.Errorf("groups dns and all both provide \"/etc/resolv.conf\"\nUse 'group_priority' in config.yaml to declare preference"), }, { "conflict: file from detected group", @@ -276,13 +160,12 @@ func TestHostSyncReq(t *testing.T) { []string{ "detected_other", }, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host2.example.org: 3 host groups: all detected_other host2.example.org other", - "host2.example.org: 3 host group priorities (desc. order): host2.example.org", + "3 false host groups: all detected_other host2.example.org other", + "3 false host group priorities (descending): host2.example.org", }, - fmt.Errorf("groups other and all both provide file \"/etc/resolv.conf\"\nUse 'group_order' in config.yaml to declare preference"), + fmt.Errorf("groups other and all both provide \"/etc/resolv.conf\"\nUse 'group_priority' in config.yaml to declare preference"), }, { @@ -290,13 +173,12 @@ func TestHostSyncReq(t *testing.T) { "project-conflict-dir", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host1.example.org: 3 host groups: all dns host1.example.org", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org", + "3 false host groups: all dns host1.example.org", + "3 false host group priorities (descending): host1.example.org", }, - fmt.Errorf("groups dns and all both provide file \"/etc\"\nUse 'group_order' in config.yaml to declare preference"), + fmt.Errorf("groups dns and all both provide \"/etc\"\nUse 'group_priority' in config.yaml to declare preference"), }, { "conflict: dir from detected group", @@ -305,13 +187,12 @@ func TestHostSyncReq(t *testing.T) { []string{ "detected_other", }, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host2.example.org: 3 host groups: all detected_other host2.example.org other", - "host2.example.org: 3 host group priorities (desc. order): host2.example.org", + "3 false host groups: all detected_other host2.example.org other", + "3 false host group priorities (descending): host2.example.org", }, - fmt.Errorf("groups other and all both provide file \"/etc\"\nUse 'group_order' in config.yaml to declare preference"), + fmt.Errorf("groups other and all both provide \"/etc\"\nUse 'group_priority' in config.yaml to declare preference"), }, { @@ -319,42 +200,40 @@ func TestHostSyncReq(t *testing.T) { "project-group-cycle", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{}, nil, fmt.Errorf("groups.yaml: cycle while expanding group \"group-b\""), }, { - "group_order", - "project-group_order", + "group_priority", + "project-group_priority", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{ Groups: []string{"all", "group-b", "group-a", "host1.example.org"}, Files: map[string]*safcm.File{ "/": { + OrigGroup: "host1.example.org", Path: "/", Mode: fs.ModeDir | 0755, Uid: -1, Gid: -1, - OrigGroup: "host1.example.org", }, "/etc": { + OrigGroup: "host1.example.org", Path: "/etc", Mode: fs.ModeDir | 0755, Uid: -1, Gid: -1, - OrigGroup: "host1.example.org", }, "/etc/dir-to-file": { + OrigGroup: "group-a", Path: "/etc/dir-to-file", Mode: 0644, Uid: -1, Gid: -1, Data: []byte("dir-to-file: from group-a\n"), - OrigGroup: "group-a", }, "/etc/dir-to-filex": { OrigGroup: "group-b", @@ -365,12 +244,12 @@ func TestHostSyncReq(t *testing.T) { Data: []byte("dir-to-filex\n"), }, "/etc/dir-to-link": { + OrigGroup: "group-a", Path: "/etc/dir-to-link", Mode: fs.ModeSymlink | 0777, Uid: -1, Gid: -1, Data: []byte("target"), - OrigGroup: "group-a", }, "/etc/dir-to-linkx": { OrigGroup: "group-b", @@ -381,83 +260,82 @@ func TestHostSyncReq(t *testing.T) { Data: []byte("dir-to-linkx\n"), }, "/etc/file-to-dir": { + OrigGroup: "group-a", Path: "/etc/file-to-dir", Mode: fs.ModeDir | 0755, Uid: -1, Gid: -1, - OrigGroup: "group-a", }, "/etc/file-to-dir/file": { + OrigGroup: "group-a", Path: "/etc/file-to-dir/file", Mode: 0644, Uid: -1, Gid: -1, Data: []byte("file: from group-a\n"), - OrigGroup: "group-a", }, "/etc/file-to-dir/dir": { + OrigGroup: "group-a", Path: "/etc/file-to-dir/dir", Mode: fs.ModeDir | 0755, Uid: -1, Gid: -1, - OrigGroup: "group-a", }, "/etc/file-to-dir/dir/file2": { + OrigGroup: "group-a", Path: "/etc/file-to-dir/dir/file2", Mode: 0644, Uid: -1, Gid: -1, Data: []byte("file2: from group-a\n"), - OrigGroup: "group-a", }, "/etc/motd": { + OrigGroup: "host1.example.org", Path: "/etc/motd", Mode: 0644, Uid: -1, Gid: -1, Data: []byte("motd: from host1\n"), - OrigGroup: "host1.example.org", }, }, }, []string{ - "host1.example.org: 3 host groups: all group-a group-b host1.example.org", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org group-a group-b all", - `host1.example.org: 4 files: "/etc": group group-a overwrites triggers from group group-b`, - `host1.example.org: 4 files: "/etc": group host1.example.org overwrites triggers from group group-a`, + "3 false host groups: all group-a group-b host1.example.org", + "3 false host group priorities (descending): host1.example.org group-a group-b all", + `4 false files: "/etc": group group-a overwrites triggers from group group-b`, + `4 false files: "/etc": group host1.example.org overwrites triggers from group group-a`, }, nil, }, { - "group_order (single group)", - "project-group_order-single", + "group_priority (single group)", + "project-group_priority-single", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{ Groups: []string{"all", "group-b", "group-a", "host1.example.org"}, Files: map[string]*safcm.File{ "/": { + OrigGroup: "group-a", Path: "/", Mode: fs.ModeDir | 0755, Uid: -1, Gid: -1, - OrigGroup: "group-a", }, "/file.txt": { + OrigGroup: "group-a", Path: "/file.txt", Mode: 0644, Uid: -1, Gid: -1, Data: []byte("file.txt: from group-a\n"), - OrigGroup: "group-a", }, }, }, []string{ - "host1.example.org: 3 host groups: all group-a group-b host1.example.org", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org group-a", + "3 false host groups: all group-a group-b host1.example.org", + "3 false host group priorities (descending): host1.example.org group-a", }, nil, }, @@ -483,44 +361,22 @@ func TestHostSyncReq(t *testing.T) { if err != nil { t.Fatal(err) } - cfg.LogLevel = tc.level var events []string - ch := make(chan Event) - done := make(chan struct{}) - go func() { - for { - x, ok := <-ch - if !ok { - break - } - if x.ConnEvent.Type != 0 { - panic("unexpected ConnEvent") - } - events = append(events, - fmt.Sprintf("%s: %v %d %s", - x.Host.Name, - x.Error, x.Log.Level, - x.Log.Text)) - } - done <- struct{}{} - }() - s := &Sync{ host: allHosts.Map[tc.host], config: cfg, allHosts: allHosts, allGroups: allGroups, - events: ch, + logFunc: func(level safcm.LogLevel, escaped bool, msg string) { + events = append(events, + fmt.Sprintf("%d %v %s", level, escaped, msg)) + }, } res, err := s.hostSyncReq(tc.detected) - testutil.AssertEqual(t, "res", res, tc.exp) testutil.AssertErrorEqual(t, "err", err, tc.expErr) - - close(ch) - <-done testutil.AssertEqual(t, "events", events, tc.expEvents) })