CGI na prática: criando APIs e scripts dinâmicos no Apache sem depender de frameworks [exemplo real com asterisk log]

Introdução

CGI (Common Gateway Interface) é uma das formas mais diretas de executar scripts dinâmicos em servidores web. É simples, funcional e ainda muito útil para cenários onde controle, leveza e independência de frameworks são prioridade. Em vez de depender de containers, linguagens específicas ou estruturas engessadas, o CGI permite que você escreva scripts em Bash, Python, Perl ou PHP puro, e os execute com apenas um Apache e permissões corretas.


1. Habilitando o CGI no Apache

Para sistemas baseados em Debian/Ubuntu:

a2enmod cgi
systemctl restart apache2

Configurando o VirtualHost com suporte a CGI:

Edite o arquivo de configuração do seu VirtualHost (por exemplo, /etc/apache2/sites-available/000-default.conf):

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

<Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Require all granted
</Directory>

Reinicie o Apache:

systemctl restart apache2

2. Criando um CGI básico em Shell (Hello World)

Crie um script:

vi /usr/lib/cgi-bin/hello.sh

Conteúdo:

#!/bin/bash
echo "Content-Type: text/plain"
echo ""
echo "CGI funcionando!"

Dê permissão de execução:

chmod +x /usr/lib/cgi-bin/hello.sh

Acesse pelo navegador:

http://SEU_SERVIDOR/cgi-bin/hello.sh

3. Lendo um CSV do Asterisk e gerando JSON via CGI

Motivo

O Asterisk salva os registros de chamadas no Master.csv. Vamos expor isso como JSON para uso em painéis, relatórios ou APIs simples.

Criação do script cdr2json.sh:

vi /usr/lib/cgi-bin/cdr2json.sh

Conteúdo:

#!/bin/bash

echo "Content-Type: application/json"
echo ""

CSV="/var/www/html/api/Master.csv"

HEADERS=$(head -1 "$CSV")

awk -F, -v headers="$HEADERS" '
BEGIN {
    split(headers, keys, ",")
    print "["
}
NR > 1 {
    printf "  {"
    for (i = 1; i <= NF; i++) {
        gsub(/^"|"$/, "", $i)
        printf "\"%s\":\"%s\"", keys[i], $i
        if (i < NF) printf ","
    }
    printf "}"
    if ((getline > 0) && NR < 100) print ","; else print ""
}
END {
    print "]"
}
' "$CSV"

Permissões:

chmod +x /usr/lib/cgi-bin/cdr2json.sh

4. Criando cópia segura do Master.csv

Evite que o Apache leia diretamente o arquivo original do Asterisk:

mkdir -p /var/www/html/api/
cp /var/log/asterisk/cdr-csv/Master.csv /var/www/html/api/Master.csv
chmod 644 /var/www/html/api/Master.csv

Agendando com cron:

crontab -e

Adicione:

* * * * * cp /var/log/asterisk/cdr-csv/Master.csv /var/www/html/api/Master.csv && chmod 644 /var/www/html/api/Master.csv

* * * * * Significa de 60 em 60 segundos


5. CGI com PHP puro (sem PHP-FPM)

Crie o script:

vi /usr/lib/cgi-bin/cdr.php

Conteúdo:

#!/usr/bin/php-cgi
<?php
header("Content-Type: application/json");

$csvFile = '/var/www/html/api/Master.csv';
if (!file_exists($csvFile)) {
    http_response_code(404);
    echo json_encode(["erro" => "Arquivo não encontrado"]);
    exit;
}

$fp = fopen($csvFile, 'r');
$headers = fgetcsv($fp);
$data = [];
$limite = 100;

while (($row = fgetcsv($fp)) !== false && $limite-- > 0) {
    $item = [];
    foreach ($headers as $i => $coluna) {
        $item[trim($coluna)] = $row[$i] ?? null;
    }
    $data[] = $item;
}
fclose($fp);

echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

Permissão:

chmod +x /usr/lib/cgi-bin/cdr.php

Acesse:

http://SEU_SERVIDOR/cgi-bin/cdr.php

6. Segurança no CGI

  • Nunca confie em input direto do usuário.
  • Evite interpretar comandos com eval, system, exec, bash -c.
  • Faça sanitize dos parâmetros, mesmo em scripts simples.
  • Use usuários diferentes sempre que possível.
  • Restrinja permissões ao mínimo necessário.
  • Prefira copiar arquivos sensíveis para leitura, como feito com o Master.csv.

7. Headers HTTP obrigatórios

Todo CGI precisa retornar os headers corretos. Exemplo mínimo:

echo "Content-Type: application/json"
echo ""

O echo "" separa os headers do corpo. Sem isso, o Apache retorna erro 500.


8. Quando CGI é a melhor escolha

  • Ambientes embarcados (ex: roteadores).
  • Servidores com poucos recursos.
  • Scripts internos de administração.
  • APIs simples que não precisam de autenticação robusta ou escalabilidade massiva.
  • Cenários em que você quer controle absoluto, sem amarras de frameworks ou dependências externas.

9. Exemplo real no ar

Se o Apache estiver configurado corretamente e o Master.csv estiver sendo espelhado, acessar:

http://SEU_SERVIDOR/cgi-bin/cdr2json.sh

Ou

http://SEU_SERVIDOR/cgi-bin/cdr.php

Retornará o JSON das ligações.


Conclusão

CGI é direto, funcional e extremamente útil para quem sabe o que está fazendo. Você elimina dependências, aumenta a transparência da aplicação e mantém controle absoluto sobre cada byte trafegado. Com um Apache e um shell script, você já consegue construir APIs inteiras — leves, rápidas e independentes.

Rolar para cima