Changeset 691 in code for trunk/cmd/soju/main.go


Ignore:
Timestamp:
Nov 15, 2021, 11:38:04 PM (4 years ago)
Author:
contact
Message:

Allow most config options to be reloaded

Closes: https://todo.sr.ht/~emersion/soju/42

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/cmd/soju/main.go

    r687 r691  
    3838}
    3939
    40 func loadMOTD(srv *soju.Server, filename string) error {
    41         if filename == "" {
    42                 return nil
    43         }
    44 
    45         b, err := ioutil.ReadFile(filename)
    46         if err != nil {
    47                 return err
    48         }
    49         srv.SetMOTD(strings.TrimSuffix(string(b), "\n"))
    50         return nil
    51 }
    52 
    5340func bumpOpenedFileLimit() error {
    5441        var rlimit syscall.Rlimit
     
    6350}
    6451
     52var (
     53        configPath string
     54        debug      bool
     55
     56        tlsCert atomic.Value // *tls.Certificate
     57)
     58
     59func loadConfig() (*config.Server, *soju.Config, error) {
     60        var raw *config.Server
     61        if configPath != "" {
     62                var err error
     63                raw, err = config.Load(configPath)
     64                if err != nil {
     65                        return nil, nil, fmt.Errorf("failed to load config file: %v", err)
     66                }
     67        } else {
     68                raw = config.Defaults()
     69        }
     70
     71        var motd string
     72        if raw.MOTDPath != "" {
     73                b, err := ioutil.ReadFile(raw.MOTDPath)
     74                if err != nil {
     75                        return nil, nil, fmt.Errorf("failed to load MOTD: %v", err)
     76                }
     77                motd = strings.TrimSuffix(string(b), "\n")
     78        }
     79
     80        if raw.TLS != nil {
     81                cert, err := tls.LoadX509KeyPair(raw.TLS.CertPath, raw.TLS.KeyPath)
     82                if err != nil {
     83                        return nil, nil, fmt.Errorf("failed to load TLS certificate and key: %v", err)
     84                }
     85                tlsCert.Store(&cert)
     86        }
     87
     88        cfg := &soju.Config{
     89                Hostname:        raw.Hostname,
     90                Title:           raw.Title,
     91                LogPath:         raw.LogPath,
     92                HTTPOrigins:     raw.HTTPOrigins,
     93                AcceptProxyIPs:  raw.AcceptProxyIPs,
     94                MaxUserNetworks: raw.MaxUserNetworks,
     95                Debug:           debug,
     96                MOTD:            motd,
     97        }
     98        return raw, cfg, nil
     99}
     100
    65101func main() {
    66102        var listen []string
    67         var configPath string
    68         var debug bool
    69103        flag.Var((*stringSliceFlag)(&listen), "listen", "listening address")
    70104        flag.StringVar(&configPath, "config", "", "path to configuration file")
     
    72106        flag.Parse()
    73107
    74         var cfg *config.Server
    75         if configPath != "" {
    76                 var err error
    77                 cfg, err = config.Load(configPath)
    78                 if err != nil {
    79                         log.Fatalf("failed to load config file: %v", err)
    80                 }
    81         } else {
    82                 cfg = config.Defaults()
     108        cfg, serverCfg, err := loadConfig()
     109        if err != nil {
     110                log.Fatal(err)
    83111        }
    84112
     
    98126
    99127        var tlsCfg *tls.Config
    100         var tlsCert atomic.Value
    101128        if cfg.TLS != nil {
    102                 cert, err := tls.LoadX509KeyPair(cfg.TLS.CertPath, cfg.TLS.KeyPath)
    103                 if err != nil {
    104                         log.Fatalf("failed to load TLS certificate and key: %v", err)
    105                 }
    106                 tlsCert.Store(&cert)
    107 
    108129                tlsCfg = &tls.Config{
    109130                        GetCertificate: func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
     
    114135
    115136        srv := soju.NewServer(db)
    116         srv.Hostname = cfg.Hostname
    117         srv.Title = cfg.Title
    118         srv.LogPath = cfg.LogPath
    119         srv.HTTPOrigins = cfg.HTTPOrigins
    120         srv.AcceptProxyIPs = cfg.AcceptProxyIPs
    121         srv.MaxUserNetworks = cfg.MaxUserNetworks
    122         srv.Debug = debug
    123 
    124         if err := loadMOTD(srv, cfg.MOTDPath); err != nil {
    125                 log.Fatalf("failed to load MOTD: %v", err)
    126         }
     137        srv.SetConfig(serverCfg)
    127138
    128139        for _, listen := range cfg.Listen {
     
    259270                switch sig {
    260271                case syscall.SIGHUP:
    261                         log.Print("reloading TLS certificate and MOTD")
    262                         if cfg.TLS != nil {
    263                                 cert, err := tls.LoadX509KeyPair(cfg.TLS.CertPath, cfg.TLS.KeyPath)
    264                                 if err != nil {
    265                                         log.Printf("failed to reload TLS certificate and key: %v", err)
    266                                         break
    267                                 }
    268                                 tlsCert.Store(&cert)
    269                         }
    270                         if err := loadMOTD(srv, cfg.MOTDPath); err != nil {
    271                                 log.Printf("failed to reload MOTD: %v", err)
     272                        log.Print("reloading configuration")
     273                        _, serverCfg, err := loadConfig()
     274                        if err != nil {
     275                                log.Printf("failed to reloading configuration: %v", err)
     276                        } else {
     277                                srv.SetConfig(serverCfg)
    272278                        }
    273279                case syscall.SIGINT, syscall.SIGTERM:
     
    287293                                return proxyproto.IGNORE, nil
    288294                        }
    289                         if srv.AcceptProxyIPs.Contains(tcpAddr.IP) {
     295                        if srv.Config().AcceptProxyIPs.Contains(tcpAddr.IP) {
    290296                                return proxyproto.USE, nil
    291297                        }
Note: See TracChangeset for help on using the changeset viewer.