-
-
Notifications
You must be signed in to change notification settings - Fork 162
/
diagnostics.go
86 lines (75 loc) · 2.14 KB
/
diagnostics.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
package diagnostics
import (
"fmt"
ios "github.com/danielpaulus/go-ios/ios"
)
const serviceName = "com.apple.mobile.diagnostics_relay"
type Connection struct {
deviceConn ios.DeviceConnectionInterface
plistCodec ios.PlistCodec
}
func New(device ios.DeviceEntry) (*Connection, error) {
deviceConn, err := ios.ConnectToService(device, serviceName)
if err != nil {
return &Connection{}, err
}
return &Connection{deviceConn: deviceConn, plistCodec: ios.NewPlistCodec()}, nil
}
func Reboot(device ios.DeviceEntry) error {
service, err := New(device)
if err != nil {
return err
}
return service.Reboot()
}
func (diagnosticsConn *Connection) Reboot() error {
req := rebootRequest{Request: "Restart", WaitForDisconnect: true, DisplayFail: true, DisplayPass: true}
reader := diagnosticsConn.deviceConn.Reader()
bytes, err := diagnosticsConn.plistCodec.Encode(req)
if err != nil {
return err
}
diagnosticsConn.deviceConn.Send(bytes)
response, err := diagnosticsConn.plistCodec.Decode(reader)
if err != nil {
return err
}
plist, err := ios.ParsePlist(response)
if err != nil {
return err
}
if val, ok := plist["Status"]; ok {
if statusString, yes := val.(string); yes {
if "Success" == statusString {
return nil
}
}
}
return fmt.Errorf("Could not reboot, response: %+v", plist)
}
func (diagnosticsConn *Connection) AllValues() (allDiagnosticsResponse, error) {
allReq := diagnosticsRequest{"All"}
reader := diagnosticsConn.deviceConn.Reader()
bytes, err := diagnosticsConn.plistCodec.Encode(allReq)
if err != nil {
return allDiagnosticsResponse{}, err
}
diagnosticsConn.deviceConn.Send(bytes)
response, err := diagnosticsConn.plistCodec.Decode(reader)
if err != nil {
return allDiagnosticsResponse{}, err
}
return diagnosticsfromBytes(response), nil
}
func (diagnosticsConn *Connection) Close() error {
reader := diagnosticsConn.deviceConn.Reader()
closeReq := diagnosticsRequest{"Goodbye"}
bytes, err := diagnosticsConn.plistCodec.Encode(closeReq)
if err != nil {
return err
}
diagnosticsConn.deviceConn.Send(bytes)
_, err = diagnosticsConn.plistCodec.Decode(reader)
diagnosticsConn.deviceConn.Close()
return err
}