не не, вы тестовый режим выключили? :)
Не помогло.
в файле cleaner_files.txt есть упоминание об этих файлах?
error есть?
не не, вы тестовый режим выключили? :)
Не помогло.
Я сделал по расширениям jpg, gif, png
Но тегов нет:
Странно, ваще оно должно из коробки идти
Can't locate DB_File.pm
согласен, если он(скрипт) будет терять картинки это — гомно :)
кто то не может себе позволить компонент по этой причине...
У вас видимо как то так
No package libdbi-perl available.
No package libdbd-mysql-perl available.
думаю вы ещё не полностью выложились, поисчите плз есчё,
original: 000/u1/1/b/69c0e671.png
small: 000/u1/9/5/bolshoi-wm-image-small.png
подождите, в каком формате они хранятся ?,
Так что мой вопрос снимается)...
это одна папка или список папок?
поле исключений в которое можно было бы вписывать пути изображений которые исключались из очистки.
А что нам мешает внести в поиск по базе те поля где описаны эти компоненты ?
Например компонент изображений. Ватермарк в нем грузится тоже в папку upload/000/
Логотипы в шаблонах, логотип в компоненте RSS, и т.д.
#!/usr/bin/perl -w $| = 1; ################################################################### # # Copyright (c) Fazer # cron_cleaner.pl # Version: 7.59 (2019-10-15) # Адаптированный под компонент "Очистка" # ################################################################### use strict; # Возможно потребуется доустановить пакеты use DBI; # yum install perl-DBI perl-DBD-MySQL perl-DB_File # or # apt-get install libdbi-perl libdbd-mysql-perl ####################################################################### # Конфигурация (множественные параметры - через пробел/запятую ) # # что бы реально удалять и переносить - поменять на: my $disabletest = 1; my $disabletest = 0; # my $disabletest = 1; # расширения файлов которые будут обрабатываться и удаляться при необходимости my $extension = "jpeg, jpg, gif, png, bmp"; # будет искать во всех ниже перечисленных полях всех таблиц в которых такие поля имеются my $fields = "photo photos image images img wm_image avatar content html cover_image logo picture"; # папки которые сканируем "внутри" ./upload/, например: "000/u1 004 images"; # если оставить пустым ($folders = "";), будет сканироваться вся ./upload/ исключая ./upload/deleted/ my $folders = "000"; # Список папок, исключенных из сканирования, ТОЛЬКО "ВЕРХНЕГО" уровня ./upload/NotDelete # например: "004, default" - не будет сканировать ./upload/004/ и ./upload/default/ my $exceptions = ""; # если установить в 'true' ненужные файлы будут удаляться безвозвратно а не переноситься в deleted my $delete = 'false'; # расположение папки конфигурационных файлов CMS относительно самого скрипта my $conf = '../system/config/'; ####################################################################### # Инициализация # $ENV{'PATH'} = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'; if (@ARGV){ if ($ARGV[0] && $ARGV[0] == 1){$disabletest = 1;} if ($ARGV[1]){$extension = $ARGV[1];} if ($ARGV[2]){$fields = $ARGV[2];} if ($#ARGV > 2){$folders = $ARGV[3];} if ($ARGV[4]){$exceptions = $ARGV[4];} } use DB_File; use File::Basename; use File::Find qw(finddepth); use File::Path qw(make_path); use Cwd; my (%db_connect, %result, @result, $str); my $prr = "No errors"; my $fullpath = dirname(__FILE__); my $dblock = tie %result, 'DB_File', "$fullpath/result.db", O_RDWR|O_CREAT, 0660, $DB_BTREE or die "Can't tie $fullpath/result.db: $!"; my $fd = $dblock->fd; open(FDB, "+<&=$fd") || die "Duplicate $!"; unless (flock (FDB, 2|4)) {print "Resource temporarily blocked by previous copy of the script\n";close(FDB);exit;} if ($disabletest){print "TestMode = 'OFF'\n";} else {print "TestMode = 'ON'\n";} my ($n, $h, $d, $m, $y) = (localtime)[1,2,3,4,5]; my $date = sprintf ("The start date is %04d.%02d.%02d %02d:%02d \n==================================\n", $y+1900, $m+1, $d, $h, $n); print $date; open (ERR, ">$fullpath/cleaner_errors.txt"); print (ERR $date); print (ERR "The script was running at those parameters:\n"); print (ERR "\$disabletest\t= $disabletest\n\$extension\t= $extension\n\$fields\t\t= $fields\n"); print (ERR "\$folders\t= $folders\n\$exceptions\t= $exceptions\n\$delete\t\t= $delete\n==================================\n"); if (open (LOGLINKS,"$fullpath/cleaner_select.txt")){ close (LOGLINKS); unlink ("$fullpath/cleaner_dirs.txt"); unlink ("$fullpath/cleaner_files.txt"); unlink ("$fullpath/cleaner_select.txt"); } chdir $fullpath or $prr='', print (ERR "Cant change $fullpath $!\n"); $fullpath = getcwd; # print "Am here $fullpath \n"; $folders =~ s/^(.\/|\/)//g; $folders =~ s/[\s|\r|\n|,]+/ /g; $extension =~ s/[\s|\r|\n|,]+/ /g; $fields =~ s/[\s|\r|\n|,]+/ /g; $exceptions =~ s/[\s|\r|\n|,]+/ /g; my @folders = split (/ /,$folders); unless (@folders){ my @exceptions = split (/ /,$exceptions); my $exceptions = 'deleted'; if (@exceptions){ foreach my $exc (@exceptions) { $exc=~s/\s//g; if ($exc){$exceptions .= "|".$exc;} } } # print "Exceptions - $exceptions\n"; opendir(DIR, "./") or $prr='', print (ERR "Cant open $fullpath $!\n"); my @dirs = grep { (!/^\./) && -d "./$_" } readdir(DIR); foreach my $dir (@dirs) { unless ($dir =~ m/^($exceptions)$/i){ push (@folders ,$dir); } } closedir (DIR); } # print "Folders - @folders\n"; my @extension = split (/ /,$extension); if (@extension){ $extension = shift (@extension); if (@extension){ foreach my $exp (@extension) { $exp=~s/\s//g; if ($exp){$extension .= "|".$exp;} } } } else { print (ERR " Nothing to do!,\n no valid extensions\n"); flock(FDB, 8); close FDB; unlink ("$fullpath/result.db"); print " Nothing to do!,\n no valid extensions\n"; exit; } # print "Extensions - $extension\n"; my @fields = split (/ /,$fields); if (@fields){ $fields = "'".shift (@fields)."'"; if (@fields){ foreach my $fi (@fields) { $fi=~s/\s//g; if ($fi){$fields .= ", '".$fi."'";} } } } else { print (ERR " Nothing to do!,\n no valid fields\n"); flock(FDB, 8); close FDB; unlink ("$fullpath/result.db"); print " Nothing to do!,\n no valid fields\n"; exit; } # print "Fields - $fields\n"; # print "ModeTest - $disabletest\n"; ####################################################################### # Обработка конфигурационных файлов # $conf =~ s/\/$//; open (CONF, "$conf/config.php") or (print (ERR "Can't open $conf at $fullpath: $!")), unlink ("$fullpath/result.db"), flock(FDB, 8), close FDB, print "Can't open $conf at $fullpath: $!", exit; while (<CONF>){ $str = $_; if ($str =~ m/.*'db_(.*)'.*=>.*'(.*)'/i){ $db_connect{$1} = $2; } } close (CONF); # while(($str,)=(each %db_connect)){ # print "$str = $db_connect{$str}\n"; # } # Обработка theme_*.yml файлов на наличие адресов картинок opendir(DIR, "$conf") or $prr='', (print ERR "Cant open dir $conf at $fullpath $!\n"); my @files = readdir DIR; closedir (DIR); foreach my $fileyml (@files) { if ($fileyml=~/.*\.yml$/i) { open (FILE, "$conf/$fileyml") or $prr='', print (ERR "Cant open $conf/$fileyml $!\n"); # print "$conf/$fileyml\n"; while (<FILE>){ $str = $_; my @str = split (/ |\r|\n/,$str); foreach $str (@str) { if ($str =~ m/(.*\/.*\.($extension)$)/i){ $result{$1} = undef; # print "$1 \n"; } } } close (FILE); } } ####################################################################### # Запрос к базе, поиск всех нужных полей # my $db = DBI->connect("DBI:mysql:$db_connect{'base'}:$db_connect{'host'}", "$db_connect{'user'}", "$db_connect{'pass'}", {mysql_auto_reconnect=>1}) or (print (ERR "Error connecting to database: $!")), unlink ("$fullpath/result.db"), flock(FDB, 8), close FDB, print "Error connecting to database: $!", exit; my $request = "SELECT DISTINCT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ($fields) AND TABLE_SCHEMA='$db_connect{'base'}';"; my $answer = $db->prepare($request); $answer->execute; while (my @row = $answer->fetchrow_array) { push @result, [ $row[0], $row[1] ]; } $answer->finish; ############################################################### # Запрос к базе, создание хеша всех ссылок на изображения и файлы # open (LOGLINKS, ">$fullpath/cleaner_select.txt"); print (LOGLINKS $date); foreach my $tabfil (@result) { $request = "SELECT @$tabfil[1] FROM @$tabfil[0];"; # print "$request \n"; print (LOGLINKS "$request \n"); $answer = $db->prepare($request); $answer->execute; while (my @row = $answer->fetchrow_array) { # print "@row \n"; foreach my $src (@row) { if ($src){ my @src = split (/ |\r|\n/,$src); foreach $src (@src) { if ($src =~ m/src=\"\/upload\/(.*)\"/i){ $result{$1} = undef; # print "$1 \n"; } else { if ($src =~ m/(.*\/.*\.($extension)$)/i){ $result{$1} = undef; # print "$1 \n"; } } } } } } $answer->finish; } $db->disconnect; ############################################################### # Рекурсивный проход по upload, сравнение с хешем ссылок, удаление(в т.ч. пустых папок) # open (LOGDIR, ">$fullpath/cleaner_dirs.txt"); print (LOGDIR $date); open (LOGFILE, ">$fullpath/cleaner_files.txt"); print (LOGFILE $date); my $ifiles = 0; my $idirs = 0; foreach my $folder (@folders) { unless (opendir(DIR, $folder)){ print (ERR "Cant open ./upload/$folder/\n"); $prr=''; next;} closedir (DIR); finddepth \&recur, $folder; sub recur { if (-d) { # print " dir $fullpath/$File::Find::name\n"; opendir(DIR, "$fullpath/$File::Find::name") or $prr='', print (ERR "Cant open $File::Find::name: $!\n"); my $dir = (grep !/^\.\.?$/, readdir DIR); closedir (DIR); unless ($dir || (grep /^$File::Find::name$/, @folders)){ if ($disabletest){ rmdir ("$fullpath/$File::Find::name") or $prr='', print (ERR "cannot rmdir $fullpath/$File::Find::name: $!\n"); } $idirs++; # print "$File::Find::name \n"; print (LOGDIR "$fullpath/$File::Find::name\n"); } } else { my $fil = $_; if ($fil =~ m/.*\.($extension)$/i){ # print "file $fil\n"; unless (exists $result{"$File::Find::name"}){ # print " rm -> $File::Find::name\n"; if ($disabletest){ if ($delete =~ /^true$/){
многое, но мне тут уже внятно сказали, что вкус моих фламастеров ни кого не…
Остальное Вас не смущает ?
В форуме все подтверждения сделаны через
/forum/thread32156-8.html
onclick="if ( confirm ( '<?php echo LANG_FORUM_CONFIRM_RESTORE_POST; ?>' ) ) { icms.forum.restorePost ( '<?php echo href_to('forum', 'post_restore', $post[ 'id' ]); ?>' );
this.openConfirm = function(title, call, arg) { title = title || 'Confirm'; call = call || function(){}; arg = arg || ''; $.nmData('<div class="modal" style="padding: 20px"><form onsubmit="return false" action="' + '#' + '"><fieldset id="fset_delete"><legend>' + title + '</legend><div id="f_thread_id" class="field ft_list"></div></fieldset><div align="right">' + '<input class="button-cancel button" type="button" name="cancel" value="Отменить" onclick="$.nmTop().close(); return false;"> ' + '<input class="button-submit button" type="button" name="submit" value="OK" onclick="' + call + '(\'' + arg + '\'); return false;"></div></form></div>'
)))) вопрос подразумевал: "как"
можно