Skip to content

Commit 7d1c42a

Browse files
committed
add registrar-cli tool
1 parent dc11912 commit 7d1c42a

23 files changed

+1007
-16
lines changed

.goreleaser.yaml

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,22 @@ builds:
1818
- -X github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/cmd.version={{.Tag}}
1919
- -X github.com/threefoldtech/tfgrid-sdk-go/node-registrar/cmd.commit={{.Commit}}
2020

21-
- dir: ./node-registrar/tools/account
21+
- dir: ./node-registrar/tools/registrar-cli
2222
env:
2323
- CGO_ENABLED=0
2424
goos:
2525
- linux
2626
- windows
2727
- darwin
28-
binary: new-account
29-
id: new-account
28+
binary: reg-cli
29+
id: reg-cli
3030

3131
ignore:
3232
- goos: windows
33+
ldflags:
34+
- -X github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/cmd.version={{.Tag}}
35+
- -X github.com/threefoldtech/tfgrid-sdk-go/node-registrar/cmd.commit={{.Commit}}
3336

34-
- dir: ./node-registrar/tools/farm
35-
env:
36-
- CGO_ENABLED=0
37-
goos:
38-
- linux
39-
- windows
40-
- darwin
41-
binary: new-farm
42-
id: new-farm
43-
44-
ignore:
45-
- goos: windows
4637

4738

4839
archives:

go.work

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
go 1.21.0
22

3-
use ./node-registrar
3+
use (
4+
./node-registrar
5+
./registrar-cli
6+
)

registrar-cli/LICENSE

Whitespace-only changes.

registrar-cli/Makefile

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
PWD := $(shell pwd)
2+
GOPATH := $(shell go env GOPATH)
3+
4+
all: verifiers test
5+
6+
test:
7+
@echo "Running Tests"
8+
go test -v ./...
9+
10+
coverage: clean
11+
@echo "Installing gopherbadger" && go get -u github.com/jpoles1/gopherbadger && go install github.com/jpoles1/gopherbadger
12+
mkdir coverage
13+
go test -v -vet=off ./... -coverprofile=coverage/coverage.out
14+
go tool cover -html=coverage/coverage.out -o coverage/coverage.html
15+
@${GOPATH}/bin/gopherbadger -png=false -md="README.md"
16+
rm coverage.out
17+
go mod tidy
18+
19+
clean:
20+
rm ./coverage -rf
21+
rm ./bin -rf
22+
23+
getverifiers:
24+
@echo "Installing golangci-lint" && go install github.com/golangci/golangci-lint/cmd/golangci-lint
25+
go mod tidy
26+
27+
lint:
28+
@echo "Running $@"
29+
golangci-lint run -c ../.golangci.yml
30+
31+
build:
32+
@echo "Running $@"
33+
@go build -ldflags=\
34+
"-X 'github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/tools/registrar-cli/cmd.commit=$(shell git rev-parse HEAD)'\
35+
-X 'github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/tools/registrar-cli/cmd.version=$(shell git tag --sort=-version:refname | head -n 1)'"\
36+
-o bin/registrar-cli main.go

registrar-cli/README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# New Farm Tool
2+
3+
## Overview
4+
5+
This tool allows users to create/get/update farm/account/node on a specified network.
6+
7+
## Installation
8+
9+
1. Clone the repository:
10+
11+
```sh
12+
git clone https://github.com/threefoldtech/tfgrid4-sdk-go
13+
```
14+
15+
2. Navigate to the project directory:
16+
17+
```sh
18+
cd node-registrar/tools/registrar-cli
19+
```
20+
21+
3. Build the application:
22+
23+
```sh
24+
go build -o registrar-cli main.go
25+
```
26+
27+
## Usage
28+
29+
```sh
30+
./registrar-cli -seed <seed> -network <network> -farm_name <farm_name>
31+
```
32+
33+
### Parameters
34+
35+
- `-seed` (required): A hexadecimal string used as a private key seed.
36+
- `-network` (required): Specifies the network (`dev`, `qa`, `test`, `main`).
37+
- `-farm_name` (required): The name of the farm to create.
38+
39+
### Example Usage
40+
41+
```sh
42+
./registrar-cli -seed aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899 -network dev -farm_name MyFarm
43+
```

