#!/usr/bin/env perl use v5.10.1; use strict; use warnings; use DBI; use File::Basename; #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, "<", "$root/onyx/config/root.xml"; for my $p (<$conf>) { if ($p =~ /<(?:option|var) name="(.*)">(.*)<\/(?:option|var)>/) { $profile = $2 if ($1 eq "profile"); $submission_dir = $2 if ($1 eq "submission_dir"); } } close $conf; die("No DB profile found") if ! $profile; die("submission_dir is not a directory") if ! $submission_dir || ! -d $submission_dir; # Read db settings my %db_settings; open my $dbprof, "<", "$root/onyx/db/$profile.profile.php"; while (<$dbprof>) { if (/\$___profile\[['"](.+)['"]\] = ['"](.+)['"]/) { $db_settings{$1} = $2; } } close $dbprof; my $dbh; # List all files to treat opendir(my $dh, $submission_dir) || die "Can't opendir submission_dir: $!"; for my $f (readdir $dh) { if ($f =~ /^([0-9]+)-([0-9]+)-([a-zA-Z0-9_]+)$/) { my $good = -1; my $team = $1; my $theme = $2; my $exercice = $3; open my $fh, "<", "$submission_dir/$f"; my $solution = <$fh>; close $fh; $dbh = DBI->connect("DBI:mysql:database=$db_settings{db};host=$db_settings{host};port=3306", $db_settings{user}, $db_settings{pass}, {'RaiseError' => 1, 'PrintError' => 1}) or die $DBI::errstr if !$dbh; my $sth = query($dbh, "SELECT format, value FROM exercice_keys WHERE id_exercice = '$exercice';"); # Check solutions while (my $row = get_row($sth)) { $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]); $sth->execute(); die($_[0]->errstr) if (!$sth); return $sth; } sub get_row { return $_[0]->fetchrow_arrayref(); }