CheRt
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Первая бета, пользуемся через браузер. Используем на свой страх и риск, крайне рекомендую сделать бекап перед попыткой восстановления. Код: #!/usr/bin/perl use CGI qw/param/; my $forumdir='.'; my $forumnum=param('forum'); $forumnum=~s/[^\d]//g; my $action=param('action'); my $header="Content-type:text/html;Charset:windows-1251;\n\n"; # begin program if ($forumnum) { if ($action eq 'rebuild') { rebuildforum(); start("Восстановление завершено, проверьте состояние!"); } else { checkforum(); } } else { &start; } sub start { my $msg=shift; my @forums=get_forums(); print <<HTML; $header <html> <head> <title>IB forum tester :: start</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body> $msg<br><br> <form method="GET" action="$ENV{'SCRIPT_NAME'}"> <select name="forum"> <option value="no">Выберите форум: HTML foreach (@forums) { m/forum(\d+)/i; print " <option value=\"$1\">Forum$1<br>\n"; } print <<HTML; </select> <input type="submit" value="Проверить"> </form> </body> </html> HTML } sub checkforum { my @list=get_list(); my @thds=get_thd(); @thds=sort {$a<=>$b} @thds; my @pls=get_pl(); @pls=sort {$a<=>$b} @pls; my $pl_size=@pls; my $thd_size=@thds; my $list_size=@list; my $error="Проверка успешна. Проблем не выявлено."; if ($list_size!=$pl_size || $thd_size!=$pl_size) { if ((($list_size!=$pl_size) && ($pl_size==$thd_size || $list_size==$thd_size)) || ($thd_size>$pl_size && $thd_size>$list_size)) { $error="Форум не целостен, <a href=\"$ENV{'SCRIPT_NAME'}?action=rebuild&forum=$forumnum\">восстановить?</a>"; } else { $error="Форум не целостен, восстановлению не подлежит!"; } } print <<HTML; $header <html> <head> <title>IB forum tester :: checking</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body> Number of PLS - $pl_size<br> Number of THDS - $thd_size<br> List size - $list_size<br> $error<br> <a href="$ENV{'SCRIPT_NAME'}">to start</a> </body> </html> HTML } sub rebuildforum { my @list=get_list(); my @thds=get_thd(); @thds=sort {$a<=>$b} @thds; my @pls=get_pl(); @pls=sort {$a<=>$b} @pls; my $pl_size=@pls; my $thd_size=@thds; my $list_size=@list; if ($thd_size==$list_size && $pl_size<$list_size) { make_pls_by_list(@list); } elsif ($thd_size==$pl_size && $pl_size>$list_size) { make_list_by_pls(@pls); } elsif ($pls_size<$thd_size && $list_size<$thd_size) { make_listandpls_by_thd(@thds); } } sub make_list_by_pls { my @pls=@_; my $temp; @pls=reverse(@pls); my $i; open(LF, ">>$forumdir/forum$forumnum/list.cgi"); foreach $i(0..$#pls) { open(PLF, "$forumdir/forum$forumnum/$pls[$i]"); $temp=<PLF>; close(PLF); print LF $temp; } close(LF); } sub make_pls_by_list { my @list=@_; foreach (@list) { m/^(\d+)\|/; open(PLF, ">$forumdir/forum$forumnum/$1.pl"); print PLF $_; close(PLF); } } sub make_listandpls_by_thd { my @thds=@_; my (@data,@temp,$temp,$i,$j,$k); open(LF, ">$forumdir/forum$forumnum/list.cgi"); foreach $i(0..$#thds) { @data=(); open(THF, "$forumdir/forum$forumnum/$thds[$i]"); $j=0; while(<THF>) { @temp=split(/\|/, $_); for ($k=0;$k<@temp;$k++) { $data[$j][$k]=$temp[$k]; } $j++; } close(THF); $thds[$i]=~m/^(\d+)\.thd$/i; open(PLF, ">$forumdir/forum$forumnum/$1.pl"); $temp=$#data*(int(rand 4)+4)-int(rand 4); print PLF "$1|$data[0][1]|-|open|$#data|$temp|$data[0][0]|$data[0][5]|$data[$#data][0]|$data[$#data][5]|no\n"; close(PLF); print LF "$1|$data[0][1]|-|open|$#data|$temp|$data[0][0]|$data[0][5]|$data[$#data][0]|$data[$#data][5]|no\n"; } close(LF); } sub get_thd { opendir(FD, "$forumdir/forum$forumnum"); @_=grep{/\.thd/i} readdir(FD); closedir(FD); return @_; } sub get_pl { opendir(FD, "$forumdir/forum$forumnum"); @_=grep{/\.pl/i} readdir(FD); closedir(FD); return @_; } sub get_list { open(LF, "$forumdir/forum$forumnum/list.cgi"); @_=<LF>; close(LF); return @_; } sub get_forums { opendir(FD, $forumdir); @_=readdir(FD); closedir(FD); my @forums; my $counter=0; for (my $i=0;$i<@_;$i++) { if ($_[$i]=~m/forum\d{1,2}/i && ! (-f $_[$i])) { $forums[$counter]=$_[$i]; $counter++; } } return @forums; } |
---------- В огне бода нет и не будет! До встречи в СССР 2.0! |
|