logmania/database/host.go

96 lines
2.1 KiB
Go

package database
import (
"time"
)
type Host struct {
Name string `json:"name"`
Address string `json:"address"`
Lastseen time.Time `json:"lastseen,omitempty"`
LastseenNotify time.Time `json:"lastseen_notify,omitempty"`
Notifies []string `json:"notifies"`
NotifiesByAddress map[string]*Notify `json:"-"`
}
func (h *Host) AddNotify(n *Notify) {
if _, ok := h.NotifiesByAddress[n.Address()]; !ok {
h.Notifies = append(h.Notifies, n.Address())
h.NotifiesByAddress[n.Address()] = n
}
}
func (h *Host) DeleteNotify(to string) {
delete(h.NotifiesByAddress, to)
for i, v := range h.Notifies {
if v == to {
copy(h.Notifies[i:], h.Notifies[i+1:])
h.Notifies = h.Notifies[:len(h.Notifies)-1]
return
}
}
return
}
// -- global notify
func (db *DB) InitHost() {
if db.HostsByAddress == nil {
db.HostsByAddress = make(map[string]*Host)
}
if db.HostsByName == nil {
db.HostsByName = make(map[string]*Host)
}
for _, h := range db.Hosts {
if h.NotifiesByAddress == nil {
h.NotifiesByAddress = make(map[string]*Notify)
}
for _, nName := range h.Notifies {
h.NotifiesByAddress[nName] = db.NotifiesByAddress[nName]
}
db.HostsByAddress[h.Address] = h
db.HostsByName[h.Name] = h
}
}
func (db *DB) AddHost(h *Host) {
db.Hosts = append(db.Hosts, h)
db.HostsByAddress[h.Address] = h
db.HostsByName[h.Name] = h
}
func (db *DB) GetHost(str string) *Host {
h, ok := db.HostsByAddress[str]
if ok {
return h
}
return db.HostsByName[str]
}
func (db *DB) DeleteHost(h *Host) {
delete(db.HostsByAddress, h.Address)
delete(db.HostsByName, h.Name)
for i, v := range db.Hosts {
if v.Address == h.Address {
copy(db.Hosts[i:], db.Hosts[i+1:])
db.Hosts[len(db.Hosts)-1] = nil
db.Hosts = db.Hosts[:len(db.Hosts)-1]
return
}
}
return
}
func (db *DB) ChangeHostname(h *Host, name string) {
delete(db.HostsByName, h.Name)
h.Name = name
db.HostsByName[name] = h
}
func (db *DB) NewHost(addr string) *Host {
h := &Host{
Address: addr,
NotifiesByAddress: make(map[string]*Notify),
}
db.AddHost(h)
return h
}