registrar-cli/cmd/create.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Package cmd for parsing command line arguments
2+
package cmd
3+
4+
import (
5+
"github.com/spf13/cobra"
6+
)
7+
8+
// createCmd represents the create command
9+
var createCmd = &cobra.Command{
10+
Use: "create",
11+
Short: "create account/farm on Threefold grid4",
12+
}
13+
14+
func init() {
15+
rootCmd.AddCommand(createCmd)
16+
}

registrar-cli/cmd/create_account.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// Package cmd for parsing command line arguments
2+
package cmd
3+
4+
import (
5+
"crypto/ed25519"
6+
"crypto/rand"
7+
"encoding/hex"
8+
"fmt"
9+
10+
"github.com/rs/zerolog/log"
11+
"github.com/spf13/cobra"
12+
"github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client"
13+
)
14+
15+
// createAccountCmd represents the cancel command
16+
var createAccountCmd = &cobra.Command{
17+
Use: "account",
18+
Short: "create new account in node registrar",
19+
RunE: func(cmd *cobra.Command, args []string) error {
20+
seed, err := cmd.Flags().GetString("seed")
21+
if err != nil {
22+
return err
23+
}
24+
25+
network, err := cmd.Flags().GetString("network")
26+
if err != nil {
27+
return err
28+
}
29+
30+
relays, err := cmd.Flags().GetStringArray("relays")
31+
if err != nil {
32+
return err
33+
}
34+
35+
rmbEncKey, err := cmd.Flags().GetString("rmb-enc-key")
36+
if err != nil {
37+
return err
38+
}
39+
40+
u, ok := urls[network]
41+
if !ok {
42+
return fmt.Errorf("invalid network %s", network)
43+
}
44+
45+
if len(seed) == 0 {
46+
seed, err = generateRandomSeed()
47+
if err != nil {
48+
return err
49+
}
50+
log.Info().Msgf("New Seed (Hex): %s", seed)
51+
}
52+
53+
seedBytes, err := hex.DecodeString(seed)
54+
if err != nil {
55+
return err
56+
}
57+
58+
privateKey := ed25519.NewKeyFromSeed(seedBytes)
59+
publicKey := privateKey.Public().(ed25519.PublicKey)
60+
61+
log.Info().Msgf("public key (Hex): %s", hex.EncodeToString(publicKey))
62+
63+
cli, err := client.NewRegistrarClient(u, seedBytes)
64+
if err != nil {
65+
return err
66+
}
67+
68+
account, err := cli.CreateAccount(relays, rmbEncKey)
69+
if err != nil {
70+
return err
71+
}
72+
73+
log.Info().Uint64("twinID", account.TwinID).Msg("account is created successfully")
74+
75+
return nil
76+
},
77+
}
78+
79+
func init() {
80+
createCmd.AddCommand(createAccountCmd)
81+
createAccountCmd.Flags().StringP("seed", "s", "", "account seed key")
82+
createAccountCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)")
83+
createAccountCmd.Flags().StringArrayP("relays", "r", nil, "relays urls")
84+
createAccountCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key")
85+
}
86+
87+
func generateRandomSeed() (string, error) {
88+
s := make([]byte, 32)
89+
_, err := rand.Read(s)
90+
if err != nil {
91+
return "", err
92+
}
93+
94+
seed := hex.EncodeToString(s)
95+
return seed, nil
96+
}
97+
98+
func createAccount(c client.RegistrarClient, relays []string, rmbEncKey string) (client.Account, error) {
99+
account, err := c.CreateAccount(relays, rmbEncKey)
100+
if err != nil {
101+
log.Fatal().Err(err).Msg("failed to create new account on registrar")
102+
}
103+
104+
return account, err
105+
}
106+
107+
func parseSeed(seed string) (ed25519.PublicKey, ed25519.PrivateKey, []byte, error) {
108+
privateKeyBytes, err := hex.DecodeString(seed)
109+
if err != nil {
110+
return nil, nil, nil, err
111+
}
112+
113+
privateKey := ed25519.NewKeyFromSeed(privateKeyBytes)
114+
publicKey := privateKey.Public().(ed25519.PublicKey)
115+
116+
return publicKey, privateKey, privateKeyBytes, nil
117+
}

