DAS and WHOIS update to use Monolog

This commit is contained in:
Pinga 2023-12-01 20:51:43 +02:00
parent 0a4057f812
commit 0ecd7023d4
6 changed files with 261 additions and 87 deletions

5
das/composer.json Normal file
View file

@ -0,0 +1,5 @@
{
"require": {
"monolog/monolog": "^3.5"
}
}

42
das/helpers.php Normal file
View file

@ -0,0 +1,42 @@
<?php
require_once 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\LineFormatter;
/**
* Sets up and returns a Logger instance.
*
* @param string $logFilePath Full path to the log file.
* @param string $channelName Name of the log channel (optional).
* @return Logger
*/
function setupLogger($logFilePath, $channelName = 'app') {
// Create a log channel
$log = new Logger($channelName);
// Set up the console handler
$consoleHandler = new StreamHandler('php://stdout', Logger::DEBUG);
$consoleFormatter = new LineFormatter(
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
"Y-m-d H:i:s.u", // Date format
true, // Allow inline line breaks
true // Ignore empty context and extra
);
$consoleHandler->setFormatter($consoleFormatter);
$log->pushHandler($consoleHandler);
// Set up the file handler
$fileHandler = new RotatingFileHandler($logFilePath, 0, Logger::DEBUG);
$fileFormatter = new LineFormatter(
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
"Y-m-d H:i:s.u" // Date format
);
$fileHandler->setFormatter($fileFormatter);
$log->pushHandler($fileHandler);
return $log;
}

View file

