RBN Core - Framework v0.9.7 76 belge

Bundles/Internal/Syshub — Sistem, güvenlik, veri temizliği ve veritabanı konsolu

Doğrulanan kod tabanı: d49b4413 (dal feat/fw-license-master) · Tarih: 2026-10-05 · Yayın: 0.9.7 = bu commit + sonrası; belge yalnız doğrulama anındaki kodu anlatır
Kaynak klasör: Bundles/Internal/Syshub/ — 47 *.php + 20 *.rbn.php görünüm.
Envanter: 47 php dosyasının 47'si bu belgelerde anlatıldı (aşağıdaki alt dal tabloları).

1. Ne işe yarar, kimler kullanır

Syshub, framework'ün kendi kendini gözetleyen panosudur: sistem sağlığı
istatistikleri, bakım modu, IP engelleme / güvenilir liste / hız sınırı, depolama
temizliği ve ham SQL terminali. Diğer modüllerin (RbnAdmin, RbnAuth, projeler)
kullandığı hiçbir işlevi yoktur; tek işi işletim katmanını yönetmektir.

Kimler çağırır: yalnız geliştirici paneli (panel: 'developer', Module
attribute'i SyshubController'da). context: 'developer' olduğu için bu
modülün rotaları diğer rollere açılmaz (ModuleData.php:17).

2. Alt dallar ve belgeleri

Alt dal *.php Belge Kısa görev
Controllers/ (kök) 3 (bu belge §2.1) SyshubController (dashboard), PurgeController, MaintenanceController
Controllers/Security/ 5 Security.md Firewall, IP blok, whitelist, rate limit, güvenlik paneli
Controllers/DbConsole/ 3 DbConsole.md DB paneli, SQL terminali, tablo gezgini
Handlers/ 4 (bu belge §2.2) İstatistik toplayıcılar + ham SQL yürütücüsü
Models/ 3 (bu belge §2.3) ModuleData (rota + kayıt haritası), SyshubMap, PurgeConfig
Providers/ 7 (bu belge §2.4) Veri katmanı: shield ayarları, rate limit, whitelist, bakım, cron, DB keşfi
Services/ 2 (bu belge §2.5) Orkestratör servisler
Views/ 20 (alt dallara dağılmış, aşağıda listeli) Panel arayüzü
Toplam 47 find Bundles/Internal/Syshub -name '*.php' \| wc -l = 47

2.1 Controllers/ kök (3)

Dosya Görev Önemli public yöntemler
SyshubController.php Modülün kök kimliği; #[Module(name:'syshub', data:ModuleData::class, service:'syshub', panel:'developer', context:'panel')]. Dashboard istatistiklerini toplayıp Dashboard/index görünümünü render eder. index(): void (:23), fixPhpLimits(): void (:43)
PurgeController.php #[SubModule(entity:'datapurge', service:'syshub', handler:'purge')]. Depolama temizliği ekranının tüm uçları: liste, içerik göster, temizle, toplu sil, zip indir. index() (:26), module(string $type) (:55), show(string $type,$path=null) (:98), clear(string $type) (:134), clearAll() (:151), bulkDelete($target=null,string $method='bulkDestroy',$redirect=null) (:170), bulkDownload($ids=null,$service=null,string $method='downloadBulk') (:196), download($id=null,$service=null,string $method='download') (:217)
MaintenanceController.php #[SubModule(entity:'maintenance', service:'syshub')]. Bakım modu ekranı; whitelist IP listesini master.ipWhitelist'ten okur ve sayfalamayı elle kurar. index(): void (:21), getModalData($id=null,?string $view=null): array (:44)

2.2 Handlers/ (4)

