]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/govpn/cmd/govpn-server/common.go
Ability to explicitly specify TAP interface, without up-script using
[govpn.git] / src / govpn / cmd / govpn-server / common.go
index 92e1bb15d349a6da07994358c6e26caeb4f7c977..313fc394aed7b70fc21e28d32b7f01bf5236ac9b 100644 (file)
@@ -1,8 +1,26 @@
+/*
+GoVPN -- simple secure free software virtual private network daemon
+Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
 package main
 
 import (
        "bytes"
-       "path"
+       "log"
        "sync"
        "time"
 
@@ -43,20 +61,29 @@ Processor:
                        ps.peer.EthProcess(data)
                }
        }
+       close(ps.terminator)
        ps.peer.Zero()
        heartbeat.Stop()
 }
 
 func callUp(peerId *govpn.PeerId) (string, error) {
-       upPath := path.Join(govpn.PeersPath, peerId.String(), "up.sh")
-       result, err := govpn.ScriptCall(upPath, "")
-       if err != nil {
-               return "", err
+       ifaceName := confs[*peerId].Iface
+       if confs[*peerId].Up != "" {
+               result, err := govpn.ScriptCall(confs[*peerId].Up, "")
+               if err != nil {
+                       log.Println("Script", confs[*peerId].Up, "call failed", err)
+                       return "", err
+               }
+               if ifaceName == "" {
+                       sepIndex := bytes.Index(result, []byte{'\n'})
+                       if sepIndex < 0 {
+                               sepIndex = len(result)
+                       }
+                       ifaceName = string(result[:sepIndex])
+               }
        }
-       sepIndex := bytes.Index(result, []byte{'\n'})
-       if sepIndex < 0 {
-               sepIndex = len(result)
+       if ifaceName == "" {
+               log.Println("Can not obtain interface name for", *peerId)
        }
-       ifaceName := string(result[:sepIndex])
        return ifaceName, nil
 }