source: code/trunk/config/config.go@ 662

Last change on this file since 662 was 662, checked in by contact, 4 years ago

Add title config option

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

File size: 2.9 KB
Line 
1package config
2
3import (
4 "fmt"
5 "net"
6 "os"
7 "strconv"
8
9 "git.sr.ht/~emersion/go-scfg"
10)
11
12type IPSet []*net.IPNet
13
14func (set IPSet) Contains(ip net.IP) bool {
15 for _, n := range set {
16 if n.Contains(ip) {
17 return true
18 }
19 }
20 return false
21}
22
23// loopbackIPs contains the loopback networks 127.0.0.0/8 and ::1/128.
24var loopbackIPs = IPSet{
25 &net.IPNet{
26 IP: net.IP{127, 0, 0, 0},
27 Mask: net.CIDRMask(8, 32),
28 },
29 &net.IPNet{
30 IP: net.IPv6loopback,
31 Mask: net.CIDRMask(128, 128),
32 },
33}
34
35type TLS struct {
36 CertPath, KeyPath string
37}
38
39type Server struct {
40 Listen []string
41 TLS *TLS
42 Hostname string
43 Title string
44 MOTDPath string
45
46 SQLDriver string
47 SQLSource string
48 LogPath string
49
50 HTTPOrigins []string
51 AcceptProxyIPs IPSet
52
53 MaxUserNetworks int
54}
55
56func Defaults() *Server {
57 hostname, err := os.Hostname()
58 if err != nil {
59 hostname = "localhost"
60 }
61 return &Server{
62 Hostname: hostname,
63 SQLDriver: "sqlite3",
64 SQLSource: "soju.db",
65 MaxUserNetworks: -1,
66 }
67}
68
69func Load(path string) (*Server, error) {
70 cfg, err := scfg.Load(path)
71 if err != nil {
72 return nil, err
73 }
74 return parse(cfg)
75}
76
77func parse(cfg scfg.Block) (*Server, error) {
78 srv := Defaults()
79 for _, d := range cfg {
80 switch d.Name {
81 case "listen":
82 var uri string
83 if err := d.ParseParams(&uri); err != nil {
84 return nil, err
85 }
86 srv.Listen = append(srv.Listen, uri)
87 case "hostname":
88 if err := d.ParseParams(&srv.Hostname); err != nil {
89 return nil, err
90 }
91 case "title":
92 if err := d.ParseParams(&srv.Title); err != nil {
93 return nil, err
94 }
95 case "motd":
96 if err := d.ParseParams(&srv.MOTDPath); err != nil {
97 return nil, err
98 }
99 case "tls":
100 tls := &TLS{}
101 if err := d.ParseParams(&tls.CertPath, &tls.KeyPath); err != nil {
102 return nil, err
103 }
104 srv.TLS = tls
105 case "db":
106 if err := d.ParseParams(&srv.SQLDriver, &srv.SQLSource); err != nil {
107 return nil, err
108 }
109 case "log":
110 var driver string
111 if err := d.ParseParams(&driver, &srv.LogPath); err != nil {
112 return nil, err
113 }
114 if driver != "fs" {
115 return nil, fmt.Errorf("directive %q: unknown driver %q", d.Name, driver)
116 }
117 case "http-origin":
118 srv.HTTPOrigins = d.Params
119 case "accept-proxy-ip":
120 srv.AcceptProxyIPs = nil
121 for _, s := range d.Params {
122 if s == "localhost" {
123 srv.AcceptProxyIPs = append(srv.AcceptProxyIPs, loopbackIPs...)
124 continue
125 }
126 _, n, err := net.ParseCIDR(s)
127 if err != nil {
128 return nil, fmt.Errorf("directive %q: failed to parse CIDR: %v", d.Name, err)
129 }
130 srv.AcceptProxyIPs = append(srv.AcceptProxyIPs, n)
131 }
132 case "max-user-networks":
133 var max string
134 if err := d.ParseParams(&max); err != nil {
135 return nil, err
136 }
137 var err error
138 if srv.MaxUserNetworks, err = strconv.Atoi(max); err != nil {
139 return nil, fmt.Errorf("directive %q: %v", d.Name, err)
140 }
141 default:
142 return nil, fmt.Errorf("unknown directive %q", d.Name)
143 }
144 }
145
146 return srv, nil
147}
Note: See TracBrowser for help on using the repository browser.