]> mj.ucw.cz Git - moe.git/blobdiff - submit/MO/Submit.pm
Replaced FREE_PASCAL_RTE by a generic EXIT_CODE_HOOK.
[moe.git] / submit / MO / Submit.pm
index 5852b80cd972f39a3b347dd76e51d06cb122211f..ba55961f7eff6dd3c56253541bf787e890196948 100644 (file)
@@ -9,30 +9,47 @@ use warnings;
 use IO::Socket::INET;
 use IO::Socket::SSL; # qw(debug3);
 use Sherlock::Object;
+use POSIX;
 
 sub new($) {
+       my $user = $ENV{"USER"} or die "Environment variable USER not set\n";
+       my $home = $ENV{"HOME"} or die "Environment variable HOME not set\n";
+       my $mo = "$home/.mo";
+       my $root = $ENV{"MO_ROOT"} or die "Environment variable MO_ROOT not set\n";
        my $self = {
-               "Server" => "localhost:8888",
-               "Key" => "client-key.pem",
-               "Cert" => "client-cert.pem",
-               "CACert" => "ca-cert.pem",
-               "user" => "testuser",
+               "Contest" => "CEOI 2007",
+               "Server" => "ceoi-gamma:8888",
+               "Key" => "$mo/key.pem",         # Keys and certificates
+               "Cert" => "$mo/cert.pem",
+               "CACert" => "$mo/ca-cert.pem",
+               "Trace" => defined $ENV{"MO_SUBMIT_TRACE"},
+               "Checks" => 1,                  # Run `check' before submitting
+               "AllowOverride" => 1,           # Allow overriding a failed check
+               "History" => "$home/.history",  # Keep submission history in this directory
+               "RefreshTimer" => 60000,        # How often GUI sends STATUS commands [ms]
+               "root" => $root,
+               "user" => $user,
                "sk" => undef,
                "error" => undef,
        };
-       # FIXME: Read config file
        return bless $self;
 }
 
+sub DESTROY($) {
+       my $self = shift @_;
+       $self->disconnect;
+}
+
 sub log($$) {
        my ($self, $msg) = @_;
-       print STDERR "LOG: $msg\n";
+       print STDERR "SUBMIT: $msg\n" if $self->{"Trace"};
 }
 
 sub err($$) {
        my ($self, $msg) = @_;
-       print STDERR "ERROR: $msg\n";
+       print STDERR "ERROR: $msg\n" if $self->{"Trace"};
        $self->{"error"} = $msg;
+       $self->disconnect;
 }
 
 sub is_connected($) {
@@ -51,7 +68,8 @@ sub disconnect($) {
 
 sub connect($) {
        my $self = shift @_;
-       !defined $self->{"sk"} or close $self->{"sk"};
+       $self->disconnect;
+
        $self->log("Connecting to submit server");
        my $sk = new IO::Socket::INET(
                PeerAddr => $self->{"Server"},
@@ -79,9 +97,9 @@ sub connect($) {
                        $sk,
                        SSL_version => 'TLSv1',
                        SSL_use_cert => 1,
-                       SSL_key_file => "client-key.pem",
-                       SSL_cert_file => "client-cert.pem",
-                       SSL_ca_file => "ca-cert.pem",
+                       SSL_key_file => $self->{"Key"},
+                       SSL_cert_file => $self->{"Cert"},
+                       SSL_ca_file => $self->{"CACert"},
                        SSL_verify_mode => 3,
                );
                if (!defined $sk) {
@@ -90,6 +108,7 @@ sub connect($) {
                }
        }
        $self->{"sk"} = $sk;
+       $sk->autoflush(0);
 
        $self->log("Logging in");
        my $req = new Sherlock::Object("U" => $self->{"user"});
@@ -97,7 +116,6 @@ sub connect($) {
        my $err = $reply->get("-");
        if (defined $err) {
                $self->err("Cannot log in: $err");
-               $self->disconnect;
                return undef;
        }
 
@@ -108,8 +126,14 @@ sub connect($) {
 sub request($$) {
        my ($self, $obj) = @_;
        my $sk = $self->{"sk"};
-       $obj->write($sk);       ### FIXME: Flushing
+       local $SIG{'PIPE'} = 'ignore';
+       $obj->write($sk);
        print $sk "\n";
+       $sk->flush();
+       if ($sk->error) {
+               $self->err("Connection broken");
+               return undef;
+       }
        return $self->reply;
 }
 
@@ -125,4 +149,38 @@ sub reply($) {
        }
 }
 
+sub send_file($$$) {
+       my ($self, $fh, $size) = @_;
+       my $sk = $self->{"sk"};
+       local $SIG{'PIPE'} = 'ignore';
+       while ($size) {
+               my $l = ($size < 4096 ? $size : 4096);
+               my $buf = "";
+               if ($fh->read($buf, $l) != $l) {
+                       $self->err("File shrunk during upload");
+                       return undef;
+               }
+               $sk->write($buf, $l);
+               if ($sk->error) {
+                       $self->err("Connection broken");
+                       return undef;
+               }
+               $size -= $l;
+       }
+       return $self->reply;
+}
+
+sub write_history($$$$$) {
+       my ($self, $task, $part, $ext, $filename) = @_;
+       my $hist = $self->{"History"};
+       -d $hist or mkdir $hist or return "Unable to create $hist: $!";
+       my $now = POSIX::strftime("%H:%M:%S", localtime(time));
+       my $maybe_part = ($part eq $task) ? "" : ":$part";
+       my $name = "$hist/$now-$task$maybe_part.$ext";
+       $self->log("Backing up to $name");
+       `cp "$filename" "$name"`;
+       return "Unable to back up $filename as $name" if $?;
+       return undef;
+}
+
 1;