]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/govpn/cmd/govpn-server/conf.go
Do not exit if JSON configuration failed during runtime
[govpn.git] / src / govpn / cmd / govpn-server / conf.go
index 284f4f9dc5a2047b0cefed8c5f6d6e1728f15ad1..36681078b565978fab4731b26aaf51a66d05b541 100644 (file)
@@ -20,6 +20,7 @@ package main
 
 import (
        "encoding/json"
+       "errors"
        "io/ioutil"
        "log"
        "time"
@@ -33,39 +34,47 @@ const (
 
 var (
        confs    map[govpn.PeerId]*govpn.PeerConf
-       idsCache govpn.CipherCache
+       idsCache *govpn.CipherCache
 )
 
-func confRead() map[govpn.PeerId]*govpn.PeerConf {
+func confRead() (*map[govpn.PeerId]*govpn.PeerConf, error) {
        data, err := ioutil.ReadFile(*confPath)
        if err != nil {
-               log.Fatalln("Unable to read configuration:", err)
+               return nil, err
        }
        confsRaw := new(map[string]govpn.PeerConf)
        err = json.Unmarshal(data, confsRaw)
        if err != nil {
-               log.Fatalln("Unable to parse configuration:", err)
+               return nil, err
        }
 
        confs := make(map[govpn.PeerId]*govpn.PeerConf, len(*confsRaw))
        for name, pc := range *confsRaw {
                verifier, err := govpn.VerifierFromString(pc.VerifierRaw)
                if err != nil {
-                       log.Fatalln("Unable to decode the key:", err.Error(), pc.VerifierRaw)
+                       return nil, errors.New("Unable to decode verifier: " + err.Error())
                }
-               if pc.EncLess {
+               if pc.Encless {
                        pc.Noise = true
                }
+               if pc.MTU == 0 {
+                       pc.MTU = govpn.MTUDefault
+               }
+               if pc.MTU > govpn.MTUMax {
+                       log.Println("MTU value", pc.MTU, "is too high, overriding to", govpn.MTUMax)
+                       pc.MTU = govpn.MTUMax
+               }
                conf := govpn.PeerConf{
                        Verifier: verifier,
                        Id:       verifier.Id,
                        Name:     name,
                        Iface:    pc.Iface,
+                       MTU:      pc.MTU,
                        Up:       pc.Up,
                        Down:     pc.Down,
                        Noise:    pc.Noise,
                        CPR:      pc.CPR,
-                       EncLess:  pc.EncLess,
+                       Encless:  pc.Encless,
                }
                if pc.TimeoutInt <= 0 {
                        pc.TimeoutInt = govpn.TimeoutDefault
@@ -73,21 +82,29 @@ func confRead() map[govpn.PeerId]*govpn.PeerConf {
                conf.Timeout = time.Second * time.Duration(pc.TimeoutInt)
                confs[*verifier.Id] = &conf
        }
-       return confs
+       return &confs, nil
 }
 
-func confRefresh() {
-       confs = confRead()
+func confRefresh() error {
+       newConfs, err := confRead()
+       if err != nil {
+               log.Println("Unable to parse peers configuration:", err)
+               return err
+       }
+       confs = *newConfs
        ids := make([]govpn.PeerId, 0, len(confs))
        for peerId, _ := range confs {
                ids = append(ids, peerId)
        }
        idsCache.Update(ids)
+       return nil
 }
 
 func confInit() {
        idsCache = govpn.NewCipherCache(nil)
-       confRefresh()
+       if err := confRefresh(); err != nil {
+               log.Fatalln(err)
+       }
        go func() {
                for {
                        time.Sleep(RefreshRate)