Mail bundling and processing performance improvements
All checks were successful
Create Docker Image / Build Docker Image (x86_64) (push) Successful in 48s
Create Docker Image / Build Docker Image (arm64) (push) Successful in 1m57s
Create Docker Image / Final Docker Image Manifest (push) Successful in 12s

This commit is contained in:
Deon George 2024-06-17 18:33:48 +09:30
parent c9700fbd0c
commit 1b2358b5a9
15 changed files with 202 additions and 184 deletions

View File

@ -52,9 +52,10 @@ abstract class Packet extends FTNBase implements \Iterator, \Countable
protected Address $fftn_p; // Address the packet is from (when packing messages) protected Address $fftn_p; // Address the packet is from (when packing messages)
protected Address $tftn_p; // Address the packet is to (when packing messages) protected Address $tftn_p; // Address the packet is to (when packing messages)
protected Collection $messages; // Messages in the Packet protected Collection $messages; // Messages in the Packet
protected string $content; // Outgoing packet data
public Collection $errors; // Messages that fail validation public Collection $errors; // Messages that fail validation
protected int $index; // Our array index protected int $index; // Our array index
protected $pass_p = NULL; // Overwrite the packet password (when packing messages) protected $pass_p = NULL; // Overwrite the packet password (when packing messages)
/* ABSTRACT */ /* ABSTRACT */
@ -67,7 +68,7 @@ abstract class Packet extends FTNBase implements \Iterator, \Countable
* @return bool * @return bool
*/ */
abstract public static function is_type(string $header): bool; abstract public static function is_type(string $header): bool;
abstract protected function header(): string; abstract protected function header(Collection $msgs): string;
/* STATIC */ /* STATIC */
@ -287,20 +288,7 @@ abstract class Packet extends FTNBase implements \Iterator, \Countable
*/ */
public function __toString(): string public function __toString(): string
{ {
if (empty($this->messages)) return $this->content;
throw new InvalidPacketException('Refusing to make an empty packet');
if (empty($this->tftn_p) || empty($this->fftn_p))
throw new InvalidPacketException('Cannot generate a packet without a destination address');
$return = $this->header();
foreach ($this->messages as $o)
$return .= self::PACKED_MSG_LEAD.$o->packet($this->tftn_p);
$return .= "\00\00";
return $return;
} }
/* INTERFACE */ /* INTERFACE */
@ -360,7 +348,20 @@ abstract class Packet extends FTNBase implements \Iterator, \Countable
public function mail(Collection $msgs): self public function mail(Collection $msgs): self
{ {
$this->messages = $msgs; if (! $msgs->count())
throw new InvalidPacketException('Refusing to make an empty packet');
if (empty($this->tftn_p) || empty($this->fftn_p))
throw new InvalidPacketException('Cannot generate a packet without a destination address');
$this->content = $this->header($msgs);
foreach ($msgs as $o)
$this->content .= self::PACKED_MSG_LEAD.$o->packet($this->tftn_p);
$this->content .= "\00\00";
$this->messages = $msgs->map(fn($item)=>$item->only(['id','date']));
return $this; return $this;
} }
@ -381,7 +382,6 @@ abstract class Packet extends FTNBase implements \Iterator, \Countable
if ($msg->errors->count()) { if ($msg->errors->count()) {
Log::info(sprintf('%s:- Message [%s] has [%d] errors',self::LOGKEY,$msg->msgid ?: 'No ID',$msg->errors->count())); Log::info(sprintf('%s:- Message [%s] has [%d] errors',self::LOGKEY,$msg->msgid ?: 'No ID',$msg->errors->count()));
// If the messages is not for the right zone, we'll ignore it // If the messages is not for the right zone, we'll ignore it
if ($msg->errors->has('invalid-zone')) { if ($msg->errors->has('invalid-zone')) {
Log::alert(sprintf('%s:! Message [%s] is from an invalid zone [%s], packet is from [%s] - ignoring it',self::LOGKEY,$msg->msgid,$msg->fftn->zone->zone_id,$this->fftn->zone->zone_id)); Log::alert(sprintf('%s:! Message [%s] is from an invalid zone [%s], packet is from [%s] - ignoring it',self::LOGKEY,$msg->msgid,$msg->fftn->zone->zone_id,$this->fftn->zone->zone_id));

View File

@ -3,6 +3,7 @@
namespace App\Classes\FTN\Packet; namespace App\Classes\FTN\Packet;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use App\Classes\FTN\Packet; use App\Classes\FTN\Packet;
use App\Models\Setup; use App\Models\Setup;
@ -62,44 +63,39 @@ final class FSC39 extends Packet
/** /**
* Create our message packet header * Create our message packet header
*/ */
protected function header(): string protected function header(Collection $msgs): string
{ {
$oldest = $this->messages->sortBy('datetime')->last(); $oldest = $this->messages->sortBy('datetime')->last();
try { return pack(collect(self::HEADER)->pluck(1)->join(''),
return pack(collect(self::HEADER)->pluck(1)->join(''), $this->fftn_p->node_id, // Orig Node
$this->fftn_p->node_id, // Orig Node $this->tftn_p->node_id, // Dest Node
$this->tftn_p->node_id, // Dest Node $oldest->datetime->format('Y'), // Year
$oldest->datetime->format('Y'), // Year $oldest->datetime->format('m')-1, // Month
$oldest->datetime->format('m')-1, // Month $oldest->datetime->format('d'), // Day
$oldest->datetime->format('d'), // Day $oldest->datetime->format('H'), // Hour
$oldest->datetime->format('H'), // Hour $oldest->datetime->format('i'), // Minute
$oldest->datetime->format('i'), // Minute $oldest->datetime->format('s'), // Second
$oldest->datetime->format('s'), // Second 0, // Baud
0, // Baud 2, // Packet Version (should be 2)
2, // Packet Version (should be 2) $this->fftn_p->host_id, // Orig Net
$this->fftn_p->host_id, // Orig Net $this->tftn_p->host_id, // Dest Net
$this->tftn_p->host_id, // Dest Net (Setup::PRODUCT_ID & 0xff), // Product Code Lo
(Setup::PRODUCT_ID & 0xff), // Product Code Lo Setup::PRODUCT_VERSION_MAJ, // Product Version Major
Setup::PRODUCT_VERSION_MAJ, // Product Version Major $this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password
$this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password $this->fftn_p->zone->zone_id, // Orig Zone
$this->fftn_p->zone->zone_id, // Orig Zone $this->tftn_p->zone->zone_id, // Dest Zone
$this->tftn_p->zone->zone_id, // Dest Zone '', // Reserved
'', // Reserved static::VERS, // fsc-0039.004 (copy of 0x2c)
static::VERS, // fsc-0039.004 (copy of 0x2c) ((Setup::PRODUCT_ID >> 8) & 0xff), // Product Code Hi
((Setup::PRODUCT_ID >> 8) & 0xff), // Product Code Hi Setup::PRODUCT_VERSION_MIN, // Product Version Minor
Setup::PRODUCT_VERSION_MIN, // Product Version Minor static::VERS, // Capability Word
static::VERS, // Capability Word $this->fftn_p->zone->zone_id, // Orig Zone
$this->fftn_p->zone->zone_id, // Orig Zone $this->tftn_p->zone->zone_id, // Dest Zone
$this->tftn_p->zone->zone_id, // Dest Zone $this->fftn_p->point_id, // Orig Point
$this->fftn_p->point_id, // Orig Point $this->tftn_p->point_id, // Dest Point
$this->tftn_p->point_id, // Dest Point strtoupper(hexstr(Setup::PRODUCT_ID)), // ProdData
strtoupper(hexstr(Setup::PRODUCT_ID)), // ProdData );
);
} catch (\Exception $e) {
return $e->getMessage();
}
} }
/** /**

View File

@ -3,6 +3,7 @@
namespace App\Classes\FTN\Packet; namespace App\Classes\FTN\Packet;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use App\Classes\FTN\Packet; use App\Classes\FTN\Packet;
use App\Models\Setup; use App\Models\Setup;
@ -54,32 +55,27 @@ final class FSC45 extends Packet
/** /**
* Create our message packet header * Create our message packet header
*/ */
protected function header(): string protected function header(Collection $msgs): string
{ {
try { return pack(collect(self::HEADER)->pluck(1)->join(''),
return pack(collect(self::HEADER)->pluck(1)->join(''), $this->fftn_p->node_id, // Orig Node
$this->fftn_p->node_id, // Orig Node $this->tftn_p->node_id, // Dest Node
$this->tftn_p->node_id, // Dest Node $this->fftn_p->point_id, // Orig Point
$this->fftn_p->point_id, // Orig Point $this->tftn_p->point_id, // Dest Point
$this->tftn_p->point_id, // Dest Point '', // Reserved
'', // Reserved 2, // Sub Version (should be 2)
2, // Sub Version (should be 2) 2, // Packet Version (should be 2)
2, // Packet Version (should be 2) $this->fftn_p->host_id, // Orig Net
$this->fftn_p->host_id, // Orig Net $this->tftn_p->host_id, // Dest Net
$this->tftn_p->host_id, // Dest Net (Setup::PRODUCT_ID & 0xff), // Product Code
(Setup::PRODUCT_ID & 0xff), // Product Code Setup::PRODUCT_VERSION_MAJ, // Product Version
Setup::PRODUCT_VERSION_MAJ, // Product Version $this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password
$this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password $this->fftn_p->zone->zone_id, // Orig Zone
$this->fftn_p->zone->zone_id, // Orig Zone $this->tftn_p->zone->zone_id, // Dest Zone
$this->tftn_p->zone->zone_id, // Dest Zone $this->fftn_p->zone->domain->name, // Orig Domain
$this->fftn_p->zone->domain->name, // Orig Domain $this->tftn_p->zone->domain->name, // Dest Domain
$this->tftn_p->zone->domain->name, // Dest Domain strtoupper(hexstr(Setup::PRODUCT_ID)), // ProdData
strtoupper(hexstr(Setup::PRODUCT_ID)), // ProdData );
);
} catch (\Exception $e) {
return $e->getMessage();
}
} }
/** /**

View File

@ -3,6 +3,7 @@
namespace App\Classes\FTN\Packet; namespace App\Classes\FTN\Packet;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use App\Classes\FTN\Packet; use App\Classes\FTN\Packet;
use App\Models\Setup; use App\Models\Setup;
@ -62,44 +63,39 @@ final class FSC48 extends Packet
/** /**
* Create our message packet header * Create our message packet header
*/ */
protected function header(): string protected function header(Collection $msgs): string
{ {
$oldest = $this->messages->sortBy('datetime')->last(); $oldest = $msgs->sortBy('date')->last();
try { return pack(collect(self::HEADER)->pluck(1)->join(''),
return pack(collect(self::HEADER)->pluck(1)->join(''), $this->fftn_p->node_id, // Orig Node
$this->fftn_p->node_id, // Orig Node $this->tftn_p->node_id, // Dest Node
$this->tftn_p->node_id, // Dest Node $oldest->datetime->format('Y'), // Year
$oldest->datetime->format('Y'), // Year $oldest->datetime->format('m')-1, // Month
$oldest->datetime->format('m')-1, // Month $oldest->datetime->format('d'), // Day
$oldest->datetime->format('d'), // Day $oldest->datetime->format('H'), // Hour
$oldest->datetime->format('H'), // Hour $oldest->datetime->format('i'), // Minute
$oldest->datetime->format('i'), // Minute $oldest->datetime->format('s'), // Second
$oldest->datetime->format('s'), // Second 0, // Baud
0, // Baud 2, // Packet Version (should be 2)
2, // Packet Version (should be 2) $this->fftn_p->point_id ? 0xffff : $this->fftn_p->host_id, // Orig Net (0xFFFF when OrigPoint != 0)
$this->fftn_p->point_id ? 0xffff : $this->fftn_p->host_id, // Orig Net (0xFFFF when OrigPoint != 0) $this->tftn_p->host_id, // Dest Net
$this->tftn_p->host_id, // Dest Net (Setup::PRODUCT_ID & 0xff), // Product Code Lo
(Setup::PRODUCT_ID & 0xff), // Product Code Lo Setup::PRODUCT_VERSION_MAJ, // Product Version Major
Setup::PRODUCT_VERSION_MAJ, // Product Version Major $this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password
$this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password $this->fftn_p->zone->zone_id, // Orig Zone
$this->fftn_p->zone->zone_id, // Orig Zone $this->tftn_p->zone->zone_id, // Dest Zone
$this->tftn_p->zone->zone_id, // Dest Zone $this->fftn_p->point_id ? $this->fftn_p->host_id : 0x00, // Aux Net
$this->fftn_p->point_id ? $this->fftn_p->host_id : 0x00, // Aux Net static::VERS, // fsc-0039.004 (copy of 0x2c)
static::VERS, // fsc-0039.004 (copy of 0x2c) ((Setup::PRODUCT_ID >> 8) & 0xff), // Product Code Hi
((Setup::PRODUCT_ID >> 8) & 0xff), // Product Code Hi Setup::PRODUCT_VERSION_MIN, // Product Version Minor
Setup::PRODUCT_VERSION_MIN, // Product Version Minor static::VERS, // Capability Word
static::VERS, // Capability Word $this->fftn_p->zone->zone_id, // Orig Zone
$this->fftn_p->zone->zone_id, // Orig Zone $this->tftn_p->zone->zone_id, // Dest Zone
$this->tftn_p->zone->zone_id, // Dest Zone $this->fftn_p->point_id, // Orig Point
$this->fftn_p->point_id, // Orig Point $this->tftn_p->point_id, // Dest Point
$this->tftn_p->point_id, // Dest Point strtoupper(hexstr(Setup::PRODUCT_ID)), // ProdData
strtoupper(hexstr(Setup::PRODUCT_ID)), // ProdData );
);
} catch (\Exception $e) {
return $e->getMessage();
}
} }
/** /**

View File

@ -3,6 +3,7 @@
namespace App\Classes\FTN\Packet; namespace App\Classes\FTN\Packet;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use App\Classes\FTN\Packet; use App\Classes\FTN\Packet;
use App\Models\Setup; use App\Models\Setup;
@ -55,35 +56,30 @@ final class FTS1 extends Packet
/** /**
* Create our message packet header * Create our message packet header
*/ */
protected function header(): string protected function header(Collection $msgs): string
{ {
$oldest = $this->messages->sortBy('datetime')->last(); $oldest = $this->messages->sortBy('datetime')->last();
try { return pack(collect(self::HEADER)->pluck(1)->join(''),
return pack(collect(self::HEADER)->pluck(1)->join(''), $this->fftn_p->node_id, // Orig Node
$this->fftn_p->node_id, // Orig Node $this->tftn_p->node_id, // Dest Node
$this->tftn_p->node_id, // Dest Node $oldest->datetime->format('Y'), // Year
$oldest->datetime->format('Y'), // Year $oldest->datetime->format('m')-1, // Month
$oldest->datetime->format('m')-1, // Month $oldest->datetime->format('d'), // Day
$oldest->datetime->format('d'), // Day $oldest->datetime->format('H'), // Hour
$oldest->datetime->format('H'), // Hour $oldest->datetime->format('i'), // Minute
$oldest->datetime->format('i'), // Minute $oldest->datetime->format('s'), // Second
$oldest->datetime->format('s'), // Second 0, // Baud
0, // Baud 2, // Packet Version (should be 2)
2, // Packet Version (should be 2) $this->fftn_p->host_id, // Orig Net
$this->fftn_p->host_id, // Orig Net $this->tftn_p->host_id, // Dest Net
$this->tftn_p->host_id, // Dest Net (Setup::PRODUCT_ID & 0xff), // Product Code Lo
(Setup::PRODUCT_ID & 0xff), // Product Code Lo Setup::PRODUCT_VERSION_MAJ, // Product Version Major
Setup::PRODUCT_VERSION_MAJ, // Product Version Major $this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password
$this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password $this->fftn_p->zone->zone_id, // Orig Zone
$this->fftn_p->zone->zone_id, // Orig Zone $this->tftn_p->zone->zone_id, // Dest Zone
$this->tftn_p->zone->zone_id, // Dest Zone '', // Reserved
'', // Reserved );
);
} catch (\Exception $e) {
return $e->getMessage();
}
} }
/** /**

View File

@ -11,7 +11,7 @@ abstract class Process
{ {
public static function canProcess(Echoarea $eao): bool public static function canProcess(Echoarea $eao): bool
{ {
return $eao->automsgs ? TRUE : FALSE; return (bool)$eao->automsgs;
} }
/** /**

View File

@ -44,9 +44,6 @@ final class Mail extends Send
case 'mtime': case 'mtime':
return $this->youngest()->timestamp; return $this->youngest()->timestamp;
case 'size':
return strlen($this->f);
case 'type': case 'type':
return ($this->ftype&0xff00)>>8; return ($this->ftype&0xff00)>>8;
@ -99,6 +96,7 @@ final class Mail extends Send
public function open(string $compress=''): bool public function open(string $compress=''): bool
{ {
$this->content = (string)$this->f; $this->content = (string)$this->f;
$this->size = strlen($this->content);
return TRUE; return TRUE;
} }

View File

@ -34,6 +34,7 @@ class Send extends Base
public const T_ECHOMAIL = (1<<2); public const T_ECHOMAIL = (1<<2);
private string $comp_data; private string $comp_data;
protected int $size = 0;
public function __construct() public function __construct()
{ {

View File

@ -16,8 +16,7 @@ class PacketDump extends Command
protected $signature = 'debug:packet:dump'. protected $signature = 'debug:packet:dump'.
' {type : Type of packet, netmail|echomail }'. ' {type : Type of packet, netmail|echomail }'.
' {ftn : FTN}'. ' {ftn : FTN}'.
' {file? : filename}'. ' {file? : filename}';
' {--dump : Dump packet}';
/** /**
* The console command description. * The console command description.
@ -50,11 +49,11 @@ class PacketDump extends Command
throw new \Exception('Unknown type: '.$this->argument('type')); throw new \Exception('Unknown type: '.$this->argument('type'));
} }
if ($this->option('dump')) { if (! $this->argument('file')) {
$this->info('Item Name:'.$pkt->name); $this->info('Item Name:'.$pkt->name);
$this->info('Item Type:'.get_class($pkt)); $this->info('Item Type:'.get_class($pkt));
$this->info('Dump:'); $this->info('Dump:');
echo hex_dump($pkt); echo hex_dump((string)$pkt);
} else { } else {
$f = fopen($this->argument('file'),'w+'); $f = fopen($this->argument('file'),'w+');

View File

@ -209,6 +209,7 @@ class Address extends Model
$o = $query $o = $query
->where('region_id',$ftn['n']) ->where('region_id',$ftn['n'])
->where('host_id',$ftn['n']) ->where('host_id',$ftn['n'])
->with(['system:id,active'])
->first(); ->first();
// Look for a normal address // Look for a normal address
@ -223,15 +224,16 @@ class Address extends Model
}) })
->orWhere('host_id',$ftn['n']); ->orWhere('host_id',$ftn['n']);
}) })
->with(['system:id,active'])
->first(); ->first();
// Check and see if we are a flattened domain, our address might be available with a different zone. // Check and see if we are a flattened domain, our address might be available with a different zone.
// This occurs when we are parsing 2D addresses from SEEN-BY, but we have the zone // This occurs when we are parsing 2D addresses from SEEN-BY, but we have the zone
if (! $o && ($ftn['p'] === 0)) { if (! $o && ($ftn['p'] === 0)) {
if ($ftn['d']) if ($ftn['d'])
$do = Domain::where(['name'=>$ftn['d']])->single(); $do = Domain::select('flatten')->where(['name'=>$ftn['d']])->single();
else { else {
$zo = Zone::where('zone_id',$ftn['z'])->where('default',TRUE)->single(); $zo = Zone::where('zone_id',$ftn['z'])->where('default',TRUE)->with(['domain:id,flatten'])->single();
$do = $zo?->domain; $do = $zo?->domain;
} }
@ -393,8 +395,11 @@ class Address extends Model
*/ */
public function scopeFTN($query) public function scopeFTN($query)
{ {
return $query->select(['addresses.zone_id','host_id','node_id','point_id']) return $query->select(['id','addresses.zone_id','host_id','node_id','point_id'])
->with('zone.domain'); ->with([
'zone:zones.id,domain_id,zone_id',
'zone.domain:domains.id,name',
]);
} }
public function scopeFTNOrder($query) public function scopeFTNOrder($query)
@ -597,9 +602,9 @@ class Address extends Model
public function nodes_hub(): HasMany public function nodes_hub(): HasMany
{ {
return $this->hasMany(Address::class,'hub_id','id') return $this->hasMany(Address::class,'hub_id','id')
->FTN()
->active() ->active()
->FTNorder() ->FTNorder();
->with(['zone.domain']);
} }
/** /**
@ -618,7 +623,7 @@ class Address extends Model
->whereNot('id',$this->id) ->whereNot('id',$this->id)
->active() ->active()
->FTNorder() ->FTNorder()
->with(['zone.domain']), ->with(['zone:id,domain_id,zone_id']),
$this, $this,
NULL, NULL,
($this->role_id === self::NODE_NC) ? 'id' : NULL) ($this->role_id === self::NODE_NC) ? 'id' : NULL)
@ -642,7 +647,7 @@ class Address extends Model
->whereNot('id',$this->id) ->whereNot('id',$this->id)
->active() ->active()
->FTNorder() ->FTNorder()
->with(['zone.domain']), ->with(['zone:id,domain_id,zone_id']),
$this, $this,
NULL, NULL,
($this->role_id !== self::NODE_POINT) ? 'id' : NULL) ($this->role_id !== self::NODE_POINT) ? 'id' : NULL)
@ -659,7 +664,7 @@ class Address extends Model
->whereNot('id',$this->id) ->whereNot('id',$this->id)
->active() ->active()
->FTNorder() ->FTNorder()
->with(['zone.domain']), ->with(['zone:id,domain_id,zone_id']),
$this, $this,
NULL, NULL,
($this->role_id === self::NODE_RC) ? 'id' : NULL) ($this->role_id === self::NODE_RC) ? 'id' : NULL)
@ -675,7 +680,7 @@ class Address extends Model
->whereNot('id',$this->id) ->whereNot('id',$this->id)
->active() ->active()
->FTNorder() ->FTNorder()
->with(['zone.domain']), ->with(['zone:id,domain_id,zone_id']),
$this, $this,
NULL, NULL,
($this->role_id === self::NODE_ZC) ? 'id' : NULL) ($this->role_id === self::NODE_ZC) ? 'id' : NULL)
@ -722,6 +727,9 @@ class Address extends Model
*/ */
public function getFTNAttribute(): string public function getFTNAttribute(): string
{ {
if (! $this->relationLoaded('zone'))
$this->load(['zone:id,domain_id,zone_id','zone.domain:domains.id,name']);
return sprintf('%s@%s',$this->getFTN4DAttribute(),$this->zone->domain->name); return sprintf('%s@%s',$this->getFTN4DAttribute(),$this->zone->domain->name);
} }
@ -732,11 +740,17 @@ class Address extends Model
public function getFTN3DAttribute(): string public function getFTN3DAttribute(): string
{ {
if (! $this->relationLoaded('zone'))
$this->load(['zone:id,domain_id,zone_id']);
return sprintf('%d:%s',$this->zone->zone_id,$this->getFTN2DAttribute()); return sprintf('%d:%s',$this->zone->zone_id,$this->getFTN2DAttribute());
} }
public function getFTN4DAttribute(): string public function getFTN4DAttribute(): string
{ {
if (! $this->relationLoaded('zone'))
$this->load(['zone:id,domain_id,zone_id']);
return sprintf('%s.%d',$this->getFTN3DAttribute(),$this->point_id); return sprintf('%s.%d',$this->getFTN3DAttribute(),$this->point_id);
} }
@ -998,20 +1012,28 @@ class Address extends Model
/** /**
* Echomail waiting to be sent to this system * Echomail waiting to be sent to this system
* *
* @param int|null $max
* @return Builder * @return Builder
*/ */
public function echomailWaiting(int $max=NULL): Builder public function echomailWaiting(): Builder
{ {
$echomails = $this return Echomail::select('echomails.*')
->UncollectedEchomail() ->join('echomail_seenby',['echomail_seenby.echomail_id'=>'echomails.id'])
->select('echomails.id') ->where('address_id',$this->id)
->where('addresses.id',$this->id) ->whereNull('echomails.deleted_at')
->when($max,function($query) use ($max) { return $query->limit($max); }) ->whereNotNull('export_at')
->groupBy(['echomails.id']) ->whereNull('sent_at')
->get(); ->orderby('id')
->with([
return Echomail::whereIn('id',$echomails->pluck('id')); 'tagline:id,value',
'tearline:id,value',
'origin:id,value',
'echoarea:id,name,domain_id',
'echoarea.domain:id,name',
'fftn:id,zone_id,host_id,node_id,point_id',
'fftn.zone:id,domain_id,zone_id',
'fftn.zone.domain:id,name',
])
->dontCache();
} }
/** /**
@ -1076,11 +1098,11 @@ class Address extends Model
*/ */
public function getEchomail(): ?Packet public function getEchomail(): ?Packet
{ {
if (($num=$this->echomailWaiting())->count()) { if ($count=($num=$this->echomailWaiting())->count()) {
Log::info(sprintf('%s:= Got [%d] echomails for [%s] for sending',self::LOGKEY,$num->count(),$this->ftn)); Log::info(sprintf('%s:= Got [%d] echomails for [%s] for sending',self::LOGKEY,$count,$this->ftn));
// Limit to max messages // Limit to max messages
if ($num->count() > $this->system->pkt_msgs) if ($count > $this->system->pkt_msgs)
Log::notice(sprintf('%s:= Only sending [%d] echomails for [%s]',self::LOGKEY,$this->system->pkt_msgs,$this->ftn)); Log::notice(sprintf('%s:= Only sending [%d] echomails for [%s]',self::LOGKEY,$this->system->pkt_msgs,$this->ftn));
return $this->system->packet($this)->mail($num->take($this->system->pkt_msgs)->get()); return $this->system->packet($this)->mail($num->take($this->system->pkt_msgs)->get());

View File

@ -62,7 +62,8 @@ class Domain extends Model
public function zones() public function zones()
{ {
return $this->hasMany(Zone::class); return $this->hasMany(Zone::class)
->select(['id','zone_id','domain_id']);
} }
/* ATTRIBUTES */ /* ATTRIBUTES */

View File

@ -280,12 +280,15 @@ final class Echomail extends Model implements Packet
public function echoarea() public function echoarea()
{ {
return $this->belongsTo(Echoarea::class); return $this->belongsTo(Echoarea::class)
->select('id','active','name','domain_id','security','automsgs')
->with(['domain:id,name']);
} }
public function seenby() public function seenby()
{ {
return $this->belongsToMany(Address::class,'echomail_seenby') return $this->belongsToMany(Address::class,'echomail_seenby')
->select(['id','zone_id','host_id','node_id'])
->withPivot(['export_at','sent_at','sent_pkt']) ->withPivot(['export_at','sent_at','sent_pkt'])
->FTN2DOrder(); ->FTN2DOrder();
} }
@ -293,6 +296,7 @@ final class Echomail extends Model implements Packet
public function path() public function path()
{ {
return $this->belongsToMany(Address::class,'echomail_path') return $this->belongsToMany(Address::class,'echomail_path')
->select(['addresses.id','zone_id','host_id','node_id'])
->withPivot(['id','parent_id','recv_pkt','recv_at']) ->withPivot(['id','parent_id','recv_pkt','recv_at'])
->orderBy('id','DESC'); ->orderBy('id','DESC');
} }

View File

@ -110,6 +110,7 @@ class System extends Model
public function sessions() public function sessions()
{ {
return $this->belongsToMany(Zone::class) return $this->belongsToMany(Zone::class)
->select(['id','zones.zone_id','domain_id','active'])
->withPivot(['sespass','pktpass','ticpass','fixpass','zt_ipv4','zt_ipv6','default']) ->withPivot(['sespass','pktpass','ticpass','fixpass','zt_ipv4','zt_ipv6','default'])
->dontCache(); ->dontCache();
} }

View File

@ -160,7 +160,7 @@ trait MessageAttributes
*/ */
public function packet(Address $ao): Message public function packet(Address $ao): Message
{ {
Log::debug(sprintf('%s:+ Bundling [%s] for [%s]',self::LOGKEY,$this->id,$ao->ftn),['type'=>get_class($this)]); Log::debug(sprintf('%s:+ Bundling [%s] for [%s]',self::LOGKEY,$this->id,$ao->ftn3d),['type'=>get_class($this)]);
// For echomail, our tftn is this address // For echomail, our tftn is this address
if ($this instanceof Echomail) if ($this instanceof Echomail)

View File

@ -98,7 +98,12 @@ function our_address(Domain|Address $o=NULL): Collection|Address|NULL
}); });
$our = Cache::remember(sprintf('%d-akas',$so->system_id),60,function() use ($so) { $our = Cache::remember(sprintf('%d-akas',$so->system_id),60,function() use ($so) {
$so->load(['system.akas.zone.domain']); $so->load([
'system:id,name',
'system.akas:addresses.id,addresses.zone_id,host_id,node_id,point_id,addresses.system_id,addresses.active,role',
'system.akas.zone:id,domain_id,zone_id',
'system.akas.zone.domain:id,name',
]);
return $so->system->akas; return $so->system->akas;
}); });
@ -114,16 +119,20 @@ function our_address(Domain|Address $o=NULL): Collection|Address|NULL
// We are requesting a list of addresses for a Domain, or a specific Address, and we have more than 1 // We are requesting a list of addresses for a Domain, or a specific Address, and we have more than 1
switch (get_class($o)) { switch (get_class($o)) {
case Address::class: case Address::class:
$filter = $our->filter(function($item) use ($o) { return $item->zone->domain_id === $o->zone->domain_id; })->sortBy('role'); $filter = $our
->filter(fn($item)=>$item->zone->domain_id === $o->zone->domain_id)
->sortBy('role_id');
// If we are looking for a specific address, and there is only 1 result, return it, otherwise return what we have // If we are looking for a specific address, and there is only 1 result, return it, otherwise return what we have
if (config('fido.strict') && ($x=$filter->filter(function($item) use ($o) { return $item->role_id <= $o->role_id; })->sortBy('role'))->count()) if (config('fido.strict') && ($x=$filter->filter(fn($item)=>$item->role_id <= $o->role_id)->sortBy('role_id'))->count())
$filter = $x; $filter = $x;
return $filter->last(); return $filter->count() ? $filter->last()->unsetRelation('nodes_hub') : NULL;
case Domain::class: case Domain::class:
return $our->filter(function($item) use ($o) { return $item->zone->domain_id === $o->id; })->sortBy('role'); return $our
->filter(fn($item)=>$item->zone->domain_id === $o->id)
->sortBy('role_id');
// We shouldnt get here // We shouldnt get here
default: default:
@ -171,11 +180,10 @@ function our_nodes(Domain $do=NULL): Collection
{ {
return Address::select(['addresses.id','addresses.zone_id','region_id','host_id','node_id','point_id','addresses.system_id','role']) return Address::select(['addresses.id','addresses.zone_id','region_id','host_id','node_id','point_id','addresses.system_id','role'])
->join('system_zone',['system_zone.system_id'=>'addresses.system_id','system_zone.zone_id'=>'addresses.zone_id']) ->join('system_zone',['system_zone.system_id'=>'addresses.system_id','system_zone.zone_id'=>'addresses.zone_id'])
->when(! is_null($do),function($query) use ($do) { ->when(! is_null($do),
return $query fn($query)=>$query
->join('zones',['zones.id'=>'addresses.zone_id']) ->join('zones',['zones.id'=>'addresses.zone_id'])
->where('domain_id',$do->id); ->where('domain_id',$do->id))
})
->active() ->active()
->FTNorder() ->FTNorder()
->get(); ->get();