1 # A Perl module for communicating with the MO Submit Server
2 # (c) 2007 Martin Mares <mj@ucw.cz>
10 use IO::Socket::SSL; # qw(debug3);
14 my $user = $ENV{"USER"} or die "Environment variable USER not set\n";
15 my $home = $ENV{"HOME"} or die "Environment variable HOME not set\n";
17 my $root = $ENV{"MO_ROOT"} or die "Environment variable MO_ROOT not set\n";
19 "Server" => "localhost:8888",
20 "Key" => "$mo/key.pem",
21 "Cert" => "$mo/cert.pem",
22 "CACert" => "$mo/ca-cert.pem",
23 "Trace" => defined $ENV{"MO_SUBMIT_TRACE"},
37 my ($self, $msg) = @_;
38 print STDERR "LOG: $msg\n" if $self->{"Trace"};
42 my ($self, $msg) = @_;
43 print STDERR "ERROR: $msg\n" if $self->{"Trace"};
44 $self->{"error"} = $msg;
50 return defined $self->{"sk"};
55 if ($self->is_connected) {
57 $self->{"sk"} = undef;
58 $self->log("Disconnected");
65 $self->log("Connecting to submit server");
66 my $sk = new IO::Socket::INET(
67 PeerAddr => $self->{"Server"},
71 $self->err("Cannot connect to server: $!");
76 $self->err("Server failed to send a welcome message");
82 $self->err("Server rejected the connection: $z");
87 $self->log("Starting TLS");
88 $sk = IO::Socket::SSL->start_SSL(
90 SSL_version => 'TLSv1',
92 SSL_key_file => $self->{"Key"},
93 SSL_cert_file => $self->{"Cert"},
94 SSL_ca_file => $self->{"CACert"},
98 $self->err("Cannot establish TLS connection: " . IO::Socket::SSL::errstr());
104 $self->log("Logging in");
105 my $req = new Sherlock::Object("U" => $self->{"user"});
106 my $reply = $self->request($req);
107 my $err = $reply->get("-");
109 $self->err("Cannot log in: $err");
113 $self->log("Connected");
118 my ($self, $obj) = @_;
119 my $sk = $self->{"sk"};
120 $obj->write($sk); ### FIXME: Flushing
122 $self->err("Connection broken");
130 my ($self, $obj) = @_;
131 my $sk = $self->{"sk"};
132 my $reply = new Sherlock::Object;
133 if ($reply->read($sk)) {
136 $self->err("Connection broken");
142 my ($self, $fh, $size) = @_;
143 my $sk = $self->{"sk"};
145 my $l = ($size < 4096 ? $size : 4096);
147 if ($fh->read($buf, $l) != $l) {
148 $self->err("File shrunk during upload");
151 $sk->write($buf, $l);
153 $self->err("Connection broken");