mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-03-12 04:36:29 -07:00
138 lines
2.9 KiB
Go
138 lines
2.9 KiB
Go
/*
|
|
* 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)
|
|
}
|