registrar-cli/cmd/create_farm.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// Package cmd for parsing command line arguments
2+
package cmd
3+
4+
import (
5+
"encoding/hex"
6+
"fmt"
7+
8+
"github.com/rs/zerolog/log"
9+
"github.com/spf13/cobra"
10+
"github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client"
11+
)
12+
13+
// createFarmCmd represents the cancel command
14+
var createFarmCmd = &cobra.Command{
15+
Use: "farm",
16+
Short: "create new farm in node registrar",
17+
RunE: func(cmd *cobra.Command, args []string) error {
18+
seed, err := cmd.Flags().GetString("seed")
19+
if err != nil {
20+
return err
21+
}
22+
23+
network, err := cmd.Flags().GetString("network")
24+
if err != nil {
25+
return err
26+
}
27+
28+
farmName, err := cmd.Flags().GetString("farm-name")
29+
if err != nil {
30+
return err
31+
}
32+
33+
dedicated, err := cmd.Flags().GetBool("dedicated")
34+
if err != nil {
35+
return err
36+
}
37+
38+
u, ok := urls[network]
39+
if !ok {
40+
return fmt.Errorf("invalid network %s", network)
41+
}
42+
43+
if len(seed) == 0 {
44+
return fmt.Errorf("can not initialize registrar client with no seed")
45+
}
46+
47+
seedBytes, err := hex.DecodeString(seed)
48+
if err != nil {
49+
return err
50+
}
51+
52+
cli, err := client.NewRegistrarClient(u, seedBytes)
53+
if err != nil {
54+
return err
55+
}
56+
57+
farm, err := cli.CreateFarm(farmName, dedicated)
58+
if err != nil {
59+
return err
60+
}
61+
62+
log.Info().Uint64("farmID", farm).Msg("farm is created successfully")
63+
64+
return nil
65+
},
66+
}
67+
68+
func init() {
69+
createCmd.AddCommand(createFarmCmd)
70+
createFarmCmd.Flags().StringP("seed", "s", "", "account seed key")
71+
createFarmCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)")
72+
createFarmCmd.Flags().StringP("farm-name", "f", "", "farm name")
73+
createFarmCmd.Flags().BoolP("dedicated", "d", false, "is farm dedicated")
74+
}

registrar-cli/cmd/farm.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Package cmd for parsing command line arguments
2+
package cmd
3+
4+
import (
5+
"github.com/spf13/cobra"
6+
)
7+
8+
// farmCmd represents the farm command
9+
var farmCmd = &cobra.Command{
10+
Use: "account",
11+
Short: "account on Threefold grid4",
12+
// Args: cobra.ExactArgs(1),
13+
// Run: func(cmd *cobra.Command, args []string) {
14+
// },
15+
}
16+
17+
func init() {
18+
}

registrar-cli/cmd/get.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Package cmd for parsing command line arguments
2+
package cmd
3+
4+
import (
5+
"github.com/spf13/cobra"
6+
)
7+
8+
// getCmd represents the get command
9+
var getCmd = &cobra.Command{
10+
Use: "get",
11+
Short: "get account/farm/node from Threefold grid4",
12+
}
13+
14+
func init() {
15+
rootCmd.AddCommand(getCmd)
16+
}

0 commit comments

Comments
 (0)