You've already forked Atomcms-edit
Initial commit
This commit is contained in:
Executable
+213
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Services\AlertService;
|
||||
use App\Services\EmulatorUpdateService;
|
||||
use App\Services\NitroUpdateService;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Process;
|
||||
|
||||
class SystemRepairCommand extends Command
|
||||
{
|
||||
#[\Override]
|
||||
protected $signature = 'system:repair
|
||||
{--emu : Alleen emulator repareren}
|
||||
{--nitro : Alleen Nitro repareren}
|
||||
{--check : Alleen controleren, niet repareren}
|
||||
{--force : Forceer reparatie ook al is alles OK}
|
||||
{--full : Volledige reset en reinstall}
|
||||
{--nuke : Alles verwijderen en opnieuw installeren (gevaarlijk!)}';
|
||||
|
||||
#[\Override]
|
||||
protected $description = 'Automatische systeem reparatie voor emulator en Nitro';
|
||||
|
||||
private const string CACHE_KEY_LAST_REPAIR = 'system_last_repair';
|
||||
|
||||
public function handle(AlertService $alertService, EmulatorUpdateService $emuService, NitroUpdateService $nitroService): int
|
||||
{
|
||||
$this->info('🔧 System Repair Service gestart...');
|
||||
$this->line('═══════════════════════════════════════════════');
|
||||
|
||||
$checkOnly = $this->option('check');
|
||||
$force = $this->option('force');
|
||||
$full = $this->option('full');
|
||||
$emuOnly = $this->option('emu');
|
||||
$nitroOnly = $this->option('nitro');
|
||||
|
||||
$results = [
|
||||
'emulator' => null,
|
||||
'nitro' => null,
|
||||
];
|
||||
|
||||
if (! $nitroOnly) {
|
||||
$results['emulator'] = $this->repairEmulator($emuService, $checkOnly, $force, $full);
|
||||
}
|
||||
|
||||
if (! $emuOnly) {
|
||||
$results['nitro'] = $this->repairNitro($nitroService, $checkOnly, $force, $full);
|
||||
}
|
||||
|
||||
Cache::put(self::CACHE_KEY_LAST_REPAIR, now()->toIso8601String());
|
||||
|
||||
$emuOk = $results['emulator'] === null || ($results['emulator']['success'] ?? false);
|
||||
$nitroOk = $results['nitro'] === null || ($results['nitro']['success'] ?? false);
|
||||
|
||||
$this->line('═══════════════════════════════════════════════');
|
||||
if ($emuOk && $nitroOk) {
|
||||
$this->info('✅ Alle systemen OK');
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
private function ensureBaseDirectories(): void
|
||||
{
|
||||
$basePaths = [
|
||||
'/var/www',
|
||||
'/var/www/atomcms',
|
||||
storage_path('app'),
|
||||
];
|
||||
|
||||
foreach ($basePaths as $path) {
|
||||
if (! is_dir($path)) {
|
||||
@mkdir($path, 0755, true);
|
||||
}
|
||||
}
|
||||
|
||||
Process::timeout(5)->run('chown -R www-data:www-data /var/www/atomcms 2>/dev/null || true');
|
||||
Process::timeout(5)->run('chmod -R 755 /var/www/atomcms 2>/dev/null || true');
|
||||
}
|
||||
|
||||
private function repairEmulator(EmulatorUpdateService $service, bool $checkOnly, bool $force, bool $full): array
|
||||
{
|
||||
$this->info('Emulator controleren...');
|
||||
|
||||
$this->ensureBaseDirectories();
|
||||
|
||||
try {
|
||||
$diagnosis = $service->diagnose();
|
||||
|
||||
if (empty($diagnosis['issues']) && ! $force && ! $full) {
|
||||
$this->line(' ✅ Emulator is OK');
|
||||
|
||||
return ['success' => true, 'status' => 'ok'];
|
||||
}
|
||||
|
||||
if ($checkOnly) {
|
||||
$this->warn(' ⚠️ Emulator problemen gevonden:');
|
||||
foreach ($diagnosis['issues'] ?? [] as $issue) {
|
||||
$this->line(' - ' . $issue);
|
||||
}
|
||||
foreach ($diagnosis['recommendations'] ?? [] as $rec) {
|
||||
$this->line(' 💡 ' . $rec);
|
||||
}
|
||||
|
||||
return ['success' => false, 'status' => 'issues_found', 'issues' => $diagnosis['issues']];
|
||||
}
|
||||
|
||||
$this->warn(' 🔧 Emulator wordt gerepareerd...');
|
||||
|
||||
if ($full) {
|
||||
$this->line(' 📦 Volledige reset...');
|
||||
$repairResult = $service->repairEmulator();
|
||||
} else {
|
||||
$repairResult = $service->repairEmulator();
|
||||
}
|
||||
|
||||
if ($repairResult['success']) {
|
||||
$this->info(' ✅ Emulator gerepareerd!');
|
||||
foreach ($repairResult['actions'] ?? [] as $action) {
|
||||
$this->line(' - ' . $action);
|
||||
}
|
||||
|
||||
return ['success' => true, 'status' => 'repaired', 'actions' => $repairResult['actions']];
|
||||
}
|
||||
|
||||
$this->error(' ❌ Emulator repair mislukt: ' . ($repairResult['error'] ?? 'Onbekend'));
|
||||
if (! empty($repairResult['actions'])) {
|
||||
$this->line(' Uitgevoerde acties:');
|
||||
foreach ($repairResult['actions'] as $action) {
|
||||
$this->line(' - ' . $action);
|
||||
}
|
||||
}
|
||||
|
||||
return ['success' => false, 'status' => 'failed', 'error' => $repairResult['error']];
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$this->error(' ❌ Emulator exception: ' . $e->getMessage());
|
||||
Log::error('[SystemRepair] Emulator exception', ['error' => $e->getMessage()]);
|
||||
|
||||
return ['success' => false, 'status' => 'exception', 'error' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
private function repairNitro(NitroUpdateService $service, bool $checkOnly, bool $force, bool $full): array
|
||||
{
|
||||
$this->info('Nitro controleren...');
|
||||
|
||||
$this->ensureBaseDirectories();
|
||||
|
||||
try {
|
||||
$diagnosis = $service->diagnose();
|
||||
|
||||
if (empty($diagnosis['issues']) && ! $force && ! $full) {
|
||||
$this->line(' ✅ Nitro is OK');
|
||||
|
||||
return ['success' => true, 'status' => 'ok'];
|
||||
}
|
||||
|
||||
if ($checkOnly) {
|
||||
$this->warn(' ⚠️ Nitro problemen gevonden:');
|
||||
foreach ($diagnosis['issues'] ?? [] as $issue) {
|
||||
$this->line(' - ' . $issue);
|
||||
}
|
||||
foreach ($diagnosis['recommendations'] ?? [] as $rec) {
|
||||
$this->line(' 💡 ' . $rec);
|
||||
}
|
||||
|
||||
return ['success' => false, 'status' => 'issues_found', 'issues' => $diagnosis['issues']];
|
||||
}
|
||||
|
||||
$this->warn(' 🔧 Nitro wordt gerepareerd...');
|
||||
|
||||
if ($full) {
|
||||
$this->line(' 📦 Volledige reset...');
|
||||
$repairResult = $service->updateNitro();
|
||||
} else {
|
||||
$repairResult = $service->repair();
|
||||
}
|
||||
|
||||
if ($repairResult['success']) {
|
||||
$this->info(' ✅ Nitro gerepareerd!');
|
||||
foreach ($repairResult['actions'] ?? [] as $action) {
|
||||
$this->line(' - ' . $action);
|
||||
}
|
||||
|
||||
return ['success' => true, 'status' => 'repaired', 'actions' => $repairResult['actions']];
|
||||
}
|
||||
|
||||
$this->error(' ❌ Nitro repair mislukt: ' . ($repairResult['error'] ?? 'Onbekend'));
|
||||
if (! empty($repairResult['actions'])) {
|
||||
$this->line(' Uitgevoerde acties:');
|
||||
foreach ($repairResult['actions'] as $action) {
|
||||
$this->line(' - ' . $action);
|
||||
}
|
||||
}
|
||||
|
||||
return ['success' => false, 'status' => 'failed', 'error' => $repairResult['error']];
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$this->error(' ❌ Nitro exception: ' . $e->getMessage());
|
||||
Log::error('[SystemRepair] Nitro exception', ['error' => $e->getMessage()]);
|
||||
|
||||
return ['success' => false, 'status' => 'exception', 'error' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user