99 lines
4.1 KiB
PHP
99 lines
4.1 KiB
PHP
<?php
|
|
header('Content-Type: application/json');
|
|
require_once dirname(__DIR__) . '/include/config.php';
|
|
|
|
$action = $_GET['action'] ?? $_POST['action'] ?? '';
|
|
|
|
// ── Boot device detection ─────────────────────────────────────────────────────
|
|
function vv_storage_detect_transport(): string {
|
|
$part = trim(shell_exec("findmnt -n -o SOURCE /boot 2>/dev/null") ?: '');
|
|
if (!$part) return 'unknown';
|
|
$disk = trim(shell_exec("lsblk -no pkname " . escapeshellarg($part) . " 2>/dev/null") ?: '');
|
|
if (!$disk) return 'unknown';
|
|
return strtolower(trim(shell_exec("lsblk -dno TRAN /dev/" . escapeshellarg($disk) . " 2>/dev/null") ?: 'unknown'));
|
|
}
|
|
|
|
// ── Current mode status ───────────────────────────────────────────────────────
|
|
if ($action === 'status') {
|
|
$transport = vv_storage_detect_transport();
|
|
$detected = ($transport === 'usb') ? 'flash' : 'internal';
|
|
$currentDir = SCRIPTS_DIR;
|
|
$internalDir = '/boot/config/plugins/varaverk';
|
|
$flashDir = '/mnt/user/appdata/Varaverk';
|
|
$currentMode = ($currentDir === $internalDir) ? 'internal'
|
|
: ($currentDir === $flashDir ? 'flash' : 'custom');
|
|
|
|
$myHost = vv_detect_host();
|
|
$vars = vv_conf_vars();
|
|
$confKey = strtoupper($myHost) . '_STORAGE_MODE_INTERNAL';
|
|
$confVal = $vars[$confKey] ?? null;
|
|
|
|
// Boot device name for display
|
|
$bootPart = trim(shell_exec("findmnt -n -o SOURCE /boot 2>/dev/null") ?: '');
|
|
$bootDisk = $bootPart ? trim(shell_exec("lsblk -no pkname " . escapeshellarg($bootPart) . " 2>/dev/null") ?: '') : '';
|
|
|
|
echo json_encode([
|
|
'ok' => true,
|
|
'current_mode' => $currentMode,
|
|
'current_dir' => $currentDir,
|
|
'internal_dir' => $internalDir,
|
|
'flash_dir' => $flashDir,
|
|
'transport' => $transport,
|
|
'detected' => $detected,
|
|
'boot_disk' => $bootDisk ? '/dev/' . $bootDisk : 'unknown',
|
|
'conf_key' => $confKey,
|
|
'conf_val' => $confVal,
|
|
'array_started'=> is_dir('/mnt/user') && count(scandir('/mnt/user')) > 2,
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// ── Run migration ─────────────────────────────────────────────────────────────
|
|
if ($action === 'migrate' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$to = trim($_POST['to'] ?? '');
|
|
if (!in_array($to, ['internal', 'flash'], true)) {
|
|
echo json_encode(['ok' => false, 'error' => 'Invalid target: must be internal or flash']);
|
|
exit;
|
|
}
|
|
|
|
$script = SCRIPTS_DIR . '/Tools/storage_migrate.sh';
|
|
if (!file_exists($script)) {
|
|
echo json_encode(['ok' => false, 'error' => 'storage_migrate.sh not found']);
|
|
exit;
|
|
}
|
|
|
|
set_time_limit(300);
|
|
$output = [];
|
|
$exit = 0;
|
|
exec('bash ' . escapeshellarg($script) . ' --to=' . escapeshellarg($to) . ' 2>&1', $output, $exit);
|
|
|
|
echo json_encode([
|
|
'ok' => $exit === 0,
|
|
'exit' => $exit,
|
|
'output' => implode("\n", $output),
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// ── Auto-detect and write to conf ─────────────────────────────────────────────
|
|
if ($action === 'detect' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$transport = vv_storage_detect_transport();
|
|
$detected = ($transport === 'usb') ? 'false' : 'true';
|
|
$myHost = vv_detect_host();
|
|
$confKey = strtoupper($myHost) . '_STORAGE_MODE_INTERNAL';
|
|
$confFile = $myHost . '.conf';
|
|
|
|
$results = vv_conf_write_changes([[
|
|
'file' => $confFile,
|
|
'key' => $confKey,
|
|
'value' => $detected,
|
|
'type' => 'scalar',
|
|
]]);
|
|
|
|
$ok = !in_array(false, $results, true);
|
|
echo json_encode(['ok' => $ok, 'detected' => $detected, 'transport' => $transport]);
|
|
exit;
|
|
}
|
|
|
|
echo json_encode(['ok' => false, 'error' => 'Unknown action']);
|