Working synchronization
This commit is contained in:
parent
db77d8b697
commit
3c04523ca8
5
check.pl
5
check.pl
@ -132,7 +132,8 @@ for my $f (readdir $dh)
|
||||
$sth = query($dbh, "SELECT S.id FROM solved S WHERE S.id_exercice = ".$dbh->quote($exercice));
|
||||
if (! $sth->rows)
|
||||
{
|
||||
say $team;
|
||||
say "TEAM$team,$theme:SYNCSYN:TEAM$team:SYNC:HOME:SYNC:all:DS";
|
||||
|
||||
say STDERR localtime().": Team $team solve exercice $exercice in $theme";
|
||||
query($dbh, "INSERT INTO solved (id_team, id_exercice, time) VALUES ($team, ".$dbh->quote($exercice).", CURRENT_TIMESTAMP);");
|
||||
$exit++;
|
||||
@ -150,6 +151,8 @@ for my $f (readdir $dh)
|
||||
}
|
||||
}
|
||||
else {
|
||||
say "TEAM$team,$theme:SYNCSYN";
|
||||
|
||||
say STDERR localtime().": Team $team didn't give the correct answer for exercice $exercice.";
|
||||
}
|
||||
|
||||
|
120
gen_site.pl
Normal file → Executable file
120
gen_site.pl
Normal file → Executable file
@ -6,10 +6,19 @@ use warnings;
|
||||
use threads;
|
||||
use threads::shared;
|
||||
|
||||
use Cwd 'abs_path';
|
||||
use File::Basename;
|
||||
use File::Copy;
|
||||
use File::Find;
|
||||
use File::Path qw/make_path remove_tree/;
|
||||
use File::Temp "tempdir";
|
||||
use Getopt::Long;
|
||||
use Thread::Queue;
|
||||
|
||||
our $outdir = "outest";
|
||||
our $outteams = "/teams/";
|
||||
our $outhome = "/htdocs/";
|
||||
our $tmpdir = tempdir();
|
||||
|
||||
our $baseurl = "http://localhost";
|
||||
our $baseadmin = "/admin/";
|
||||
@ -21,6 +30,7 @@ our $threads = 6;
|
||||
sub genHome(;$)
|
||||
{
|
||||
my $m = shift // Mirror->new();
|
||||
$m->add_url($basehome . "index.html");
|
||||
$m->add_url($basehome);
|
||||
|
||||
return $m;
|
||||
@ -104,9 +114,19 @@ sub manage
|
||||
elsif (/^(reset)*r(e(s(e(t)?)?)?)?/)
|
||||
{
|
||||
say "Performing RESET ...";
|
||||
remove_tree($main::tmpdir);
|
||||
mkdir($main::tmpdir);
|
||||
$m->reset();
|
||||
}
|
||||
elsif (/^J$/)
|
||||
elsif (/^(D)?(SYNC)*S(Y(N(C)?)?)?/)
|
||||
{
|
||||
sync($1);
|
||||
}
|
||||
elsif (/^LS$/)
|
||||
{
|
||||
system("ls '$main::tmpdir'");
|
||||
}
|
||||
elsif (/^J(O(I(N)?)?)?$/)
|
||||
{
|
||||
say "JOIN receive, stopping all threads...";
|
||||
$m->stop();
|
||||
@ -144,6 +164,77 @@ sub manage
|
||||
}
|
||||
}
|
||||
|
||||
sub sync
|
||||
{
|
||||
if (shift)
|
||||
{
|
||||
say "Full synchronization to $main::outdir";
|
||||
|
||||
my $tmpcopy = tempdir();
|
||||
|
||||
find(
|
||||
sub
|
||||
{
|
||||
if (-f)
|
||||
{
|
||||
my $todir = $File::Find::dir."/";
|
||||
if ($todir =~ /^\Q$main::tmpdir\E\/?(\Q$main::baseadmin\E|\Q$main::baseteams\E|\Q$main::basehome\E)(.*)$/)
|
||||
{
|
||||
$todir = $tmpcopy;
|
||||
|
||||
return if ($1 eq $main::baseadmin);
|
||||
$todir .= $main::outteams if ($1 eq $main::baseteams);
|
||||
$todir .= $main::outhome if ($1 eq $main::basehome);
|
||||
|
||||
$todir .= $2;
|
||||
}
|
||||
make_path($todir, { mode => 0711 }) if (! -d $todir );
|
||||
|
||||
copy($File::Find::name, $todir) or warn(q{copy failed:} . $!);
|
||||
}
|
||||
},
|
||||
$tmpdir
|
||||
);
|
||||
|
||||
abs_path($main::outdir);
|
||||
abs_path($tmpcopy);
|
||||
|
||||
remove_tree($main::outdir);
|
||||
|
||||
system("mv '$tmpcopy' '$main::outdir'");
|
||||
}
|
||||
else
|
||||
{
|
||||
say "Incremental synchronization to $main::outdir";
|
||||
|
||||
find(
|
||||
sub
|
||||
{
|
||||
if (-f)
|
||||
{
|
||||
my $todir = $File::Find::dir."/";
|
||||
if ($todir =~ /^\Q$main::tmpdir\E\/?(\Q$main::baseadmin\E|\Q$main::baseteams\E|\Q$main::basehome\E)(.*)$/)
|
||||
{
|
||||
$todir = $main::outdir;
|
||||
|
||||
return if ($1 eq $main::baseadmin);
|
||||
$todir .= $main::outteams if ($1 eq $main::baseteams);
|
||||
$todir .= $main::outhome if ($1 eq $main::basehome);
|
||||
|
||||
$todir .= $2;
|
||||
}
|
||||
make_path($todir, { mode => 0711 }) if (! -d $todir );
|
||||
|
||||
say "$File::Find::name -> $todir";
|
||||
|
||||
copy($File::Find::name, $todir) or warn(q{copy failed:} . $!);
|
||||
}
|
||||
},
|
||||
$tmpdir
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
sub parse($$)
|
||||
{
|
||||
my $m = shift;
|
||||
@ -189,6 +280,8 @@ GetOptions ("threads|thread|t=i" => \$threads,
|
||||
"deamon|d" => \$deamon,
|
||||
"help|h|?" => \$help);
|
||||
|
||||
$outdir = abs_path($outdir);
|
||||
|
||||
if ($deamon)
|
||||
{
|
||||
my $m :shared = Mirror->new();
|
||||
@ -222,8 +315,12 @@ else
|
||||
genHome($m);
|
||||
|
||||
$m->join();
|
||||
|
||||
sync(1);
|
||||
}
|
||||
|
||||
remove_tree($main::tmpdir);
|
||||
|
||||
|
||||
package Mirror;
|
||||
|
||||
@ -461,21 +558,30 @@ sub getLinks($)
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
return $self->{content} =~ /(?:src|href)="([^"]+)"/g;
|
||||
return $self->{content} =~ /(?:src|href|action)="([^"]+)"/g;
|
||||
}
|
||||
|
||||
sub getNearLinks($)
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
return $self->{content} =~ /(?:src|href)="(?:\Q$main::baseurl\E|(?:\/?\.\.)+)?([^:"]+)"/g;
|
||||
my @links = $self->{content} =~ /(?:src|href)="(?:\Q$main::baseurl\E|(?:\/?\.\.)+)?([^:"]+)"/g;
|
||||
|
||||
for my $action ($self->{content} =~ /action="(?:\Q$main::baseurl\E|(?:\/?\.\.)+)?([^:"]+)"/g)
|
||||
{
|
||||
push @links, $action;
|
||||
push @links, "$action/gerr";
|
||||
push @links, "$action/serr";
|
||||
}
|
||||
|
||||
return @links;
|
||||
}
|
||||
|
||||
sub treatLinks($)
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
$self->{content} =~ s!(src|href)="( \Q$baseteams\E[^/]+/ | \Q$baseadmin\E | \Q$basehome\E)([^"]*)"!$1="/$3"!gx;
|
||||
$self->{content} =~ s!(src|href|action)="( \Q$baseteams\E[^/]+/ | \Q$baseadmin\E | \Q$basehome\E)([^"]*)"!$1="/$3"!gx;
|
||||
}
|
||||
|
||||
sub fetch($)
|
||||
@ -499,7 +605,7 @@ sub alreadySaved($;$)
|
||||
sub getSavePath($;$)
|
||||
{
|
||||
my $self = shift;
|
||||
my $basedir = shift // $main::outdir;
|
||||
my $basedir = shift // $main::tmpdir;
|
||||
|
||||
# Convert URL to real directory path
|
||||
my $path = $self->{url};
|
||||
@ -520,7 +626,7 @@ sub save($;$)
|
||||
if ($path =~ /\.[a-z0-9]{2,4}$/)
|
||||
{
|
||||
eval {
|
||||
make_path( dirname("$path") ) if (! -d dirname("$path") );
|
||||
make_path( dirname("$path") , { mode => 0711 }) if (! -d dirname("$path") );
|
||||
};
|
||||
|
||||
open my $fd, ">", $path or die "$path: $!";
|
||||
@ -530,7 +636,7 @@ sub save($;$)
|
||||
else
|
||||
{
|
||||
eval {
|
||||
make_path "$path" if (! -d "$path");
|
||||
make_path "$path", { mode => 0711 } if (! -d "$path");
|
||||
};
|
||||
|
||||
open my $fd, ">", "$path/index.html" or die "$path: $!";
|
||||
|
37
launch.sh
37
launch.sh
@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
rm /tmp/stop
|
||||
rm -f /tmp/stop
|
||||
cd `dirname "$0"`
|
||||
|
||||
if [ "$UID" = "0" ]
|
||||
@ -13,42 +13,21 @@ fi
|
||||
touch ./logs/checks.log
|
||||
tail -f ./logs/checks.log &
|
||||
|
||||
FULLREGEN=0
|
||||
TMPF=`mktemp`
|
||||
|
||||
tail -f "$TMPF" | ./gen_site.pl -d -o ./out/ &
|
||||
|
||||
while ! [ -f /tmp/stop ];
|
||||
do
|
||||
if [ "$FULLREGEN" != "0" ]
|
||||
then
|
||||
./synchro.sh
|
||||
else
|
||||
./synchro.sh delete
|
||||
fi
|
||||
./synchro.sh delete > /dev/null
|
||||
|
||||
if [ `ls submission | wc -l` -gt 1 ]
|
||||
then
|
||||
TMPF=`mktemp`
|
||||
if ! ./check.pl 2>> ./logs/checks.log > "$TMPF"
|
||||
then
|
||||
FULLREGEN=1
|
||||
fi
|
||||
|
||||
if [ `cat "$TMPF" | wc -l` -gt 0 ]
|
||||
then
|
||||
while ! cat "$TMPF" | xargs ./gen_site.sh
|
||||
do
|
||||
echo "FAIL regeneration, retry..." 1>&2
|
||||
done
|
||||
fi
|
||||
rm "$TMPF"
|
||||
|
||||
elif [ "$FULLREGEN" != "0" ]
|
||||
then
|
||||
while ! ./gen_site.sh; do
|
||||
echo "FAIL regeneration, retry..." 1>&2
|
||||
done
|
||||
FULLREGEN=0
|
||||
./check.pl 2>> ./logs/checks.log >> "$TMPF"
|
||||
|
||||
else
|
||||
sleep 1
|
||||
fi
|
||||
done
|
||||
|
||||
rm -rf "$TMPF"
|
||||
|
@ -12,7 +12,7 @@ server {
|
||||
}
|
||||
|
||||
server {
|
||||
listen [::1]:80 ipv6only=on;
|
||||
listen 80;
|
||||
|
||||
include /var/www/fic2014-server/nginx-server-common.conf;
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ server {
|
||||
|
||||
if ($team) {
|
||||
root /var/www/fic2014-server/teams/$team$1;
|
||||
rewrite ^/submission-([0-9]+)-([a-zA-Z0-9_]+).html$ /submission.php?team=$team&theme=$1&exercice=$2 last;
|
||||
rewrite ^/([0-9]+-?[a-zA-Z0-9_-]*)/([a-zA-Z0-9_]+)/submission$ /submission.php?team=$team&theme=$1&exercice=$2 last;
|
||||
}
|
||||
if ($team = 0) {
|
||||
root /var/www/fic2014-server/htdocs/;
|
||||
@ -55,12 +55,14 @@ server {
|
||||
}
|
||||
|
||||
location ~* \favicon.ico$ {
|
||||
root /var/www/fic2014-server/htdocs/;
|
||||
access_log off;
|
||||
expires 1d;
|
||||
add_header Cache-Control public;
|
||||
}
|
||||
|
||||
location ~ ^/(img|js|css|fonts)/ {
|
||||
location ~ ^/(assets|img|js|css|fonts)/ {
|
||||
root /var/www/fic2014-server/htdocs/;
|
||||
access_log off;
|
||||
expires 7d;
|
||||
add_header Cache-Control public;
|
||||
|
@ -5,20 +5,21 @@ function show($file)
|
||||
if (file_exists($file))
|
||||
print file_get_contents($file);
|
||||
else
|
||||
header("Location: ".$_SERVER["HTTP_REFERER"]);
|
||||
header("HTTP/1.1 403 Forbidden");
|
||||
}
|
||||
|
||||
$file = __DIR__."/submission/".intval($_GET["team"])."-".intval($_GET["theme"])."-".urlencode($_GET["exercice"]);
|
||||
|
||||
|
||||
if (file_exists($file))
|
||||
show(__DIR__."/teams/".intval($_GET["team"])."/submission-".intval($_GET["theme"])."-".urlencode($_GET["exercice"])."-already.html");
|
||||
show(__DIR__."/teams/".intval($_GET["team"])."/".urlencode($_GET["theme"])."/".urlencode($_GET["exercice"])."/submission/serr/index.html");
|
||||
|
||||
else if (!empty($_POST["solution"]) && !empty($_GET["team"]) && !empty($_GET["theme"]) && !empty($_GET["exercice"]))
|
||||
{
|
||||
file_put_contents($file, $_POST['solution'], LOCK_EX);
|
||||
|
||||
show(__DIR__."/teams/".intval($_GET["team"])."/submission-".intval($_GET["theme"])."-".urlencode($_GET["exercice"]).".html");
|
||||
show(__DIR__."/teams/".intval($_GET["team"])."/".urlencode($_GET["theme"])."/".urlencode($_GET["exercice"])."/submission/index.html");
|
||||
}
|
||||
|
||||
else
|
||||
show(__DIR__."/teams/".intval($_GET["team"])."/submission-".intval($_GET["theme"])."-".urlencode($_GET["exercice"])."-bad.html");
|
||||
show(__DIR__."/teams/".intval($_GET["team"])."/".urlencode($_GET["theme"])."/".urlencode($_GET["exercice"])."/submission/gerr/index.html");
|
||||
|
Loading…
Reference in New Issue
Block a user