diff --git a/check.pl b/check.pl index 2c12913a..9d88f259 100755 --- a/check.pl +++ b/check.pl @@ -4,14 +4,20 @@ use v5.10.1; use strict; use warnings; use DBI; +use File::Basename; -use Data::Dumper; +#Return number of good solutions +my $exit = 0; + +my $root = dirname(__FILE__); + +chdir($root); # First, read PHP configuration to extract some settings my $profile; my $submission_dir; -open my $conf, "<", "onyx/config/root.xml"; +open my $conf, "<", "$root/onyx/config/root.xml"; for my $p (<$conf>) { if ($p =~ /<(?:option|var) name="(.*)">(.*)<\/(?:option|var)>/) @@ -27,7 +33,7 @@ die("submission_dir is not a directory") if ! $submission_dir || ! -d $submissio # Read db settings my %db_settings; -open my $dbprof, "<", "onyx/db/$profile.profile.php"; +open my $dbprof, "<", "$root/onyx/db/$profile.profile.php"; while (<$dbprof>) { if (/\$___profile\[['"](.+)['"]\] = ['"](.+)['"]/) @@ -42,8 +48,10 @@ my $dbh; opendir(my $dh, $submission_dir) || die "Can't opendir submission_dir: $!"; for my $f (readdir $dh) { - if ($f =~ /^([0-9]+)-([0-9]+)-([0-9]+)$/) + if ($f =~ /^([0-9]+)-([0-9]+)-([a-zA-Z0-9_]+)$/) { + my $good = -1; + my $team = $1; my $theme = $2; my $exercice = $3; @@ -57,18 +65,51 @@ for my $f (readdir $dh) {'RaiseError' => 1, 'PrintError' => 1}) or die $DBI::errstr if !$dbh; - my $sth = query($dbh, "SELECT format, value FROM exercice_keys WHERE id_exercice = ".int($exercice)); + my $sth = query($dbh, "SELECT format, value FROM exercice_keys WHERE id_exercice = '$exercice';"); + # Check solutions while (my $row = get_row($sth)) { - say Dumper($row); + $good = 1 if ($good == -1); + + my $type = @$row[0]; + my $sol = @$row[1]; + + if ($type eq "raw" && $sol ne $solution) { + $good = 0; + last; + } + elsif ($type ne "raw") { + $good = 0; + warn "$type not implemented"; + last; + } } + + # Register solve + if ($good == -1) { + say "Exercice $exercice doesn't exist ; given by team $team in theme $theme."; + } + elsif ($good == 1) + { + say "Team $team solve exercice $exercice in $theme at ".localtime(); + query($dbh, "INSERT INTO solved (id_team, id_exercice, time) VALUES ($team, '$exercice', CURRENT_TIMESTAMP);"); + $exit++; + } + else { + say "Team $team didn't give the correct answer for exercice $exercice."; + } + + # Remove the file + unlink("$submission_dir/$f"); } } closedir $dh; $dbh->disconnect() if $dbh; +exit( $exit > 126 ? 126 : $exit ); + sub query { my $sth = $_[0]->prepare($_[1]); @@ -78,3 +119,8 @@ sub query return $sth; } + +sub get_row +{ + return $_[0]->fetchrow_arrayref(); +} diff --git a/gen_site.sh b/gen_site.sh index 442b3511..974eeb67 100755 --- a/gen_site.sh +++ b/gen_site.sh @@ -1,10 +1,91 @@ #!/bin/sh BASEURL="localhost" +SALT_TEAM="connected" +OUT_TEAM="./teams" + +MAX_PARAL=9 + +DEBUG=0 + cd `dirname "$0"` +if [ "$UID" = "0" ] +then + SCRIPT=`pwd`/`basename "$0"` + su -c "sh -c '$SCRIPT $@'" synchro + exit $? +fi + +if [ -f "/tmp/generate_site" ] +then + echo "This script is already running" 1>&2 + echo "Remove the file /tmp/generate_site if you are sure this is not true" 1>&2 + exit 1 +fi + +touch /tmp/generate_site + +WGET_OPT="--no-check-certificate -c" + +if [ $DEBUG -ne 1 ] +then + WGET_OPT="-q" +fi + mkdir -p out cd out -wget -c -m https://$BASEURL/ https://$BASEURL/connected/ +# First, remove existing version if any +rm -rf "$BASEURL" "$OUT_TEAM" + +wget $WGET_OPT -m -b "http://$BASEURL/" -o /dev/null + +mkdir -p "$BASEURL" +ln -sf "`pwd`/../files/" "$BASEURL/files" + +NB=0 +PIDLIST= +# Get list of teams and fetch them in parallel +for l in $(curl -k "http://$BASEURL/$SALT_TEAM/" 2> /dev/null | grep -oE "/[^/]+/[0-9]+/") +do + ( + wget $WGET_OPT -m "http://$BASEURL/$l" + + for m in $(grep -R "