From a601200df800154faf0a890dc04fa1ddc67610a5 Mon Sep 17 00:00:00 2001 From: Deon George Date: Mon, 14 Apr 2025 23:09:41 +1000 Subject: [PATCH] Added tool to list node addresses and the address we use, Fix address edit which reactivated the address, Fix correct icons when using address merge, We only advertise validated addresses and use validated addresses for routing, Show our address on known AKA screen --- .../Commands/Debug/AddressCheckNode.php | 64 +++++++++++++++++++ app/Console/Commands/Debug/ZoneCheck.php | 4 +- app/Http/Controllers/SystemController.php | 5 +- app/Models/Address.php | 2 +- app/helpers.php | 31 ++++++--- resources/views/system/addedit.blade.php | 53 +++++++++++++-- 6 files changed, 142 insertions(+), 17 deletions(-) create mode 100644 app/Console/Commands/Debug/AddressCheckNode.php diff --git a/app/Console/Commands/Debug/AddressCheckNode.php b/app/Console/Commands/Debug/AddressCheckNode.php new file mode 100644 index 0000000..c9f63ac --- /dev/null +++ b/app/Console/Commands/Debug/AddressCheckNode.php @@ -0,0 +1,64 @@ +argument('ftn')) { + $ao = Address::findFTN($this->argument('ftn')); + + if (! $ao) { + $this->error('FTN not found: ' .$this->argument('ftn')); + + return self::FAILURE; + } + + $this->info('our address:'.our_address($ao)->ftn); + return self::SUCCESS; + } + + $this->table(['System','Node','Ours'], + our_nodes($ao ? $ao->domain : NULL) + ->sortBy(fn($item)=>$this->option('node') + ? sprintf('%s:%s',$item->system->name,$item->domain->name) + : sprintf('%s',$item->domain->name)) + ->map(fn($item)=> + [ + 'System'=>$item->system->name, + 'Node'=>$item->ftn.' '.($item->echoareas->count() ? '^' : '').($item->fileareas->count() ? '*' : ''), + 'Ours'=>our_address($item)?->ftn, + ])); + + return self::SUCCESS; + } +} \ No newline at end of file diff --git a/app/Console/Commands/Debug/ZoneCheck.php b/app/Console/Commands/Debug/ZoneCheck.php index 228846c..30daee9 100644 --- a/app/Console/Commands/Debug/ZoneCheck.php +++ b/app/Console/Commands/Debug/ZoneCheck.php @@ -25,10 +25,11 @@ class ZoneCheck extends Command $this->warn('Zone: '.$zo->zone_id); $this->info(sprintf('- Our address(es): %s',our_address($do)->pluck('ftn4d')->join(','))); - $this->table(['id','ftn','role','parent','children','downlinks','uplink','send from','region_id','system','notes'], + $this->table(['id','region_id','ftn','role','parent','children','downlinks','uplink','send from','system','notes'], $zo->addresses()->FTN()->active()->with(['system','nodes_hub'])->get()->transform(function($item) { return [ 'id'=>$item->id, + 'region_id'=>$item->region_id, 'ftn'=>$item->ftn4d, 'role'=>$item->role_name, 'parent'=>$item->parent()?->ftn4d, @@ -36,7 +37,6 @@ class ZoneCheck extends Command 'downlinks'=>$item->downlinks()->count(), 'uplink'=>($x=$item->uplink())?->ftn4d, 'send from'=>$x ? our_address($item->uplink())?->ftn4d : '', - 'region_id'=>$item->region_id, 'system'=>$item->system->name, 'notes'=>$item->isRoleOverride() ? 'Role Override' : '', ]; diff --git a/app/Http/Controllers/SystemController.php b/app/Http/Controllers/SystemController.php index b2c71fb..147e097 100644 --- a/app/Http/Controllers/SystemController.php +++ b/app/Http/Controllers/SystemController.php @@ -98,7 +98,10 @@ class SystemController extends Controller $oo = Address::findOrNew($request->validated('submit')); $oo->zone_id = $request->validated('zone_id'); $oo->security = $request->validated('security'); - $oo->active = TRUE; + + // Only change to active if it is new + if (! $oo->exists) + $oo->active = TRUE; switch ($request->validated('action')) { case 'region': diff --git a/app/Models/Address.php b/app/Models/Address.php index 4605919..e3e2665 100644 --- a/app/Models/Address.php +++ b/app/Models/Address.php @@ -764,7 +764,7 @@ class Address extends Model public function getFTNAttribute(): string { if (! $this->relationLoaded('zone')) - $this->load(['zone:id,domain_id,zone_id','zone.domain:domains.id,name']); + $this->load(['zone:id,domain_id,active,zone_id','zone.domain:domains.id,name,active']); return sprintf('%s@%s',$this->getFTN4DAttribute(),$this->zone->domain->name); } diff --git a/app/helpers.php b/app/helpers.php index f6c4b65..e54aca4 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -84,14 +84,27 @@ if (! function_exists('hexstr')) { /** * Return our addresses. + * + * We have two address types: + * + a) address that we advertise to receive mail and use to package up mail (Public) + * + b) address that we accept and process mail + * + * a is a subset of b, where b might have addresses we used in the past but no longer (but mail still comes in, and we + * dont want to send out mail with those addresses anymore) + * + * Public addresses are when validated is set to true + * When determining our public addresses for a specific Address (when Address::class is passed), we only return addresses + * when security is not null + * * If domain provided, limit the list to those within the domain - returning a Collection::class * If address provided, return our address that would be used for the provided address - return Address::class * - * @param Domain|Address|null $o - Domain or Address + * @param Domain|Address|null $o Domain or Address + * @param bool $public Return only public addresses * @return Collection|Address|NULL * @throws Exception */ -function our_address(Domain|Address $o=NULL): Collection|Address|NULL +function our_address(Domain|Address $o=NULL,bool $public=TRUE): Collection|Address|NULL { if (! Config::has('setup')) Config::set('setup',Setup::findOrFail(config('app.id'))); @@ -99,7 +112,7 @@ function our_address(Domain|Address $o=NULL): Collection|Address|NULL $so = Config::get('setup'); $so->loadMissing([ 'system:id,name,sysop,location', - 'system.akas:addresses.id,addresses.zone_id,region_id,host_id,node_id,point_id,addresses.system_id,addresses.active,role', + 'system.akas:addresses.id,addresses.zone_id,region_id,host_id,node_id,point_id,addresses.system_id,addresses.active,role,validated,security', 'system.akas.zone:id,domain_id,zone_id', 'system.akas.zone.domain:id,name', ]); @@ -117,20 +130,22 @@ function our_address(Domain|Address $o=NULL): Collection|Address|NULL // Looking for addresses in the same domain, and if fido.strict, addresses that have a higher role (ie: uplink) case Address::class: $filter = $so->system->akas - ->filter(fn($item)=>$item->zone->domain_id === $o->zone->domain_id) + ->filter(fn($item)=>((! $public) || ($public && $item->validated)) && ($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 (config('fido.strict') && ($x=$filter->filter(fn($item)=>$item->role_id <= $o->role_id)->sortBy('role_id'))->count()) $filter = $x; - return $filter->count() ? $filter->last()->unsetRelation('nodes_hub') : NULL; + return $filter->count() + ? ($filter->filter(fn($item)=>$item->region_id === $o->region_id)->count() + ? $filter->last() + : $filter->first())->unsetRelation('nodes_hub') + : NULL; // Addresses in this domain case Domain::class: return $so->system->akas - ->filter(fn($item)=>$item->zone->domain_id === $o->id) - ->sortBy('role_id'); + ->filter(fn($item)=>((! $public) || ($public && $item->validated)) && ($item->zone->domain_id === $o->id)); // We shouldnt get here default: diff --git a/resources/views/system/addedit.blade.php b/resources/views/system/addedit.blade.php index 16f74f4..e49a297 100644 --- a/resources/views/system/addedit.blade.php +++ b/resources/views/system/addedit.blade.php @@ -112,21 +112,36 @@ @if($o->addresses->count())

This system has the following addresses assigned to it:

- +
+ - + + @foreach ($o->addresses as $oo) - - - + $oo->trashed() || (! $oo->active_domain),'inactive'=>(! $oo->trashed()) && (! $oo->active)])> + + +
Address Active@if($o->setup)Parent @else Uplink @endif SecurityRoleRole
$oo->trashed(),'inactive'=>(! $oo->trashed()) && (! $oo->active)])>{{ $oo->ftn }}$oo->validated,'bi-radioactive'=>(! $oo->validated)])>{{ $oo->active ? 'YES' : 'NO' }}
{{ $oo->ftn }}$oo->validated,'bi-radioactive'=>(! $oo->validated)])>-{{ $oo->active ? 'Active' : 'Not Active' }}- + @if($o->setup) + {{ ($oo->validated && $x=$oo->parent()) ? $x->ftn : '' }} + @else + @if($x=our_address($oo)) + @if(true) + Auto [{{ $x->ftn4d }}] + @else + 3:633/509 [Override] + @endif + @endif + @endif + {{ $oo->security }} {{ $oo->role_name }} @@ -614,13 +629,16 @@ @endsection @section('page-css') + @css('datatables') @endsection + @section('page-scripts') + @js('datatables')