0

ICMP (Ping) to server, open a support ticket if down.

WANDERLEY il y a 1 jour mis à jour il y a 1 jour 0

Eu criei uma página ICMP.php via API ela abre um ticket baseado em um ping para um determinado servidor via IP . Gostaria que validasse esta função, para melhorar e acrescentar no GLPI assim não preciso integrar o zabbix no GLPI.

Image 517

Image 518


CÓDIGO UTILIZADO COMO FONTE EU ADAPTEI O MEU ATE CHEGAR NO PONTO AI DO CHAMADO JÁ CRIADO AO GLPI.

?php
// --- PARTE 1: Configurações e Função de Ping ---
// Configurações do GLPI
$glpi_url = 'http://<seu-servidor-glpi>/apirest.php/'; // Ex: http://localhost/glpi/apirest.php/
$app_token = '<SEU_APP_TOKEN>';
$user_token = '<SEU_USER_TOKEN>';
$entidade_id = 0; // ID da entidade (0 para entidade raiz ou o ID específico)
$categoria_id = 0; // ID da categoria do chamado (ex: 9 para Problema de Rede )
$user_id = 1; // **[NOVO]** ID do usuário solicitante (substitua pelo ID real do usuário no GLPI)

// Endereço IP ou hostname a ser pingado
$target_host = '8.8.8.8'; // Ex: IP do servidor ou Google DNS

// Função para verificar se o host está online (simples ICMP ping)
function is_host_online($host) {
    // Comando ping para sistemas Linux. Ajuste para Windows se necessário.
    $command = 'ping -c 3 ' . escapeshellarg($host);
    exec($command, $output, $status);
    return ($status === 0);
}

// --- PARTE 2: Lógica Principal ---
if (!is_host_online($target_host)) {
    echo "Falha no ping para {$target_host}. Abrindo chamado no GLPI...\n";
    // **[MODIFICADO]** Passando o novo user_id para a função
    create_glpi_ticket($glpi_url, $app_token, $user_token, $entidade_id, $categoria_id, $target_host, $user_id);
} else {
    echo "O host {$target_host} está online. Nenhum chamado foi aberto.\n";
}

// --- PARTE 3: Função para Criar Chamado no GLPI via API ---
// **[MODIFICADO]** Adicionando $user_id como parâmetro
function create_glpi_ticket($url, $app_token, $user_token, $entity_id, $category_id, $host, $user_id) {
    // 1. Iniciar sessão para obter o Session Token
    $session_token = get_glpi_session_token($url, $app_token, $user_token);
    if (!$session_token) {
        echo "Erro: Não foi possível obter o Session Token.\n";
        return;
    }

    // 2. Criar o chamado (Ticket)
    $ticket_data = json_encode([
        'input' => [
            'name' => "FALHA DE PING: Host {$host} inacessível", // Título do chamado
            'content' => "O monitoramento automático detectou que o host {$host} não responde ao ping.\nFavor verificar a conectividade.", // Descrição
            'status' => 1, // Status: Novo
            'urgency' => 3, // Urgência: Média
            'priority' => 3, // Prioridade: Média
            'entities_id' => $entity_id,
            'itilcategories_id' => $category_id,
            'requesttypes_id' => 1, // Tipo de requisição (1 para Incidente, ajuste se necessário)
            'users_id' => $user_id // **[NOVO]** Define o usuário solicitante pelo ID
        ]
    ]);

    $ch = curl_init("{$url}Ticket");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $ticket_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'App-Token: ' . $app_token,
        'Session-Token: ' . $session_token
    ));
    $result = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpcode == 201) {
        echo "Chamado criado com sucesso! Código de status: {$httpcode}\n";
    } else {
        echo "Erro ao criar chamado. Código de status: {$httpcode}. Resposta: {$result}\n";
    }

    // Opcional: Finalizar sessão
    // logout_glpi_session($url, $app_token, $session_token);
}

function get_glpi_session_token($url, $app_token, $user_token) {
    $ch = curl_init("{$url}initSession");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'App-Token: ' . $app_token,
        'Authorization: user_token ' . $user_token
    ));
    $result = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpcode == 200) {
        $response = json_decode($result, true);
        return $response['session_token'];
    }
    return false;
}

// Função de logout opcional
function logout_glpi_session($url, $app_token, $session_token) {
    $ch = curl_init("{$url}killSession");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'App-Token: ' . $app_token,
        'Session-Token: ' . $session_token
    ));
    curl_exec($ch);
    curl_close($ch);
}
?>