-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatualiza_bd.php
108 lines (92 loc) · 4.02 KB
/
atualiza_bd.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
set_time_limit(300); // Aumenta o limite de tempo de execução para 5 minutos
ini_set('display_errors', 1);
error_reporting(E_ALL);
require 'db.php'; // Inclui o arquivo de conexão com o banco de dados
$logDir = '/var/www/html/cgnat/logs/';
$logFileName = 'atualiza_db-' . date('Y-m-d') . '.log';
$logPath = $logDir . $logFileName;
if (!file_exists($logDir)) {
mkdir($logDir, 0755, true);
}
function addLog($message, $logPath) {
file_put_contents($logPath, date('Y-m-d H:i:s') . ' - ' . $message . "\n", FILE_APPEND);
}
// Limpar dados antigos da tabela LOGS_CGNAT
if ($conn->query("TRUNCATE TABLE LOGS_CGNAT")) {
addLog("Dados antigos excluídos com sucesso da tabela LOGS_CGNAT.", $logPath);
} else {
addLog("Erro ao limpar os dados antigos da tabela LOGS_CGNAT: " . $conn->error, $logPath);
exit; // Saia do script se houver um erro ao limpar os dados antigos
}
// Verifica se um nome de arquivo de log foi passado e constrói o caminho completo
if (isset($_POST['logFile'])) {
$logFileToProcess = '/var/log/mikrotik/' . basename($_POST['logFile']);
} else {
die('Nenhum arquivo de log especificado.');
}
$year = date('Y'); // Utiliza o ano atual
$batchSize = 1000; // Número de linhas a serem processadas em cada lote
$batchData = []; // Armazena os dados do lote atual
if ($logFile = fopen($logFileToProcess, 'r')) {
while (!feof($logFile)) {
$logLine = fgets($logFile);
if (preg_match('/(\w{3} \d{2} \d{2}:\d{2}:\d{2}) (\d+\.\d+\.\d+\.\d+) firewall,info CGNAT: CGNAT forward: (.*)/', $logLine, $matches)) {
$dateString = $matches[1] . " " . $year; // Adiciona o ano à string de data
$dateTime = DateTime::createFromFormat('M d H:i:s Y', $dateString);
if ($dateTime === false) {
addLog("Erro ao criar objeto DateTime a partir da string: " . $dateString, $logPath);
continue;
}
$formattedDateTime = $dateTime->format('Y-m-d H:i:s');
// Adiciona a linha processada ao lote atual
$batchData[] = [
'data_hora' => $formattedDateTime,
'ip_bras' => $matches[2],
'firewall_log' => 'firewall,info CGNAT: CGNAT forward:',
'dados_cgnat' => $matches[3]
];
// Se alcançarmos o tamanho do lote, insira o lote no banco de dados
if (count($batchData) >= $batchSize) {
insertBatchIntoDatabase($batchData, $conn, $logPath);
$batchData = []; // Limpa o lote após a inserção
}
} else {
addLog("A linha do log não corresponde ao padrão esperado.", $logPath);
}
}
// Verifica se ainda há dados no lote após o fim do arquivo e os insere no banco de dados
if (!empty($batchData)) {
insertBatchIntoDatabase($batchData, $conn, $logPath);
}
fclose($logFile);
addLog("Processamento concluído para: $logFileToProcess", $logPath);
} else {
addLog("Não foi possível abrir o arquivo de log: $logFileToProcess", $logPath);
}
header('Location: dashboard.php'); // Redireciona para o dashboard após o processamento
exit;
// Função para inserir um lote de dados no banco de dados
function insertBatchIntoDatabase($batchData, $conn, $logPath) {
$values = [];
$params = [];
$paramTypes = '';
foreach ($batchData as $row) {
$values[] = "(?, ?, ?, ?)";
$params[] = $row['data_hora'];
$params[] = $row['ip_bras'];
$params[] = $row['firewall_log'];
$params[] = $row['dados_cgnat'];
$paramTypes .= 'ssss'; // 4 strings por linha
}
$stmt = $conn->prepare("INSERT INTO LOGS_CGNAT (data_hora, ip_bras, firewall_log, dados_cgnat) VALUES " . implode(',', $values));
if (!$stmt) {
addLog("Erro ao preparar a inserção: " . $conn->error, $logPath);
return;
}
$stmt->bind_param($paramTypes, ...$params);
if (!$stmt->execute()) {
addLog("Erro ao inserir o lote no banco de dados: " . $stmt->error, $logPath);
}
$stmt->close();
}