OSDN Git Service

config networkID
[bytom/vapor.git] / toolbar / precog / monitor / monitor.go
index a278fc5..e11a657 100644 (file)
@@ -1,35 +1,53 @@
 package monitor
 
 import (
-       "io/ioutil"
+       // "encoding/binary"
+       // "io/ioutil"
+       "fmt"
        "os"
+       "strings"
        "time"
 
        "github.com/jinzhu/gorm"
        log "github.com/sirupsen/logrus"
-       dbm "github.com/vapor/database/leveldb"
+       // dbm "github.com/vapor/database/leveldb"
 
-       cfg "github.com/vapor/config"
+       vaporCfg "github.com/vapor/config"
        "github.com/vapor/p2p"
        // conn "github.com/vapor/p2p/connection"
+       // "github.com/vapor/consensus"
+       // "github.com/vapor/crypto/sha3pool"
+       "github.com/vapor/p2p/discover/dht"
+       "github.com/vapor/p2p/discover/mdns"
        "github.com/vapor/p2p/signlib"
        "github.com/vapor/toolbar/precog/config"
        "github.com/vapor/toolbar/precog/database/orm"
 )
 
 type monitor struct {
-       cfg *config.Config
-       db  *gorm.DB
+       cfg     *config.Config
+       db      *gorm.DB
+       nodeCfg *vaporCfg.Config
 }
 
 func NewMonitor(cfg *config.Config, db *gorm.DB) *monitor {
+       nodeCfg := &vaporCfg.Config{
+               BaseConfig: vaporCfg.DefaultBaseConfig(),
+               P2P:        vaporCfg.DefaultP2PConfig(),
+               Federation: vaporCfg.DefaultFederationConfig(),
+       }
+       nodeCfg.DBPath = "vapor_precog_data"
+
        return &monitor{
-               cfg: cfg,
-               db:  db,
+               cfg:     cfg,
+               db:      db,
+               nodeCfg: nodeCfg,
        }
 }
 
 func (m *monitor) Run() {
+       defer os.RemoveAll(m.nodeCfg.DBPath)
+
        m.updateBootstrapNodes()
        go m.discovery()
        ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqSeconds) * time.Second)
@@ -41,6 +59,7 @@ func (m *monitor) Run() {
 
 // create or update: https://github.com/jinzhu/gorm/issues/1307
 func (m *monitor) updateBootstrapNodes() {
+       var seeds []string
        for _, node := range m.cfg.Nodes {
                ormNode := &orm.Node{
                        PublicKey: node.PublicKey.String(),
@@ -48,6 +67,7 @@ func (m *monitor) updateBootstrapNodes() {
                        Host:      node.Host,
                        Port:      node.Port,
                }
+               seeds = append(seeds, fmt.Sprintf("%s:%d", node.Host, node.Port))
 
                if err := m.db.Where(&orm.Node{PublicKey: ormNode.PublicKey}).
                        Assign(&orm.Node{
@@ -59,6 +79,7 @@ func (m *monitor) updateBootstrapNodes() {
                        continue
                }
        }
+       m.nodeCfg.P2P.Seeds = strings.Join(seeds, ",")
 }
 
 // TODO:
@@ -66,28 +87,31 @@ func (m *monitor) updateBootstrapNodes() {
 // /home/gavin/work/go/src/github.com/vapor/
 // p2p/test_util.go
 // p2p/switch_test.go
+// syncManager
+// notificationMgr
 func (m *monitor) discovery() {
-       mCfg := cfg.DefaultConfig()
-       // TODO: fix
-       dirPath, err := ioutil.TempDir(".", "")
+       sw, err := m.makeSwitch()
        if err != nil {
                log.Fatal(err)
        }
-       mCfg.DBPath = dirPath
-       defer os.RemoveAll(dirPath)
 
-       // TODO: fix
-       mCfg.P2P.ListenAddress = "127.0.1.1:0"
+       sw.Start()
+}
+
+func (m *monitor) makeSwitch() (*p2p.Switch, error) {
        swPrivKey, err := signlib.NewPrivKey()
        if err != nil {
-               log.Fatal(err)
+               return nil, err
        }
 
-       testDB := dbm.NewDB("testdb", "leveldb", dirPath)
-       // initSwitchFunc
-       sw := p2p.MakeSwitch(mCfg, testDB, swPrivKey, initSwitchFunc)
-       sw.Start()
-       defer sw.Stop()
+       l, listenAddr := p2p.GetListener(m.nodeCfg.P2P)
+       discv, err := dht.NewDiscover(m.nodeCfg, swPrivKey, l.ExternalAddress().Port, m.cfg.NetworkID)
+       if err != nil {
+               return nil, err
+       }
+
+       lanDiscv := mdns.NewLANDiscover(mdns.NewProtocol(), int(l.ExternalAddress().Port))
+       return p2p.NewSwitch(m.nodeCfg, discv, lanDiscv, l, swPrivKey, listenAddr, m.cfg.NetworkID)
 }
 
 func (m *monitor) monitorRountine() error {