Fixes for nodelist importing
This commit is contained in:
parent
17a44a0945
commit
aa06296963
@ -9,11 +9,13 @@ use App\Models\{Address,Domain,Zone};
|
||||
|
||||
class DomainController extends Controller
|
||||
{
|
||||
public const NODE_ZC = 1<<1; // Zone
|
||||
public const NODE_RC = 1<<2; // Region
|
||||
public const NODE_NC = 1<<3; // Host
|
||||
public const NODE_HC = 1<<4; // Hub
|
||||
public const NODE_PVT = 1<<5; // Pvt
|
||||
public const NODE_ACTIVE = 0; // Active
|
||||
public const NODE_ZC = 1<<0; // Zone
|
||||
public const NODE_RC = 1<<1; // Region
|
||||
public const NODE_NC = 1<<2; // Host
|
||||
public const NODE_HC = 1<<3; // Hub
|
||||
public const NODE_PVT = 1<<4; // Pvt
|
||||
public const NODE_HOLD = 1<<5; // Hold
|
||||
public const NODE_DOWN = 1<<6; // Down
|
||||
|
||||
// http://ftsc.org/docs/frl-1002.001
|
||||
|
@ -190,7 +190,7 @@ class SystemController extends Controller
|
||||
$this->authorize('admin',$o);
|
||||
|
||||
$request->validate([
|
||||
'name' => 'required|min:3|unique:systems,name,'.($o->exists ? $o->id : 0),
|
||||
'name' => 'required|min:3',
|
||||
'location' => 'required|min:3',
|
||||
'sysop' => 'required|min:3',
|
||||
'address' => 'nullable|regex:/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i',
|
||||
|
@ -58,11 +58,12 @@ class ImportNodelist implements ShouldQueue
|
||||
Log::debug(sprintf('%s:Processing [%d] lines.',static::LOGKEY,$lines));
|
||||
|
||||
$fh = fopen($file,'r');
|
||||
$c =0;
|
||||
$p = $c =0;
|
||||
|
||||
$region = NULL;
|
||||
$host = NULL;
|
||||
$hub_id = NULL;
|
||||
$zo = NULL;
|
||||
|
||||
while (! feof($fh)) {
|
||||
$line = stream_get_line($fh, 0, "\r\n");
|
||||
@ -89,17 +90,20 @@ class ImportNodelist implements ShouldQueue
|
||||
switch ($fields[0]) {
|
||||
case 'Zone': $zone = $fields[1];
|
||||
// We ignore the Zone entries, since they are dynamically created.
|
||||
$zo = Zone::firstOrCreate([
|
||||
Zone::unguard();
|
||||
$zo = Zone::firstOrNew([
|
||||
'zone_id'=>$zone,
|
||||
'domain_id'=>$this->do->id,
|
||||
'active'=>TRUE,
|
||||
]);
|
||||
Zone::reguard();
|
||||
|
||||
$region = 0;
|
||||
$host = 0;
|
||||
$host = $fields[1];
|
||||
$hub_id = NULL;
|
||||
$role = DomainController::NODE_ZC;
|
||||
|
||||
continue 2;
|
||||
break;
|
||||
|
||||
case 'Region':
|
||||
$region = $fields[1];
|
||||
@ -118,6 +122,7 @@ class ImportNodelist implements ShouldQueue
|
||||
continue 2;
|
||||
|
||||
case 'Hub':
|
||||
$node = $fields[1];
|
||||
$role = DomainController::NODE_HC;
|
||||
|
||||
break;
|
||||
@ -128,6 +133,12 @@ class ImportNodelist implements ShouldQueue
|
||||
|
||||
break;
|
||||
|
||||
case 'Hold':
|
||||
$node = $fields[1];
|
||||
$role = DomainController::NODE_HOLD;
|
||||
|
||||
break;
|
||||
|
||||
case 'Down':
|
||||
$node = $fields[1];
|
||||
$role = DomainController::NODE_DOWN;
|
||||
@ -150,7 +161,6 @@ class ImportNodelist implements ShouldQueue
|
||||
|
||||
Address::unguard();
|
||||
$ao = Address::firstOrNew([
|
||||
'zone_id' => $zo->id,
|
||||
'region_id' => $region,
|
||||
'host_id' => $host,
|
||||
'node_id' => $node,
|
||||
@ -164,36 +174,52 @@ class ImportNodelist implements ShouldQueue
|
||||
|
||||
$role = NULL;
|
||||
|
||||
if ($ao->exists)
|
||||
Log::debug(sprintf('%s:Processing existing address [%s]',self::LOGKEY,$ao->ftn));
|
||||
|
||||
$sysop = trim(str_replace('_',' ',$fields[4]));
|
||||
$system = trim(str_replace('_',' ',$fields[2]));
|
||||
$location = trim(str_replace('_',' ',$fields[3]));
|
||||
|
||||
// Get the System
|
||||
if ($ao->system_id && (($ao->system->sysop === str_replace('_',' ',$fields[4])) || ($ao->system->name !== str_replace('_',' ',$fields[2])))) {
|
||||
if ($ao->system_id && (($ao->system->sysop === $sysop) || ($ao->system->name === $system))) {
|
||||
$so = $ao->system;
|
||||
|
||||
// If the sysop name is different
|
||||
if ($so->sysop !== str_replace('_',' ',$fields[4])) {
|
||||
$so->sysop = str_replace('_',' ',$fields[4]);
|
||||
$so->location = str_replace('_',' ',$fields[3]);
|
||||
if ($so->sysop !== $sysop) {
|
||||
Log::debug(sprintf('%s:Sysop Name changed for BBS [%s:%s] from [%s] to [%s]',
|
||||
self::LOGKEY,$so->id,$so->name,$so->sysop,$sysop));
|
||||
|
||||
$so->sysop = $sysop;
|
||||
|
||||
// We have the same name has changed.
|
||||
} else {
|
||||
$so->name = str_replace('_',' ',$fields[2]);
|
||||
$so->location = str_replace('_',' ',$fields[3]);
|
||||
} elseif ($so->name !== $system) {
|
||||
Log::debug(sprintf('%s:System Name changed for BBS [%s:%s] to [%s]',
|
||||
self::LOGKEY,$so->id,$so->name,$system));
|
||||
|
||||
$so->name = $system;
|
||||
}
|
||||
|
||||
// We'll search and see if we already have that system
|
||||
} else {
|
||||
$so = System::where('name',str_replace('_',' ',$fields[2]))
|
||||
->where('sysop',str_replace('_',' ',$fields[4]))
|
||||
$so = System::where('name',$system)
|
||||
->where('sysop',$sysop)
|
||||
->firstOrNew();
|
||||
|
||||
$so->name = str_replace('_',' ',$fields[2]);
|
||||
$so->sysop = str_replace('_',' ',$fields[4]);
|
||||
$so->location = str_replace('_',' ',$fields[3]);
|
||||
if ($so->exists)
|
||||
Log::debug(sprintf('%s:Linking address [%d:%d/%d] to [%s:%s]',self::LOGKEY,$zo->zone_id,$ao->host_id,$ao->node_id,$so->id,$so->name));
|
||||
else
|
||||
Log::debug(sprintf('%s:New System [%s] with address [%d:%d/%d]',self::LOGKEY,$system,$zo->zone_id,$ao->host_id,$ao->node_id));
|
||||
|
||||
$so->name = $system;
|
||||
$so->sysop = $sysop;
|
||||
$so->active = TRUE;
|
||||
|
||||
if (! $so->exists)
|
||||
$so->notes = sprintf('Created by Nodelist Import: %d',$this->no->id);
|
||||
}
|
||||
|
||||
$so->location = $location;
|
||||
/*
|
||||
if (! in_array($fields[5],['-Unpublished-']))
|
||||
$so->phone = $fields[5];
|
||||
@ -204,6 +230,19 @@ class ImportNodelist implements ShouldQueue
|
||||
// Save the system record
|
||||
$so->save();
|
||||
|
||||
// If our zone didnt exist, we'll create it with this system
|
||||
if (! $zo->exists) {
|
||||
$zo->system_id = $so->id;
|
||||
$zo->save();
|
||||
}
|
||||
|
||||
$ao->zone_id = $zo->id;
|
||||
|
||||
if ($ao->getDirty()) {
|
||||
dd($ao);
|
||||
$p++;
|
||||
}
|
||||
|
||||
try {
|
||||
$so->addresses()->save($ao);
|
||||
if ($role == DomainController::NODE_HC)
|
||||
@ -226,6 +265,6 @@ class ImportNodelist implements ShouldQueue
|
||||
if ($this->deletefile and $c)
|
||||
unlink($file);
|
||||
|
||||
Log::info(sprintf('%s:Records Updated: %d',self::LOGKEY,$c));
|
||||
Log::info(sprintf('%s:Updated %d records from %d systems',self::LOGKEY,$p,$c));
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ class Nodelist extends Model
|
||||
protected $dates = ['date'];
|
||||
protected $fillable = ['date','domain_id'];
|
||||
|
||||
public const definitions = ['Zone','Region','Host','Hub','Pvt','Down'];
|
||||
public const definitions = ['Zone','Region','Host','Hub','Pvt','Hold','Down'];
|
||||
|
||||
/* RELATIONS */
|
||||
|
||||
|
@ -47,7 +47,7 @@
|
||||
<td>{{ $oo->name }}</td>
|
||||
<td>{{ $oo->active ? 'YES' : 'NO' }}</td>
|
||||
<td>{{ $oo->dnsdomain }}</td>
|
||||
<td>{{ join(', ',$oo->zones->pluck('zone_id')->toArray()) }}</td>
|
||||
<td>{{ join(', ',$oo->zones->pluck('zone_id')->sort()->toArray()) }}</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
|
@ -55,13 +55,12 @@
|
||||
<div id="collapse_systems" class="accordion-collapse collapse" aria-labelledby="systems" data-bs-parent="#accordion_homepage">
|
||||
<div class="accordion-body">
|
||||
<p>The following systems are members of this network.</p>
|
||||
<table class="table monotable">
|
||||
<table class="table monotable" id="network">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>System</th>
|
||||
<th>Sysop</th>
|
||||
<th>Location</th>
|
||||
<th>Role</th>
|
||||
<th>Address</th>
|
||||
<th>Last Seen</th>
|
||||
</tr>
|
||||
@ -74,7 +73,6 @@
|
||||
<td>{{ sprintf('ZC-%s-%05d',$oz->domain->name,$oz->zone_id) }}</td>
|
||||
<td>{{ $oz->system->sysop }}</td>
|
||||
<td>{{ $oz->system->location }}</td>
|
||||
<td>Zone</td>
|
||||
<td>{{ $oz->zone_id }}:0/0.0<span>@</span>{{ $oz->domain->name }}</td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
@ -82,20 +80,18 @@
|
||||
@foreach ($oz->addresses()->active()->FTNorder()->whereNull('hub_id')->with(['system','zone.domain'])->get() as $ao)
|
||||
@if ($ao->role == 'Host')
|
||||
<tr>
|
||||
<td>{{ sprintf('NC-%s-%05d',$oz->domain->name,$ao->host_id) }}</td>
|
||||
<td>{{ sprintf('NC-%s-%05d',$oz->domain->name,$ao->host_id) }} <span class="float-end"><small>[{{ $ao->id }}]</small></span></td>
|
||||
<td>{{ $ao->system->sysop }}</td>
|
||||
<td>{{ $ao->system->location }}</td>
|
||||
<td>{{ $ao->role }}</td>
|
||||
<td>{{ $oz->zone_id }}:{{ $ao->host_id }}/0.0<span>@</span>{{ $oz->domain->name }}</td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
<tr>
|
||||
<td>{{ $ao->system->full_name($ao) }}</td>
|
||||
<td>{{ $ao->system->full_name($ao) }} <span class="float-end"><small>[{{ $ao->id }}]</small></span></td>
|
||||
<td>{{ $ao->system->sysop }}</td>
|
||||
<td>{{ $ao->system->location }}</td>
|
||||
<td>{{ $ao->role }}</td>
|
||||
<td>{{ $ao->ftn }}</td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
@ -104,9 +100,9 @@
|
||||
@if ($ao->role == 'Hub')
|
||||
@foreach ($oz->addresses()->active()->FTNorder()->where('hub_id',$ao->id)->with(['system','zone.domain'])->get() as $aoo)
|
||||
<tr>
|
||||
<td>{{ $aoo->system->full_name($aoo) }}</td>
|
||||
<td>{{ $aoo->system->full_name($aoo) }} <span class="float-end"><small>[{{ $aoo->id }}]</small></span></td>
|
||||
<td>{{ $aoo->system->sysop }}</td>
|
||||
<td>{{ $ao->system->location }}</td>
|
||||
<td>{{ $aoo->system->location }}</td>
|
||||
<td>{{ $aoo->role }}</td>
|
||||
<td>{{ $aoo->ftn }}</td>
|
||||
<td>-</td>
|
||||
@ -140,3 +136,38 @@
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('page-scripts')
|
||||
<link type="text/css" rel="stylesheet" href="https://cdn.datatables.net/1.10.25/css/dataTables.bootstrap5.min.css" media="screen" >
|
||||
<link type="text/css" rel="stylesheet" href="{{ asset('plugin/dataTables/dataTables.bootstrap5.css') }}" media="screen">
|
||||
|
||||
<script type="text/javascript" src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
|
||||
<script type="text/javascript" src="https://cdn.datatables.net/rowgroup/1.1.2/js/dataTables.rowGroup.min.js"></script>
|
||||
<script type="text/javascript" src="https://cdn.datatables.net/1.10.25/js/dataTables.bootstrap5.min.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
$('table tr').click(function() {
|
||||
var href = $(this).find('a').attr('href');
|
||||
|
||||
if (href)
|
||||
window.location = href;
|
||||
});
|
||||
|
||||
$('#network').DataTable({
|
||||
paging: true,
|
||||
pageLength: 25,
|
||||
searching: true,
|
||||
order: [
|
||||
[3,'asc'],
|
||||
],
|
||||
/*
|
||||
columnDefs: [
|
||||
{
|
||||
targets: [5,6],
|
||||
visible: false,
|
||||
}
|
||||
],
|
||||
*/
|
||||
});
|
||||
</script>
|
||||
@append
|
@ -56,7 +56,7 @@
|
||||
<span class="input-group-text"><i class="bi bi-laptop-fill"></i></span>
|
||||
<select class="form-select @error('system_id') is-invalid @enderror" id="system" name="system_id" required @cannot('admin',$o)disabled @endcannot>
|
||||
<option value=""> </option>
|
||||
@foreach (\App\Models\System::active()->cursor() as $oo)
|
||||
@foreach (\App\Models\System::active()->orderBy('name')->cursor() as $oo)
|
||||
<option value="{{ $oo->id }}" @if(old('system_id',$o->system_id)==$oo->id)selected @endif>{{ $oo->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
|
@ -38,12 +38,12 @@
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@foreach (\App\Models\Zone::with(['domain'])->get() as $oo)
|
||||
@foreach (\App\Models\Zone::orderBy('zone_id')->with(['domain','addresses'])->get() as $oo)
|
||||
<tr>
|
||||
<td>{{ $oo->domain->name }}</td>
|
||||
<td><a href="{{ url('ftn/zone/addedit',[$oo->id]) }}">{{ $oo->zone_id }}</a></td>
|
||||
<td>{{ $oo->active ? 'YES' : 'NO' }}</td>
|
||||
<td>-</td>
|
||||
<td>{{ $oo->addresses->count() }}</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
|
Loading…
Reference in New Issue
Block a user