| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Agent { | 
					
						
							|  |  |  |     private $db; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function __construct($database) { | 
					
						
							|  |  |  |         $this->db = $database->getConnection(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // get details of a specified agent ID (or all) in a specified platform ID
 | 
					
						
							|  |  |  |     public function getAgentDetails($platform_id, $agent_id = '') { | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  |         $sql = 'SELECT | 
					
						
							|  |  |  |                     ja.id, | 
					
						
							|  |  |  |                     ja.platform_id, | 
					
						
							|  |  |  |                     ja.agent_type_id, | 
					
						
							|  |  |  |                     ja.url, | 
					
						
							|  |  |  |                     ja.secret_key, | 
					
						
							|  |  |  |                     jat.description AS agent_description, | 
					
						
							|  |  |  |                     jat.endpoint AS agent_endpoint | 
					
						
							|  |  |  |                 FROM | 
					
						
							|  |  |  |                     jilo_agents ja | 
					
						
							|  |  |  |                 JOIN | 
					
						
							|  |  |  |                     jilo_agent_types jat ON ja.agent_type_id = jat.id | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |                 WHERE | 
					
						
							|  |  |  |                     platform_id = :platform_id'; | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |         if ($agent_id !== '') { | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  |             $sql .= ' AND ja.id = :agent_id'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $query = $this->db->prepare($sql); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $query->bindParam(':platform_id', $platform_id); | 
					
						
							|  |  |  |         if ($agent_id !== '') { | 
					
						
							|  |  |  |             $query->bindParam(':agent_id', $agent_id); | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $query->execute(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $query->fetchAll(PDO::FETCH_ASSOC); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |     // get details of a specified agent ID
 | 
					
						
							|  |  |  |     public function getAgentIDDetails($agent_id) { | 
					
						
							|  |  |  |         $sql = 'SELECT | 
					
						
							|  |  |  |                     ja.id, | 
					
						
							|  |  |  |                     ja.platform_id, | 
					
						
							|  |  |  |                     ja.agent_type_id, | 
					
						
							|  |  |  |                     ja.url, | 
					
						
							|  |  |  |                     ja.secret_key, | 
					
						
							|  |  |  |                     jat.description AS agent_description, | 
					
						
							|  |  |  |                     jat.endpoint AS agent_endpoint | 
					
						
							|  |  |  |                 FROM | 
					
						
							|  |  |  |                     jilo_agents ja | 
					
						
							|  |  |  |                 JOIN | 
					
						
							|  |  |  |                     jilo_agent_types jat ON ja.agent_type_id = jat.id | 
					
						
							|  |  |  |                 WHERE | 
					
						
							|  |  |  |                     ja.id = :agent_id'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $query = $this->db->prepare($sql); | 
					
						
							|  |  |  |         $query->bindParam(':agent_id', $agent_id); | 
					
						
							|  |  |  |         $query->execute(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $query->fetchAll(PDO::FETCH_ASSOC); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-03 08:28:23 +00:00
										 |  |  |     // get agent types
 | 
					
						
							|  |  |  |     public function getAgentTypes() { | 
					
						
							|  |  |  |         $sql = 'SELECT * | 
					
						
							|  |  |  |                     FROM jilo_agent_types | 
					
						
							|  |  |  |                     ORDER BY id'; | 
					
						
							|  |  |  |         $query = $this->db->prepare($sql); | 
					
						
							|  |  |  |         $query->execute(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $query->fetchAll(PDO::FETCH_ASSOC); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |     // add new agent
 | 
					
						
							|  |  |  |     public function addAgent($platform_id, $newAgent) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             $sql = 'INSERT INTO jilo_agents | 
					
						
							| 
									
										
										
										
											2024-09-23 09:39:33 +00:00
										 |  |  |                     (platform_id, agent_type_id, url, secret_key) | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |                     VALUES | 
					
						
							| 
									
										
										
										
											2024-09-23 09:39:33 +00:00
										 |  |  |                     (:platform_id, :agent_type_id, :url, :secret_key)'; | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $query = $this->db->prepare($sql); | 
					
						
							|  |  |  |             $query->execute([ | 
					
						
							|  |  |  |                 ':platform_id'		=> $platform_id, | 
					
						
							| 
									
										
										
										
											2024-09-23 09:39:33 +00:00
										 |  |  |                 ':agent_type_id'	=> $newAgent['type_id'], | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |                 ':url'			=> $newAgent['url'], | 
					
						
							|  |  |  |                 ':secret_key'		=> $newAgent['secret_key'], | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             return $e->getMessage(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // edit an existing agent
 | 
					
						
							|  |  |  |     public function editAgent($platform_id, $updatedAgent) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             $sql = 'UPDATE jilo_agents SET | 
					
						
							| 
									
										
										
										
											2024-09-23 09:39:33 +00:00
										 |  |  |                         agent_type_id = :agent_type_id, | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |                         url = :url, | 
					
						
							|  |  |  |                         secret_key = :secret_key | 
					
						
							|  |  |  |                     WHERE | 
					
						
							|  |  |  |                         id = :agent_id | 
					
						
							|  |  |  |                     AND | 
					
						
							|  |  |  |                         platform_id = :platform_id'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $query = $this->db->prepare($sql); | 
					
						
							|  |  |  |             $query->execute([ | 
					
						
							| 
									
										
										
										
											2024-09-23 09:39:33 +00:00
										 |  |  |                 ':agent_type_id'	=> $updatedAgent['agent_type_id'], | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  |                 ':url'			=> $updatedAgent['url'], | 
					
						
							|  |  |  |                 ':secret_key'		=> $updatedAgent['secret_key'], | 
					
						
							|  |  |  |                 ':agent_id'		=> $updatedAgent['id'], | 
					
						
							|  |  |  |                 ':platform_id'		=> $platform_id, | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             return $e->getMessage(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // delete an agent
 | 
					
						
							|  |  |  |     public function deleteAgent($agent_id) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             $sql = 'DELETE FROM jilo_agents | 
					
						
							|  |  |  |                     WHERE | 
					
						
							|  |  |  |                     id = :agent_id'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $query = $this->db->prepare($sql); | 
					
						
							|  |  |  |             $query->bindParam(':agent_id', $agent_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $query->execute(); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             return $e->getMessage(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-01 07:18:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-26 06:56:24 +00:00
										 |  |  |     // check for agent cache
 | 
					
						
							|  |  |  |     public function checkAgentCache($agent_id) { | 
					
						
							| 
									
										
										
										
											2024-10-03 07:59:32 +00:00
										 |  |  |         $agent_cache_name = 'agent' . $agent_id . '_cache'; | 
					
						
							|  |  |  |         $agent_cache_time = 'agent' . $agent_id . '_time'; | 
					
						
							| 
									
										
										
										
											2024-09-26 06:56:24 +00:00
										 |  |  |         return isset($_SESSION[$agent_cache_name]) && isset($_SESSION[$agent_cache_time]) && (time() - $_SESSION[$agent_cache_time] < 600); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-01 07:18:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // method for base64 URL encoding for JWT tokens
 | 
					
						
							|  |  |  |     private function base64UrlEncode($data) { | 
					
						
							|  |  |  |         return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // generate a JWT token for jilo agent
 | 
					
						
							|  |  |  |     public function generateAgentToken($payload, $secret_key) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // header
 | 
					
						
							|  |  |  |         $header = json_encode([ | 
					
						
							|  |  |  |             'typ' => 'JWT', | 
					
						
							|  |  |  |             'alg' => 'HS256' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |         $base64Url_header = $this->base64UrlEncode($header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // payload
 | 
					
						
							|  |  |  |         $payload = json_encode($payload); | 
					
						
							|  |  |  |         $base64Url_payload = $this->base64UrlEncode($payload); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // signature
 | 
					
						
							|  |  |  |         $signature = hash_hmac('sha256', $base64Url_header . "." . $base64Url_payload, $secret_key, true); | 
					
						
							|  |  |  |         $base64Url_signature = $this->base64UrlEncode($signature); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // build the JWT
 | 
					
						
							|  |  |  |         $jwt = $base64Url_header . "." . $base64Url_payload . "." . $base64Url_signature; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $jwt; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |     // fetch result from jilo agent API
 | 
					
						
							| 
									
										
										
										
											2024-09-30 07:07:50 +00:00
										 |  |  |     public function fetchAgent($agent_id, $force = false) { | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // we need agent details for URL and JWT token
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         $agentDetails = $this->getAgentIDDetails($agent_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Safe exit in case the agent is not found
 | 
					
						
							|  |  |  |         if (empty($agentDetails)) { | 
					
						
							|  |  |  |             return json_encode(['error' => 'Agent not found']); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $agent = $agentDetails[0]; | 
					
						
							| 
									
										
										
										
											2024-10-03 07:59:32 +00:00
										 |  |  |         $agent_cache_name = 'agent' . $agent_id . '_cache'; | 
					
						
							|  |  |  |         $agent_cache_time = 'agent' . $agent_id . '_time'; | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // check if the cache is still valid, unless force-refresh is requested
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         if (!$force && $this->checkAgentCache($agent_id)) { | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |             return $_SESSION[$agent_cache_name]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         // generate the JWT token
 | 
					
						
							|  |  |  |         $payload = [ | 
					
						
							|  |  |  |             'agent_id'      => $agent_id, | 
					
						
							|  |  |  |             'timestamp'     => time() | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |         $jwt = $this->generateAgentToken($payload, $agent['secret_key']); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |         // Make the API request
 | 
					
						
							|  |  |  |         $ch = curl_init(); | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         curl_setopt($ch, CURLOPT_URL, $agent['url'] . $agent['agent_endpoint']); | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | 
					
						
							| 
									
										
										
										
											2024-09-30 08:09:01 +00:00
										 |  |  |         curl_setopt($ch, CURLOPT_TIMEOUT, 10); // timeout 10 seconds
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         curl_setopt($ch, CURLOPT_HTTPHEADER, [ | 
					
						
							|  |  |  |             'Authorization: Bearer ' . $jwt, | 
					
						
							|  |  |  |             'Content-Type: application/json' | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2024-09-30 08:09:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |         $response = curl_exec($ch); | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  |         $curl_error = curl_error($ch); | 
					
						
							|  |  |  |         $curl_errno = curl_errno($ch); | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); | 
					
						
							| 
									
										
										
										
											2024-09-30 08:09:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |         curl_close($ch); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         // curl error
 | 
					
						
							|  |  |  |         if ($curl_errno) { | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  |             return json_encode(['error' => 'curl error: ' . $curl_error]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:06:59 +00:00
										 |  |  |         // response is not 200 OK
 | 
					
						
							|  |  |  |         if ($http_code !== 200) { | 
					
						
							|  |  |  |             return json_encode(['error' => 'HTTP error: ' . $http_code]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  |         // other custom error(s)
 | 
					
						
							|  |  |  |         if (strpos($response, 'Auth header not received') !== false) { | 
					
						
							|  |  |  |             return json_encode(['error' => 'Auth header not received']); | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Cache the result and the timestamp if the response is successful
 | 
					
						
							| 
									
										
										
										
											2024-10-23 10:22:55 +00:00
										 |  |  |         // We decode it so that it's pure JSON and not escaped
 | 
					
						
							|  |  |  |         $_SESSION[$agent_cache_name] = json_decode($response, true); | 
					
						
							| 
									
										
										
										
											2024-09-30 08:55:23 +00:00
										 |  |  |         $_SESSION[$agent_cache_time] = time(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-28 07:04:20 +00:00
										 |  |  |         return $response; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-03 07:59:32 +00:00
										 |  |  |     // clear agent cache
 | 
					
						
							|  |  |  |     public function clearAgentCache($agent_id) { | 
					
						
							|  |  |  |         $_SESSION["agent{$agent_id}_cache"] = ''; | 
					
						
							|  |  |  |         $_SESSION["agent{$agent_id}_cache_time"] = ''; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-11 07:58:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // get latest stored jilo agents data
 | 
					
						
							|  |  |  |     public function getLatestData($platform_id, $agent_type, $metric_type) { | 
					
						
							|  |  |  |         // retrieves data already stored in db from another function (or the jilo-server to-be)
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 22:06:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ?>
 |