X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=submit%2FMO%2FSubmit.pm;h=ba55961f7eff6dd3c56253541bf787e890196948;hb=107b5e8dc73f0180e2b3f35f8ed031662bbc57fb;hp=5852b80cd972f39a3b347dd76e51d06cb122211f;hpb=c05f79a5d7b6d14d938d25198846c173f27e8b39;p=moe.git diff --git a/submit/MO/Submit.pm b/submit/MO/Submit.pm index 5852b80..ba55961 100644 --- a/submit/MO/Submit.pm +++ b/submit/MO/Submit.pm @@ -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;