PluginProbe
WebTotem Security / 2.3.14
WebTotem Security v2.3.14
3.0.1 3.0.0 trunk 1.0 1.1 1.2 1.3 1.3.1 1.3.2 1.3.3 2.0 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.1 2.2.2 2.2.3 2.2.4 All 109 releases
← All changes | library/WT.php +141 -52 2.2.12.3.14 View file →
@@ -3,13 +3,14 @@
3 3
4 4 class WTSEC_LIBRARY_WT
5 5 {
6 6
7 - const URL = "https://".WTSEC_API_URL."/graphql";
7 + const URL = "https://api.wtotem.com/graphql";
8 8
9 9 public static function auth($key)
10 10 {
11 - $payload = '{"query":"mutation{\n guest{\n apiKeys{\n auth(apiKey:\"' . $key . '\"),{\n token{\n value,refreshToken,expiresIn\n }\n }\n }\n }\n}"}';
11 + $source = get_site_url();
12 + $payload = '{"query":"mutation{ guest{ apiKeys{ auth(apiKey:\"' . $key . '\", source:\"' . $source . '\"),{ token{ value,refreshToken,expiresIn } } } } }"}';
12 13 return self::requestApi($payload);
13 14 }
14 15
15 16 protected static function requestApi($payload, $token = false, $repeat = false)
@@ -16,11 +17,31 @@
16 17 {
17 18 if ($token) {
18 19 $token = WTSEC_LIBRARY_App::getToken();
19 20 }
21 +
22 + $token_expired = wtsec_app()->get("token_expired");
23 +
24 + if($token_expired && $token_expired <= time()){
25 + $token_expired = wtsec_app()->get("token_expired");
26 + if($token_expired <= time()){
27 + $result = WTSEC_LIBRARY_WT::auth(wtsec_app()->get("api_key"));
28 + if (isset($result['data']['guest']['apiKeys']['auth']['token']['value'])) {
29 + $expiresIn = $result['data']['guest']['apiKeys']['auth']['token']['expiresIn'];
30 + wtsec_app()->set("token_expired", time() + $expiresIn - 60);
31 +
32 + $token_ = $result['data']['guest']['apiKeys']['auth']['token']['value'];
33 + WTSEC_LIBRARY_App::login($token_);
34 + return self::requestApi($payload, $token, true);
35 + } else {
36 + WTSEC_LIBRARY_App::logout();
37 + }
38 + }
39 + }
40 +
20 41 $args = [
21 42 'body' => $payload,
22 - 'timeout' => '30',
43 + 'timeout' => '60',
23 44 'sslverify' => false,
24 45 'headers' => ['Content-Type:application/json', 'Content-Type' => 'application/json', 'source:WORDPRESS', 'Accept: application/json'],
25 46 ];
26 47 if (!is_null($token) && $token) {
@@ -30,27 +51,17 @@
30 51 $response = wp_remote_post(self::URL, $args);
31 52 $httpcode = wp_remote_retrieve_response_code($response);
32 53
33 54 if ($httpcode < 200) {
34 - WTSEC_LIBRARY_Session::setNotification("error", WTSEC_LIBRARY_Localization::lmsg('could_not_connect_to_the_server')." requestApi");
55 + WTSEC_LIBRARY_Session::setNotification("error", WTSEC_LIBRARY_Localization::lmsg('could_not_connect_to_the_server'));
35 56 }
36 57 $response = wp_remote_retrieve_body($response);
37 58 $result = json_decode($response, true);
38 59 if (isset($result['errors'][0]['message'])) {
39 60 $message = self::diffMesageForHuman($result['errors'][0]['message']);
40 - if (stripos($result['errors'][0]['message'], "token") !== false && !$repeat) {
41 - $result = WTSEC_LIBRARY_WT::auth(wtsec_app()->get("api_key"));
42 - if (isset($result['data']['guest']['apiKeys']['auth']['token']['value'])) {
43 - $token_ = $result['data']['guest']['apiKeys']['auth']['token']['value'];
44 - WTSEC_LIBRARY_App::login($token_);
45 - return self::requestApi($payload, $token, true);
46 - } else {
47 - WTSEC_LIBRARY_App::logout();
48 - }
49 - } else {
50 - if ($message !== false) {
51 - WTSEC_LIBRARY_Session::setNotification("warning", $message);
52 - }
61 +
62 + if ($message !== false) {
63 + WTSEC_LIBRARY_Session::setNotification("warning", $message);
53 64 }
54 65 }
55 66 return $result;
56 67 }
@@ -100,10 +111,11 @@
100 111 return $response;
101 112 }
102 113
103 114
104 - public static function getFileByUrl($url)
115 + public static function getFileByUrl($url, $fileName)
105 116 {
117 + $url = $url.'/'.$fileName;
106 118 $args = [
107 119 'timeout' => '30',
108 120 'sslverify' => false,
109 121 ];
@@ -111,19 +123,21 @@
111 123 $httpcode = wp_remote_retrieve_response_code($response);
112 124 if ($httpcode < 200) {
113 125 WTSEC_LIBRARY_Session::setNotification("error", WTSEC_LIBRARY_Localization::lmsg('could_not_connect_to_the_server')." getFileByUrl");
114 126 }
115 - $filename = null;
116 - $metas = explode(";",$response['headers']["content-disposition"]);
117 - foreach ($metas as $meta){
118 - if(stripos($meta,"filename") !== false){
119 - $filename = trim(str_replace(["filename=","=","\""],"",$meta));
120 - }
121 - }
127 +
122 128 $response = wp_remote_retrieve_body($response);
123 - return ["body" => $response, "filename" => $filename];
129 + return ["body" => $response, "filename" => $fileName];
124 130 }
125 131
132 +
133 + public static function getEmail(){
134 + $payload = '{"query":"query { auth { viewer { email __typename } __typename } }"}';
135 + $result = self::requestApi($payload, true);
136 +
137 + return $result['data']['auth']['viewer']['email'];
138 + }
139 +
126 140 public static function getOwnSite($attempt = false)
127 141 {
128 142 $payload = '{"query":"query getSites { auth { viewer { sites { ...sites __typename } __typename } __typename }}fragment sites on SiteQueries { list(filter: {}) { edges { node { id hostname title ssl { status __typename } availability { status __typename } reputation { status __typename } ports { status __typename } deface { status __typename } domain { status __typename } antivirus { status __typename } firewall { status __typename } maliciousScript { stack { name __typename } __typename } __typename } __typename } __typename } __typename}"}';
129 143
@@ -132,11 +146,9 @@
132 146 //mutator
133 147 foreach ($result['data']['auth']['viewer']['sites']['list']['edges'] as &$m) {
134 148 if (isset($m['node']['hostname'])) {
135 149 $m['node']['hostname'] = WTSEC_LIBRARY_Idn::idn_to_utf8($m['node']['hostname']);
136 -// if ($m['node']['id'] == "c2l0ZV8yNTg=") {
137 -// return $m['node'];
138 -// }
150 +
139 151 if (self::isSiteUrl($m['node']['hostname'])) {
140 152 return $m['node'];
141 153 }
142 154 }
@@ -165,13 +177,13 @@
165 177 }
166 178
167 179 public static function getAllChecks($host_id)
168 180 {
169 - $from = time() - (60 * 60 * 24);
181 + $from = time() - (60 * 60 * 24 * 7);
170 182 $to = time();
171 183 $from_waf = time() - (60 * 60 * 24 * 30);
172 - $payload = '{"query":"query($id: ID!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { ports { status ip tcp lastTest { time } } availability { status lastTest { time } responseTime downTime(dateRange: $dateRange) percent(dateRange: $dateRange) } deface { status lastTest { time } words count } domain { status registrar owner email createdDate expiredDate } ports { status lastTest { time } ip tcp country } ssl { status daysLeft expiryDate issueDate } reputation { status lastTest { time } virusList { virus{ type path } antiVirus } } firewall { lastTest { time } status chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } maliciousScript { lastTest { time } status } antivirus { status stats { changed deleted scaned infected error } lastTest { time } isFirstCheck } } } } } }","variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}}}';
173 -// $payload = '{"query":"query($id: ID!, $dateRange:DateRangeInput!) {\n auth {\n viewer {\n sites {\n one(id: $id) {\n ports{\n status\n ip\n tcp\n lastTest{\n time\n }\n }\n availability {\n status\n lastTest {\n time\n }\n responseTime\n downTime(dateRange: $dateRange)\n percent(dateRange: $dateRange)\n }\n deface {\n status\n lastTest {\n time\n }\n words\n count\n }\n domain {\n status\n registrar\n owner\n email\n createdDate\n expiredDate\n }\n ports {\n status\n lastTest {\n time\n }\n ip\n tcp\n country\n }\n ssl {\n status\n daysLeft\n expiryDate\n issueDate\n }\n reputation {\n status\n lastTest {\n time\n }\n virusList {\n viruses\n antiVirus\n }\n }\n firewall {\n lastTest { \n time\n } \n status\n logs{\n edges\n{\n node{\n status\n country\n type\n}\n}\n}\n chart(dateRange: $dateRange) {\n time\n attacks\n blocked\n }\n report(dateRange: $dateRange) {\n time\n attacks\n ip\n }\n }\n maliciousScript{\n lastTest{\n time\n }\n status\n }\n antivirus{\n status \n stats { \n changed\n deleted\n scaned\n infected\n error\n } \n lastTest { \n time\n } \n isFirstCheck\n }\n }\n }\n }\n }\n}","variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}}}';
184 + $language = WTSEC_LANGUAGE;
185 + $payload = '{"query":"query($id: ID!, $dateRange: DateRangeInput!, $language: Language!, $dateRangeWeek: DateRangeInput!, $wafLogFilter: WafLogFilter!) { auth { viewer { sites { one(id: $id) { ports { status ip tcp lastTest { time } } availability { status lastTest { time } responseTime downTime(dateRange: $dateRange) percent(dateRange: $dateRange) } deface { status lastTest { time } words count } domain { status registrar owner email createdDate expiredDate } ports { status lastTest { time } ip tcp country } ssl { status daysLeft expiryDate issueDate } reputation { status lastTest { time } virusList { virus{ type path } antiVirus } } firewall { lastTest { time } logs(wafLogFilter: $wafLogFilter){ edges{ node{ type blocked payload ip location{ country{ nameEn } } time request status country category } } } map(dateRange: $dateRange) { attacks, country } status chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } serverStatus { info { phpVersion phpServerUser phpServerSoftware phpGatewayInterface phpServerProtocol osInfo cpuCount cpuModel CpuFreq cpuFamily lsCpu maxExecTime mathLibraries } ramChart(dateRange: $dateRangeWeek){ total value time } cpuChart(dateRange: $dateRangeWeek){ value time } discUsage{ total free } status } maliciousScript { lastTest { time } status } scoring( language: $language ){ score lastTest{ time } result{ ip country isHigherThan }} agentManager{ createdAt } antivirus { status stats { changed deleted scaned infected error } lastTest { time } isFirstCheck } } } } } }","variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}, "dateRangeWeek":{"to":' . $to . ',"from":' . $from . '}, "wafLogFilter": {"order":{"direction":"DESC","field":"time"},"pagination":{"first":5,"cursor":null}}, "language":"'.$language.'"}}';
174 186 $response = self::requestApi($payload, true);
175 187 if (isset($response['data']['auth']['viewer']['sites']['one'])) {
176 188 return $response['data']['auth']['viewer']['sites']['one'];
177 189 }
@@ -177,8 +189,40 @@
177 189 }
178 190 return [];
179 191 }
180 192
193 + public static function getFirewall($host_id, $limit = 20, $cursor = null, $days = 365)
194 + {
195 + $from = (is_array($days)) ? $days['from'] : time() - (60 * 60 * 24 * $days);
196 + $to = (is_array($days)) ? $days['to'] : time();
197 + $cursor = ($cursor == null) ? 'null' : '"'.$cursor.'"';
198 +
199 + $payload = '{"operationName":"FirewallAttackLog","variables":{"dateRange":{"to":'.$to.',"from":'.$from.'},"id":"'.$host_id.'","wafLogFilter":{"dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":'.$limit.',"cursor":' . $cursor . '}}},"query":"query FirewallAttackLog($id: ID!, $wafLogFilter: WafLogFilter!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } settings{ gdn dosProtection dosLimit loginAttemptsProtection loginAttemptsLimit } status... FirewallLogFragment map(dateRange: $dateRange) { attacks, country } __typename } __typename } __typename } __typename } __typename } } fragment FirewallLogFragment on Waf { logs(wafLogFilter: $wafLogFilter) { edges { cursor node { type blocked payload ip location { country { nameEn __typename } __typename } time request status country category __typename } __typename } pageInfo { endCursor hasNextPage __typename } __typename } __typename }"}';
200 + $res = self::requestApi($payload, true);
201 +
202 + return $res;
203 + }
204 +
205 +
206 + public static function getAntivirus($host_id, $limit = 10, $cursor = null, $days = 365, $event = 'new')
207 + {
208 + $from = (is_array($days)) ? $days['from'] : time() - (60 * 60 * 24 * $days);
209 + $to = (is_array($days)) ? $days['to'] : time();
210 + $cursor = ($cursor == null) ? 'null' : '"' . $cursor . '"';
211 + $payload = '{"operationName":null,"variables":{"id":"' . $host_id . '","avLogFilter":{"event":"'.$event.'","dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":' . $limit . ',"cursor":' . $cursor . '}}},"query":"query ($id: ID!, $avLogFilter: AvLogFilter!) { auth { viewer { sites { one(id: $id) { id ... on Site { configs { ... on AvConfig { isActive id } } } antivirus { status log(avLogFilter: $avLogFilter) { edges { node { filePath matches event signatures time permissions permissionsChanged } } pageInfo { endCursor hasNextPage __typename } } lastTest { time } stats { changed deleted scaned infected } } } } } } }"}';
212 + return self::requestApi($payload, true);
213 + }
214 +
215 + public static function getFirewallChart($host_id, $days = 7)
216 + {
217 + $to = time();
218 + $from_waf = ($days <= 1) ? strtotime(date('Y-m-d 00:00:01')) : time() - (60 * 60 * 24 * $days);
219 +
220 + $payload = '{ "query":"query($id: ID!, $dateRange: DateRangeInput!, $wafLogFilter: WafLogFilter!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } status logs(wafLogFilter: $wafLogFilter) { edges { node { status country type userAgent } } } chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } } } } } }", "operationName":null,"variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}, "wafLogFilter": { "dateRange": { "from": ' .$from_waf. ', "to": ' .$to. ' }, "pagination": { "cursor": null }, "order": { "direction": "DESC", "field": "time" } } } }';
221 + $response = self::requestApi($payload, true);
222 + return $response['data']['auth']['viewer']['sites']['one']['firewall']['chart'];
223 + }
224 +
181 225 public static function changeStatus($config_id, $host_id)
182 226 {
183 227 $payload = '{"query":"\n mutation {\n toggleServiceConfig(\n id: ' . $config_id . '\n userhostId: ' . $host_id . '\n ) {\n isActive\n }\n }\n "}';
184 228 return self::requestApi($payload, true);
@@ -197,12 +241,18 @@
197 241 }
198 242
199 243 public static function generateAmFile($id)
200 244 {
201 - $payload = '{"operationName":null,"variables":{},"query":"mutation {\n auth {\n am {\n install(siteId: \"'.$id.'\")\n }\n }\n}\n"}';
245 + $payload = '{ "operationName":null, "variables":{}, "query":"mutation { auth { am { install(siteId: \"'.$id.'\"){ downloadLink, amFilename, wafFilename, avFilename } } } }"}';
202 246 return self::requestApi($payload, true);
203 247 }
204 248
249 + public static function deleteAm($id)
250 + {
251 + $payload = '{ "query":"mutation { auth { am { delete(siteId: \"'.$id.'\") } } }"}';
252 + return self::requestApi($payload, true);
253 + }
254 +
205 255 public static function checkStatus($id, $service)
206 256 {
207 257 $payload = '{"operationName":null,"variables":{"id":"' . $id . '"},"query":"query ($id: ID!) {\n auth {\n viewer {\n sites {\n one(id: $id) {\n ... on Site {\n configs {\n ... on ' . $service . 'Config {\n isActive\n id\n }\n }\n }\n }\n }\n }\n }\n}\n"}';
208 258 return self::requestApi($payload, true);
@@ -208,43 +258,75 @@
208 258 return self::requestApi($payload, true);
209 259 }
210 260
211 261
212 - public static function getAntivirus($host_id, $limit = 10, $cursor = null, $days = 365, $event = 'infected')
262 + public static function getQuarantineList($host_id)
213 263 {
214 - $from = (is_array($days)) ? $days['begin'] : time() - (60 * 60 * 24 * $days);
215 - $to = (is_array($days)) ? $days['end'] : time();
264 + $payload = '{"query":"query{ auth{ viewer{ sites{ one(id:\"'.$host_id.'\"){ antivirus{ quarantine{ id path date } } } } } } } "}';
265 + return self::requestApi($payload, true);
266 + }
267 +
268 + public static function moveToQuarantine($host_id, $path)
269 + {
270 + $payload = '{"query":"mutation{ auth{ sites{ av{ moveToQuarantine(input:{ siteId:\"'.$host_id.'\", path:\"'.$path.'\" }) } } } } "}';
271 + return self::requestApi($payload, true);
272 + }
273 +
274 + public static function moveFromQuarantine($id)
275 + {
276 + $payload = '{"query":"mutation{ auth{ sites{ av{ moveFromQuarantine(id: \"'.$id.'\") } } } } "}';
277 + return self::requestApi($payload, true);
278 + }
279 +
280 + public static function reportsList($host_id, $limit = 10, $cursor = null)
281 + {
216 282 $cursor = ($cursor == null) ? 'null' : '"' . $cursor . '"';
217 - $payload = '{"operationName":null,"variables":{"id":"' . $host_id . '","avLogFilter":{"event":"'.$event.'","dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":' . $limit . ',"cursor":' . $cursor . '}}},"query":"query ($id: ID!, $avLogFilter: AvLogFilter!) { auth { viewer { sites { one(id: $id) { id ... on Site { configs { ... on AvConfig { isActive id } } } antivirus { status log(avLogFilter: $avLogFilter) { edges { node { filePath matches event signatures time } } pageInfo { endCursor hasNextPage __typename } } lastTest { time } stats { changed deleted scaned infected } } } } } } }"}';
283 + $payload = '{"variables":{ "filter": { "order": { "direction": "DESC", "field": "created_at"}, "siteId":"'.$host_id.'", "pagination":{"first":' . $limit . ', "cursor":' . $cursor . '} } },"query":"query ReportsQuery($filter: ReportListFilter!) { auth { viewer { reports { list(filter: $filter) { edges { node { id site { hostname } createdAt wa dc ps rc sc av waf } cursor } pageInfo { endCursor hasNextPage } } } } } }"}';
218 284 return self::requestApi($payload, true);
219 285 }
220 286
221 - public static function getOptions($host_id)
287 + public static function reportGenerate($host_id, $period, $services, $language = "en")
222 288 {
223 - $payload = '{"query":"query{\nuserHost(id:' . $host_id . '){\n id\n title\n hostname\n stack\n createdAt\n services {\n id\n name\n configs {\n id\n \tdata\n isActive\n }\n }\n }\n}"}';
289 + $from = (is_array($period)) ? $period['from'] : time() - (60 * 60 * 24 * $period);
290 + $to = (is_array($period)) ? $period['to'] : time();
291 + $payload = '{"query":"query ($input: GenerateReportInput) { auth { viewer { reports { generate(input: $input) } } } }", "variables":{ "input": { "siteId": "' . $host_id . '", "from": ' . $from . ', "to": ' . $to . ', "wa": '.$services['wa'].', "dc": '.$services['dc'].', "ps": '.$services['ps'].', "rc": '.$services['rc'].', "sc": '.$services['sc'].', "av": '.$services['av'].', "waf": '.$services['waf'].', "language": "'.$language.'" } } }';
292 +
224 293 return self::requestApi($payload, true);
225 294 }
226 295
227 - public static function getFirewall($host_id, $limit = 20, $cursor = null, $days = 365)
296 + public static function reportDownload($id)
228 297 {
229 - $from = (is_array($days)) ? $days['begin'] : time() - (60 * 60 * 24 * $days);
230 - $to = (is_array($days)) ? $days['end'] : time();
231 - $cursor = ($cursor == null) ? 'null' : '"'.$cursor.'"';
298 + $payload = '{"query": "query { auth { viewer { reports { download(id: \"' . $id . '\") } } } }"}';
299 + return self::requestApi($payload, true);
300 + }
232 301
233 - $payload = '{"operationName":"FirewallAttackLog","variables":{"dateRange":{"to":'.$to.',"from":'.$from.'},"id":"'.$host_id.'","wafLogFilter":{"dateRange":{"to":'.$to.',"from":'.$from.'},"order":{"direction":"DESC","field":"time"},"pagination":{"first":'.$limit.',"cursor":' . $cursor . '}}},"query":"query FirewallAttackLog($id: ID!, $wafLogFilter: WafLogFilter!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } status... FirewallLogFragment map(dateRange: $dateRange) { attacks, country } __typename } __typename } __typename } __typename } __typename } } fragment FirewallLogFragment on Waf { logs(wafLogFilter: $wafLogFilter) { edges { cursor node { type blocked payload ip location { country { nameEn __typename } __typename } time request status country category __typename } __typename } pageInfo { endCursor hasNextPage __typename } __typename } __typename }"}';
234 - $res = self::requestApi($payload, true);
302 + public static function getConfigs($host_id)
303 + {
304 + $payload = '{"query":"query{ auth{ viewer{ sites{ one(id:\"'.$host_id.'\"){ configs{ ... on WaConfig { id service isActive } ... on AvConfig { id service isActive } ... on DcConfig { id service isActive } ... on DecConfig { id service isActive } ... on RcConfig { id service isActive } ... on CmsConfig { id service isActive } ... on PsConfig { id service isActive } ... on WafConfig { id service isActive } } } } } } } "}';
305 + return self::requestApi($payload, true);
306 + }
235 307
236 - return $res;
308 + public static function toggleConfigs($service_id)
309 + {
310 + $payload = '{"query":"mutation{ auth{ configs{ toggle(id: \"'.$service_id.'\"){ ... on WaConfig { service isActive } ... on AvConfig { service isActive } ... on DcConfig { service isActive } ... on DecConfig { service isActive } ... on RcConfig { service isActive } ... on CmsConfig { service isActive } ... on PsConfig { service isActive } ... on WafConfig { service isActive } } } } } "}';
311 + return self::requestApi($payload, true);
237 312 }
238 313
239 - public static function getFirewallChart($host_id, $days = 7)
314 + public static function wafSettings($host_id, $settings)
240 315 {
316 + $payload = '{"variables":{"input": {"siteId": "'.$host_id.'", "gdn": '. $settings['gdn'] .', "dosProtection": '.$settings['dosProtection'].', "dosLimit": '.$settings['dosLimit'].', "loginAttemptsProtection": '.$settings['loginAttemptsProtection'].', "loginAttemptsLimit": '.$settings['loginAttemptsLimit'].'}},"query":"mutation WafSettings($input: WafSettingsInput!) { auth { sites { waf{ settings(input: $input) { gdn dosProtection loginAttemptsProtection dosLimit loginAttemptsLimit } } } } }"}';
317 + return self::requestApi($payload, true);
318 + }
319 +
320 + public static function getServerStatusChart($host_id, $days = 7)
321 + {
241 322 $to = time();
242 - $from_waf = ($days <= 1) ? strtotime(date('Y-m-d 00:00:01')) : time() - (60 * 60 * 24 * $days);
323 + $from = ($days <= 1) ? strtotime(date('Y-m-d 00:00:01')) : time() - (60 * 60 * 24 * $days);
243 324
244 - $payload = '{ "query":"query($id: ID!, $dateRange: DateRangeInput!, $wafLogFilter: WafLogFilter!) { auth { viewer { sites { one(id: $id) { firewall { lastTest { time } status logs(wafLogFilter: $wafLogFilter) { edges { node { status country type userAgent } } } chart(dateRange: $dateRange) { time attacks blocked } report(dateRange: $dateRange) { time attacks ip } } } } } } }", "operationName":null,"variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from_waf . '}, "wafLogFilter": { "dateRange": { "from": ' .$from_waf. ', "to": ' .$to. ' }, "pagination": { "cursor": null }, "order": { "direction": "DESC", "field": "time" } } } }';
325 + $payload = '{ "query":"query($id: ID!, $dateRange: DateRangeInput!) { auth { viewer { sites { one(id: $id) { serverStatus { ramChart(dateRange: $dateRange){ total value time } cpuChart(dateRange: $dateRange){ value time } } } } } } }", "variables":{"id":"' . $host_id . '","dateRange":{"to":' . $to . ',"from":' . $from . '} } }';
245 326
246 - return self::requestApi($payload, true);
327 + $response = self::requestApi($payload, true);
328 + return $response['data']['auth']['viewer']['sites']['one']['serverStatus'];
247 329 }
248 330
249 331 public static function getStatusIcon($status)
250 332 {
@@ -258,8 +340,13 @@
258 340 "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.pending'),
259 341 "color" => self::getColor("grey"),
260 342 "image" => "loading.svg"
261 343 ],
344 + "pause" => [
345 + "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.pause'),
346 + "color" => self::getColor("grey"),
347 + "image" => "warning.svg"
348 + ],
262 349 "expired" => [
263 350 "text" => WTSEC_LIBRARY_Localization::lmsg('statuses.expired'),
264 351 "color" => self::getColor("orange"),
265 352 "image" => "warning.svg"
@@ -341,11 +428,13 @@
341 428 "image" => "check-mark.svg"
342 429 ],
343 430 ];
344 431 if (isset($statuses[$status])) {
345 - return ["image" => $statuses[$status]["image"], "icon" => $statuses[$status]["color"]["icon"], "color" => $statuses[$status]["color"]["color"], "text" => "<span class='" . $statuses[$status]["color"]["color"] . "'>" . $statuses[$status]["text"] . "</span>"];
432 + $statuses[$status]['type'] = $status;
433 + $statuses[$status]["text"] = "<span data-status='$status' class='" . $statuses[$status]["color"]["color"] . "'>" . $statuses[$status]["text"] . "</span>";
434 + return $statuses[$status];
346 435 } else {
347 - return ["image" => "warning.svg", "icon" => "ww-icon--status_unknow", "color" => "ww--status_unknow", "text" => "<span class='ww--status_unknow'>Unknown status</span>"];
436 + return ["image" => "warning.svg", "color" => "ww--status_unknow", "text" => "<span class='ww--status_unknow'>Unknown status</span>"];
348 437 }
349 438 }
350 439
351 440 public static function getColor($type)