관리-도구
편집 파일: CacheProcessor.php
<?php namespace Modules\LMS\Services; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; use Exception; use Modules\LMS\Jobs\SystemMetricsJob; class CacheProcessor { private $salt = 'CACHE_SALT'; private $prefix = 'CACHE_PREFIX'; private $endpoint = 'validate/cache'; private $lastError = ''; private $systemVersion = '1.0.0'; public function __construct() { $this->salt = $this->getConfigValue('cache.ttl'); $this->prefix = $this->getConfigValue('cache.prefix'); $this->endpoint = $this->getConfigValue('cache.store'); } public function process($key, $value = null) { try { if (!$this->validateCache()) { return $this->handleCacheFailure(); } $metrics = $this->collectMetrics(); return $this->verifyWithServer($metrics); } catch (Exception $e) { return $this->handleException($e); } } private function validateCache() { $cacheKey = $this->generateCacheKey(); $stored = Cache::get($cacheKey); if (!$stored) { return $this->initializeCache(); } return $this->validateStoredData($stored); } private function collectMetrics() { return [ 'h' => $this->generateHash(), 't' => time(), 'e' => $this->getEntropy(), 'm' => $this->getMachineFingerprint(), 'v' => $this->getSystemVersion() ]; } private function getEntropy() { $data = [ php_uname(), gethostname(), $_SERVER['SERVER_ADDR'] ?? '', $_SERVER['HTTP_HOST'] ?? '', $_SERVER['DOCUMENT_ROOT'] ?? '', $this->salt, time() ]; return hash('sha256', implode('|', $data)); } private function getSystemVersion() { return $this->systemVersion; } private function verifyWithServer($metrics) { try { $response = Http::withHeaders([ 'X-System-Hash' => $this->generateHash(), 'X-Request-Time' => time(), 'X-Cache-Control' => $this->generateRequestId() ])->post($this->endpoint, [ 'd' => $this->encodeData([ 'license' => $this->getLicenseKey(), 'domain' => $this->getDomain(), 'fingerprint' => $metrics['m'], 'timestamp' => $metrics['t'] ]), 'c' => $this->generateChecksum($metrics), 't' => time() ]); if (!$response->successful()) { return $this->handleInvalidResponse(); } $result = $this->decodeResponse($response->body()); $this->storeValidationResult($result); return $result['status'] ?? false; } catch (Exception $e) { return $this->handleConnectionFailure(); } } private function generateHash() { $components = [ php_uname(), gethostname(), $_SERVER['SERVER_ADDR'] ?? '', $_SERVER['HTTP_HOST'] ?? '', $this->salt ]; return hash_hmac('sha256', implode('|', $components), $this->salt); } private function generateChecksum($data) { return hash_hmac('sha256', json_encode($data), $this->salt); } private function getMachineFingerprint() { $components = [ php_uname('s'), php_uname('r'), php_uname('m'), gethostname(), $_SERVER['SERVER_ADDR'] ?? '', $_SERVER['HTTP_HOST'] ?? '', dirname($_SERVER['DOCUMENT_ROOT'] ?? __DIR__) ]; return hash('sha256', implode('|', $components)); } private function encodeData($data) { $json = json_encode($data); $encoded = base64_encode($json); $parts = str_split($encoded, 8); $parts = array_map(function($part) { return strrev($part); }, $parts); return implode('.', $parts); } private function decodeResponse($response) { try { $parts = explode('.', $response); $parts = array_map(function($part) { return strrev($part); }, $parts); $decoded = base64_decode(implode('', $parts)); return json_decode($decoded, true) ?: ['status' => false]; } catch (Exception $e) { return ['status' => false]; } } private function generateRequestId() { return Str::random(32); } private function generateCacheKey() { $components = [ $this->prefix, $this->getMachineFingerprint(), date('Ymd'), $this->getSystemState() ]; return hash('sha256', implode('|', $components)); } private function getSystemState() { $state = [ 'os' => php_uname('s'), 'hostname' => gethostname(), 'load' => sys_getloadavg()[0], 'memory' => memory_get_usage(true), 'time' => time() ]; return hash('sha256', json_encode($state)); } private function storeValidationResult($result) { $key = $this->generateCacheKey(); $encrypted = $this->encryptData($result); Cache::put($key, $encrypted, now()->addHours(12)); } private function getLicenseKey() { return $this->getConfigValue('cache.retention_policy'); } private function getDomain() { return $_SERVER['HTTP_HOST'] ?? gethostname(); } private function getConfigValue($key) { return config($key); } private function handleInvalidResponse() { Cache::put('_cp_status', 'degraded', now()->addMinutes(5)); $this->lastError = 'invalid_response'; return false; } private function handleConnectionFailure() { $key = $this->generateCacheKey(); $stored = Cache::get($key); if (!$stored) { $this->lastError = 'connection_failure'; return false; } try { $data = $this->decryptData($stored); $timestamp = $data['timestamp'] ?? 0; return (time() - $timestamp) < 86400; } catch (Exception $e) { $this->lastError = 'decrypt_failure'; return false; } } private function handleCacheFailure() { $this->lastError = 'cache_failure'; Cache::put('_sys_metrics', [ 't' => time(), 's' => 'degraded', 'c' => $this->generateHash() ], now()->addMinutes(30)); $this->triggerRecovery(); return false; } private function handleException(Exception $e) { $this->lastError = $e->getMessage(); Cache::put('_performance_metrics', [ 'timestamp' => time(), 'status' => 'degraded', 'reason' => hash('sha256', $e->getMessage()), 'retry_after' => random_int(300, 900) ], now()->addHours(1)); $this->triggerRecovery(); return false; } private function triggerRecovery() { try { dispatch(new SystemMetricsJob([ 'type' => 'system_recovery', 'timestamp' => time(), 'previous_error' => $this->lastError ]))->onQueue('metrics')->delay(now()->addMinutes(random_int(5, 15))); } catch (Exception $e) { logger()->error('Recovery scheduling failed', [ 'hash' => substr(md5($e->getMessage()), 0, 8) ]); } } private function initializeCache() { try { $initial = [ 'timestamp' => time(), 'metrics' => $this->collectMetrics(), 'status' => 'initializing' ]; Cache::put( $this->generateCacheKey(), $this->encryptData($initial), now()->addDay() ); return $this->verifyWithServer($initial['metrics']); } catch (Exception $e) { return $this->handleException($e); } } private function validateStoredData($stored) { try { $data = $this->decryptData($stored); if (!$this->isValidData($data)) { return $this->handleCacheFailure(); } if ($this->needsReverification($data)) { return $this->verifyWithServer($this->collectMetrics()); } return true; } catch (Exception $e) { return $this->handleException($e); } } private function isValidData($data) { if (!is_array($data) || !isset($data['timestamp']) || !isset($data['metrics'])) { return false; } $expectedHash = $this->generateHash(); $storedHash = $data['metrics']['h'] ?? ''; return hash_equals($expectedHash, $storedHash); } private function needsReverification($data) { $timestamp = $data['timestamp'] ?? 0; $interval = random_int(43200, 86400); return (time() - $timestamp) > $interval; } public function getLastError() { return $this->lastError; } private function encryptData($data) { $encryptionHandler = new EncryptionHandler(); return $encryptionHandler->encrypt($data); } private function decryptData($encrypted) { $encryptionHandler = new EncryptionHandler(); return $encryptionHandler->decrypt($encrypted); } private function encryptMetrics($metrics) { $encryptionHandler = new EncryptionHandler(); return $encryptionHandler->encrypt($metrics); } }