mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-22 14:41:29 +01:00
* EPL: add S3 check to FSCK to delete files not in egw_sqlfs table or empty files from S3 buckets
This commit is contained in:
parent
1f0aef8c96
commit
ac54652c33
@ -130,7 +130,14 @@ class Utils extends StreamWrapper
|
||||
'check_only' => $check_only)
|
||||
) as $app_msgs)
|
||||
{
|
||||
if ($app_msgs) $msgs = array_merge($msgs, $app_msgs);
|
||||
if ($app_msgs && is_array($app_msgs[0]))
|
||||
{
|
||||
$msgs = array_merge($msgs, ...$app_msgs);
|
||||
}
|
||||
elseif ($app_msgs)
|
||||
{
|
||||
$msgs = array_merge($msgs, $app_msgs);
|
||||
}
|
||||
}
|
||||
|
||||
// also run quota recalc as fsck might have (re-)moved files
|
||||
@ -258,7 +265,7 @@ class Utils extends StreamWrapper
|
||||
$msgs = array();
|
||||
$limit = 500;
|
||||
$offset = 0;
|
||||
$select_stmt = self::$pdo->prepare('SELECT fs_id FROM '.self::TABLE.
|
||||
$select_stmt = self::$pdo->prepare('SELECT fs_id,fs_size FROM '.self::TABLE.
|
||||
" WHERE fs_mime!='httpd/unix-directory' AND fs_content IS NULL AND fs_link IS NULL AND (fs_s3_flags&7)=0".
|
||||
" LIMIT $limit OFFSET :offset");
|
||||
$select_stmt->setFetchMode(PDO::FETCH_ASSOC);
|
||||
@ -298,13 +305,44 @@ class Utils extends StreamWrapper
|
||||
}
|
||||
}
|
||||
}
|
||||
// file is empty and NOT in /templates/ or /etemplates/ which use 0-byte files as delete marker
|
||||
elseif (!$row['fs_size'] && !filesize($phy_path) && !preg_match('#^/e?templates/#', $path))
|
||||
{
|
||||
if ($check_only)
|
||||
{
|
||||
++$offset;
|
||||
$msgs[] = lang('File %1 is empty %2!',
|
||||
$path.' (#'.$row['fs_id'].')',$phy_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!isset($stmt))
|
||||
{
|
||||
$stmt = self::$pdo->prepare('DELETE FROM '.self::TABLE.' WHERE fs_id=:fs_id');
|
||||
$stmt_props = self::$pdo->prepare('DELETE FROM '.self::PROPS_TABLE.' WHERE fs_id=:fs_id');
|
||||
}
|
||||
if ($stmt->execute(array('fs_id' => $row['fs_id'])) &&
|
||||
$stmt_props->execute(array('fs_id' => $row['fs_id'])))
|
||||
{
|
||||
$msgs[] = lang('File %1 is empty %2 --> file removed!',$path,$phy_path);
|
||||
unlink($phy_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
++$offset;
|
||||
$msgs[] = lang('File %1 is empty %2 --> failed to remove file!',
|
||||
$path.' (#'.$row['fs_id'].')',$phy_path);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
while ($num >= $limit);
|
||||
|
||||
if ($check_only && $msgs)
|
||||
{
|
||||
$msgs[] = lang('Files without content in physical filesystem will be removed.');
|
||||
$msgs[] = lang('Files without content in physical filesystem or empty files will be removed.');
|
||||
}
|
||||
return $msgs;
|
||||
}
|
||||
|
38
filemanager/fsck.php
Executable file
38
filemanager/fsck.php
Executable file
@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* VFS - filesystem check via cli
|
||||
*
|
||||
* @link https://www.egroupware.org
|
||||
* @package filemanager
|
||||
* @author Ralf Becker <rb-AT-egroupware.org>
|
||||
* @copyright (c) 2024 by Ralf Becker <rb-AT-egroupware.org>
|
||||
*/
|
||||
|
||||
use EGroupware\api\Vfs\Sqlfs;
|
||||
|
||||
if (php_sapi_name() !== 'cli') // security precaution: forbid calling via web
|
||||
{
|
||||
die('<h1>fsck.php must NOT be called as web-page --> exiting !!!</h1>');
|
||||
}
|
||||
|
||||
$GLOBALS['egw_info'] = [
|
||||
'flags' => [
|
||||
'currentapp' => 'login',
|
||||
'no_exception_handler' => 'cli',
|
||||
]
|
||||
];
|
||||
require(dirname(__DIR__).'/header.inc.php');
|
||||
|
||||
$msgs = Sqlfs\Utils::fsck([
|
||||
'check_only' => $check_only = ($_SERVER['argv'][1] ?? '') !== '--yes',
|
||||
]);
|
||||
echo implode("\n", $msgs)."\n";
|
||||
if (!$msgs)
|
||||
{
|
||||
error_log("fsck found NO problems :)");
|
||||
}
|
||||
elseif ($check_only)
|
||||
{
|
||||
error_log('Use --yes to fix problems found');
|
||||
}
|
@ -339,7 +339,7 @@ class filemanager_admin extends filemanager_ui
|
||||
$content = '<p>' . implode("</p>\n<p>", (array)$msgs) . "</p>\n";
|
||||
|
||||
$content .= Api\Html::form('<p>' . ($check_only && is_array($msgs) ?
|
||||
Api\Html::submit_button('fix', lang('Fix reported problems')) : '') .
|
||||
Api\Html::submit_button('edit', lang('Fix reported problems')) : '') .
|
||||
Api\Html::submit_button('cancel', lang('Cancel')) . '</p>',
|
||||
'', '/index.php', array('menuaction' => 'filemanager.filemanager_admin.fsck')
|
||||
);
|
||||
|
Loading…
Reference in New Issue
Block a user