source: code/trunk/cmd/soju/main.go@ 317

Last change on this file since 317 was 317, checked in by contact, 5 years ago

Allow multiple listeners, default to ircs

Users can now specify multiple "listen" directives in their
configuration file. If -listen is specified on the CLI, it's added to
the list of listeners.

Listeners are now parsed as URLs. If the scheme is missing "ircs" is
assumed. URLs allow to enable/disable TLS on a per-listener basis and
will be used for Unix sockets too.

The default listening address is changed from irc+insecure://:6667 to
ircs://:6697. This avoids setting up an insecure listener opened to
everybody.

File size: 2.5 KB
Line 
1package main
2
3import (
4 "crypto/tls"
5 "flag"
6 "log"
7 "net"
8 "net/url"
9 "strings"
10
11 "git.sr.ht/~emersion/soju"
12 "git.sr.ht/~emersion/soju/config"
13)
14
15func main() {
16 var listen, configPath string
17 var debug bool
18 flag.StringVar(&listen, "listen", "", "listening address")
19 flag.StringVar(&configPath, "config", "", "path to configuration file")
20 flag.BoolVar(&debug, "debug", false, "enable debug logging")
21 flag.Parse()
22
23 var cfg *config.Server
24 if configPath != "" {
25 var err error
26 cfg, err = config.Load(configPath)
27 if err != nil {
28 log.Fatalf("failed to load config file: %v", err)
29 }
30 } else {
31 cfg = config.Defaults()
32 }
33
34 if listen != "" {
35 cfg.Listen = append(cfg.Listen, listen)
36 }
37 if len(cfg.Listen) == 0 {
38 cfg.Listen = []string{":6697"}
39 }
40
41 db, err := soju.OpenSQLDB(cfg.SQLDriver, cfg.SQLSource)
42 if err != nil {
43 log.Fatalf("failed to open database: %v", err)
44 }
45
46 var tlsCfg *tls.Config
47 if cfg.TLS != nil {
48 cert, err := tls.LoadX509KeyPair(cfg.TLS.CertPath, cfg.TLS.KeyPath)
49 if err != nil {
50 log.Fatalf("failed to load TLS certificate and key: %v", err)
51 }
52 tlsCfg = &tls.Config{Certificates: []tls.Certificate{cert}}
53 }
54
55 srv := soju.NewServer(db)
56 // TODO: load from config/DB
57 srv.Hostname = cfg.Hostname
58 srv.LogPath = cfg.LogPath
59 srv.Debug = debug
60
61 for _, listen := range cfg.Listen {
62 listenURI := listen
63 if !strings.Contains(listenURI, ":/") {
64 // This is a raw domain name, make it an URL with an empty scheme
65 listenURI = "//" + listenURI
66 }
67 u, err := url.Parse(listenURI)
68 if err != nil {
69 log.Fatalf("failed to parse listen URI %q: %v", listen, err)
70 }
71
72 switch u.Scheme {
73 case "ircs", "":
74 if tlsCfg == nil {
75 log.Fatalf("failed to listen on %q: missing TLS configuration", listen)
76 }
77 host := u.Host
78 if _, _, err := net.SplitHostPort(host); err != nil {
79 host = host + ":6697"
80 }
81 ln, err := tls.Listen("tcp", host, tlsCfg)
82 if err != nil {
83 log.Fatalf("failed to start TLS listener on %q: %v", listen, err)
84 }
85 go func() {
86 log.Fatal(srv.Serve(ln))
87 }()
88 case "irc+insecure":
89 host := u.Host
90 if _, _, err := net.SplitHostPort(host); err != nil {
91 host = host + ":6667"
92 }
93 ln, err := net.Listen("tcp", host)
94 if err != nil {
95 log.Fatalf("failed to start listener on %q: %v", listen, err)
96 }
97 go func() {
98 log.Fatal(srv.Serve(ln))
99 }()
100 default:
101 log.Fatalf("failed to listen on %q: unsupported scheme", listen)
102 }
103
104 log.Printf("server listening on %q", listen)
105 }
106 log.Fatal(srv.Run())
107}
Note: See TracBrowser for help on using the repository browser.