do = $do; $this->no = $no; $this->file = $file; if ($delete) $no->addresses()->detach(); } /** * Execute the job. * * @return void * @throws \Exception */ public function handle() { // Get the file from the host $file = $this->getFileFromHost('',self::importkey,$this->file); $lines = $this->getFileLines($file); Log::debug(sprintf('%s:Processing [%d] lines.',static::LOGKEY,$lines)); $fh = fopen($file,'r'); $p = $c =0; $region = NULL; $host = NULL; $hub_id = NULL; $zo = NULL; while (! feof($fh)) { $line = stream_get_line($fh, 0, "\r\n"); // Lines beginning with a semicolon(;) are comments if (preg_match('/^;/',$line) OR ($line == chr(0x1a))) continue; // Remove any embedded CR and BOM $line = str_replace("\r",'',$line); $line = preg_replace('/^\x{feff}/u','',$line); $c++; $fields = str_getcsv(trim($line)); // First field is either zone,region,host,hub,down,pvt (or blank) if ($fields[0] AND ! in_array($fields[0],Nodelist::definitions)) { Log::error(sprintf('%s:Invalid field zero [%s] - IGNORING record (%s)',self::LOGKEY,$fields[0],$line)); continue; } $node = 0; switch ($fields[0]) { case 'Zone': $zone = $fields[1]; // We ignore the Zone entries, since they are dynamically created. Zone::unguard(); $zo = Zone::firstOrNew([ 'zone_id'=>$zone, 'domain_id'=>$this->do->id, 'active'=>TRUE, ]); Zone::reguard(); $region = 0; $host = $fields[1]; $hub_id = NULL; $role = DomainController::NODE_ZC; break; case 'Region': $region = $fields[1]; $role = DomainController::NODE_RC; $host = 0; $hub_id = NULL; break; case 'Host': $host = $fields[1]; $hub_id = NULL; $role = DomainController::NODE_NC; // We ignore the Host entries, since they are dynamically created. continue 2; case 'Hub': $node = $fields[1]; $role = DomainController::NODE_HC; break; case 'Pvt': $node = $fields[1]; $role = DomainController::NODE_PVT; break; case 'Hold': $node = $fields[1]; $role = DomainController::NODE_HOLD; break; case 'Down': $node = $fields[1]; $role = DomainController::NODE_DOWN; break; case '': $node = $fields[1]; break; default: Log::error(sprintf('%s:Unhandled first field [%s]',self::LOGKEY,$fields[0])); continue 2; } if (! $zone) { Log::error(sprintf('%s:Zone NOT set, ignoring record...',self::LOGKEY)); continue; } Address::unguard(); $ao = Address::firstOrNew([ 'region_id' => $region, 'host_id' => $host, 'node_id' => $node, 'point_id' => 0, ]); Address::reguard(); $ao->active = TRUE; $ao->role = $role; $ao->hub_id = $hub_id; $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 === $sysop) || ($ao->system->name === $system))) { $so = $ao->system; // If the sysop name is different 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. } 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',$system) ->where('sysop',$sysop) ->firstOrNew(); 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]; $so->baud = $fields[6]; */ // 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()) $p++; try { $so->addresses()->save($ao); if ($role == DomainController::NODE_HC) $hub_id = $ao->id; $this->no->addresses()->attach($ao,['role'=>$role]); } catch (\Exception $e) { Log::error(sprintf('%s:Error with line [%s] (%s)',self::LOGKEY,$line,$e->getMessage()),['fields'=>$fields]); throw new \Exception($e->getMessage()); } if (! ($c % 100)) { Log::notice(sprintf('%s:Processed [%s] records',self::LOGKEY,$c),['memory'=>memory_get_usage(TRUE)]); } } fclose($fh); if ($this->deletefile and $c) unlink($file); Log::info(sprintf('%s:Updated %d records from %d systems',self::LOGKEY,$p,$c)); } }