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ı
5. Tuzaklar ve kurallar (kodda görülen, ölçülmüş)
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.
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).
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).
- 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).
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).
- Ö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.
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.
- 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.
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.
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.
- 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