Changeset 475 in code for trunk/cmd/soju


Ignore:
Timestamp:
Mar 18, 2021, 1:07:03 PM (4 years ago)
Author:
contact
Message:

Reload TLS certs on SIGHUP

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

File:
1 edited

Legend:

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

    r470 r475  
    1111        "os/signal"
    1212        "strings"
     13        "sync/atomic"
    1314        "syscall"
    1415
     
    5152
    5253        var tlsCfg *tls.Config
     54        var tlsCert atomic.Value
    5355        if cfg.TLS != nil {
    5456                cert, err := tls.LoadX509KeyPair(cfg.TLS.CertPath, cfg.TLS.KeyPath)
     
    5658                        log.Fatalf("failed to load TLS certificate and key: %v", err)
    5759                }
    58                 tlsCfg = &tls.Config{Certificates: []tls.Certificate{cert}}
     60                tlsCert.Store(cert)
     61
     62                tlsCfg = &tls.Config{
     63                        GetCertificate: func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
     64                                return tlsCert.Load().(*tls.Certificate), nil
     65                        },
     66                }
    5967        }
    6068
     
    181189
    182190        sigCh := make(chan os.Signal, 1)
    183         signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
     191        signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
    184192
    185193        if err := srv.Start(); err != nil {
     
    187195        }
    188196
    189         <-sigCh
    190         log.Print("shutting down server")
    191         srv.Shutdown()
     197        for sig := range sigCh {
     198                switch sig {
     199                case syscall.SIGHUP:
     200                        if cfg.TLS != nil {
     201                                log.Print("reloading TLS certificate")
     202                                cert, err := tls.LoadX509KeyPair(cfg.TLS.CertPath, cfg.TLS.KeyPath)
     203                                if err != nil {
     204                                        log.Printf("failed to reload TLS certificate and key: %v", err)
     205                                        break
     206                                }
     207                                tlsCert.Store(cert)
     208                        }
     209                case syscall.SIGINT, syscall.SIGTERM:
     210                        log.Print("shutting down server")
     211                        srv.Shutdown()
     212                        return
     213                }
     214        }
    192215}
    193216
Note: See TracChangeset for help on using the changeset viewer.