-
Notifications
You must be signed in to change notification settings - Fork 0
/
zone.go
105 lines (88 loc) · 2.35 KB
/
zone.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
package sc
import (
"encoding/json"
"net"
"strconv"
"strings"
"time"
)
type zonesResp struct {
scResp
Response []Zone
}
type zoneResp struct {
scResp
Response Zone
}
// Zone https://docs.tenable.com/sccv/api/Scan-Zone.html
type Zone struct {
ID string `json:"id" sc:"id"`
Name string `json:"name" sc:"name"`
Description string `json:"description" sc:"description"`
Status string `json:"status" sc:"status"`
IPList []*net.IPNet `json:"-" sc:"ipList"`
IPListStr string `json:"ipList"`
CreatedTime time.Time `json:"-" sc:"createdTime"`
CreatedTimeStr string `json:"createdTime"`
ModifiedTime time.Time `json:"-" sc:"modifiedTime"`
ModifiedTimeStr string `json:"modifiedTime"`
Scanners []Scanner `json:"scanners" sc:"scanners"`
ActiveScanners int `json:"activeScanners" sc:"activeScaners"`
TotalScanners int `json:"totalScanners" sc:"totalScanners"`
}
// todo: finish Zones, Scanner, Scan, Repository, other key objects, and basic editing
// GetZones retrieves a slice of Zones with either the user-supplied fields or their default values
func (sc *SC) GetZones(fields ...string) ([]Zone, error) {
var (
resp zonesResp
zones []Zone
req = sc.NewRequest("GET", "zone")
scResp *Response
err error
)
if len(fields) > 0 {
req.data["fields"] = strings.Join(fields, ",")
}
scResp, err = req.Do()
if err != nil {
return nil, err
}
err = json.Unmarshal(scResp.RespBody, &resp)
if err != nil {
return resp.Response, err
}
for _, z := range resp.Response {
err = z.readAttr()
if err != nil {
return nil, err
}
zones = append(zones, z)
}
return zones, err
}
func (z *Zone) readAttr() error {
// read list of IP networks
for _, ipNetStr := range strings.Split(z.IPListStr, ",") {
_, ipNet, err := net.ParseCIDR(ipNetStr)
if err != nil {
return err
}
z.IPList = append(z.IPList, ipNet)
}
createdTime, err := strconv.ParseInt(z.CreatedTimeStr, 10, 64)
if err != nil {
return err
}
z.CreatedTime = time.Unix(createdTime, 0)
modifiedTime, err := strconv.ParseInt(z.ModifiedTimeStr, 10, 64)
if err != nil {
return err
}
z.ModifiedTime = time.Unix(modifiedTime, 0)
for _, s := range z.Scanners {
if err := (&s).readAttr(); err != nil {
return err
}
}
return nil
}