package zones import ( "net/netip" "strings" ) // revive:disable:line-length-limit // A Machine is a machine on a Zone type Machine struct { zone *Zone logger `toml:"-" json:"-" yaml:"-"` ID int `toml:"id"` Name string `toml:"-" json:"-" yaml:"-"` PublicAddresses []netip.Addr `toml:"public,omitempty" json:"public,omitempty" yaml:"public,omitempty"` Rings []*RingInfo `toml:"rings,omitempty" json:"rings,omitempty" yaml:"rings,omitempty"` CephMonitor bool `toml:"ceph_monitor,omitempty" json:"ceph_monitor,omitempty" yaml:"ceph_monitor,omitempty"` } // revive:enable:line-length-limit func (m *Machine) String() string { return m.Name } // FullName returns the Name of the machine including domain name func (m *Machine) FullName() string { if domain := m.zone.zones.domain; domain != "" { var s = []string{ m.Name, domain, } return strings.Join(s, ".") } return m.Name } // IsGateway tells if the Machine is a ring0 gateway func (m *Machine) IsGateway() bool { _, ok := m.getRingInfo(0) return ok } // SetGateway enables/disables a Machine ring0 integration func (m *Machine) SetGateway(enabled bool) error { ri, found := m.getRingInfo(0) switch { case !found && !enabled: return nil case !found: var err error if ri, err = m.createRingInfo(0, false); err != nil { return err } } ri.Enabled = enabled return m.SyncWireguardConfig(0) } // Zone indicates the [Zone] this machine belongs to func (m *Machine) Zone() int { return m.zone.ID } func (m *Machine) getPeerByName(name string) (*Machine, bool) { return m.zone.zones.GetMachineByName(name) }