telebit/cmd/machineid/machineid.go

84 lines
2.0 KiB
Go

package main
import (
"encoding/base64"
"encoding/hex"
"flag"
"fmt"
"os"
"git.rootprojects.org/root/telebit/mgmt/authstore"
"github.com/denisbrodbeck/machineid"
_ "github.com/joho/godotenv/autoload"
)
func main() {
var secret, clientSecret, relaySecret string
var raw bool
flag.BoolVar(&raw, "raw", false, "output the raw machine id")
vendorID := flag.String("vendor-id", "", "a unique identifier for a deploy target environment")
flag.StringVar(&secret, "secret", "", "either the remote server or the tunnel relay secret (used for JWT authentication)")
flag.Parse()
if 0 == len(*vendorID) {
*vendorID = os.Getenv("VENDOR_ID")
}
if 0 == len(*vendorID) {
*vendorID = "telebit.io"
}
if 0 == len(secret) {
clientSecret = os.Getenv("CLIENT_SECRET")
relaySecret = os.Getenv("RELAY_SECRET")
if 0 == len(relaySecret) {
relaySecret = os.Getenv("SECRET")
}
}
if 0 == len(secret) {
secret = clientSecret
}
if 0 == len(secret) {
secret = relaySecret
}
if 0 == len(secret) && 0 == len(clientSecret) && 0 == len(relaySecret) {
fmt.Fprintf(os.Stderr, "See usage: machineid --help\n")
os.Exit(1)
return
} else if 0 != len(clientSecret) && 0 != len(relaySecret) {
fmt.Fprintf(os.Stderr, "Use only one of $SECRET or --relay-secret or --client-secret\n")
os.Exit(1)
return
}
if raw {
rawID, err := machineid.ID()
if nil != err {
fmt.Fprintf(os.Stderr, "Error: %q", err)
os.Exit(1)
return
}
fmt.Println("Raw Machine ID:", rawID)
}
fmt.Println("Vendor ID:", *vendorID)
fmt.Println("Secret:", secret)
var ppid string
muid, err := machineid.ProtectedID(fmt.Sprintf("%s|%s", *vendorID, secret))
//muid, err := machineid.ProtectedID(fmt.Sprintf("%s|%s", VendorID, ClientSecret))
if nil != err {
fmt.Fprintf(os.Stderr, "unauthorized device: %s\n", err)
os.Exit(1)
return
}
muidBytes, _ := hex.DecodeString(muid)
ppid = base64.RawURLEncoding.EncodeToString(muidBytes)
fmt.Println("PPID:", ppid)
pub := authstore.ToPublicKeyString(ppid)
fmt.Println("Pub:", pub)
}