ping-monitoring

A prometheus exporter to monitor matrix federation with using the existing pingbot infra.
git clone git://archive.git.mtrnord.blog/MTRNord/ping-monitoring.git
Log | Files | Refs | LICENSE

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 }