@ -4,18 +4,22 @@ if (!extension_loaded('swoole')) {
die('Swoole extension must be installed');
}
require_once 'helpers.php';
$logFilePath = '/var/log/namingo/das.log';
$log = setupLogger($logFilePath, 'DAS');
// Create a Swoole TCP server
$server = new Swoole\Server('0.0.0.0', 1043);
$server->set([
'daemonize' => false,
'log_file' => '/var/log/namingo/das.log',
'log_file' => '/var/log/namingo/das_application.log',
'log_level' => SWOOLE_LOG_INFO,
'worker_num' => swoole_cpu_num() * 2,
'pid_file' => '/var/run/das.pid',
'max_request' => 1000,
'dispatch_mode' => 2,
'open_tcp_nodelay' => true,
'max_conn' => 10000,
'max_conn' => 1024,
'heartbeat_check_interval' => 60,
'heartbeat_idle_time' => 120,
'buffer_output_size' => 2 * 1024 * 1024, // 2MB
@ -24,6 +28,7 @@ $server->set([
'open_eof_check' => true,
'package_eof' => "\r\n"
]);
$log->info('server started.');
// Connect to the database
try {
@ -31,17 +36,18 @@ try {
$pdo = new PDO("{$c['db_type']}:host={$c['db_host']};dbname={$c['db_database']}", $c['db_username'], $c['db_password']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to database");
$server->close($fd);
}
// Register a callback to handle incoming connections
$server->on('connect', function ($server, $fd) {
echo "Client connected: {$fd}\r\n";
$server->on('connect', function ($server, $fd) use ($log) {
$log->info('new client connected: ' . $fd);
});
// Register a callback to handle incoming requests
$server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo) {
$server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo, $log) {
// Validate and sanitize the domain name
$domain = trim($data);
@ -74,7 +80,7 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo)
$server->close($fd);
return;
}
// Check if domain is reserved
$stmtReserved = $pdo->prepare("SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1");
$stmtReserved->execute([$parts[0]]);
@ -115,33 +121,26 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo)
if ($f = $stmt->fetch(PDO::FETCH_ASSOC)) {
$server->send($fd, "1");
if ($fp = @fopen("/var/log/das/das_request.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $domain . "\n");
fclose($fp);
}
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $domain . ' | FOUND');
$server->close($fd);
} else {
$server->send($fd, "0");
if ($fp = @fopen("/var/log/das/das_not_found.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $domain . "\n");
fclose($fp);
}
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $domain . ' | NOT FOUND');
$server->close($fd);
}
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the das database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
// Close the connection
@ -149,8 +148,8 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo)
});
// Register a callback to handle client disconnections
$server->on('close', function ($server, $fd) {
echo "Client disconnected: {$fd}\r\n";
$server->on('close', function ($server, $fd) use ($log) {
$log->info('client ' . $fd . ' connected.');
});
// Start the server

View file

@ -0,0 +1,5 @@
{
"require": {
"monolog/monolog": "^3.5"
}
}

42
whois/port43/helpers.php Normal file
View file

@ -0,0 +1,42 @@
<?php
require_once 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\LineFormatter;
/**
* Sets up and returns a Logger instance.
*
* @param string $logFilePath Full path to the log file.
* @param string $channelName Name of the log channel (optional).
* @return Logger
*/
function setupLogger($logFilePath, $channelName = 'app') {
// Create a log channel
$log = new Logger($channelName);
// Set up the console handler
$consoleHandler = new StreamHandler('php://stdout', Logger::DEBUG);
$consoleFormatter = new LineFormatter(
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
"Y-m-d H:i:s.u", // Date format
true, // Allow inline line breaks
true // Ignore empty context and extra
);
$consoleHandler->setFormatter($consoleFormatter);
$log->pushHandler($consoleHandler);
// Set up the file handler
$fileHandler = new RotatingFileHandler($logFilePath, 0, Logger::DEBUG);
$fileFormatter = new LineFormatter(
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
"Y-m-d H:i:s.u" // Date format
);
$fileHandler->setFormatter($fileFormatter);
$log->pushHandler($fileHandler);
return $log;
}

View file

@ -4,18 +4,22 @@ if (!extension_loaded('swoole')) {
die('Swoole extension must be installed');
}
require_once 'helpers.php';
$logFilePath = '/var/log/namingo/whois.log';
$log = setupLogger($logFilePath, 'WHOIS');
// Create a Swoole TCP server
$server = new Swoole\Server('0.0.0.0', 43);
$server->set([
'daemonize' => false,
'log_file' => '/var/log/namingo/whois.log',
'log_file' => '/var/log/namingo/whois_application.log',
'log_level' => SWOOLE_LOG_INFO,
'worker_num' => swoole_cpu_num() * 2,
'pid_file' => '/var/run/whois.pid',
'max_request' => 1000,
'dispatch_mode' => 2,
'open_tcp_nodelay' => true,
'max_conn' => 10000,
'max_conn' => 1024,
'heartbeat_check_interval' => 60,
'heartbeat_idle_time' => 120,
'buffer_output_size' => 2 * 1024 * 1024, // 2MB
@ -24,6 +28,7 @@ $server->set([
'open_eof_check' => true,
'package_eof' => "\r\n"
]);
$log->info('server started.');
// Connect to the database
try {
@ -31,17 +36,18 @@ try {
$pdo = new PDO("{$c['db_type']}:host={$c['db_host']};dbname={$c['db_database']}", $c['db_username'], $c['db_password']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to database");
$server->close($fd);
}
// Register a callback to handle incoming connections
$server->on('connect', function ($server, $fd) {
echo "Client connected: {$fd}\r\n";
$server->on('connect', function ($server, $fd) use ($log) {
$log->info('new client connected: ' . $fd);
});
// Register a callback to handle incoming requests
$server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo) {
$server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo, $log) {
$privacy = $c['privacy'];
// Validate and sanitize the data
@ -133,36 +139,61 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo)
."\nyou agree to abide by this policy."
."\n";
$server->send($fd, $res . "");
if ($fp = @fopen("/var/log/whois/whois_request.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $nameserver . "\n");
fclose($fp);
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $nameserver . ' | FOUND');
try {
$stmt = $pdo->prepare("UPDATE settings SET value = value + 1 WHERE name = :name");
$settingName = 'whois-43-queries';
$stmt->bindParam(':name', $settingName);
$stmt->execute();
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
$server->close($fd);
} else {
//NOT FOUND or No match for;
$server->send($fd, "NOT FOUND");
if ($fp = @fopen("/var/log/whois/whois_not_found.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $nameserver . "\n");
fclose($fp);
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $nameserver . ' | NOT FOUND');
try {
$stmt = $pdo->prepare("UPDATE settings SET value = value + 1 WHERE name = :name");
$settingName = 'whois-43-queries';
$stmt->bindParam(':name', $settingName);
$stmt->execute();
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
$server->close($fd);
}
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
}
@ -241,36 +272,61 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo)
."\nyou agree to abide by this policy."
."\n";
$server->send($fd, $res . "");
if ($fp = @fopen("/var/log/whois/whois_request.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $registrar . "\n");
fclose($fp);
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $registrar . ' | FOUND');
try {
$stmt = $pdo->prepare("UPDATE settings SET value = value + 1 WHERE name = :name");
$settingName = 'whois-43-queries';
$stmt->bindParam(':name', $settingName);
$stmt->execute();
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
$server->close($fd);
} else {
//NOT FOUND or No match for;
$server->send($fd, "NOT FOUND");
if ($fp = @fopen("/var/log/whois/whois_not_found.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $registrar . "\n");
fclose($fp);
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $registrar . ' | NOT FOUND');
try {
$stmt = $pdo->prepare("UPDATE settings SET value = value + 1 WHERE name = :name");
$settingName = 'whois-43-queries';
$stmt->bindParam(':name', $settingName);
$stmt->execute();
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
$server->close($fd);
}
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
}
@ -587,35 +643,60 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo)
."\nyou agree to abide by this policy."
."\n";
$server->send($fd, $res . "");
if ($fp = @fopen("/var/log/whois/whois_request.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $domain . "\n");
fclose($fp);
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $domain . ' | FOUND');
try {
$stmt = $pdo->prepare("UPDATE settings SET value = value + 1 WHERE name = :name");
$settingName = 'whois-43-queries';
$stmt->bindParam(':name', $settingName);
$stmt->execute();
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
$server->close($fd);
} else {
//NOT FOUND or No match for;
$server->send($fd, "NOT FOUND");
if ($fp = @fopen("/var/log/whois/whois_not_found.log",'a')) {
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$currentDateTime = new DateTime();
$milliseconds = $currentDateTime->format("v");
$timestampWithMilliseconds = $currentDateTime->format("Y-m-d H:i:s") . '.' . $milliseconds;
fwrite($fp, $timestampWithMilliseconds . "\t-\t" . $remoteAddr . "\t-\t" . $domain . "\n");
fclose($fp);
$clientInfo = $server->getClientInfo($fd);
$remoteAddr = $clientInfo['remote_ip'];
$log->notice('new request from ' . $remoteAddr . ' | ' . $domain . ' | NOT FOUND');
try {
$stmt = $pdo->prepare("UPDATE settings SET value = value + 1 WHERE name = :name");
$settingName = 'whois-43-queries';
$stmt->bindParam(':name', $settingName);
$stmt->execute();
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
$server->close($fd);
}
} catch (PDOException $e) {
$log->error('DB Connection failed: ' . $e->getMessage());
$server->send($fd, "Error connecting to the whois database");
$server->close($fd);
} catch (Throwable $e) {
$log->error('Error: ' . $e->getMessage());
$server->send($fd, "General error");
$server->close($fd);
}
}
@ -624,8 +705,8 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo)
});
// Register a callback to handle client disconnections
$server->on('close', function ($server, $fd) {
echo "Client disconnected: {$fd}\r\n";
$server->on('close', function ($server, $fd) use ($log) {
$log->info('client ' . $fd . ' connected.');
});
// Start the server