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

Last change on this file since 425 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
RevLine 
[62]1package config
2
3import (
4 "fmt"
[370]5 "net"
[62]6 "os"
[200]7
[424]8 "git.sr.ht/~emersion/go-scfg"
[62]9)
10
[370]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
[62]34type TLS struct {
35 CertPath, KeyPath string
36}
37
38type Server struct {
[370]39 Listen []string
40 Hostname string
41 TLS *TLS
42 SQLDriver string
43 SQLSource string
44 LogPath string
45 HTTPOrigins []string
46 AcceptProxyIPs IPSet
[62]47}
48
49func Defaults() *Server {
50 hostname, err := os.Hostname()
51 if err != nil {
52 hostname = "localhost"
53 }
54 return &Server{
[370]55 Hostname: hostname,
56 SQLDriver: "sqlite3",
57 SQLSource: "soju.db",
58 AcceptProxyIPs: loopbackIPs,
[62]59 }
60}
61
62func Load(path string) (*Server, error) {
[424]63 cfg, err := scfg.Load(path)
[62]64 if err != nil {
65 return nil, err
66 }
[424]67 return parse(cfg)
[62]68}
69
[424]70func parse(cfg scfg.Block) (*Server, error) {
[62]71 srv := Defaults()
[424]72 for _, d := range cfg {
[62]73 switch d.Name {
74 case "listen":
[317]75 var uri string
[424]76 if err := d.ParseParams(&uri); err != nil {
[62]77 return nil, err
78 }
[317]79 srv.Listen = append(srv.Listen, uri)
[62]80 case "hostname":
[424]81 if err := d.ParseParams(&srv.Hostname); err != nil {
[62]82 return nil, err
83 }
84 case "tls":
85 tls := &TLS{}
[424]86 if err := d.ParseParams(&tls.CertPath, &tls.KeyPath); err != nil {
[62]87 return nil, err
88 }
89 srv.TLS = tls
[77]90 case "sql":
[424]91 if err := d.ParseParams(&srv.SQLDriver, &srv.SQLSource); err != nil {
[77]92 return nil, err
93 }
[178]94 case "log":
[424]95 if err := d.ParseParams(&srv.LogPath); err != nil {
[178]96 return nil, err
97 }
[323]98 case "http-origin":
[371]99 srv.HTTPOrigins = d.Params
[370]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 }
[62]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.