-
Notifications
You must be signed in to change notification settings - Fork 0
/
fritz_devicelist.go
132 lines (110 loc) · 2.46 KB
/
fritz_devicelist.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
package go_fritzbox_api
import (
"encoding/json"
"net/http"
"net/url"
"strings"
)
type response struct {
Data struct {
Topology struct {
Rootuid string `json:"rootuid"`
Devices map[string]json.RawMessage `json:"devices"`
}
}
}
type DeviceList struct {
Rootuid string `json:"rootuid"`
Devices []Device
}
func (c *Client) GetCLientList() (clients DeviceList, err error) {
data := url.Values{
"sid": {c.session.Sid},
"page": {"homeNet"},
}
resp, err := c.doRequest(http.MethodPost, "data.lua", data, true)
if err != nil {
return
}
body, err := getBody(resp)
if err != nil {
return
}
// remove empty conninfo array, otherwise json.Unmarshal will fail (inconsistent types)
body = strings.ReplaceAll(body, ",\"conninfo\":[]", "")
r := response{}
err = json.Unmarshal([]byte(body), &r)
if err != nil {
return
}
clients.Devices = []Device{}
for _, v := range r.Data.Topology.Devices {
var d Device
err = json.Unmarshal(v, &d)
if err != nil {
// ignore errors because they will happen for devices not relevant here (dect)
//fmt.Println(string(v))
//fmt.Println(err)
continue
}
if d.Nameinfo.Name != "" && d.UID != "" {
clients.Devices = append(clients.Devices, d)
}
}
err = nil
return
}
func (c *Client) AddMACs(cl *DeviceList) (err error) {
data := url.Values{
"sid": {c.session.Sid},
"page": {"netDev"},
"xhrId": {"all"},
}
resp, err := c.doRequest(http.MethodPost, "data.lua", data, true)
if err != nil {
return
}
body, err := getBody(resp)
if err != nil {
return
}
type macResponse struct {
Data struct {
Active []struct {
UID string
Mac string
}
}
}
r := macResponse{}
err = json.Unmarshal([]byte(body), &r)
if err != nil {
return
}
for i, d := range cl.Devices {
for _, v := range r.Data.Active {
if d.UID == v.UID {
cl.Devices[i].MAC = v.Mac
}
}
}
return
}
// AddProfiles gets the profile for every device and adds it into an already existing Client-list.
// Warning: This will send one request per device, meaning it will take multiple seconds to complete.
// Alternatively, call GetProfileUIDFromDevice only for the devices you need
func (c *Client) AddProfiles(cl *DeviceList) {
for dI, d := range cl.Devices {
profiles, err := c.GetAvailableProfiles()
if err != nil {
return
}
var uid string
uid, err = c.GetProfileUIDFromDevice(d.UID)
if err != nil {
return
}
d.Profile = profiles[uid]
cl.Devices[dI] = d
}
}