// Config: load files/ directory tree
-// 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/>.
+// SPDX-License-Identifier: GPL-3.0-or-later
+// Copyright (C) 2021-2024 Simon Ruderich
package config
"fmt"
"io/fs"
"os"
+ slashpath "path"
"path/filepath"
+ "runtime"
"ruderich.org/simon/safcm"
)
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 {
// 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",
return err
}
} else if typ == fs.ModeDir {
+ if windows {
+ perm = 0755
+ }
if perm != 0755 {
return fmt.Errorf(
"%q: invalid permissions %#o%s",
return err
}
data = []byte(x)
+ perm |= 0777 // see cmd/safcm-remote/sync/files.go
} else {
return fmt.Errorf("%q: file type not supported", path)
}
- // Convert to absolute path as used on the target host
+ // Convert to absolute and slash-separated path as used on the
+ // target host
x, err := filepath.Rel(basePath, path)
if err != nil {
return err
}
- x = filepath.Join("/", x)
+ x = slashpath.Join("/", filepath.ToSlash(x))
files[x] = &safcm.File{
Path: x,