-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgravityzone.js
More file actions
149 lines (138 loc) · 4.79 KB
/
Copy pathgravityzone.js
File metadata and controls
149 lines (138 loc) · 4.79 KB
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
// ===================================
// Packages
// ===================================
const request = require('request');
const EventEmitter = require('events');
// ===================================
// Gravityzone API
// ===================================
class gravityzone extends EventEmitter {
constructor(conf) {
super();
this.apiKey = conf.gravityZoneAPI;
this.endpoints = {};
// --------------------
// List of endpoints
// --------------------
// create list of endpoint
this.generateEndpoint();
// set interval for the generate endpoint function to run
setInterval(this.generateEndpoint.bind(this), conf.generateEndpoint);
// --------------------
// Endpoint details
// --------------------
// get endpoint details (delay with one min to allow enpoin list to be generated)
setTimeout(this.getEndpoint.bind(this), 60000);
// set interval to get endpoint details
setInterval(this.getEndpoint.bind(this), conf.getEndpoint);
}
/**
* Make an API call to bitdefender
* @param {String} location - link location.
* @param {String} method - name of method to use.
* @param {Object} params - Object with parameters to send
* @returns
*/
gzCall(location, method, params) {
return new Promise((resolve, rejects) => {
try {
request({ uri: `https://cloudgz.gravityzone.bitdefender.com/api/v1.0/jsonrpc/${location}`,
method: "POST",
auth: {
username: this.apiKey,
password: ""
},
json: {
"id": 1001,
"jsonrpc": "2.0",
"method": method,
"params": params
}
}, function(response, body) {
if (body) {
resolve(body.body.result)
} else {
rejects({ err: "body undefiend" })
}
});
} catch (err) {
rejects(err.message);
}
})
}
/**
* get list of endpoints from gz
* @param {Integer} page - page number
* @param {Array} list - list of discovred endpoints
*/
getEndpointList(page, list) {
return new Promise((resolve, rejects) => {
this.gzCall("network", "getEndpointsList", {perPage: 30, page: page})
.then(result => {
if (result) {
if (!list) {
list = result;
}
else {
list.items = list.items.concat(result.items)
}
resolve(this.getEndpointList(page + 1, list))
}
else
resolve(list)
})
.catch(err => {
console.log(err.message)
resolve()
})
})
}
/**
* Genetate list of endpoints to be used by SNMP
*/
generateEndpoint() {
this.getEndpointList(1)
.then(result => {
let endpointList = {};
Object.keys(result.items).forEach(e => { endpointList[result.items[e].id] = result.items[e] })
if (!(Object.keys(endpointList).length === 0)) {
if (Object.keys(this.endpoints).length === 0) {
this.endpoints = endpointList;
} else {
// check for new endpoints
Object.keys(endpointList).forEach(a => {
if (!this.endpoints[a]) {
this.endpoints = endpointList[a];
}
})
// check for old endpoints
Object.keys(this.endpoints).forEach(b => {
if (!endpointList[b]) {
delete this.endpoints[b];
}
})
}
}
})
.catch(err => {
console.log(err.message)
})
}
getEndpoint() {
const endpointList = Object.keys(this.endpoints);
if (!(endpointList.length === 0)) {
endpointList.forEach(e => {
this.gzCall("network", "getManagedEndpointDetails", { "endpointId": e })
.then(result => {
if (result) {
this.endpoints[result.id].data = result;
}
})
.catch(err => {
console.log(err.message)
})
})
}
}
}
module.exports.gravityzone = gravityzone;