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'); $c =0; $region = NULL; $host = NULL; $hub_id = 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. $zo = Zone::firstOrCreate([ 'zone_id'=>$zone, 'domain_id'=>$this->do->id, ]); $region = 0; $host = 0; $hub_id = NULL; $role = DomainController::NODE_ZC; continue 2; 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': $role = DomainController::NODE_HC; break; case 'Pvt': $node = $fields[1]; $role = DomainController::NODE_PVT; 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([ 'zone_id' => $zo->id, '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; // Get the System if ($ao->system_id && (($ao->system->sysop === str_replace('_',' ',$fields[4])) || ($ao->system->name !== str_replace('_',' ',$fields[2])))) { $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]); // We have the same name has changed. } else { $so->name = str_replace('_',' ',$fields[2]); $so->location = str_replace('_',' ',$fields[3]); } // 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])) ->firstOrNew(); $so->name = str_replace('_',' ',$fields[2]); $so->sysop = str_replace('_',' ',$fields[4]); $so->location = str_replace('_',' ',$fields[3]); $so->active = TRUE; if (! $so->exists) $so->notes = sprintf('Created by Nodelist Import: %d',$this->no->id); } /* if (! in_array($fields[5],['-Unpublished-'])) $so->phone = $fields[5]; $so->baud = $fields[6]; */ // Save the system record $so->save(); 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:Records Updated: %d',self::LOGKEY,$c)); } }