OSDN Git Service

Webbrowser (#260)
authorGuanghua Guo <1536310027@qq.com>
Mon, 8 Jan 2018 09:22:22 +0000 (17:22 +0800)
committerGitHub <noreply@github.com>
Mon, 8 Jan 2018 09:22:22 +0000 (17:22 +0800)
* Add webbrowser package

* Add bytomd run with webbrowser

* Add configure web's prameters

* go fmt

* Change wallet config

* Change lanch web browser time

Makefile
cmd/bytomd/commands/init.go
cmd/bytomd/commands/run_node.go
config/config.go
node/node.go
util/browser/browser.go [new file with mode: 0644]
vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md [new file with mode: 0644]
vendor/github.com/toqueteos/webbrowser/LICENSE.md [new file with mode: 0644]
vendor/github.com/toqueteos/webbrowser/README.md [new file with mode: 0644]
vendor/github.com/toqueteos/webbrowser/webbrowser.go [new file with mode: 0644]

index e53105e..40fdb52 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ bytomcli:
        @go build -ldflags "-X github.com/bytom/version.GitCommit=`git rev-parse HEAD`" \
     -o cmd/bytomcli/bytomcli cmd/bytomcli/main.go
 
-multi_platform:
+multi_platform: bytomd bytomcli
        @echo "Building multi platform binary"
        CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-X github.com/bytom/version.GitCommit=`git rev-parse HEAD`" \
     -o cmd/bytomcli/darwin/bytomcli cmd/bytomcli/main.go
index 486d777..690f800 100644 (file)
@@ -1,16 +1,16 @@
 package commands
 
 import (
-       "os"
        "encoding/hex"
+       "os"
 
-       "github.com/spf13/cobra"
        log "github.com/sirupsen/logrus"
+       "github.com/spf13/cobra"
        cmn "github.com/tendermint/tmlibs/common"
 
-       "github.com/bytom/types"
        cfg "github.com/bytom/config"
        "github.com/bytom/crypto/ed25519/chainkd"
+       "github.com/bytom/types"
 )
 
 var initFilesCmd = &cobra.Command{
index 0d6302b..4d3b962 100755 (executable)
@@ -24,7 +24,9 @@ func init() {
 
        runNodeCmd.Flags().Bool("auth.disable", config.Auth.Disable, "Disable rpc access authenticate")
 
-       runNodeCmd.Flags().Bool("wallet.enable", config.Wallet.Enable, "Enable wallet")
+       runNodeCmd.Flags().Bool("wallet.disable", config.Wallet.Disable, "Disable wallet")
+
+       runNodeCmd.Flags().Bool("web.closed", config.Web.Closed, "Lanch web browser or not")
 
        // p2p flags
        runNodeCmd.Flags().String("p2p.laddr", config.P2P.ListenAddress, "Node listen address. (0.0.0.0:0 means any interface, any port)")
index 24dbb4a..cb46748 100644 (file)
@@ -13,8 +13,10 @@ type Config struct {
        P2P    *P2PConfig     `mapstructure:"p2p"`
        Wallet *WalletConfig  `mapstructure:"wallet"`
        Auth   *RPCAuthConfig `mapstructure:"auth"`
+       Web    *WebConfig     `mapstructure:"web"`
 }
 
+// Default configurable parameters.
 func DefaultConfig() *Config {
        return &Config{
                BaseConfig: DefaultBaseConfig(),
@@ -22,6 +24,7 @@ func DefaultConfig() *Config {
                P2P:        DefaultP2PConfig(),
                Wallet:     DefaultWalletConfig(),
                Auth:       DefaultRPCAuthConfig(),
+               Web:        DefaultWebConfig(),
        }
 }
 
@@ -44,7 +47,6 @@ func (cfg *Config) SetRoot(root string) *Config {
 
 //-----------------------------------------------------------------------------
 // BaseConfig
-
 type BaseConfig struct {
        // The root directory for all data.
        // This should be set in viper so it can unmarshal into this struct
@@ -94,6 +96,7 @@ type BaseConfig struct {
        Time time.Time
 }
 
+// Default configurable base parameters.
 func DefaultBaseConfig() BaseConfig {
        return BaseConfig{
                Genesis:           "genesis.json",
@@ -130,12 +133,6 @@ func (b BaseConfig) KeysDir() string {
        return rootify(b.KeysPath, b.RootDir)
 }
 
-func DefaultLogLevel() string {
-       return "info"
-}
-
-// RPCConfig
-
 type RPCConfig struct {
        RootDir string `mapstructure:"home"`
 
@@ -150,6 +147,7 @@ type RPCConfig struct {
        Unsafe bool `mapstructure:"unsafe"`
 }
 
+// Default configurable rpc parameters.
 func DefaultRPCConfig() *RPCConfig {
        return &RPCConfig{
                ListenAddress:     "tcp://0.0.0.0:46657",
@@ -168,7 +166,6 @@ func TestRPCConfig() *RPCConfig {
 
 //-----------------------------------------------------------------------------
 // P2PConfig
-
 type P2PConfig struct {
        RootDir          string `mapstructure:"home"`
        ListenAddress    string `mapstructure:"laddr"`
@@ -182,6 +179,7 @@ type P2PConfig struct {
        DialTimeout      int    `mapstructure:"dial_timeout"`
 }
 
+// Default configurable p2p parameters.
 func DefaultP2PConfig() *P2PConfig {
        return &P2PConfig{
                ListenAddress:    "tcp://0.0.0.0:46656",
@@ -206,25 +204,36 @@ func (p *P2PConfig) AddrBookFile() string {
 }
 
 //-----------------------------------------------------------------------------
-// WalletConfig
-
 type WalletConfig struct {
-       Enable bool `mapstructure:"enable"`
+       Disable bool `mapstructure:"disable"`
 }
 
 type RPCAuthConfig struct {
        Disable bool `mapstructure:"disable"`
 }
 
+type WebConfig struct {
+       Closed bool `mapstructure:"closed"`
+}
+
+// Default configurable rpc's auth parameters.
 func DefaultRPCAuthConfig() *RPCAuthConfig {
        return &RPCAuthConfig{
                Disable: false,
        }
 }
 
+// Default configurable web parameters.
+func DefaultWebConfig() *WebConfig {
+       return &WebConfig{
+               Closed: false,
+       }
+}
+
+// Default configurable wallet parameters.
 func DefaultWalletConfig() *WalletConfig {
        return &WalletConfig{
-               Enable: false,
+               Disable: false,
        }
 }
 
index ced1775..aaf4b95 100755 (executable)
@@ -32,12 +32,14 @@ import (
        "github.com/bytom/p2p"
        "github.com/bytom/protocol"
        "github.com/bytom/types"
+       "github.com/bytom/util/browser"
        "github.com/bytom/version"
 )
 
 const (
        httpReadTimeout  = 2 * time.Minute
        httpWriteTimeout = time.Hour
+       webAddress       = "http://127.0.0.1:9888"
 )
 
 type Node struct {
@@ -201,7 +203,7 @@ func NewNode(config *cfg.Config) *Node {
                return nil
        }
 
-       if config.Wallet.Enable {
+       if !config.Wallet.Disable {
                walletDB := dbm.NewDB("wallet", config.DBBackend, config.DBDir())
                accounts = account.NewManager(walletDB, chain)
                assets = asset.NewRegistry(walletDB, chain)
@@ -252,13 +254,25 @@ func NewNode(config *cfg.Config) *Node {
                assets:     assets,
        }
        node.BaseService = *cmn.NewBaseService(nil, "Node", node)
+
        return node
 }
 
+// Lanch web broser or not
+func lanchWebBroser(lanch bool) {
+       if lanch {
+               log.Info("Launching System Browser with :", webAddress)
+               if err := browser.Open(webAddress); err != nil {
+                       log.Error(err.Error())
+                       return
+               }
+       }
+}
+
 func (n *Node) OnStart() error {
        // Create & add listener
-       protocol, address := ProtocolAndAddress(n.config.P2P.ListenAddress)
-       l := p2p.NewDefaultListener(protocol, address, n.config.P2P.SkipUPNP, nil)
+       p, address := ProtocolAndAddress(n.config.P2P.ListenAddress)
+       l := p2p.NewDefaultListener(p, address, n.config.P2P.SkipUPNP, nil)
        n.sw.AddListener(l)
 
        // Start the switch
@@ -277,6 +291,7 @@ func (n *Node) OnStart() error {
                        return err
                }
        }
+       lanchWebBroser(!n.config.Web.Closed)
        return nil
 }
 
@@ -296,13 +311,6 @@ func (n *Node) RunForever() {
        })
 }
 
-// Add the event switch to reactors, mempool, etc.
-func SetEventSwitch(evsw types.EventSwitch, eventables ...types.Eventable) {
-       for _, e := range eventables {
-               e.SetEventSwitch(evsw)
-       }
-}
-
 // Add a Listener to accept inbound peer connections.
 // Add listeners before starting the Node.
 // The first listener is the primary listener (in NodeInfo)
@@ -359,12 +367,12 @@ func (n *Node) DialSeeds(seeds []string) error {
 
 // Defaults to tcp
 func ProtocolAndAddress(listenAddr string) (string, string) {
-       protocol, address := "tcp", listenAddr
+       p, address := "tcp", listenAddr
        parts := strings.SplitN(address, "://", 2)
        if len(parts) == 2 {
-               protocol, address = parts[0], parts[1]
+               p, address = parts[0], parts[1]
        }
-       return protocol, address
+       return p, address
 }
 
 //------------------------------------------------------------------------------
diff --git a/util/browser/browser.go b/util/browser/browser.go
new file mode 100644 (file)
index 0000000..b57acde
--- /dev/null
@@ -0,0 +1,10 @@
+package browser
+
+import (
+       "github.com/toqueteos/webbrowser"
+)
+
+// Open opens browser
+func Open(url string) error {
+       return webbrowser.Open(url)
+}
diff --git a/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md b/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..b9f7bf8
--- /dev/null
@@ -0,0 +1,11 @@
+# webbrowser contributing guide
+
+Any changes are welcomed!
+
+1. Be nice.
+2. Don't be afraid to ask, but please try search first.
+
+## Looking for contact info?
+
+- Twitter: [@toqueteos](https://twitter.com/toqueteos)
+- Mail: `toqueteos AT gmail DOT com`
diff --git a/vendor/github.com/toqueteos/webbrowser/LICENSE.md b/vendor/github.com/toqueteos/webbrowser/LICENSE.md
new file mode 100644 (file)
index 0000000..4b7314c
--- /dev/null
@@ -0,0 +1,19 @@
+The MIT License (MIT)
+Copyright (c) 2013-17 by Carlos Cobo and contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/toqueteos/webbrowser/README.md b/vendor/github.com/toqueteos/webbrowser/README.md
new file mode 100644 (file)
index 0000000..92693ee
--- /dev/null
@@ -0,0 +1,56 @@
+# webbrowser [![Build Status](https://travis-ci.org/toqueteos/webbrowser.png?branch=master)](https://travis-ci.org/toqueteos/webbrowser) [![GoDoc](http://godoc.org/github.com/toqueteos/webbrowser?status.png)](http://godoc.org/github.com/toqueteos/webbrowser)
+
+webbrowser provides a simple API for opening web pages on your default browser.
+
+It's inspired on [Python's webbrowser](http://docs.python.org/3/library/webbrowser.html) package but lacks some of its features (open new window).
+
+It just opens a webpage, most browsers will open it on a new tab.
+
+## Installation
+
+As simple as:
+
+```bash
+go get -u github.com/toqueteos/webbrowser
+```
+
+## Usage
+
+```go
+package main
+
+import "github.com/toqueteos/webbrowser"
+
+func main() {
+    webbrowser.Open("http://golang.org")
+}
+```
+
+That's it!
+
+## Crossplatform support
+
+The package works on:
+
+- [x] `android` (verified by 3rd party)
+- [x] `darwin`
+- [x] `freebsd` (verified by 3rd party)
+- [x] `linux`
+- [x] `netbsd` (verified by 3rd party)
+- [x] `openbsd` (verified by 3rd party)
+- [x] `windows`
+
+## License
+
+It is licensed under the MIT open source license, please see the [LICENSE.md](https://github.com/toqueteos/webbrowser/blob/master/LICENSE.md) file for more information.
+
+## Thanks...
+
+Miki Tebeka wrote a nicer version that wasn't on godoc.org when I did this, [check it out!](https://bitbucket.org/tebeka/go-wise/src/d8db9bf5c4d1/desktop.go?at=default).
+
+## Already disliking it?
+
+No problem! There's alternative libraries that may be better to your needs:
+
+- https://github.com/pkg/browser, it does what webbrowser does and more!
+- https://github.com/skratchdot/open-golang, it even provides a `xdg-open` implementation in case you don't have it!
diff --git a/vendor/github.com/toqueteos/webbrowser/webbrowser.go b/vendor/github.com/toqueteos/webbrowser/webbrowser.go
new file mode 100644 (file)
index 0000000..f4f19b6
--- /dev/null
@@ -0,0 +1,137 @@
+// Package webbrowser provides a simple API for opening web pages on your
+// default browser.
+package webbrowser
+
+import (
+       "errors"
+       "fmt"
+       "net/url"
+       "os"
+       "os/exec"
+       "runtime"
+       "strings"
+)
+
+var (
+       ErrCantOpenBrowser = errors.New("webbrowser: can't open browser")
+       ErrNoCandidates    = errors.New("webbrowser: no browser candidate found for your OS")
+)
+
+// Candidates contains a list of registered `Browser`s that will be tried with Open.
+var Candidates []Browser
+
+type Browser interface {
+       // Command returns a ready to be used Cmd that will open an URL.
+       Command(string) (*exec.Cmd, error)
+       // Open tries to open a URL in your default browser. NOTE: This may cause
+       // your program to hang until the browser process is closed in some OSes,
+       // see https://github.com/toqueteos/webbrowser/issues/4.
+       Open(string) error
+}
+
+// Open tries to open a URL in your default browser ensuring you have a display
+// set up and not running this from SSH. NOTE: This may cause your program to
+// hang until the browser process is closed in some OSes, see
+// https://github.com/toqueteos/webbrowser/issues/4.
+func Open(s string) (err error) {
+       if len(Candidates) == 0 {
+               return ErrNoCandidates
+       }
+
+       // Try to determine if there's a display available (only linux) and we
+       // aren't on a terminal (all but windows).
+       switch runtime.GOOS {
+       case "linux":
+               // No display, no need to open a browser. Lynx users **MAY** have
+               // something to say about this.
+               if os.Getenv("DISPLAY") == "" {
+                       return fmt.Errorf("webbrowser: tried to open %q, no screen found", s)
+               }
+               fallthrough
+       case "darwin":
+               // Check SSH env vars.
+               if os.Getenv("SSH_CLIENT") != "" || os.Getenv("SSH_TTY") != "" {
+                       return fmt.Errorf("webbrowser: tried to open %q, but you are running a shell session", s)
+               }
+       }
+
+       // Try all candidates
+       for _, candidate := range Candidates {
+               err := candidate.Open(s)
+               if err == nil {
+                       return nil
+               }
+       }
+
+       return ErrCantOpenBrowser
+}
+
+func init() {
+       // Register the default Browser for current OS, if it exists.
+       if os, ok := osCommand[runtime.GOOS]; ok {
+               Candidates = append(Candidates, browserCommand{os.cmd, os.args})
+       }
+}
+
+var (
+       osCommand = map[string]*browserCommand{
+               "android": &browserCommand{"xdg-open", nil},
+               "darwin":  &browserCommand{"open", nil},
+               "freebsd": &browserCommand{"xdg-open", nil},
+               "linux":   &browserCommand{"xdg-open", nil},
+               "netbsd":  &browserCommand{"xdg-open", nil},
+               "openbsd": &browserCommand{"xdg-open", nil}, // It may be open instead
+               "windows": &browserCommand{"cmd", []string{"/c", "start"}},
+       }
+       winSchemes = [3]string{"https", "http", "file"}
+)
+
+type browserCommand struct {
+       cmd  string
+       args []string
+}
+
+func (b browserCommand) Command(s string) (*exec.Cmd, error) {
+       u, err := url.Parse(s)
+       if err != nil {
+               return nil, err
+       }
+
+       validUrl := ensureValidURL(u)
+
+       b.args = append(b.args, validUrl)
+
+       return exec.Command(b.cmd, b.args...), nil
+}
+
+func (b browserCommand) Open(s string) error {
+       cmd, err := b.Command(s)
+       if err != nil {
+               return err
+       }
+
+       return cmd.Run()
+}
+
+func ensureScheme(u *url.URL) {
+       for _, s := range winSchemes {
+               if u.Scheme == s {
+                       return
+               }
+       }
+       u.Scheme = "http"
+}
+
+func ensureValidURL(u *url.URL) string {
+       // Enforce a scheme (windows requires scheme to be set to work properly).
+       ensureScheme(u)
+       s := u.String()
+
+       // Escape characters not allowed by cmd/bash
+       switch runtime.GOOS {
+       case "windows":
+               s = strings.Replace(s, "&", `^&`, -1)
+       }
+
+       return s
+}