|
@@ -0,0 +1,135 @@
|
|
|
+/*
|
|
|
+ * Copyright (c)2019 ZeroTier, Inc.
|
|
|
+ *
|
|
|
+ * Use of this software is governed by the Business Source License included
|
|
|
+ * in the LICENSE.TXT file in the project's root directory.
|
|
|
+ *
|
|
|
+ * Change Date: 2023-01-01
|
|
|
+ *
|
|
|
+ * On the date above, in accordance with the Business Source License, use
|
|
|
+ * of this software will be governed by version 2.0 of the Apache License.
|
|
|
+ */
|
|
|
+/****/
|
|
|
+
|
|
|
+package cli
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "io/ioutil"
|
|
|
+ "os"
|
|
|
+ "strings"
|
|
|
+
|
|
|
+ "zerotier/pkg/zerotier"
|
|
|
+)
|
|
|
+
|
|
|
+func locatorNew(args []string) {
|
|
|
+ if len(args) < 2 {
|
|
|
+ Help()
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ identityData, err := ioutil.ReadFile(args[0])
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: unable to read identity: %s\n", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ identity, err := zerotier.NewIdentityFromString(string(identityData))
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: invalid identity: %s\n", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ if !identity.HasPrivate() {
|
|
|
+ fmt.Println("FATAL: identity does not contain secret key")
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ var virt []*zerotier.Identity
|
|
|
+ var phys []*zerotier.InetAddress
|
|
|
+ for i := 1; i < len(args); i++ {
|
|
|
+ if strings.Contains(args[i], "/") {
|
|
|
+ a := zerotier.NewInetAddressFromString(args[i])
|
|
|
+ if a == nil {
|
|
|
+ fmt.Printf("FATAL: IP/port address '%s' is not valid\n", args[i])
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ phys = append(phys, a)
|
|
|
+ } else {
|
|
|
+ a, err := zerotier.NewIdentityFromString(args[i])
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: identity (virtual address) '%s' is not valid: %s\n", args[i], err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ virt = append(virt, a)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ loc, err := zerotier.NewLocator(identity, virt, phys)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: internal error creating locator: %s\n", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ fmt.Println(jsonDump(loc))
|
|
|
+}
|
|
|
+
|
|
|
+func locatorNewDNSKey(args []string) {
|
|
|
+ if len(args) != 0 {
|
|
|
+ Help()
|
|
|
+ os.Exit(0)
|
|
|
+ }
|
|
|
+
|
|
|
+ sk, err := zerotier.NewLocatorDNSSigningKey()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: error creating secure DNS signing key: %s", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ fmt.Println(jsonDump(sk))
|
|
|
+ os.Exit(0)
|
|
|
+}
|
|
|
+
|
|
|
+func locatorGetDNS(args []string) {
|
|
|
+ if len(args) < 2 {
|
|
|
+ Help()
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ keyData, err := ioutil.ReadFile(args[0])
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: unable to read secure DNS key file: %s\n", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ var sk zerotier.LocatorDNSSigningKey
|
|
|
+ err = json.Unmarshal(keyData, &sk)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: DNS key file invalid: %s", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ locData, err := ioutil.ReadFile(args[1])
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: unable to read locator: %s\n", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ var loc zerotier.Locator
|
|
|
+ err = json.Unmarshal(locData, &loc)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("FATAL: locator invalid: %s", err.Error())
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Locator CLI command
|
|
|
+func Locator(args []string) {
|
|
|
+ if len(args) > 0 {
|
|
|
+ switch args[0] {
|
|
|
+ case "new":
|
|
|
+ locatorNew(args[1:])
|
|
|
+ case "newdnskey":
|
|
|
+ locatorNewDNSKey(args[1:])
|
|
|
+ case "getdns":
|
|
|
+ locatorGetDNS(args[1:])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Help()
|
|
|
+ os.Exit(1)
|
|
|
+}
|