-
Notifications
You must be signed in to change notification settings - Fork 40
/
struct.go
152 lines (137 loc) · 4.88 KB
/
struct.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package meshviewerFFRGB
import (
"time"
"github.com/FreifunkBremen/yanic/lib/jsontime"
"github.com/FreifunkBremen/yanic/runtime"
)
type Meshviewer struct {
Timestamp jsontime.Time `json:"timestamp"`
Nodes []*Node `json:"nodes"`
Links []*Link `json:"links"`
}
type Node struct {
Firstseen jsontime.Time `json:"firstseen"`
Lastseen jsontime.Time `json:"lastseen"`
IsOnline bool `json:"is_online"`
IsGateway bool `json:"is_gateway"`
Clients uint32 `json:"clients"`
ClientsWifi24 uint32 `json:"clients_wifi24"`
ClientsWifi5 uint32 `json:"clients_wifi5"`
ClientsOthers uint32 `json:"clients_other"`
RootFSUsage float64 `json:"rootfs_usage"`
LoadAverage float64 `json:"loadavg"`
MemoryUsage *float64 `json:"memory_usage,omitempty"`
Uptime jsontime.Time `json:"uptime,omitempty"`
GatewayNexthop string `json:"gateway_nexthop,omitempty"`
GatewayIPv4 string `json:"gateway,omitempty"`
GatewayIPv6 string `json:"gateway6,omitempty"`
NodeID string `json:"node_id"`
MAC string `json:"mac"`
Addresses []string `json:"addresses"`
SiteCode string `json:"site_code,omitempty"`
DomainCode string `json:"-"`
Hostname string `json:"hostname"`
Owner string `json:"owner,omitempty"`
Location *Location `json:"location,omitempty"`
Firmware Firmware `json:"firmware,omitempty"`
Autoupdater Autoupdater `json:"autoupdater"`
Nproc int `json:"nproc"`
Model string `json:"model,omitempty"`
VPN bool `json:"vpn"`
}
// Firmware out of software
type Firmware struct {
Base string `json:"base,omitempty"`
Release string `json:"release,omitempty"`
}
// Autoupdater
type Autoupdater struct {
Enabled bool `json:"enabled"`
Branch string `json:"branch,omitempty"`
}
// Location struct
type Location struct {
Longitude float64 `json:"longitude,omitempty"`
Latitude float64 `json:"latitude,omitempty"`
}
// Link
type Link struct {
Type string `json:"type"`
Source string `json:"source"`
Target string `json:"target"`
SourceTQ float32 `json:"source_tq"`
TargetTQ float32 `json:"target_tq"`
SourceAddress string `json:"source_addr"`
TargetAddress string `json:"target_addr"`
}
func NewNode(nodes *runtime.Nodes, n *runtime.Node) *Node {
node := &Node{
Firstseen: n.Firstseen,
Lastseen: n.Lastseen,
IsOnline: n.Online,
IsGateway: n.IsGateway(),
}
if nodeinfo := n.Nodeinfo; nodeinfo != nil {
node.NodeID = nodeinfo.NodeID
node.MAC = nodeinfo.Network.Mac
node.Addresses = nodeinfo.Network.Addresses
node.SiteCode = nodeinfo.System.SiteCode
node.DomainCode = nodeinfo.System.DomainCode
node.Hostname = nodeinfo.Hostname
if owner := nodeinfo.Owner; owner != nil {
node.Owner = owner.Contact
}
if location := nodeinfo.Location; location != nil {
node.Location = &Location{
Longitude: location.Longitude,
Latitude: location.Latitude,
}
}
node.Firmware = nodeinfo.Software.Firmware
node.Autoupdater = Autoupdater{
Enabled: nodeinfo.Software.Autoupdater.Enabled,
Branch: nodeinfo.Software.Autoupdater.Branch,
}
node.Nproc = nodeinfo.Hardware.Nproc
node.Model = nodeinfo.Hardware.Model
node.VPN = nodeinfo.VPN
}
if statistic := n.Statistics; statistic != nil {
if n.Online {
node.Clients = statistic.Clients.Total
node.ClientsWifi24 = statistic.Clients.Wifi24
node.ClientsWifi5 = statistic.Clients.Wifi5
clientsWifi := node.ClientsWifi24 + node.ClientsWifi5
if node.Clients == 0 {
node.Clients = clientsWifi
} else if node.Clients >= clientsWifi {
node.ClientsOthers = node.Clients - clientsWifi
}
}
node.RootFSUsage = statistic.RootFsUsage
node.LoadAverage = statistic.LoadAverage
/* The Meshviewer could not handle absolute memory output
* calc the used memory as a float which 100% equal 1.0
* calc is coppied from node statuspage (look discussion:
* https://github.com/FreifunkBremen/yanic/issues/35)
*/
if statistic.Memory.Total > 0 {
usage := 1 - (float64(statistic.Memory.Free)+float64(statistic.Memory.Buffers)+float64(statistic.Memory.Cached))/float64(statistic.Memory.Total)
node.MemoryUsage = &usage
}
node.Uptime = jsontime.Now().Add(time.Duration(statistic.Uptime) * -time.Second)
node.GatewayNexthop = nodes.GetNodeIDbyAddress(statistic.GatewayNexthop)
if node.GatewayNexthop == "" {
node.GatewayNexthop = statistic.GatewayNexthop
}
node.GatewayIPv4 = nodes.GetNodeIDbyAddress(statistic.GatewayIPv4)
if node.GatewayIPv4 == "" {
node.GatewayIPv4 = statistic.GatewayIPv4
}
node.GatewayIPv6 = nodes.GetNodeIDbyAddress(statistic.GatewayIPv6)
if node.GatewayIPv6 == "" {
node.GatewayIPv6 = statistic.GatewayIPv6
}
}
return node
}