diff --git a/pkg/cluster/cluster_file.go b/pkg/cluster/cluster_file.go index e1deb11..0d885e1 100644 --- a/pkg/cluster/cluster_file.go +++ b/pkg/cluster/cluster_file.go @@ -1,9 +1,12 @@ package cluster import ( + "bufio" + "bytes" "fmt" "io" "os" + "strings" fs "github.com/hack-pad/hackpadfs" ) @@ -40,6 +43,21 @@ func (m *Cluster) openWriter(name string, flags int, args ...any) (io.WriteClose panic("unreachable") } +// RemoveFile deletes a file from the cluster's config directory +func (m *Cluster) RemoveFile(name string, args ...any) error { + if len(args) > 0 { + name = fmt.Sprintf(name, args...) + } + + err := fs.Remove(m.dir, name) + switch { + case os.IsNotExist(err): + return nil + default: + return err + } +} + // ReadFile reads a file from the cluster's config directory func (m *Cluster) ReadFile(name string, args ...any) ([]byte, error) { if len(args) > 0 { @@ -48,3 +66,41 @@ func (m *Cluster) ReadFile(name string, args ...any) ([]byte, error) { return fs.ReadFile(m.dir, name) } + +// ReadLines reads a file from the cluster's config directory, +// split by lines, trimmed, and accepting `#` to comment lines out. +func (m *Cluster) ReadLines(name string, args ...any) ([]string, error) { + var out []string + + data, err := m.ReadFile(name, args...) + if err != nil { + return nil, err + } + + sc := bufio.NewScanner(bytes.NewReader(data)) + for sc.Scan() { + s := strings.TrimSpace(sc.Text()) + switch { + case s == "", strings.HasPrefix(s, "#"): + // ignore + default: + // accepted + out = append(out, s) + } + } + + return out, nil +} + +// WriteStringFile writes the given content to a file on the machine's config directory +func (m *Cluster) WriteStringFile(value string, name string, args ...any) error { + f, err := m.CreateTruncFile(name, args...) + if err != nil { + return err + } + defer f.Close() + + buf := bytes.NewBufferString(value) + _, err = buf.WriteTo(f) + return err +} diff --git a/pkg/cluster/machine_file.go b/pkg/cluster/machine_file.go index 40dde3a..0dff58e 100644 --- a/pkg/cluster/machine_file.go +++ b/pkg/cluster/machine_file.go @@ -1,7 +1,6 @@ package cluster import ( - "bytes" "fmt" "io" "os" @@ -43,16 +42,9 @@ func (m *Machine) openWriter(name string, flags int, args ...any) (io.WriteClose // RemoveFile deletes a file from the machine's config directory func (m *Machine) RemoveFile(name string, args ...any) error { - base := m.zone.zones.dir fullName := m.getFilename(name, args...) - err := fs.Remove(base, fullName) - switch { - case os.IsNotExist(err): - return nil - default: - return err - } + return m.zone.zones.RemoveFile(fullName) } // ReadFile reads a file from the machine's config directory @@ -65,15 +57,9 @@ func (m *Machine) ReadFile(name string, args ...any) ([]byte, error) { // WriteStringFile writes the given content to a file on the machine's config directory func (m *Machine) WriteStringFile(value string, name string, args ...any) error { - f, err := m.CreateTruncFile(name, args...) - if err != nil { - return err - } - defer f.Close() + fullName := m.getFilename(name, args...) - buf := bytes.NewBufferString(value) - _, err = buf.WriteTo(f) - return err + return m.zone.zones.WriteStringFile(value, fullName) } func (m *Machine) getFilename(name string, args ...any) string {