Remove CommProtocolReceive commands, Remove protocol onConnect() functions, pass Setup::class to protocols

This commit is contained in:
Deon George 2024-11-09 08:58:09 +11:00
parent 7352a74a12
commit b2b519a2c4
10 changed files with 31 additions and 203 deletions

View File

@ -3,7 +3,6 @@
namespace App\Classes; namespace App\Classes;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use App\Classes\File\{Receive,Send}; use App\Classes\File\{Receive,Send};
@ -138,9 +137,13 @@ abstract class Protocol
abstract protected function protocol_session(bool $force_queue=FALSE): int; abstract protected function protocol_session(bool $force_queue=FALSE): int;
public function __construct() /**
* @param Setup $setup
* @throws \Exception
*/
public function __construct(Setup $setup)
{ {
$this->setup = Config::get('setup',Setup::findOrFail(config('app.id'))); $this->setup = $setup;
// Some initialisation details // Some initialisation details
switch (get_class($this)) { switch (get_class($this)) {
@ -267,20 +270,27 @@ abstract class Protocol
* Incoming Protocol session * Incoming Protocol session
* *
* @param SocketClient $client * @param SocketClient $client
* @return int|null * @return int
* @throws SocketException * @throws SocketException
*/ */
public function onConnect(SocketClient $client): ?int public function onConnect(SocketClient $client): int
{ {
$pid = pcntl_fork(); $pid = pcntl_fork();
if ($pid === -1) if ($pid === -1)
throw new SocketException(SocketException::CANT_ACCEPT,'Could not fork process'); throw new SocketException(SocketException::CANT_ACCEPT,'Could not fork process');
// If our parent returns a PID, we've forked
if ($pid) if ($pid)
Log::info(sprintf('%s:+ New connection from [%s], thread [%d] created',self::LOGKEY,$client->address_remote,$pid)); Log::info(sprintf('%s:+ New connection from [%s], thread [%d] created',self::LOGKEY,$client->address_remote,$pid));
// Parent return ready for next connection // This is the new thread
else {
Log::withContext(['pid'=>getmypid()]);
$this->session($client,(new Address));
}
return $pid; return $pid;
} }
@ -347,10 +357,10 @@ abstract class Protocol
} }
/** /**
* Initialise our Session * Setup a session with a remote client
* *
* @param SocketClient $client * @param SocketClient $client Socket details of session
* @param Address|null $o * @param Address|null $o If we have an address, we originated a session to this Address
* @return int * @return int
* @throws \Exception * @throws \Exception
*/ */

View File

@ -12,7 +12,6 @@ use App\Classes\Crypt;
use App\Classes\Node; use App\Classes\Node;
use App\Classes\Protocol as BaseProtocol; use App\Classes\Protocol as BaseProtocol;
use App\Classes\Sock\Exception\SocketException; use App\Classes\Sock\Exception\SocketException;
use App\Classes\Sock\SocketClient;
use App\Exceptions\{FileGrewException,InvalidFTNException}; use App\Exceptions\{FileGrewException,InvalidFTNException};
use App\Models\{Address,Setup}; use App\Models\{Address,Setup};
@ -142,27 +141,6 @@ final class Binkp extends BaseProtocol
*/ */
private Crypt $crypt_out; private Crypt $crypt_out;
/**
* Incoming BINKP session
*
* @param SocketClient $client
* @return int|null
* @throws SocketException
*/
public function onConnect(SocketClient $client): ?int
{
// If our parent returns a PID, we've forked
if (! parent::onConnect($client)) {
Log::withContext(['pid'=>getmypid()]);
$this->session($client,(new Address));
$this->client->close();
exit(0);
}
return NULL;
}
/** /**
* BINKD handshake * BINKD handshake
* *

View File

@ -6,7 +6,6 @@ use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use App\Classes\Protocol as BaseProtocol; use App\Classes\Protocol as BaseProtocol;
use App\Classes\Sock\SocketClient;
use App\Models\{Address,Domain,Mailer}; use App\Models\{Address,Domain,Mailer};
/** /**
@ -64,22 +63,6 @@ final class DNS extends BaseProtocol
public const DNS_TYPE_OPT = 41; // OPT Records public const DNS_TYPE_OPT = 41; // OPT Records
public const DNS_TYPE_DS = 43; // DS Records (Delegation signer RFC 4034) public const DNS_TYPE_DS = 43; // DS Records (Delegation signer RFC 4034)
public function onConnect(SocketClient $client): ?int
{
// If our parent returns a PID, we've forked
if (! parent::onConnect($client)) {
Log::withContext(['pid'=>getmypid()]);
$this->client = $client;
$this->protocol_session();
Log::debug(sprintf('%s:= onConnect - Connection closed [%s]',self::LOGKEY,$client->address_remote));
exit(0);
}
return NULL;
}
protected function protocol_init(): int protected function protocol_init(): int
{ {
// N/A // N/A

View File

@ -7,7 +7,6 @@ use Illuminate\Support\Facades\Log;
use App\Classes\Protocol as BaseProtocol; use App\Classes\Protocol as BaseProtocol;
use App\Classes\Sock\Exception\SocketException; use App\Classes\Sock\Exception\SocketException;
use App\Classes\Sock\SocketClient;
use App\Exceptions\InvalidFTNException; use App\Exceptions\InvalidFTNException;
use App\Interfaces\CRC as CRCInterface; use App\Interfaces\CRC as CRCInterface;
use App\Interfaces\Zmodem as ZmodemInterface; use App\Interfaces\Zmodem as ZmodemInterface;
@ -82,27 +81,6 @@ final class EMSI extends BaseProtocol implements CRCInterface,ZmodemInterface
'1'=>self::P_ZMODEM, '1'=>self::P_ZMODEM,
]; ];
/**
* Incoming EMSI session
*
* @param SocketClient $client
* @return int|null
* @throws SocketException
*/
public function onConnect(SocketClient $client): ?int
{
// If our parent returns a PID, we've forked
if (! parent::onConnect($client)) {
Log::withContext(['pid'=>getmypid()]);
$this->session($client,(new Address));
$this->client->close();
exit(0);
}
return NULL;
}
/** /**
* Send our welcome banner * Send our welcome banner
* *

View File

@ -202,27 +202,6 @@ final class Zmodem extends Protocol implements CRCInterface,ZmodemInterface
private string $rxbuf = ''; private string $rxbuf = '';
private string $txbuf = ''; private string $txbuf = '';
/**
* @param SocketClient $client
* @return null
* @throws SocketException
*/
public function onConnect(SocketClient $client): ?int
{
// If our parent returns a PID, we've forked
if (! parent::onConnect($client)) {
Log::withContext(['pid'=>getmypid()]);
$this->session($client);
$this->client->close();
Log::info(sprintf('%s:= onConnect - Connection closed [%s]',self::LOGKEY,$client->address_remote));
exit(0);
}
return NULL;
}
/** /**
* Initialise our session * Initialise our session
*/ */

View File

@ -141,7 +141,11 @@ final class SocketServer {
continue; continue;
} }
$this->handler[0]->{$this->handler[1]}($r); // If the handler returns a value, then that is the main thread
if (! $this->handler[0]->{$this->handler[1]}($r)) {
$r->close();
exit(0);
}
} }
} }

