<?php
/**
 * Esse arquivo atua como proxy para as notificações do webhook do Zabbix e a TELIC
 * @author Telic Technologies <contato@telic.com.br>
 * @license PRIVATE
 */

// métodos para log e requisições
require 'lib/lib.php';

// só deve ser chamado pelo próprio zabbix
// Função auxiliar para verificar se IP pertence a um prefixo CIDR
function ipInRange($ip, $cidr) {
    if (strpos($cidr, '/') === false) {
        // é IP simples
        return $ip === $cidr;
    }

    list($subnet, $maskBits) = explode('/', $cidr);
    $ipBinary = inet_pton($ip);
    $subnetBinary = inet_pton($subnet);

    if ($ipBinary === false || $subnetBinary === false) {
        return false;
    }

    $maskBits = (int)$maskBits;
    $ipBits = unpack('A*', $ipBinary)[1];
    $subnetBits = unpack('A*', $subnetBinary)[1];

    // transforma em string binária
    $ipBits = '';
    foreach (str_split($ipBinary) as $ch) $ipBits .= str_pad(decbin(ord($ch)), 8, '0', STR_PAD_LEFT);
    $subnetBits = '';
    foreach (str_split($subnetBinary) as $ch) $subnetBits .= str_pad(decbin(ord($ch)), 8, '0', STR_PAD_LEFT);

    return substr($ipBits, 0, $maskBits) === substr($subnetBits, 0, $maskBits);
}

// Lista de IPs e redes permitidas
$allowed_ips = [
    "::1",
    "127.0.0.1",
    "172.16.31.1",
    "2001:3984:3989::/64"
];

$remote_ip = $_SERVER['REMOTE_ADDR'];
$authorized = false;

foreach ($allowed_ips as $allowed) {
    if (ipInRange($remote_ip, $allowed)) {
        $authorized = true;
        break;
    }
}

if (!$authorized) {
    http_response_code(401);
    die(json_encode(['ok' => false, 'message' => 'Recurso negado para o IP ' . $remote_ip]));
}

if($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(401);
    die(json_encode(['ok' => false, 'message' => 'Apenas requisições POST devem ser realizadas']));
}

// caso o diretório da fila não exista, crie ele
if(!is_dir(__DIR__ . '/fila')) mkdir(__DIR__ . '/fila');

// gerando nome aleatório
$new_uiqid = bin2hex(random_bytes(5));
$arquivo = date('Ymd_His') . '_' . $new_uiqid . '.json';

$message = array(
    "params"=>$_REQUEST,
    "data"=>json_decode(file_get_contents('php://input'))
);

if(json_last_error() !== JSON_ERROR_NONE){
    http_response_code(401);
    die(json_encode(['ok' => false, 'message' => 'Falha ao obter JSON. Fora do formato. Reenvie a mensagem.']));
}

// gravando no sistema de arquivos
while(true){
    $fileHandle = fopen(__DIR__ . "/fila/" . $arquivo, 'w');
    if ($fileHandle === false) {
        http_response_code(401);
        die(json_encode(['ok' => false, 'message' => 'Falha ao criar arquivo. Verifique o armazenamento do servidor.']));
    } else {
        fwrite($fileHandle, json_encode($message));
        fclose($fileHandle);
        echo json_encode(['ok' => true]);
        $dados = json_decode(file_get_contents(__DIR__ . "/fila/" . $arquivo),true);
        if(json_last_error() !== JSON_ERROR_NONE){
            unlink(__DIR__ . "/fila/" . $arquivo);
        } else {
            break; // Sucesso
        }
    }
}

// permissão para www-data na pasta da fila
// instalar php-curl
// atualizar o script do webhook
