pandorafms/pandora_console/include/lib/ITSM/ITSM.php

613 lines
15 KiB
PHP

<?php
namespace PandoraFMS\ITSM;
/**
* Dashboard manager.
*/
class ITSM
{
/**
* User level conf.
*
* @var boolean
*/
private ?bool $userLevelConf;
/**
* User level conf.
*
* @var string
*/
private string $url;
/**
* Bearer.
*
* @var string
*/
private ?string $userBearer;
/**
* ITSM.
*
* @param string|null $host Host url.
* @param string|null $token Token.
*/
public function __construct(?string $host=null, ?string $token=null)
{
global $config;
$user_info = \users_get_user_by_id($config['id_user']);
$this->userLevelConf = (bool) $config['ITSM_user_level_conf'];
$this->url = ($host ?? $config['ITSM_hostname']);
$this->userBearer = ($token ?? $config['ITSM_token']);
if ($this->userLevelConf === true) {
$this->userBearer = ($token ?? $user_info['integria_user_level_pass']);
}
}
/**
* Call api ITSM.
*
* @param string $action Endpoint.
* @param array $queryParams Params send get.
* @param array $postFields Params send post.
* @param mixed $id Specific id for path.
* @param string|null $method Request method.
* @param array|null $file Upload file.
* @param boolean $download Download file.
*
* @return array Array result.
* @throws \Exception On error.
*/
public function callApi(
string $action,
?array $queryParams=null,
?array $postFields=null,
mixed $id=null,
?string $method='POST',
?array $file=null,
?bool $download=false
) {
$headers = [
'accept: application/json',
'Content-Type: application/json',
'Authorization: Bearer '.$this->userBearer,
];
$path = $this->pathAction($action, $queryParams, $id);
$url = $this->url.$path;
$data = [];
// Clean safe_input forms.
if (empty($postFields) === false) {
foreach ($postFields as $key => $field) {
if ($field !== null) {
$field = io_safe_output($field);
}
$data[$key] = $field;
}
}
if ($file !== null && file_exists($file['tmp_name']) === true) {
$data['attachment'] = curl_file_create(
$file['tmp_name'],
$file['type'],
$file['name']
);
$headers = [
'Content-Type: multipart/form-data',
'Authorization: Bearer '.$this->userBearer,
];
} else {
$data = json_encode($data);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$response = curl_exec($ch);
if ($download === true) {
return $response;
}
$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Exception(__('Invalid response').', '.$response);
}
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_status !== 200) {
throw new \Exception($result['error']);
}
return $result;
}
/**
* Convert path to endpoint ITSM.
*
* @param string $action EndPoint.
* @param array|null $queryParams Params to url.
* @param mixed $id Specific id for path.
*
* @return string Return path to Endpoint.
*/
private function pathAction(string $action, ?array $queryParams=null, mixed $id=null): string
{
$path = '';
switch ($action) {
case 'ping':
$path = '/ping';
break;
case 'listTickets':
$path = '/incidence/list';
break;
case 'listObjectTypes':
$path = '/incidencetype/list';
break;
case 'listGroups':
$path = '/group/list';
break;
case 'listResolutions':
$path = '/incidence/resolution/list';
break;
case 'listStatus':
$path = '/incidence/status/list';
break;
case 'listPriorities':
$path = '/incidence/priority/list';
break;
case 'listUsers':
$path = '/user/list';
break;
case 'listCompanies':
$path = '/company/list';
break;
case 'createIncidence':
$path = '/incidence';
break;
case 'updateIncidence':
$path = '/incidence/'.$id;
break;
case 'incidenceTypeFields':
$path = '/incidencetype/'.$id.'/field/list';
break;
case 'incidence':
$path = '/incidence/'.$id;
break;
case 'deleteIncidence':
$path = '/incidence/'.$id;
break;
case 'incidenceWus':
$path = '/incidence/'.$id.'/workunit/list';
break;
case 'incidenceFiles':
$path = '/incidence/'.$id.'/attachment/list';
break;
case 'createIncidenceAttachment':
$path = '/incidence/'.$id.'/attachment';
break;
case 'createIncidenceWu':
$path = '/incidence/'.$id.'/workunit';
break;
case 'deleteIncidenceAttachment':
$path = '/incidence/'.$id['idIncidence'].'/attachment/'.$id['idAttachment'];
break;
case 'downloadIncidenceAttachment':
$path = '/incidence/'.$id['idIncidence'].'/attachment/'.$id['idAttachment'].'/download';
break;
case 'getIncidencesGroupedByStatus':
$path = '/incidence/statistic/groupedByStatus';
break;
case 'getIncidencesGroupedByPriorities':
$path = '/incidence/statistic/groupedByPriorities';
break;
case 'getIncidencesGroupedByGroups':
$path = '/incidence/statistic/groupedByGroups';
break;
case 'getIncidencesGroupedByOwners':
$path = '/incidence/statistic/groupedByOwners';
break;
case 'listCustomSearch':
$path = '/customSearch/list';
break;
case 'customSearch':
$path = '/customSearch/'.$id;
break;
case 'inventory':
$path = '/inventory/'.$id;
break;
case 'createNode':
$path = '/pandorafms/nodes';
break;
case 'getNode':
$path = '/pandorafms/node/'.$id;
break;
case 'pingItsmToPandora':
$path = '/pandorafms/node/ping';
break;
default:
// Not posible.
break;
}
if (empty($queryParams) === false) {
if (isset($queryParams['field']) === true) {
$queryParams['sortField'] = $queryParams['field'];
unset($queryParams['field']);
}
if (isset($queryParams['direction']) === true) {
$queryParams['sortDirection'] = $queryParams['direction'];
unset($queryParams['direction']);
}
$path .= '?';
$path .= http_build_query($queryParams);
}
return $path;
}
/**
* Ping API.
*
* @return boolean Data incidence
*/
public function ping(): bool
{
$result = $this->callApi(
'ping',
[],
[],
null,
'GET'
);
return $result['valid'];
}
/**
* Get Groups.
*
* @return array Return mode select.
*/
public function getGroups(): array
{
$listGroups = $this->callApi('listGroups');
$result = [];
foreach ($listGroups['data'] as $group) {
if ($group['idGroup'] > 1) {
$result[$group['idGroup']] = $group['name'];
}
}
return $result;
}
/**
* Get Priorities.
*
* @return array Return mode select.
*/
public function getPriorities(): array
{
$listPriorities = $this->callApi('listPriorities');
return $listPriorities;
}
/**
* Get Status.
*
* @return array Return mode select.
*/
public function getStatus(): array
{
$listStatus = $this->callApi('listStatus');
$result = [];
foreach ($listStatus['data'] as $status) {
$result[$status['idIncidenceStatus']] = $status['name'];
}
return $result;
}
/**
* Get Incidences types.
*
* @return array Return mode select.
*/
public function getObjectypes(): array
{
$listObjectTypes = $this->callApi('listObjectTypes');
$result = [];
foreach ($listObjectTypes['data'] as $objectType) {
$result[$objectType['idIncidenceType']] = $objectType['name'];
}
return $result;
}
/**
* Get fields incidence type.
*
* @param integer $idIncidenceType Incidence Type ID.
*
* @return array Fields array.
*/
public function getObjecTypesFields(int $idIncidenceType): array
{
$result = $this->callApi(
'incidenceTypeFields',
[
'page' => 0,
'sizePage' => 0,
'field' => 'idIncidenceTypeField',
'direction' => 'ascending',
],
[],
$idIncidenceType
);
return $result['data'];
}
/**
* List custom search.
*
* @return array Result.
*/
public function listCustomSearch(): array
{
$listCustomSearch = $this->callApi(
'listCustomSearch',
[
'page' => 0,
'sizePage' => 0,
],
['section' => 'incidences']
);
$result = [];
foreach ($listCustomSearch['data'] as $customSearch) {
$result[$customSearch['idCustomSearch']] = $customSearch['name'];
}
return $result;
}
/**
* Get Custom search.
*
* @param integer $idCustomSearch Custom search ID.
*
* @return array Data custom search.
*/
public function getCustomSearch(int $idCustomSearch): array
{
$result = $this->callApi(
'customSearch',
[],
[],
$idCustomSearch,
'GET'
);
return $result;
}
/**
* List incidences.
*
* @param integer $idAgent Agent id.
*
* @return array list Incidences.
*/
public function listIncidenceAgents(int $idAgent, ?bool $blocked=null): array
{
global $config;
$listIncidences = $this->callApi(
'listTickets',
[
'page' => 0,
'sizePage' => 0,
],
[
'externalIdLike' => $config['metaconsole_node_id'].'-'.$idAgent,
'blocked' => $blocked,
]
);
return $listIncidences['data'];
}
/**
* Get table incicidences for agent.
*
* @param integer $idAgent Id agent.
* @param boolean|null $mini Visual mode mini.
* @param integer|null $blocked Blocked.
*
* @return string Html output.
*/
public function getTableIncidencesForAgent(int $idAgent, ?bool $mini=false, ?int $blocked=null)
{
\ui_require_css_file('pandoraitsm');
\ui_require_javascript_file('ITSM');
global $config;
$columns = [
'idIncidence',
'title',
'groupCompany',
'statusResolution',
'priority',
'updateDate',
'startDate',
'idCreator',
'owner',
];
$column_names = [
__('ID'),
__('Title'),
__('Group').'/'.__('Company'),
__('Status').'/'.__('Resolution'),
__('Priority'),
__('Updated'),
__('Started'),
__('Creator'),
__('Owner'),
];
$options = [
'id' => 'itms_list_tickets',
'class' => 'info_table',
'style' => 'width: 99%',
'columns' => $columns,
'column_names' => $column_names,
'ajax_url' => 'operation/ITSM/itsm',
'ajax_data' => [
'method' => 'getListTickets',
'externalIdLike' => $config['metaconsole_node_id'].'-'.$idAgent,
'blocked' => $blocked,
],
'no_sortable_columns' => [
2,
3,
-1,
],
'order' => [
'field' => 'updateDate',
'direction' => 'desc',
],
'return' => true,
];
if ($mini === true) {
$options['csv'] = 0;
$options['dom_elements'] = 'frtip';
}
return ui_print_datatable($options);
}
/**
* Create Node in pandora ITSM.
*
* @param array $data Info connect to node from ITSM.
*
* @return boolean
*/
public function createNode(array $data): array
{
return $this->callApi('createNode', null, $data);
}
/**
* Get info node sincronization.
*
* @param string $serverAuth Server Auth.
*
* @return array Array.
*/
public function getNode(string $serverAuth): array
{
$result = $this->callApi(
'getNode',
[],
[],
$serverAuth,
'GET'
);
return $result;
}
/**
* Ping Itsm to pandora node.
*
* @param string $path Path.
*
* @return boolean
*/
public function pingItsmtoPandora(string $path): bool
{
global $config;
$result = $this->callApi(
'pingItsmToPandora',
[],
[
'path' => $path,
'apiPass' => $config['api_password'],
'serverAuth' => $config['server_unique_identifier'],
]
);
return (bool) $result['valid'];
}
}