freifunkmanager/runtime/yanic.go

102 lines
2.3 KiB
Go

package runtime
import (
"time"
"github.com/bdlm/log"
"github.com/jinzhu/gorm"
databaseYanic "github.com/FreifunkBremen/yanic/database"
runtimeYanic "github.com/FreifunkBremen/yanic/runtime"
"github.com/FreifunkBremen/freifunkmanager/ssh"
)
type YanicDB struct {
databaseYanic.Connection
blacklistFor time.Duration
db *gorm.DB
ssh *ssh.Manager
sendNode func(*Node)
sendStats func(*runtimeYanic.GlobalStats)
prefix string
}
func NewYanicDB(db *gorm.DB, ssh *ssh.Manager, blacklistFor time.Duration, sendNode func(*Node), sendStats func(*runtimeYanic.GlobalStats), prefix string) *YanicDB {
return &YanicDB{
db: db,
ssh: ssh,
blacklistFor: blacklistFor,
sendNode: sendNode,
sendStats: sendStats,
prefix: prefix,
}
}
func (conn *YanicDB) InsertNode(n *runtimeYanic.Node) {
if n.Nodeinfo == nil {
return
}
now := time.Now()
logger := log.WithField("method", "LearnNode").WithField("node_id", n.Nodeinfo.NodeID)
lNode := Node{
NodeID: n.Nodeinfo.NodeID,
}
if conn.db.First(&lNode).Error == nil {
lNode.Update(n, conn.prefix)
conn.db.Model(&lNode).Update(map[string]interface{}{
"address": lNode.Address,
"lastseen": now,
})
if lNode.TimeFilter(conn.blacklistFor) {
logger.Debug("on blacklist")
return
}
if !lNode.CheckRespondd() {
if !lNode.SSHUpdate(conn.ssh) {
conn.db.Model(&lNode).Update(map[string]interface{}{"blacklist": &now})
logger.Warn("yanic trigger sshupdate failed - set blacklist")
return
}
logger.Debug("yanic trigger sshupdate again")
} else {
logger.Debug("yanic update")
}
conn.sendNode(&lNode)
return
}
node := NewNode(n, conn.prefix)
if node == nil {
return
}
_, err := conn.ssh.RunOn(node.GetAddress(), "uptime")
if err != nil {
logger.Debugf("set on blacklist: %s", err.Error())
node.Blacklist = &now
}
conn.db.Create(&node)
if node.Blacklist == nil {
conn.sendNode(node)
}
}
func (conn *YanicDB) InsertLink(link *runtimeYanic.Link, time time.Time) {
}
func (conn *YanicDB) InsertGlobals(stats *runtimeYanic.GlobalStats, time time.Time, site string, domain string) {
if runtimeYanic.GLOBAL_SITE == site && runtimeYanic.GLOBAL_DOMAIN == domain {
conn.sendStats(stats)
}
}
func (conn *YanicDB) PruneNodes(deleteAfter time.Duration) {
}
func (conn *YanicDB) Close() {
}