-
Notifications
You must be signed in to change notification settings - Fork 10
/
puppeth.go
141 lines (131 loc) · 4.04 KB
/
puppeth.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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// Copyright 2017 The go-ethereum Authors
// This file is part of go-ethereum.
//
// go-ethereum is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// go-ethereum is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
// puppeth is a command to assemble and maintain private networks.
package main
import (
"math/rand"
"os"
"strings"
"time"
"github.com/Onther-Tech/plasma-evm/log"
"gopkg.in/urfave/cli.v1"
)
// main is just a boring entry point to set up the CLI app.
func main() {
app := cli.NewApp()
app.Name = "puppeth"
app.Usage = "assemble and maintain private Ethereum networks"
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "network",
Usage: "name of the network to administer (no spaces or hyphens, please)",
},
cli.IntFlag{
Name: "loglevel",
Value: 3,
Usage: "log level to emit to the screen",
},
cli.StringFlag{
Name: "images.ethstats",
Usage: "name of ethstats docker image",
Value: "puppeth/ethstats:latest",
},
cli.StringFlag{
Name: "images.bootnode",
Usage: "name of bootnode docker image",
Value: "onthertech/plasma-evm:alltools-latest",
},
cli.StringFlag{
Name: "images.node",
Usage: "name of node docker image",
Value: "onthertech/plasma-evm:latest",
},
cli.StringFlag{
Name: "images.explorer",
Usage: "name of explorer docker image",
Value: "onthertech/blockscout:latest",
},
cli.StringFlag{
Name: "images.nginx",
Usage: "name of nginx docker image",
Value: "jwilder/nginx-proxy",
},
cli.StringFlag{
Name: "images.wallet",
Usage: "name of wallet docker image",
Value: "puppeth/wallet:latest",
},
cli.StringFlag{
Name: "images.faucet",
Usage: "name of faucet docker image",
Value: "onthertech/plasma-evm:alltools-latest",
},
cli.StringFlag{
Name: "images.dashboard",
Usage: "name of dashboard docker image",
Value: "mhart/alpine-node:latest",
},
cli.StringFlag{
Name: "bootnodes",
Usage: "Comma separated enode URLs for P2P discovery bootstrap for Sealer or usernode",
Value: "",
},
}
app.Before = func(c *cli.Context) error {
// Set up the logger to print everything and the random generator
log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(c.Int("loglevel")), log.StreamHandler(os.Stdout, log.TerminalFormat(true))))
rand.Seed(time.Now().UnixNano())
return nil
}
app.Action = runWizard
app.Run(os.Args)
}
// runWizard start the wizard and relinquish control to it.
func runWizard(c *cli.Context) error {
network := c.String("network")
images := map[string]string{
"ethstats": c.String("images.ethstats"),
"bootnode": c.String("images.bootnode"),
"node": c.String("images.node"),
"explorer": c.String("images.explorer"),
"nginx": c.String("images.nginx"),
"wallet": c.String("images.wallet"),
"faucet": c.String("images.faucet"),
"dashboard": c.String("images.dashboard"),
}
bootnodes := c.String("bootnodes")
urls := []string{}
urls = strings.Split(bootnodes, ",")
if strings.Contains(network, " ") || strings.Contains(network, "-") || strings.ToLower(network) != network {
log.Crit("No spaces, hyphens or capital letters allowed in network name")
}
// Checking enode address
for _, url := range urls {
if url != "" {
// prefix check
if !strings.HasPrefix(url, "enode://") {
log.Crit("Bootstrap URL invalid, has not `enode://`")
}
url = url[8:]
addrs := strings.Split(url, "@")
if len(addrs[0]) != 128 {
log.Crit("Bootstrap URL invalid, wrong length, want 128 hex chars")
}
}
}
makeWizard(c.String("network"), images, urls).run()
return nil
}