summaryrefslogtreecommitdiff
path: root/cmd/anygone/conf.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/anygone/conf.go')
-rw-r--r--cmd/anygone/conf.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/cmd/anygone/conf.go b/cmd/anygone/conf.go
new file mode 100644
index 0000000..5066808
--- /dev/null
+++ b/cmd/anygone/conf.go
@@ -0,0 +1,129 @@
+//
+// Copyright (c) 2017 anygone contributors (see AUTHORS file)
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// * Neither the name of anygone nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+package main
+
+import (
+ "fmt"
+ "net"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/spf13/pflag"
+)
+
+type IPAddrCIDR struct {
+ Net net.IPNet
+ Valid bool
+}
+
+func (ipnet IPAddrCIDR) String() string {
+ if ipnet.Valid {
+ return ipnet.Net.String()
+ }
+ return ""
+}
+
+func (ipnet *IPAddrCIDR) Set(value string) error {
+ ip, net, err := net.ParseCIDR(strings.TrimSpace(value))
+ if err != nil {
+ return err
+ }
+ net.IP = ip
+ *ipnet = IPAddrCIDR{*net, true}
+ return nil
+}
+
+func (*IPAddrCIDR) Type() string {
+ return "ipNet"
+}
+
+type Config struct {
+ name string
+ flags *pflag.FlagSet
+
+ Help bool
+ Version bool
+ DeviceName string
+ DeviceType string
+ IFConfig IPAddrCIDR
+ PostUp string
+}
+
+func (cfg *Config) PrintUsage() {
+ cfg.flags.Usage()
+}
+
+func (cfg *Config) PrintVersion() {
+ fmt.Println("anygone version 0.1")
+}
+
+func (cfg *Config) Dump() {
+ fmt.Printf("Config: %+v\n", cfg)
+}
+
+func (cfg *Config) parsePost() error {
+ extraArgs := cfg.flags.Args()
+ if len(extraArgs) > 0 {
+ return fmt.Errorf("unknown additional parameters (%s)", strings.Join(extraArgs, ", "))
+ }
+
+ if cfg.DeviceName == "" && cfg.DeviceType == "" {
+ cfg.DeviceType = "tun"
+ }
+ return nil
+}
+
+func NewConfig() (cfg *Config, err error) {
+ cfg = &Config{}
+ cfg.name = filepath.Base(os.Args[0])
+ cfg.flags = pflag.NewFlagSet(cfg.name, pflag.ContinueOnError)
+ cfg.flags.SetInterspersed(false)
+ cfg.flags.SortFlags = false
+ cfg.flags.Usage = func() {
+ fmt.Fprintf(os.Stderr, "Usage of %s:\n", cfg.name)
+ cfg.flags.PrintDefaults()
+ }
+
+ cfg.flags.BoolVarP(&cfg.Help, "help", "h", false, "print this...")
+ cfg.flags.BoolVarP(&cfg.Version, "version", "v", false, "print version info and exit")
+
+ cfg.flags.StringVarP(&cfg.DeviceName, "dev", "d", "", "device name")
+ cfg.flags.StringVarP(&cfg.DeviceType, "type", "t", "", "device type")
+ cfg.flags.VarP(&cfg.IFConfig, "ifconfig", "n", "the local address for the tun/tap device and the used prefix length")
+ cfg.flags.StringVarP(&cfg.PostUp, "post-up-script", "x", "", "script gets called after interface is created")
+
+ if err = cfg.flags.Parse(os.Args[1:]); err != nil {
+ return
+ }
+ err = cfg.parsePost()
+ return
+}