Dosya Görev Önemli public yöntemler
SyshubHandler.php Sistem panosunun istatistik motoru: depolama klasörlerini özyinelemeli tarar, güvenlik sayaçlarını toplar, modül sayısını fiziksel sayar. getDashboardStats(): array (:26), getSystemInfo(): array (:76 protected), getFolderStats(string $path): array (:94 protected), getModuleCount(): int (:119 protected)
DataPurgeHandler.php Depolama sağlayıcılarını (cache/logs/sessions/backups/exports/uploads/view) tek noktadan toplar; temizleme/silme/okuma yapar. getDashboardStats(?string $projectKey=null): array (:24), getProviderStats(?string $projectKey=null): array (:54), clear(string $type,?string $resource=null,?string $projectKey=null): bool (:84), bulkDelete(string $type,array $ids,?string $projectKey=null): bool (:99), getFileContent(string $type,string $filename,?string $projectKey=null): mixed (:117), getLogData(string $filename,$content,?string $projectKey=null): array (:144)
SyshubSecurityHandler.php Güvenlik panelinin veri derleyicisi; GeoIP zenginleştirmesini tek yerde toplar. getSecurityDashboardData(): array (:27), buildStatsTree(array $coreSecurityStats): array (:49 protected), getEnrichedRecentAttempts(): array (:75 protected), enrich(array $data): array (:85)
SyshubDbConsoleHandler.php Veritabanı eylem yürütücüsü. Tek ifade kuralı, rol kapısı ve denetim kaydı buradadır. executeQuery(string $sql): array (:23), isRawSqlRole(bool,bool,string): bool (:68 static), hasMultipleStatements(string $sql): bool (:81 static), maskForAudit(string $sql): string (:128 static), optimize(?string $table=null): bool (:221), cleanInstall(): bool (:236), changeCollation(string,string): bool (:251), dropTable(string): bool (:259), deleteRows(string,array): bool (:267), exportSql(string,?array): string (:275)

2.3 Models/ (3)

Dosya Görev Önemli public yöntemler
ModuleData.php #[Bundle(name:'syshub', context:'developer', map:SyshubMap::MAP)]. Modülün tek kayıt noktası: 2 servis + 4 handler + 7 provider alias'ı ve 5 rota grubu (58 satır rota). registerMap(): array (:26), registerRoutes(): void (:55)
SyshubMap.php Menü haritası sabiti (const MAP): 1 kimlik + 5 alt modül, 3'ünde alt alt modüller. title/description/icon dizeleri panel menüsünü besler. const MAP (:18)
PurgeConfig.php Depolama türlerinin arayüz metinleri (başlık, ikon, renk, uyarı noktaları, toplu işlem etiketleri). Controller'ları temiz tutmak için ayrıldı. const TYPES (:14, 6 tür), get(string $type): ?array (:123)

2.4 Providers/ (7)

Dosya Görev Önemli public yöntemler
SyshubProvider.php writePhpLimits(int $limit=64): bool (:21) — proje köküne .user.ini yazar (memory_limit, post_max_size, upload_max_filesize).
SyshubFirewallProvider.php common.shieldSetting tablosunun tek yazma yolu. Yazma sonrası ShieldSettingsRepository::settingsCacheKey() önbelleğini düşürür. getSettings(): array (:20), updatesetting($keyOrData,$value=null): bool (:35), performUpdate(string,string): bool (:52 protected), getHealthStatus(): array (:85)
SyshubRateLimitProvider.php common.rateLimit (CM_SYS_RATE_LIMITS) veri katmanı; GeoIP zenginleştirmesi kayıt döngüsünde yapılır. getRecords(int $limit=0): array (:28), getStats(): array (:55), destroy(int $id): bool (:73), destroyBulk(array $ids): int (:81), clearAll(): bool (:89)
SyshubWhitelistProvider.php İki kaynağı birleştirir: master.ipWhitelist kayıtları + cm_sys_settings_shield.maintenance_ips ayarındaki virgüllü liste. getList(): array (:22), add(string $ip,string $label): bool (:41), remove(string $ip): bool (:72), getIpsFromSettings(): array (:94 protected)
SyshubMaintenanceProvider.php Bakım modu anahtarı ve mesajı; [G-03] notu: zorlayıcı katmanla (SystemGuardHandler) aynı yorumlayıcıyı kullanır. getWhitelistedIps(): array (:20), isMaintenance(): bool (:37), getMaintenanceMessage(): string (:51), save(array $data): bool (:67)
SyshubCronProvider.php Cron görevleri ve logları; getCrontabCommand() komutu service('cron')'ten alır. getJobs(): array (:23), getCrontabCommand(): string (:31), getLogs(int $limit=100): array (:39), getStorageFolders(): array (:47), find(int $id): array (:67)
SyshubDbConsoleProvider.php Tablo envanterini schemaDoctor modelinden okur ve biçimlendirir (size_formatted, engine, collation). getInfo(): array (:18), getTables(): array (:38), getRows(string $table,int $limit=100): array (:59), getMetadata(string $table): array (:67)

