]> ruderich.org/simon Gitweb - safcm/safcm.git/commitdiff
safcm: add experimental support to sync from Windows hosts
authorSimon Ruderich <simon@ruderich.org>
Thu, 13 May 2021 11:55:47 +0000 (13:55 +0200)
committerSimon Ruderich <simon@ruderich.org>
Thu, 13 May 2021 11:55:47 +0000 (13:55 +0200)
This is _very_ experimental. The testsuite doesn't yet run on Windows
and only a few manual tests were run. Basically this is only present
because it was used to verify our changes to always use slash-separated
paths in the configuration on a real system. It seemed a waste to just
throw it away.

To build the binary for windows use (empty GOFLAGS to disable -race):

    make GOOS=windows GOFLAGS=

cmd/safcm-remote/sync/files.go
cmd/safcm-remote/sync/files_windows.go [new file with mode: 0644]
cmd/safcm/config/files.go
cmd/safcm/sync.go

index 3e88be2b6f2ff78ead5af113846fc6cc302c1f0f..e0a2221009deda9824aa38419fec6ffc1decc0f0 100644 (file)
@@ -15,6 +15,8 @@
 // You should have received a copy of the GNU General Public License
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // You should have received a copy of the GNU General Public License
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+// +build !windows
+
 package sync
 
 import (
 package sync
 
 import (
diff --git a/cmd/safcm-remote/sync/files_windows.go b/cmd/safcm-remote/sync/files_windows.go
new file mode 100644 (file)
index 0000000..11252ef
--- /dev/null
@@ -0,0 +1,34 @@
+// MsgSyncReq: copy files to the remote host; Windows compatibility
+
+// 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 <http://www.gnu.org/licenses/>.
+
+package sync
+
+import (
+       "fmt"
+       "os"
+)
+
+// Windows remote hosts are not supported. However, the local safcm binary
+// imports safcm-remote which fails to build with the regular files.go.
+
+func (s *Sync) syncFiles() error {
+       return fmt.Errorf("not implemented on Windows")
+}
+
+func OpenFileNoFollow(path string) (*os.File, error) {
+       return nil, fmt.Errorf("not implemented on Windows")
+}
index 7ffa8b201cfeb5548cb0d2356f19677931218542..143a678ac15653254d28ac8b42b4c1046cfb81dd 100644 (file)
@@ -40,6 +40,9 @@ confusion files must be manually chmodded 0644/0755 and directories 0755 or
 via "safcm fixperms".
 `
 
 via "safcm fixperms".
 `
 
+       // No permission checks on windows which doesn't track them.
+       windows := runtime.GOOS == "windows"
+
        files := make(map[string]*safcm.File)
        err := filepath.WalkDir(basePath, func(path string, d fs.DirEntry,
                err error) error {
        files := make(map[string]*safcm.File)
        err := filepath.WalkDir(basePath, func(path string, d fs.DirEntry,
                err error) error {
@@ -60,6 +63,11 @@ via "safcm fixperms".
                // permissions they could assume that these permissions are
                // respected. This is not the case.
                if typ == 0 /* regular file */ {
                // permissions they could assume that these permissions are
                // respected. This is not the case.
                if typ == 0 /* regular file */ {
+                       if windows {
+                               perm = 0644
+                               // 0755 must be set via permissions.yaml if
+                               // windows is used
+                       }
                        if perm != 0644 && perm != 0755 {
                                return fmt.Errorf(
                                        "%q: invalid permissions %#o%s",
                        if perm != 0644 && perm != 0755 {
                                return fmt.Errorf(
                                        "%q: invalid permissions %#o%s",
@@ -70,6 +78,9 @@ via "safcm fixperms".
                                return err
                        }
                } else if typ == fs.ModeDir {
                                return err
                        }
                } else if typ == fs.ModeDir {
+                       if windows {
+                               perm = 0755
+                       }
                        if perm != 0755 {
                                return fmt.Errorf(
                                        "%q: invalid permissions %#o%s",
                        if perm != 0755 {
                                return fmt.Errorf(
                                        "%q: invalid permissions %#o%s",
index 4a82ca3b906464f8ce58f652f4abf9afbbf71cb8..0f7c54ff309f360ac0e0bc9cbe4071a467c7c02b 100644 (file)
@@ -23,6 +23,7 @@ import (
        "log"
        "os"
        "os/signal"
        "log"
        "os"
        "os/signal"
+       "runtime"
        "sort"
        "strings"
        "sync"
        "sort"
        "strings"
        "sync"
@@ -105,6 +106,10 @@ func MainSync(args []string) error {
                os.Exit(1)
        }
 
                os.Exit(1)
        }
 
+       if runtime.GOOS == "windows" {
+               log.Print("WARNING: Windows support is experimental!")
+       }
+
        cfg, allHosts, allGroups, err := LoadBaseFiles()
        if err != nil {
                return err
        cfg, allHosts, allGroups, err := LoadBaseFiles()
        if err != nil {
                return err