...
1 package main
2
3 import (
4 "errors"
5 "fmt"
6 "os"
7 "path"
8 "path/filepath"
9
10 "gopkg.in/yaml.v2"
11 )
12
13 type portalConfig struct {
14 Command string
15 Host []string `yaml:",flow"`
16 }
17
18 type appConfig struct {
19 Portals map[string]*portalConfig
20 }
21
22 var config = &appConfig{}
23
24 func defaultConfigPath() (string, error) {
25 homedir, err := os.UserHomeDir()
26 if err != nil {
27 return "", err
28 } else if homedir == "" {
29 return "", errors.New("a blank path to user homedir was returned")
30 }
31
32 dir := path.Join(homedir, ".config", "sshtargate")
33 _, err = os.Stat(path.Join(dir, "config.yaml"))
34 if err == nil {
35 return path.Join(dir, "config.yaml"), nil
36 }
37
38 _, err = os.Stat(path.Join(dir, "config.yml"))
39 if err == nil {
40 return path.Join(dir, "config.yml"), nil
41 }
42
43 return path.Join(dir, "config.yaml"), nil
44 }
45
46 func serializeConfig(path string) error {
47 if path == "" {
48 return errors.New("failed to serialize: no path specified")
49
50 }
51
52 out, err := yaml.Marshal(config)
53 if err != nil {
54 return fmt.Errorf("failed to marshal configuration: %s", err)
55 }
56
57 os.MkdirAll(filepath.Dir(path), 0755)
58 err = os.WriteFile(path, out, 0644)
59 if err != nil {
60 return fmt.Errorf("failed to write to %s: %s", path, err)
61 }
62
63 return nil
64 }
65
66 func deserializeConfig(path string) error {
67 if path == "" {
68 return errors.New("failed to deserialize: no path specified")
69 }
70
71 _, err := os.Stat(path)
72 if os.IsNotExist(err) {
73 return nil
74 }
75
76 configData, err := os.ReadFile(path)
77 if err != nil {
78 return fmt.Errorf("failed to read file: %s", err)
79 }
80
81 err = yaml.Unmarshal(configData, config)
82 if err != nil {
83 return fmt.Errorf("failed to parse file: %s", err)
84 }
85
86 return nil
87 }
88
View as plain text