2.5 Services/ (2)

Dosya Görev Önemli public yöntemler
SyshubService.php Orkestratör. 8 kısa yöntem alt birimleri döndürür (purge(), maintenance(), security(), firewall(), rateLimit(), ipBlock(), whitelist(), cron()) + 2 yetki. ipBlock() bir repository döndürür, provider değil (:64). getDashboardStats(): array (:80), optimizePhpLimits(): bool (:88)
SyshubDbConsoleService.php DB konsolunun düz proxy'si: 4 provider + 8 handler çağrısını yönlendirir, seedAdmin() için service('masterAccount')'a gider. getInfo/getTables/getRows/getMetadata/executeQuery/optimize/cleanInstall/changeCollation/dropTable/deleteRows/exportSql, seedAdmin(): bool (:84)

2.6 Views/ (20)

Görünüm Sağlayan uç Görev
Dashboard/index.rbn.php SyshubController::index Sistem kartları: CPU/bellek, sürüm, güvenlik özeti, temizlenebilir alan
DataPurge/index.rbn.php PurgeController::index 7 depolama kartı + disk kullanımı + "hepsini temizle"
DataPurge/Common/index.rbn.php PurgeController::module (logs dışı) Dosya listesi + toplu seçim + moduleConfig uyarıları
DataPurge/Common/show.rbn.php PurgeController::show Tek dosya içeriği (önbellek: base64/serialized uyarısı)
DataPurge/Logs/index.rbn.php PurgeController::module (type=logs) Sekmeli log listesi (getCategorizedLogs())
DataPurge/Logs/view.rbn.php PurgeController::show JSON ayrıştırılmış log içeriği
DbConsole/index.rbn.php DbConsoleController::index DB özeti (ad, tip, tablo sayısı, kayıt sayısı)
DbConsole/console.rbn.php SqlConsoleController::index SQL terminali: editör, çalıştır, CSV dışa aktar, geçmiş (satır 193-358 gömülü JS)
DbConsole/tables.rbn.php TableExplorerController::index Tablo listesi + sayfalama + arama
DbConsole/browse.rbn.php TableExplorerController::browse Tablo satırları + meta + satır silme/dışa aktarma
Maintenance/index.rbn.php MaintenanceController::index Bakım anahtarı + mesaj + izinli IP tablosu
Maintenance/partials/modal_add_ip.rbn.php MaintenanceController::modal Bakım moduna VIP IP ekleme
Maintenance/partials/modal_update_message.rbn.php aynı Bakım mesajı düzenleme
Security/index.rbn.php SecurityController::index Sağlık skoru + son denemeler
Security/firewall.rbn.php FirewallController::index firewall_enabled / firewall_mode anahtarları
Security/rate_limits.rbn.php RateLimitsController::index Hız sınırı kayıtları (bayrak + ülke)
Security/ip_blocks.rbn.php IpBlockController::index Manuel IP engelleri
Security/ip_whitelist.rbn.php IpWhitelistController::index Güvenilir IP listesi
Security/Partials/modal_ip_block.rbn.php IpBlockController::modal IP + sebep + süre formu
Security/Partials/modal_whitelist.rbn.php IpWhitelistController::modal IP + etiket formu

Kapsama: 47/47.

3. Akış — bir istek syshub'a geldiğinde

GET /<panel>/syshub
  → Route::prefix('syshub')->controller('SyshubController')        ModuleData.php:58
  → SyshubController::index()                                     SyshubController.php:23
      → $this->service  ⇒  SyshubService (alias 'syshub')          ModuleData.php:30
          → handler('syshub')  ⇒  SyshubHandler                     SyshubService.php:82
              → repository('common.shieldSetting')                  SyshubHandler.php:28
              → getFolderStats(Paths::project()->storage('framework/views'))  :30,35
              → getFolderStats(Paths::project()->storage('logs'))            :31,36
              → getFolderStats(Paths::project()->sessions())                 :32,37
              → model('master.ipBlock')?->count()                            :49
              → model('common.rateLimit')?->count()                          :50
      → render('Dashboard/index', [...])                           SyshubController.php:27

