summaryrefslogtreecommitdiffstats
path: root/pkg/icingadb/v1/host.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/icingadb/v1/host.go')
-rw-r--r--pkg/icingadb/v1/host.go122
1 files changed, 122 insertions, 0 deletions
diff --git a/pkg/icingadb/v1/host.go b/pkg/icingadb/v1/host.go
new file mode 100644
index 0000000..fbab47c
--- /dev/null
+++ b/pkg/icingadb/v1/host.go
@@ -0,0 +1,122 @@
+package v1
+
+import (
+ "bytes"
+ "database/sql/driver"
+ "github.com/icinga/icingadb/pkg/contracts"
+ "github.com/icinga/icingadb/pkg/types"
+ "net"
+)
+
+type Host struct {
+ Checkable `json:",inline"`
+ Address string `json:"address"`
+ Address6 string `json:"address6"`
+ AddressBin AddressBin `json:"-"`
+ Address6Bin Address6Bin `json:"-"`
+}
+
+// Init implements the contracts.Initer interface.
+func (h *Host) Init() {
+ h.Checkable.Init()
+ h.AddressBin.Host = h
+ h.Address6Bin.Host = h
+}
+
+type AddressBin struct {
+ Host *Host `db:"-"`
+}
+
+var v4InV6Prefix = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}
+
+// Value implements the driver.Valuer interface.
+func (ab AddressBin) Value() (driver.Value, error) {
+ if ab.Host == nil {
+ return nil, nil
+ }
+
+ ip := net.ParseIP(ab.Host.Address)
+ if ip == nil {
+ return nil, nil
+ }
+
+ if ip = bytes.TrimPrefix(ip, v4InV6Prefix); len(ip) == 4 {
+ return []byte(ip), nil
+ } else {
+ return nil, nil
+ }
+}
+
+type Address6Bin struct {
+ Host *Host `db:"-"`
+}
+
+// Value implements the driver.Valuer interface.
+func (ab Address6Bin) Value() (driver.Value, error) {
+ if ab.Host == nil {
+ return nil, nil
+ }
+
+ if ip := net.ParseIP(ab.Host.Address6); ip == nil {
+ return nil, nil
+ } else {
+ return []byte(ip), nil
+ }
+}
+
+type HostCustomvar struct {
+ CustomvarMeta `json:",inline"`
+ HostId types.Binary `json:"host_id"`
+}
+
+type HostState struct {
+ State `json:",inline"`
+ HostId types.Binary `json:"host_id"`
+}
+
+type Hostgroup struct {
+ GroupMeta `json:",inline"`
+}
+
+type HostgroupCustomvar struct {
+ CustomvarMeta `json:",inline"`
+ HostgroupId types.Binary `json:"hostgroup_id"`
+}
+
+type HostgroupMember struct {
+ MemberMeta `json:",inline"`
+ HostId types.Binary `json:"host_id"`
+ HostgroupId types.Binary `json:"hostgroup_id"`
+}
+
+func NewHost() contracts.Entity {
+ return &Host{}
+}
+
+func NewHostCustomvar() contracts.Entity {
+ return &HostCustomvar{}
+}
+
+func NewHostState() contracts.Entity {
+ return &HostState{}
+}
+
+func NewHostgroup() contracts.Entity {
+ return &Hostgroup{}
+}
+
+func NewHostgroupCustomvar() contracts.Entity {
+ return &HostgroupCustomvar{}
+}
+
+func NewHostgroupMember() contracts.Entity {
+ return &HostgroupMember{}
+}
+
+// Assert interface compliance.
+var (
+ _ contracts.Initer = (*Host)(nil)
+ _ driver.Valuer = AddressBin{}
+ _ driver.Valuer = Address6Bin{}
+ _ contracts.Initer = (*Hostgroup)(nil)
+)