diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-10-12 18:46:57 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-12 18:46:57 +0800 |
commit | 8d8034fe59e40d606e6feea4c71b4798e7862e2f (patch) | |
tree | de4bfbf5480c595dfec75f4b41ce146f65391ee3 | |
parent | fd0e7b1c679ff4535513ae2d01c81803b7eb8f9b (diff) | |
parent | b45cc0c9e8c8724f9db6420a0ea7fbf6d5401fbe (diff) | |
download | go-tangerine-8d8034fe59e40d606e6feea4c71b4798e7862e2f.tar go-tangerine-8d8034fe59e40d606e6feea4c71b4798e7862e2f.tar.gz go-tangerine-8d8034fe59e40d606e6feea4c71b4798e7862e2f.tar.bz2 go-tangerine-8d8034fe59e40d606e6feea4c71b4798e7862e2f.tar.lz go-tangerine-8d8034fe59e40d606e6feea4c71b4798e7862e2f.tar.xz go-tangerine-8d8034fe59e40d606e6feea4c71b4798e7862e2f.tar.zst go-tangerine-8d8034fe59e40d606e6feea4c71b4798e7862e2f.zip |
Merge pull request #15269 from karalabe/puppeth-dumb-ip-filtering
cmd/puppeth: use dumb textual IP filtering
-rw-r--r-- | cmd/puppeth/wizard.go | 13 | ||||
-rw-r--r-- | cmd/puppeth/wizard_ethstats.go | 31 |
2 files changed, 33 insertions, 11 deletions
diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 3fdd639f8..5fbc11cb9 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -302,8 +302,10 @@ func (w *wizard) readJSON() string { } // readIPAddress reads a single line from stdin, trimming if from spaces and -// converts it to a network IP address. -func (w *wizard) readIPAddress() net.IP { +// returning it if it's convertible to an IP address. The reason for keeping +// the user input format instead of returning a Go net.IP is to match with +// weird formats used by ethstats, which compares IPs textually, not by value. +func (w *wizard) readIPAddress() string { for { // Read the IP address from the user fmt.Printf("> ") @@ -312,14 +314,13 @@ func (w *wizard) readIPAddress() net.IP { log.Crit("Failed to read user input", "err", err) } if text = strings.TrimSpace(text); text == "" { - return nil + return "" } // Make sure it looks ok and return it if so - ip := net.ParseIP(text) - if ip == nil { + if ip := net.ParseIP(text); ip == nil { log.Error("Invalid IP address, please retry") continue } - return ip + return text } } diff --git a/cmd/puppeth/wizard_ethstats.go b/cmd/puppeth/wizard_ethstats.go index 504d8fd9c..8bfa1d6e5 100644 --- a/cmd/puppeth/wizard_ethstats.go +++ b/cmd/puppeth/wizard_ethstats.go @@ -18,6 +18,7 @@ package main import ( "fmt" + "sort" "github.com/ethereum/go-ethereum/log" ) @@ -64,17 +65,37 @@ func (w *wizard) deployEthstats() { fmt.Println() fmt.Printf("Keep existing IP %v blacklist (y/n)? (default = yes)\n", infos.banned) if w.readDefaultString("y") != "y" { - infos.banned = nil - + // The user might want to clear the entire list, although generally probably not + fmt.Println() + fmt.Printf("Clear out blacklist and start over (y/n)? (default = no)\n") + if w.readDefaultString("n") != "n" { + infos.banned = nil + } + // Offer the user to explicitly add/remove certain IP addresses + fmt.Println() + fmt.Println("Which additional IP addresses should be blacklisted?") + for { + if ip := w.readIPAddress(); ip != "" { + infos.banned = append(infos.banned, ip) + continue + } + break + } fmt.Println() - fmt.Println("Which IP addresses should be blacklisted?") + fmt.Println("Which IP addresses should not be blacklisted?") for { - if ip := w.readIPAddress(); ip != nil { - infos.banned = append(infos.banned, ip.String()) + if ip := w.readIPAddress(); ip != "" { + for i, addr := range infos.banned { + if ip == addr { + infos.banned = append(infos.banned[:i], infos.banned[i+1:]...) + break + } + } continue } break } + sort.Strings(infos.banned) } // Try to deploy the ethstats server on the host trusted := make([]string, 0, len(w.servers)) |