| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /*
- * 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)
- }
- identity := readIdentity(args[0])
- if !identity.HasPrivate() {
- fmt.Println("FATAL: identity does not contain a secret key (required to sign locator)")
- 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))
- os.Exit(0)
- }
- 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)
- }
- txt, err := loc.MakeTXTRecords(&sk)
- if err != nil {
- fmt.Printf("FATAL: error creating TXT records: %s\n", err.Error())
- os.Exit(1)
- }
- for _, t := range txt {
- fmt.Println(t)
- }
- os.Exit(0)
- }
- // 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)
- }
|