config.go (4082B)
1 package main 2 3 import ( 4 "os" 5 6 "github.com/goccy/go-yaml" 7 log "github.com/sirupsen/logrus" 8 "maunium.net/go/mautrix" 9 "maunium.net/go/mautrix/id" 10 ) 11 12 type MatrixConfig struct { 13 Homeserver string `yaml:"homeserver"` 14 Username string `yaml:"username"` 15 Password string `yaml:"password,omitempty"` 16 DeviceID string `yaml:"device_id,omitempty"` 17 AccessToken string `yaml:"access_token,omitempty"` 18 Client *mautrix.Client 19 } 20 21 type Config struct { 22 Address string `yaml:"address"` 23 OwnHomeserver MatrixConfig `yaml:"own_homeserver"` 24 RemoteHomeservers []MatrixConfig `yaml:"remote_homeservers"` 25 PingRoom string `yaml:"ping_room"` 26 PingRoomID id.RoomID 27 PingRateSeconds int `yaml:"ping_rate_seconds"` 28 PingThresholdSeconds int `yaml:"ping_threshold_seconds"` 29 PingJsonURL string `yaml:"ping_json_url"` 30 BlacklistedHomeservers []string `yaml:"blacklisted_homeservers"` 31 } 32 33 func ReadConfig() Config { 34 var err error 35 var b []byte 36 var config Config 37 if b, err = os.ReadFile("config.yaml"); err != nil { 38 log.Errorf("Failed to read config file: %s", err) 39 os.Exit(1) 40 } 41 42 // Load yaml 43 if err := yaml.Unmarshal(b, &config); err != nil { 44 log.Errorf("Failed to load config: %s", err) 45 os.Exit(1) 46 } 47 48 // Ensure we have a PingRoom 49 if config.PingRoom == "" { 50 log.Errorln("No ping room defined") 51 os.Exit(1) 52 } 53 54 // Ensure we have a PingJsonURL 55 if config.PingJsonURL == "" { 56 log.Errorln("No ping json url defined") 57 os.Exit(1) 58 } 59 60 // Ensure we have a PingRateSeconds 61 if config.PingRateSeconds == 0 { 62 config.PingRateSeconds = 60 63 } 64 65 // Ensure we have a PingThresholdSeconds 66 if config.PingThresholdSeconds == 0 { 67 config.PingThresholdSeconds = 240 68 } 69 70 // Ensure the matrix homeserver values are not empty 71 if config.OwnHomeserver.Homeserver == "" { 72 log.Errorln("No own homeserver defined") 73 os.Exit(1) 74 } 75 if config.OwnHomeserver.Username == "" { 76 log.Errorln("No own homeserver username defined") 77 os.Exit(1) 78 } 79 if config.OwnHomeserver.Password == "" && config.OwnHomeserver.AccessToken == "" && config.OwnHomeserver.DeviceID == "" { 80 log.Errorln("No own homeserver password or access token defined") 81 os.Exit(1) 82 } 83 84 // Ensure we have at least one Remote Homeserver 85 if len(config.RemoteHomeservers) == 0 { 86 log.Errorln("No remote homeservers defined") 87 os.Exit(1) 88 } 89 90 // Ensure the remote homeserver values are not empty 91 for n, remoteHomeserver := range config.RemoteHomeservers { 92 if remoteHomeserver.Homeserver == "" { 93 log.Errorf("No remote homeserver defined for homeserver %d", n) 94 os.Exit(1) 95 } 96 if remoteHomeserver.Username == "" { 97 log.Errorf("No remote homeserver username defined for homeserver %s", remoteHomeserver.Homeserver) 98 os.Exit(1) 99 } 100 if remoteHomeserver.AccessToken == "" && remoteHomeserver.DeviceID == "" && remoteHomeserver.Password == "" { 101 log.Errorf("No remote homeserver password or access token defined for homeserver %s", remoteHomeserver.Homeserver) 102 os.Exit(1) 103 } 104 } 105 106 // Ensure that the Remote Homeservers are not blacklisted 107 for _, blacklistedHomeserver := range config.BlacklistedHomeservers { 108 for _, remoteHomeserver := range config.RemoteHomeservers { 109 if remoteHomeserver.Homeserver == blacklistedHomeserver { 110 log.Errorf("Remote homeserver %s is blacklisted", remoteHomeserver.Homeserver) 111 os.Exit(1) 112 } 113 } 114 } 115 116 // Ensure that the Remote Homeservers are different from the Own Homeserver or each other 117 for i, remoteHomeserver := range config.RemoteHomeservers { 118 if remoteHomeserver.Homeserver == config.OwnHomeserver.Homeserver { 119 log.Errorf("Remote homeserver %s is the same as the own homeserver", remoteHomeserver.Homeserver) 120 os.Exit(1) 121 } 122 for j, remoteHomeserver2 := range config.RemoteHomeservers { 123 if remoteHomeserver.Homeserver == remoteHomeserver2.Homeserver && i != j { 124 log.Errorf("Remote homeserver %s is the same as remote homeserver %s", remoteHomeserver.Homeserver, remoteHomeserver2.Homeserver) 125 os.Exit(1) 126 } 127 } 128 } 129 130 return config 131 }