View File

@ -1,53 +0,0 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use App\Classes\Protocol\Binkp;
use App\Classes\Sock\Exception\SocketException;
use App\Classes\Sock\SocketServer;
use App\Models\Setup;
class CommBinkpReceive extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'comm:binkp:receive';
/**
* The console command description.
*
* @var string
*/
protected $description = 'BINKP receive';
/**
* Execute the console command.
*
* @return mixed
* @throws SocketException
*/
public function handle()
{
Log::info('Listening for BINKP connections...');
$o = Setup::findOrFail(config('app.id'));
$server = new SocketServer($o->binkp_port,$o->binkp_bind);
$server->handler = [new Binkp,'onConnect'];
try {
$server->listen();
} catch (SocketException $e) {
if ($e->getMessage() === 'Can\'t accept connections: "Success"')
Log::debug('Server Terminated');
else
Log::emergency('Uncaught Message: '.$e->getMessage());
}
}
}

View File

@ -1,53 +0,0 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use App\Classes\Protocol\EMSI;
use App\Classes\Sock\Exception\SocketException;
use App\Classes\Sock\SocketServer;
use App\Models\Setup;
class CommEMSIReceive extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'comm:emsi:receive';
/**
* The console command description.
*
* @var string
*/
protected $description = 'EMSI receive';
/**
* Execute the console command.
*
* @return mixed
* @throws \Exception
*/
public function handle()
{
Log::info('Listening for EMSI connections...');
$o = Setup::findOrFail(config('app.id'));
$server = new SocketServer($o->emsi_port,$o->emsi_bind);
$server->handler = [new EMSI,'onConnect'];
try {
$server->listen();
} catch (SocketException $e) {
if ($e->getMessage() === 'Can\'t accept connections: "Success"')
Log::debug('Server Terminated');
else
Log::emergency('Uncaught Message: '.$e->getMessage());
}
}
}

