OSDN Git Service

fix
[bytom/vapor.git] / toolbar / precog / monitor / monitor.go
1 package monitor
2
3 import (
4         // "encoding/binary"
5         // "io/ioutil"
6         "os"
7         "time"
8
9         "github.com/jinzhu/gorm"
10         log "github.com/sirupsen/logrus"
11         // dbm "github.com/vapor/database/leveldb"
12
13         vaporCfg "github.com/vapor/config"
14         "github.com/vapor/p2p"
15         // conn "github.com/vapor/p2p/connection"
16         // "github.com/vapor/consensus"
17         // "github.com/vapor/crypto/sha3pool"
18         "github.com/vapor/p2p/discover/dht"
19         "github.com/vapor/p2p/discover/mdns"
20         "github.com/vapor/p2p/signlib"
21         "github.com/vapor/toolbar/precog/config"
22         "github.com/vapor/toolbar/precog/database/orm"
23 )
24
25 const vaporNetID = 10817814959495988245
26
27 type monitor struct {
28         cfg     *config.Config
29         db      *gorm.DB
30         nodeCfg *vaporCfg.Config
31 }
32
33 func NewMonitor(cfg *config.Config, db *gorm.DB) *monitor {
34         nodeCfg := &vaporCfg.Config{
35                 BaseConfig: vaporCfg.DefaultBaseConfig(),
36                 P2P:        vaporCfg.DefaultP2PConfig(),
37                 Federation: vaporCfg.DefaultFederationConfig(),
38         }
39         nodeCfg.DBPath = "vapor_precog_data"
40
41         return &monitor{
42                 cfg:     cfg,
43                 db:      db,
44                 nodeCfg: nodeCfg,
45         }
46 }
47
48 func (m *monitor) Run() {
49         defer os.RemoveAll(m.nodeCfg.DBPath)
50
51         m.updateBootstrapNodes()
52         go m.discovery()
53         ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqSeconds) * time.Second)
54         for ; true; <-ticker.C {
55                 // TODO: lock?
56                 m.monitorRountine()
57         }
58 }
59
60 // create or update: https://github.com/jinzhu/gorm/issues/1307
61 func (m *monitor) updateBootstrapNodes() {
62         for _, node := range m.cfg.Nodes {
63                 ormNode := &orm.Node{
64                         PublicKey: node.PublicKey.String(),
65                         Alias:     node.Alias,
66                         Host:      node.Host,
67                         Port:      node.Port,
68                 }
69
70                 if err := m.db.Where(&orm.Node{PublicKey: ormNode.PublicKey}).
71                         Assign(&orm.Node{
72                                 Alias: node.Alias,
73                                 Host:  node.Host,
74                                 Port:  node.Port,
75                         }).FirstOrCreate(ormNode).Error; err != nil {
76                         log.Error(err)
77                         continue
78                 }
79         }
80 }
81
82 // TODO:
83 // implement logic first, and then refactor
84 // /home/gavin/work/go/src/github.com/vapor/
85 // p2p/test_util.go
86 // p2p/switch_test.go
87 func (m *monitor) discovery() {
88         sw, err := m.makeSwitch()
89         if err != nil {
90                 log.Fatal(err)
91         }
92
93         sw.Start()
94 }
95
96 func (m *monitor) makeSwitch() (*p2p.Switch, error) {
97         swPrivKey, err := signlib.NewPrivKey()
98         if err != nil {
99                 return nil, err
100         }
101
102         l, listenAddr := p2p.GetListener(m.nodeCfg.P2P)
103         discv, err := dht.NewDiscover(m.nodeCfg, swPrivKey, l.ExternalAddress().Port, vaporNetID)
104         if err != nil {
105                 return nil, err
106         }
107
108         lanDiscv := mdns.NewLANDiscover(mdns.NewProtocol(), int(l.ExternalAddress().Port))
109         return p2p.NewSwitch(m.nodeCfg, discv, lanDiscv, l, swPrivKey, listenAddr, vaporNetID)
110 }
111
112 func (m *monitor) monitorRountine() error {
113         // TODO: dail nodes, get lantency & best_height
114         // TODO: decide check_height("best best_height" - "confirmations")
115         // TODO: get blockhash by check_height, get latency
116         // TODO: update lantency, active_time and status
117         return nil
118 }