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

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

Switch to go-scfg

We don't use child directives yet, but likely will in the future.

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