forked from nknorg/tuna
-
Notifications
You must be signed in to change notification settings - Fork 0
/
exit.go
120 lines (99 loc) · 2.86 KB
/
exit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
"log"
"strings"
"github.com/nknorg/nkn-sdk-go"
"github.com/nknorg/tuna"
"github.com/nknorg/tuna/util"
)
type ExitCommand struct {
ConfigFile string `short:"c" long:"config" description:"Config file path" default:"config.exit.json"`
Reverse bool `long:"reverse" description:"Reverse mode"`
}
var exitCommand ExitCommand
func (e *ExitCommand) Execute(args []string) error {
config := &tuna.ExitConfiguration{}
err := util.ReadJSON(e.ConfigFile, config)
if err != nil {
log.Fatalln("Load config file error:", err)
}
if len(opts.BeneficiaryAddr) > 0 {
config.BeneficiaryAddr = opts.BeneficiaryAddr
}
if exitCommand.Reverse {
config.Reverse = true
}
if len(config.BeneficiaryAddr) > 0 {
err = nkn.VerifyWalletAddress(config.BeneficiaryAddr)
if err != nil {
log.Fatalln("Invalid beneficiary address:", err)
}
}
account, err := tuna.LoadOrCreateAccount(opts.WalletFile, opts.PasswordFile)
if err != nil {
log.Fatalln("Load or create account error:", err)
}
var seedRPCServerAddr *nkn.StringArray
if len(opts.SeedRPCServerAddr) > 0 {
seedRPCServerAddr = nkn.NewStringArrayFromString(strings.ReplaceAll(opts.SeedRPCServerAddr, ",", " "))
} else if config.Reverse && len(config.MeasureStoragePath) > 0 {
c, err := tuna.MergedExitConfig(config)
if err == nil {
rpcAddrs, err := tuna.GetFavoriteSeedRPCServer(config.MeasureStoragePath, c.SubscriptionPrefix+c.ReverseServiceName, 3000)
if err == nil {
seedRPCServerAddr = nkn.NewStringArray(append(rpcAddrs, nkn.DefaultSeedRPCServerAddr...)...)
}
}
}
walletConfig := &nkn.WalletConfig{
SeedRPCServerAddr: seedRPCServerAddr,
RPCConcurrency: 4,
}
wallet, err := nkn.NewWallet(&nkn.Account{account}, walletConfig)
if err != nil {
log.Fatalln("Create wallet error:", err)
}
log.Println("Your NKN wallet address is:", wallet.Address())
var services []tuna.Service
err = util.ReadJSON(opts.ServicesFile, &services)
if err != nil {
log.Fatalln("Load service file error:", err)
}
if config.Reverse {
for _, service := range services {
if _, ok := config.Services[service.Name]; ok {
go func(service tuna.Service) {
for {
te, err := tuna.NewTunaExit([]tuna.Service{service}, wallet, config)
if err != nil {
log.Fatalln(err)
}
go func() {
for range te.OnConnect.C {
log.Printf("Service: %s, Address: %v:%v\n", service.Name, te.GetReverseIP(), te.GetReverseTCPPorts())
}
}()
err = te.StartReverse(false)
if err != nil {
log.Println(err)
}
}
}(service)
}
}
} else {
te, err := tuna.NewTunaExit(services, wallet, config)
if err != nil {
log.Fatalln(err)
}
err = te.Start()
if err != nil {
log.Fatalln(err)
}
defer te.Close()
}
select {}
}
func init() {
parser.AddCommand("exit", "Tuna exit mode", "Start tuna in exit mode", &exitCommand)
}