dsnet/reporttypes.go
2020-03-04 22:49:27 +00:00

87 lines
2.0 KiB
Go

package dsnet
import (
"encoding/json"
"io/ioutil"
"net"
"time"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
type Status int
const (
// Host has not been loaded into wireguard yet
Pending = iota
// Host has not transferred anything (not even a keepalive) for 30 seconds
Offline
// Host has transferred something in the last 30 seconds, keepalive counts
Online
// Host has not connected for 28 days and may be removed
Expired
)
func (s Status) String() string {
switch s {
case Pending:
return "pending"
case Offline:
return "offline"
case Online:
return "online"
case Expired:
return "expired"
default:
return "unknown"
}
}
// note unmarshal not required
func (s Status) MarshalJSON() ([]byte, error) {
return []byte("\"" + s.String() + "\""), nil
}
type DsnetReport struct {
// domain to append to hostnames. Relies on separate DNS server for
// resolution. Informational only.
ExternalIP net.IP
ListenPort int
Domain string
// IP network from which to allocate automatic sequential addresses
// Network is chosen randomly when not specified
Network JSONIPNet
IP net.IP
DNS net.IP
Peers []PeerReport
}
func GenerateReport(dev *wgtypes.Device, conf *DsnetConfig) DsnetReport {
return DsnetReport{}
}
func (report *DsnetReport) MustSave(filename string) {
_json, _ := json.MarshalIndent(report, "", " ")
err := ioutil.WriteFile(filename, _json, 0644)
check(err)
}
type PeerReport struct {
// Used to update DNS
Hostname string
// username of person running this host/router
Owner string
// Description of what the host is and/or does
Description string
// Internal VPN IP address. Added to AllowedIPs in server config as a /32
IP net.IP
Status Status
// TODO ExternalIP support (Endpoint)
//ExternalIP net.UDPAddr `validate:"required,udp4_addr"`
// TODO support routing additional networks (AllowedIPs)
Networks []JSONIPNet
LastHandshakeTime time.Time
ReceiveBytes int64
TransmitBytes int64
}