96 lines
2.1 KiB
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
|
||
|
}
|