From fefb954eec63c0b0beb3fa1a9c61a33acb9bfb24 Mon Sep 17 00:00:00 2001 From: opus Date: Thu, 16 Apr 2026 17:01:29 +0200 Subject: [PATCH] opus-1700: opus_write_safe helper in wevia-ops --- api/l99-autofix-log.json | 12 ++--- api/wevia-ops.php | 46 ++++++++++++++++++ generated/video-20260416-150007.mp4 | Bin 48 -> 47912 bytes ...n-opus-2026-04-16-1700-helper-writesafe.md | 23 +++++++++ 4 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 wiki/session-opus-2026-04-16-1700-helper-writesafe.md diff --git a/api/l99-autofix-log.json b/api/l99-autofix-log.json index 20520d216..4eb063a35 100644 --- a/api/l99-autofix-log.json +++ b/api/l99-autofix-log.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-16T16:45:20.438357", + "timestamp": "2026-04-16T17:00:19.660786", "layers": { "DOCKER": { "n": "DOCKER", @@ -9,9 +9,9 @@ }, "CAPABILITIES": { "n": "CAPABILITIES", - "t": 1, - "p": 0, - "c": "ro" + "t": 10, + "p": 10, + "c": "cy" }, "CRONS": { "n": "CRONS", @@ -57,6 +57,6 @@ } }, "fixes": [], - "total": 191, - "pass": 181 + "total": 200, + "pass": 191 } \ No newline at end of file diff --git a/api/wevia-ops.php b/api/wevia-ops.php index 883ecbfdb..692d5c464 100644 --- a/api/wevia-ops.php +++ b/api/wevia-ops.php @@ -1,6 +1,52 @@ "auth"]);exit;} + +// OPUS v3 HELPER — écriture fichier robuste (fixe silent-fail récurrent sur fichiers root-owned) +// Retourne ['ok'=>bool, 'bytes'=>int|false, 'md5'=>string|null, 'via'=>'direct'|'sudo_cp'|'fail', 'marker_ok'=>bool] +if (!function_exists('opus_write_safe')) { + function opus_write_safe($target, $content, $verify_marker = null, $exec_bit = false) { + if (!$target || !is_string($content)) return ['ok'=>false,'err'=>'bad_args']; + $dir = dirname($target); + if (!is_dir($dir)) { + @mkdir($dir, 0755, true); + if (!is_dir($dir)) @shell_exec("sudo mkdir -p " . escapeshellarg($dir)); + } + // chattr -i si present + $attr = @shell_exec("lsattr " . escapeshellarg($target) . " 2>/dev/null"); + $had_immut = ($attr && strpos($attr, 'i') !== false && strpos($attr, '-i-') === false); + if ($had_immut) @shell_exec("sudo chattr -i " . escapeshellarg($target)); + + $via = 'direct'; + $n = @file_put_contents($target, $content); + if ($n === false) { + $via = 'sudo_cp'; + $tmpw = tempnam('/tmp', 'ows'); + @file_put_contents($tmpw, $content); + @shell_exec("sudo cp " . escapeshellarg($tmpw) . " " . escapeshellarg($target)); + @shell_exec("sudo chown www-data:www-data " . escapeshellarg($target)); + @unlink($tmpw); + clearstatcache(); + $n = file_exists($target) ? filesize($target) : false; + } + if ($exec_bit) { @chmod($target, 0755); @shell_exec("sudo chmod +x " . escapeshellarg($target)); } + if ($had_immut) @shell_exec("sudo chattr +i " . escapeshellarg($target)); + + $marker_ok = true; + if ($verify_marker !== null) { + $final = @file_get_contents($target); + $marker_ok = ($final && strpos($final, $verify_marker) !== false); + } + return [ + 'ok' => ($n !== false && $marker_ok), + 'bytes' => $n, + 'md5' => ($n !== false) ? @md5_file($target) : null, + 'via' => ($n === false ? 'fail' : $via), + 'marker_ok' => $marker_ok, + ]; + } +} + $action=$_REQUEST["action"]??""; $results=[]; diff --git a/generated/video-20260416-150007.mp4 b/generated/video-20260416-150007.mp4 index 17e5e5fbd204f4f1c8bf240b166ab0a318db4744..bbdf31985e52a2537a9a7fb05ab816b7484f0319 100644 GIT binary patch literal 47912 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 O0&gh