]> Cypherpunks.ru repositories - govpn.git/blob - src/cypherpunks.ru/govpn/cmd/govpn-server/action.go
Language mistakes and stylistic fixes
[govpn.git] / src / cypherpunks.ru / govpn / cmd / govpn-server / action.go
1 /*
2 GoVPN -- simple secure free software virtual private network daemon
3 Copyright (C) 2014-2017 Sergey Matveev <stargrave@stargrave.org>
4               2016-2017 Bruno Clermont <bruno@robotinfra.com>
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 package main
21
22 import (
23         "bytes"
24
25         "github.com/pkg/errors"
26
27         "cypherpunks.ru/govpn"
28 )
29
30 func preUpAction(path string) govpn.TunnelPreUpAction {
31         if len(path) == 0 {
32                 return nil
33         }
34
35         return func(ctx govpn.PeerContext) (*govpn.TAP, error) {
36                 result, err := govpn.ScriptCall(path, ctx.Config.Iface, ctx.RemoteAddress)
37                 if err != nil {
38                         return nil, errors.Wrap(err, "govpn.ScriptCall")
39                 }
40                 if len(ctx.Config.Iface) == 0 {
41                         sepIndex := bytes.Index(result, []byte{'\n'})
42                         if sepIndex < 0 {
43                                 sepIndex = len(result)
44                         }
45                         ctx.Config.Iface = string(result[:sepIndex])
46                 }
47
48                 if len(ctx.Config.Iface) == 0 {
49                         return nil, errors.Errorf("Script %q didn't return interface name", path)
50                 }
51
52                 tap, err := govpn.TAPListen(ctx.Config.Iface, ctx.Config.MTU)
53                 if err != nil {
54                         return nil, errors.Wrap(err, "govpn.TAPListen")
55                 }
56                 return tap, nil
57         }
58 }