Depolama temizliği zinciri:

POST syshub/datapurge/clearAll
  → PurgeController::clearAll()                                    PurgeController.php:151
      → SyshubMap::MAP['sub_modules']['datapurge']['sub_modules']  :155
        (7 anahtar: cache, logs, sessions, backups, exports, uploads, view)
      → her anahtar için purge()->clear($type,null,$projectKey)     :159
          → service('storage')->{$type}()->withProject($key)->clearAll()  DataPurgeHandler.php:93

Ham SQL zinciri:

POST syshub/dbconsole/console/execute
  → SqlConsoleController::executeQuery()                           SqlConsoleController.php:40
      → request->form(['query'=>'required|string'], ['action'=>'sql_console_execute'])
      → SyshubDbConsoleService::executeQuery()                      SyshubDbConsoleService.php:46
          → SyshubDbConsoleHandler::executeQuery()                 SyshubDbConsoleHandler.php:23
              ├─ session: is_logged_in / is_master_developer / user_role      :29-35
              ├─ isRawSqlRole(...)  → reddi hâlinde SQL_CONSOLE_DENIED_ROLE   :31,37
              ├─ hasMultipleStatements(...) → SQL_CONSOLE_DENIED_MULTI         :42
              ├─ auditSql('SQL_CONSOLE_EXECUTE', $sql) → logs()->channel('security')  :47,200-216
              └─ model('schemaDoctor')->executeRaw($sql)                        :50

4. Yapılandırma / ayar anahtarları

Anahtar Yer Varsayılan Not
maintenance_mode cm_sys_settings_shield '0' SyshubMaintenanceProvider.php:43; zorlayıcı katmanla aynı yorumlayıcı (ShieldSettingsRepository::normalizeSwitch)
maintenance_ips aynı tablo '' Virgüllü IP listesi; whitelist ve bakım izinlerinin ortak kaynağı
bakım mesajı aynı tablo 'Sistem şu anda bakımda. Lütfen daha sonra tekrar deneyin.' SyshubMaintenanceProvider.php:58
firewall_enabled aynı tablo '0' SyshubFirewallProvider.php:90
firewall_mode aynı tablo 'standard' SyshubFirewallProvider.php:91
CLEANUP_ALLOWED_TABLES Definition::get('database_project', …) — cleanInstall()'ın sadece bu tabloları truncate etmesini sağlar (SyshubDbConsoleHandler.php:239)
writePhpLimits(64) .user.ini (proje kökü) 64 MB SyshubProvider.php:23; üç anahtarı birlikte yazar
Depolama türü anahtarları (7) SyshubMap.php:52 — PurgeController::clearAll() bu anahtarları service('storage') metot adı olarak kullanır

