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..a2d052c 100644 --- a/resources/views/system/addedit.blade.php +++ b/resources/views/system/addedit.blade.php @@ -112,21 +112,37 @@ @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 + [Override] + @endif + @endif + @endif + {{ $oo->security }} {{ $oo->role_name }} @@ -614,13 +630,16 @@ @endsection @section('page-css') + @css('datatables') @endsection + @section('page-scripts') + @js('datatables')