/usr/bin/ansel-garbage-collection is in php-horde-ansel 3.0.1+debian0-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #!/usr/bin/env php
<?php
/**
* This script looks for images in the VFS that have no pointer in the
* database. Any non-referenced images it finds get moved to a garbage
* folder in Ansel's VFS directory.
*
* Make sure to run this as a user who has full permissions on the VFS
* directory.
*
* @author Ben Chavet <ben@horde.org>
* @author Michael J Rubinsky <mrubinsk@horde.org>
* @pacakge Ansel
*/
if (file_exists(__DIR__ . '/../../ansel/lib/Application.php')) {
$baseDir = __DIR__ . '/../';
} else {
require_once 'PEAR/Config.php';
$baseDir = PEAR_Config::singleton()
->get('horde_dir', null, 'pear.horde.org') . '/ansel/';
}
require_once $baseDir . 'lib/Application.php';
Horde_Registry::appInit('ansel', array('cli' => true));
$parser = new Horde_Argv_Parser(
array(
'usage' => '%prog [--options]',
'optionList' => array(
new Horde_Argv_Option(
'-m',
'--move',
array(
'help' => 'Actually move dangling images to GC folder.',
'default' => false,
'action' => 'store_true'
)
),
new Horde_Argv_Option(
'-v',
'--verbose',
array(
'help' => 'Verbose output',
'default' => false,
'action' => 'store_true'
)
)
)
)
);
list($opts, $args) = $parser->parseArgs();
$vfs = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Vfs')->create();
$vfspath = '.horde/ansel/';
$garbagepath = $vfspath . 'garbage/';
$hash = $vfs->listFolder($vfspath, null, false, true);
sort($hash);
$styles = $injector->getInstance('Ansel_Storage')->getHashes();
$count = 0;
foreach ($hash as $dir) {
if ($dir['name'] == 'garbage') {
continue;
}
try {
$images = $vfs->listFolder($vfspath . $dir['name'] . '/full/');
} catch (Horde_Vfs_Exception $e) {
continue;
}
foreach ($images as $image) {
$image_id = strpos($image['name'], '.') ? substr($image['name'], 0, strpos($image['name'], '.')) : $image['name'];
$result = $ansel_db->selectValue('SELECT 1 FROM ansel_images WHERE image_id = ' . (int)$image_id);
if (!$result) {
if (!$count && !$vfs->isFolder($vfspath, 'garbage')) {
$vfs->createFolder($vfspath, 'garbage');
}
$count++;
if ($opts['verbose']) {
$cli->message($vfspath . $image['name'] . ' -> ' . $garbagepath . $image['name'], 'cli.info');
}
if ($opts['move']) {
try {
$vfs->move($vfspath . $dir['name'] . '/full/', $image['name'], $garbagepath);
} catch (Horde_Vfs_Exception $e) {
$cli->fatal($e->getMessage());
}
// These may fail, and it's ok if they do. Might not exist.
try {
$vfs->deleteFile($vfspath . $dir['name'] . '/screen/', $image['name']);
$vfs->deleteFile($vfspath . $dir['name'] . '/thumb/', $image['name']);
$vfs->deleteFile($vfspath . $dir['name'] . '/mini/', $image['name']);
foreach ($styles as $style) {
$vfs->deleteFile($vfspath . $dir['name'] . '/' . $style . '/', $image['name']);
}
} catch (Horde_Vfs_Exception $e) {
}
// Might also fail if directories are not empty...and that's
// to be expected.
try {
$vfs->deleteFolder($vfspath . $dir['name'], 'full');
$vfs->deleteFolder($vfspath . $dir['name'], 'screen');
$vfs->deleteFolder($vfspath . $dir['name'], 'thumb');
$vfs->deleteFolder($vfspath . $dir['name'], 'mini');
foreach ($styles as $style) {
$vfs->deleteFolder($vfspath . $dir['name'], $style);
}
$vfs->deleteFolder($vfspath, $dir['name']);
} catch (Horde_Vfs_Exception $e) {
}
}
}
}
}
if ($count) {
$msg = 'Found dangling images';
if ($opts['move']) {
$msg .= ' and moved $count to ' . $garbagepath . '.';
} else {
$msg .= ', run this script with --move to clean them up.';
}
$cli->message($msg, 'cli.success');
} else {
$cli->message('No cleanup necessary.', 'cli.success');
}
|