"RaspberryRelay", "ContactInfo" => "contact@admin.com", "ORPort" => "9001", "BandwidthRate" => "625 KB", "BandwidthBurst" => "1250 KB", "AccountingMax" => "100 GB", "AccountingStart" => "month 1 00:00", "SocksPort" => "0", "TransPort" => "0", "ExitRelay" => "0", "ControlPort" => "0", "ControlSocket" => "/run/tor/control", "CookieAuthentication" => "1", "CookieAuthFileGroupReadable" => "1", ]; if (!is_readable($path)) return $cfg; foreach (@file($path) ?: [] as $line) { if (preg_match('/^\s*(Nickname|ContactInfo|ORPort|BandwidthRate|BandwidthBurst|AccountingMax|AccountingStart|SocksPort|TransPort|ExitRelay|ControlPort|ControlSocket|CookieAuthentication|CookieAuthFileGroupReadable)\s+(.+?)\s*$/', $line, $m)) { $cfg[$m[1]] = trim($m[2]); } } return $cfg; } function torrc_to_ui(array $parsed): array { $rate_kb = _rate_to_kb((string)($parsed['BandwidthRate'] ?? '625 KB')); $burst_kb = _rate_to_kb((string)($parsed['BandwidthBurst'] ?? max(1, $rate_kb * 2))); $cap_gb = 100; if (preg_match('/^\s*(\d+(?:\.\d+)?)\s*GB\b/i', (string)($parsed['AccountingMax'] ?? ''), $m)) { $cap_gb = (int)max(1, round((float)$m[1])); } $acc_day = 1; if (preg_match('/month\s+(\d+)\s+\d+:\d+/i', (string)($parsed['AccountingStart'] ?? ''), $m)) { $acc_day = max(1, min(28, (int)$m[1])); } return [ 'nickname' => (string)($parsed['Nickname'] ?? 'RaspberryRelay'), 'contact' => (string)($parsed['ContactInfo'] ?? 'contact@admin.com'), 'orport' => (int) ($parsed['ORPort'] ?? 9001), 'rate_mbps' => _kb_to_mbps($rate_kb), 'burst_mbps' => _kb_to_mbps($burst_kb), 'cap_gb' => (int)$cap_gb, 'acc_day' => (int)$acc_day, ]; } function write_torpanel_conf(array $in): bool { $nick = isset($in['nickname']) ? (string)$in['nickname'] : (isset($in['Nickname']) ? (string)$in['Nickname'] : 'RaspberryRelay'); $nick = _sanitize_nickname($nick); $contact = isset($in['contact']) ? (string)$in['contact'] : (isset($in['ContactInfo']) ? (string)$in['ContactInfo'] : 'contact@admin.com'); $contact = substr(preg_replace('/[\x00-\x1F\x7F]/', '', trim($contact)), 0, 200); $orport = (int)($in['orport'] ?? ($in['ORPort'] ?? 9001)); if ($orport < 1 || $orport > 65535) $orport = 9001; if (isset($in['rate_mbps'])) { $rate_kb = _mbps_to_kb((int)$in['rate_mbps']); } else { $rate_kb = _rate_to_kb((string)($in['BandwidthRate'] ?? '625 KB')); } if (isset($in['burst_mbps'])) { $burst_kb = _mbps_to_kb((int)$in['burst_mbps']); } else { $burst_kb = _rate_to_kb((string)($in['BandwidthBurst'] ?? max(1, $rate_kb*2) . ' KB')); } if ($burst_kb < $rate_kb) $burst_kb = $rate_kb; $cap_gb = (int)($in['cap_gb'] ?? 0); if ($cap_gb <= 0 && isset($in['AccountingMax']) && preg_match('/^\s*(\d+(?:\.\d+)?)\s*GB\b/i', (string)$in['AccountingMax'], $m)) { $cap_gb = (int)max(1, round((float)$m[1])); } if ($cap_gb < 1) $cap_gb = 100; $acc_day = (int)($in['acc_day'] ?? 0); if ($acc_day <= 0 && isset($in['AccountingStart']) && preg_match('/month\s+(\d+)\s+\d+:\d+/i', (string)$in['AccountingStart'], $m)) { $acc_day = (int)$m[1]; } if ($acc_day < 1 || $acc_day > 28) $acc_day = 1; $out = <</dev/null'); return true; }