5. Tuzaklar ve kurallar (kodda görülen, ölçülmüş)

  1. BulkControllerTrait imza tuzağı. PurgeController::bulkDelete($target=null, string $method='bulkDestroy', $redirect=null)
    imzası bilerek yorum bozucudur: yönlendirici {type}'ı 1. argüman, {path}'i 2. argüman geçirir
    (ModuleData.php:78,81), controller bunu $path = ($method !== 'bulkDestroy') ? $method : null
    ile ayrıştırır (PurgeController.php:176). $method bir yöntem adı değil, dosya yoludur.
  2. logs ve view ayrıcalıklı tip. DataPurgeHandler::getProviderStats() yedi tip döndürür ama
    logs için getCategorizedLogs()/getConfigs() ve view için farklı anahtar kullanılır
    (DataPurgeHandler.php:60). PurgeController::module() yalnız logs'ta özel dallanır (:69).
  3. PurgeConfig::TYPES ile SyshubMap uyuşmuyor. PurgeConfig framework türünü tanımlar
    (PurgeConfig.php:51) ama SyshubMap alt modülleri arasında framework yoktur; view var
    (SyshubMap.php:59). Ters yönde de fark var: view PurgeConfig'te yok. Bu yüzden view kartı
    bg_color alamaz ve PurgeController::index #6366f1 varsayılanına düşer (PurgeController.php:39).
  4. Ham SQL üç kapıdan geçer ve her durumda denetlenir. Rol (:31), tek ifade (:42) ve denetim
    (:47) sırayla; reddedilen durumlar da auditSql ile kayda girer (:38,43). Denetim yazımı
    try/catch içindedir — denetim kaydı yazılamazsa sorgu yine de çalışır (:213-215).
  5. isMaintenance() yorum uyumu (G-03). Panel eskiden === 'on' ile okuyordu; zorlayıcı katman
    normalizeSwitch() kullanıyordu. maintenance_mode='1' yazan operatör siteyi AÇIK görüyor,
    site ENGELLİ görünüyordu. İkisi de tek kaynağa bağlandı; anahtar yoksa KAPALI sayılır
    (SyshubMaintenanceProvider.php:29,42-45).
  6. Önbellek düşürme yazma sonrası zorunlu. getSetting() settings_shield önbelleğini kullanır;
    yazma sonrası düşürülmezse panel eski değeri okumaya devam eder
    (SyshubMaintenanceProvider.php:88, SyshubFirewallProvider.php:71).
    Her iki yerde de try/catch ile yutulur — güvenlik açığı değil, gecikmedir.
  7. SyshubCronProvider::find() ölü kod. getJobs() kayıtlı alias master.cronJob kullanırken
    (SyshubCronProvider.php:25) find() kayıtsız model('cronJobs') çağırır (:69). Bu ada karşılık
    gelen CronJobsModel yoktur (dosya adı MasterCronJobsModel.php; kayıt alias'ı
    SystemPhysicalMapTrait.php:29). ?->toArray() sayesinde hata fırlatmaz, daima [] döner.
  8. Statistiklerde sert kodlanmış değerler. active_threats => 0, health_score => 98
    (SyshubHandler.php:53), getHealthStatus()['score'] => 98 (SyshubFirewallProvider.php:92),
    traffic bloğu tamamen sıfır (SyshubHandler.php:64). Panel bunları gerçek ölçüm gibi gösterir.
  9. Paths::frameworkRoot() ile modül sayımı. getModuleCount() Bundles/Internal ve
    Bundles/RbnSuite altındaki dizin sayısını sayar (SyshubHandler.php:122); paket içi
    *.php sayısıyla ilgisi yoktur.
  10. SqlConsoleController::getTableData() tablo adını interpolasyonla gömüyor —
    "SELECT * FROM `{$form['table']}` LIMIT 100" (SqlConsoleController.php:78).
    Değer required|string ile gelir; backtick kaçışı yapılmadığı için backtick içeren bir tablo adı
    sorguyu bozabilir. executeQuery() bu yüzden tek ifade kuralını uygular ama tablo adını doğrulamaz.
  11. Rol kapısı yalnız SQL'de var. executeQuery() user_role ∈ {developer, superadmin} ya da
    is_master_developer arar (SyshubDbConsoleHandler.php:68). dropTable, deleteRows,
    optimize, cleanInstall gibi daha yıkıcı işlemlerin hiçbirinde bu kapı yoktur; güvenlik
    yalnız URI'nin context: 'developer' korumasına dayanır.

6. Örnek (gerçek koddan)

// Bundles/Internal/Syshub/Handlers/SyshubDbConsoleHandler.php:23-47 (özetlenmiş)
public function executeQuery(string $sql): array
{
    if (empty(trim($sql))) {
        return ['success' => false, 'message' => 'Sorgu boş olamaz.'];
    }

    $session  = $this->session();
    $role     = (string) $session->get('user_role', '');
    $allowed  = self::isRawSqlRole(
        (bool) $session->get('is_logged_in', false),
        (bool) $session->get('is_master_developer', false),
        $role
    );
    if (!$allowed) {
        $this->auditSql('SQL_CONSOLE_DENIED_ROLE', $sql);
        return ['success' => false, 'message' => 'Bu işlem için yetkiniz yok.'];
    }
    if (self::hasMultipleStatements($sql)) {
        $this->auditSql('SQL_CONSOLE_DENIED_MULTI', $sql);
        return ['success' => false, 'message' => 'Aynı anda yalnızca tek bir SQL ifadesi çalıştırılabilir.'];
    }
    $this->auditSql('SQL_CONSOLE_EXECUTE', $sql);
    // …
}

7. İlgili belgeler