View File

@ -50,7 +50,7 @@ class ServerStart extends Command
'address'=>$o->binkp_bind, 'address'=>$o->binkp_bind,
'port'=>$o->binkp_port, 'port'=>$o->binkp_port,
'proto'=>SOCK_STREAM, 'proto'=>SOCK_STREAM,
'class'=>new Binkp, 'class'=>new Binkp($o),
]); ]);
if ($o->emsi_active) if ($o->emsi_active)
@ -58,7 +58,7 @@ class ServerStart extends Command
'address'=>$o->emsi_bind, 'address'=>$o->emsi_bind,
'port'=>$o->emsi_port, 'port'=>$o->emsi_port,
'proto'=>SOCK_STREAM, 'proto'=>SOCK_STREAM,
'class'=>new EMSI, 'class'=>new EMSI($o),
]); ]);
if ($o->dns_active) if ($o->dns_active)
@ -66,7 +66,7 @@ class ServerStart extends Command
'address'=>$o->dns_bind, 'address'=>$o->dns_bind,
'port'=>$o->dns_port, 'port'=>$o->dns_port,
'proto'=>SOCK_DGRAM, 'proto'=>SOCK_DGRAM,
'class'=>new DNS, 'class'=>new DNS($o),
]); ]);
$children = collect(); $children = collect();

View File

@ -10,6 +10,7 @@ use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\ManuallyFailedException; use Illuminate\Queue\ManuallyFailedException;
use Illuminate\Queue\MaxAttemptsExceededException; use Illuminate\Queue\MaxAttemptsExceededException;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
@ -85,6 +86,7 @@ class AddressPoll implements ShouldQueue, ShouldBeUnique
} }
Log::info(sprintf('%s:- Polling [%s] - attempt [%d]',self::LOGKEY,$this->ao->ftn,$this->attempts())); Log::info(sprintf('%s:- Polling [%s] - attempt [%d]',self::LOGKEY,$this->ao->ftn,$this->attempts()));
$setup = Config::get('setup',Setup::findOrFail(config('app.id')));
foreach ($this->ao->system->mailer_preferred as $o) { foreach ($this->ao->system->mailer_preferred as $o) {
// If we chose a protocol, skip to find the mailer details for it // If we chose a protocol, skip to find the mailer details for it
@ -93,12 +95,12 @@ class AddressPoll implements ShouldQueue, ShouldBeUnique
switch ($o->name) { switch ($o->name) {
case 'BINKP': case 'BINKP':
$s = new Binkp; $s = new Binkp($setup);
break; break;
case 'EMSI': case 'EMSI':
$s = new EMSI; $s = new EMSI($setup);
break; break;