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);
15 "Server" => "localhost:8888",
16 "Key" => "client-key.pem",
17 "Cert" => "client-cert.pem",
18 "CACert" => "ca-cert.pem",
24 # FIXME: Read config file
34 my ($self, $msg) = @_;
35 print STDERR "LOG: $msg\n" if $self->{"Trace"};
39 my ($self, $msg) = @_;
40 print STDERR "ERROR: $msg\n" if $self->{"Trace"};
41 $self->{"error"} = $msg;
47 return defined $self->{"sk"};
52 if ($self->is_connected) {
54 $self->{"sk"} = undef;
55 $self->log("Disconnected");
62 $self->log("Connecting to submit server");
63 my $sk = new IO::Socket::INET(
64 PeerAddr => $self->{"Server"},
68 $self->err("Cannot connect to server: $!");
73 $self->err("Server failed to send a welcome message");
79 $self->err("Server rejected the connection: $z");
84 $self->log("Starting TLS");
85 $sk = IO::Socket::SSL->start_SSL(
87 SSL_version => 'TLSv1',
89 SSL_key_file => "client-key.pem",
90 SSL_cert_file => "client-cert.pem",
91 SSL_ca_file => "ca-cert.pem",
95 $self->err("Cannot establish TLS connection: " . IO::Socket::SSL::errstr());
101 $self->log("Logging in");
102 my $req = new Sherlock::Object("U" => $self->{"user"});
103 my $reply = $self->request($req);
104 my $err = $reply->get("-");
106 $self->err("Cannot log in: $err");
110 $self->log("Connected");
115 my ($self, $obj) = @_;
116 my $sk = $self->{"sk"};
117 $obj->write($sk); ### FIXME: Flushing
119 $self->err("Connection broken");
127 my ($self, $obj) = @_;
128 my $sk = $self->{"sk"};
129 my $reply = new Sherlock::Object;
130 if ($reply->read($sk)) {
133 $self->err("Connection broken");
139 my ($self, $fh, $size) = @_;
140 my $sk = $self->{"sk"};
142 my $l = ($size < 4096 ? $size : 4096);
144 if ($fh->read($buf, $l) != $l) {
145 $self->err("File shrunk during upload");
148 $sk->write($buf, $l);
150 $self->err("Connection broken");