// Package appmeta stores the small amount of per-app networking config // Skiff itself needs (IP, port, health check, domains) that isn't already // implied by jail.conf/rc.conf - a flat file living with the app's own // data, not a separate control-plane database. package appmeta import ( "encoding/json" "os" ) // Domain is one hostname routed to the app; every non-Primary one redirects // to whichever is Primary. type Domain struct { Hostname string `json:"hostname"` Primary bool `json:"primary"` } type Meta struct { IP string `json:"ip"` Port int `json:"port"` HealthPath string `json:"health_path"` Domains []Domain `json:"domains,omitempty"` // Hostnames the app's cert actually covers as of the last sync - may // lag Domains after an add (not yet issued) or a remove (not pruned). TLSDomains []string `json:"tls_domains,omitempty"` } func (m Meta) PrimaryDomain() (Domain, bool) { for _, d := range m.Domains { if d.Primary { return d, true } } return Domain{}, false } func Write(path string, m Meta) error { b, err := json.MarshalIndent(m, "", " ") if err != nil { return err } return os.WriteFile(path, b, 0644) } func Read(path string) (Meta, error) { var m Meta b, err := os.ReadFile(path) if err != nil { return m, err } err = json.Unmarshal(b, &m) return m, err }