summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@ka-ata-killa.panaceas.james.local>2021-08-31 17:48:59 +0100
committerroot <root@ka-ata-killa.panaceas.james.local>2021-08-31 17:50:15 +0100
commitb6ff4cb4dcc61cb069740b0f0e5098394b4a700d (patch)
tree5d62291df86e6ce1f64f5659eaf5ec759201c9c3
parente8417daed5461bda9fcce0a629bf7c831b070cda (diff)
downloadinf-b6ff4cb4dcc61cb069740b0f0e5098394b4a700d.tar.gz
inf-b6ff4cb4dcc61cb069740b0f0e5098394b4a700d.tar.bz2
inf-b6ff4cb4dcc61cb069740b0f0e5098394b4a700d.zip
add support for ilo5
(cherry picked from commit 860cff84e4bf068373819bc54bab098a64d3dccb)
-rw-r--r--INF.pm11
-rw-r--r--INF/ILO5.pm499
-rw-r--r--Makefile10
-rwxr-xr-xilo5/certs38
-rw-r--r--ilo5/intgapp4_251.jarbin0 -> 383764 bytes
-rw-r--r--ilo5/mypolicy8
-rw-r--r--ilo5/myvtdpolicy10
-rw-r--r--ilo5/server.cnf19
-rw-r--r--ilo5/server.crt14
-rw-r--r--ilo5/server.jksbin0 -> 611 bytes
-rw-r--r--ilo5/server.key16
11 files changed, 622 insertions, 3 deletions
diff --git a/INF.pm b/INF.pm
index 20b41b8..58a5964 100644
--- a/INF.pm
+++ b/INF.pm
@@ -1,8 +1,9 @@
package INF;
use INF::APC;
use INF::DSRx020;
-use INF::ILO;
use INF::ILO2;
+use INF::ILO; #ilo 4 confusingly
+use INF::ILO5;
use INF::SuperMicro;
use INF::Cyclades;
@@ -35,10 +36,14 @@ sub new ($;$) {
return INF::APC->new($inf);
} elsif ( $inf->{inf_type} eq 'supermicro' ) {
return INF::SuperMicro->new($inf);
- } elsif ( $inf->{inf_type} eq 'ilo' ) {
- return INF::ILO->new($inf);
} elsif ( $inf->{inf_type} eq 'ilo2' ) {
return INF::ILO2->new($inf);
+ } elsif ( $inf->{inf_type} eq 'ilo' ) {
+ return INF::ILO->new($inf);
+ } elsif ( $inf->{inf_type} eq 'ilo4' ) {
+ return INF::ILO->new($inf);
+ } elsif ( $inf->{inf_type} eq 'ilo5' ) {
+ return INF::ILO5->new($inf);
} elsif ( $inf->{inf_type} eq 'cyclades' ) {
return INF::Cyclades->new($inf);
}
diff --git a/INF/ILO5.pm b/INF/ILO5.pm
new file mode 100644
index 0000000..a2d68b6
--- /dev/null
+++ b/INF/ILO5.pm
@@ -0,0 +1,499 @@
+#!/usr/bin/env perl
+
+package INF::ILO5;
+
+use HTTP::Daemon::SSL;
+use HTTP::Server::Brick;
+use HTTP::Status;
+
+use IO::Socket::SSL qw();
+use HTML::TreeBuilder;
+use HTTP::Request::Common;
+use LWP::UserAgent;
+use URI::Escape;
+use File::Temp qw/ tempfile tempdir /;
+use XML::Simple;
+use Data::Dumper;
+use JSON::PP;
+
+#IO::Socket::SSL::set_ctx_defaults( SSL_verify_mode => SSL_VERIFY_NONE );
+IO::Socket::SSL::set_ctx_defaults(
+ SSL_verify_mode => Net::SSLeay::VERIFY_NONE() );
+
+sub read_file($) {
+ my ($name) = @_;
+
+ my $fh = new IO::File "<" . $name;
+ local $/;
+ my $guts = $fh->getline;
+ $fh->close;
+ undef $fh;
+
+ return $guts;
+}
+
+#sub setup_port_proxy($$$) {
+# my ( $local_port, $remote_host, $remote_port ) = @_;
+#
+# my $child = fork();
+#
+# print STDERR "balance ",
+# join(
+# ' ',
+# (
+# "balance", "-d", "-f", "127.0.0.1", $local_port,
+# $remote_host . ":" . $remote_port
+# )
+# ),
+# "\n";
+#
+# if ( $child == 0 ) {
+#
+# exec( "balance", "-d", "-f", "-b", "127.0.0.1", $local_port,
+# $remote_host . ":" . $remote_port );
+# print STDERR "failed to start port proxy";
+# sleep(10000);
+# }
+#
+# print "Setup proxy $local_port -> $remote_host:$remote_port\n";
+#
+# return $child;
+#}
+#
+
+sub setup_port_proxy($$$$) {
+ my ( $self, $local_port, $remote_host, $remote_port ) = @_;
+
+ my $child = fork();
+
+ my $cmd = [
+ "balance", "-d", "-f", "-b", "127.0.0.1", $local_port,
+ $remote_host . ":" . $remote_port
+ ];
+
+ print STDERR "PROXY CMD: " . join( ' ', @$cmd ) . "\n";
+
+ if ( $child == 0 ) {
+
+ if ( defined $self->{proxy_host} ) {
+ my $tmp = File::Temp->new( UNLINK => 0, SUFFIX => '.cnf' );
+
+ select( ( select($tmp), $| = 1 )[0] );
+
+ print $tmp "server = 127.0.0.1\n";
+ print $tmp "server_port = " . $self->{proxy_port} . "\n";
+ print $tmp "local = 127.0.0.0/255.0.0.0\n";
+
+ $ENV{'LD_PRELOAD'} = 'libtsocks.so';
+ $ENV{'TSOCKS_CONF_FILE'} = $tmp->filename;
+
+ print "Filename is $tmp->filename\n";
+ }
+
+ exec(@$cmd);
+ print STDERR "failed to start port proxy";
+ sleep(10000);
+ }
+
+ sleep(4);
+
+ print "Setup proxy $local_port -> $remote_host:$remote_port\n";
+
+ return $child;
+}
+
+sub proxy($$$) {
+ my ( $self, $req, $res ) = @_;
+
+ my $suri = $req->uri->as_string;
+
+ print STDERR "proxying $suri\n";
+
+ if ( $req->uri->as_string =~ /^\/html\/java_irc.html/ ) {
+
+ $res->header( 'Content-type' => 'text/html' );
+ $res->add_content( $self->{java_html} );
+ $res->code(200);
+
+ return;
+
+ }
+
+ if ( $req->uri->as_string =~ /^\/html\/intgapp.*\.jar/ ) {
+
+ $res->header( 'Content-type' => 'application/x-ms-application' );
+ $res->add_content(
+ read_file('/usr/local/share/inf/ilo5/intgapp4_251.jar') );
+ $res->code(200);
+
+ return;
+ }
+
+# print STDERR "fish: ",Dumper($req->headers),"\n";
+
+ my $proxy_req =
+ HTTP::Request->new( $req->method, $self->{ilo_url} . $req->uri->as_string,
+ [], $req->content );
+
+ $proxy_req->header( 'cookie' => 'sessionKey=' . $self->{skey} );
+ $proxy_req->header( 'x-auth-token' => $self->{skey} );
+
+# print STDERR "soup: ",Dumper($proxy_req->headers),"\n";
+
+#sessionLang=en; externalIrc=ircLocation=/redfish/v1/SessionService/Sessions/administrator0000000060db1eb3cdd2f1a9/
+#Location=/redfish/v1/SessionService/Sessions/uxen00000000612e3f404189374c/;
+#UserPref=html5_statbar=true%2Ckbd_type=en
+#irc=last=jrc
+
+
+ my $proxy_res = $self->{ua}->request($proxy_req);
+
+ unless ( $proxy_res->is_success ) {
+ print STDERR "request failed - did not get 200\n";
+
+ }
+
+ print "URI:", $req->uri->as_string, " code ", $proxy_res->code, " type ",
+ $proxy_res->header('Content-type'), "\n";
+
+ $res->code( $proxy_res->code );
+ $res->header( 'Content-type' => $proxy_res->header('Content-type') );
+
+ my $content = $proxy_res->content;
+
+ if ( $req->uri->as_string =~ /^\/redfish\/v1\/Managers\/1\/RcInfo/ ) {
+
+ print "content: $content\n";
+
+ my $local_port = int( rand(30000) ) + 30000;
+
+ $content =~ s/"RcPort":(\d+),/"RcPort":$local_port,/;
+ push @{ $self->{to_kill} },
+ $self->setup_port_proxy( $local_port, $self->{host}, $1 );
+
+ print "FISH $1 -> $local_port\n";
+
+ $local_port = int( rand(30000) ) + 30000;
+
+ $content =~ s/"VmPort":(\d+),/"VmPort":$local_port,/;
+ push @{ $self->{to_kill} },
+ $self->setup_port_proxy( $local_port, $self->{host}, $1 );
+
+ print "SOUP $1 -> $local_port\n";
+
+ }
+
+ $res->add_content($content);
+
+}
+
+sub login($) {
+ my $self = shift;
+
+ my $post = POST( $self->{ilo_url} . '/json/login_session' );
+ my $json =
+ '{"method":"login","user_login":"'
+ . $self->{user}
+ . '","password":"'
+ . $self->{password} . '"}';
+
+ $post->header( 'Content-Type' => 'application/json' );
+ $post->header( 'Content-Length' => length($json) );
+ $post->content($json);
+
+ my $res = $self->{ua}->request($post);
+
+ unless ( $res->is_success ) {
+ print STDERR "Login failed - did not get 200\n";
+
+ print Dumper($res);
+
+ $self->{skey} = undef;
+ return -1;
+ }
+ print STDERR "Login good!\n";
+
+ my $json = decode_json( $res->content );
+
+
+ $self->{skey} = $json->{session_key};
+
+ # print "Session key ".$self->{skey}."\n";
+
+ return 0;
+}
+
+sub view($) {
+ my $self = shift;
+
+ $self->login() unless defined $self->{skey};
+
+ my $get = GET( $self->{ilo_url} . '/html/java_irc.html?lang=en', 'Cookie' => 'sessionKey=' . $self->{skey} );
+
+ my $res = $self->{ua}->request($get);
+
+ unless ( $res->is_success ) {
+ print STDERR "IRC frequest failed - did not get 200\n";
+ return -1;
+ }
+ my $content = $res->content;
+
+ unless ( $content =~ /Netscape'\) \{(.*)\}[\s\n]*else if/s ) {
+ print STDERR "returned html doesn't look right\n";
+ return -1;
+ }
+
+
+ $content = $1;
+
+ #$content=~ s/document.writeln\("(.*)"\);$/\1/m;
+ $content =~ s/^\s*document.writeln\("(.*)"\);\s*$/\1/mg;
+ $content =~ s/\\//g;
+
+ $content =~ s/RCINFO1=.*$/RCINFO1="$self->{skey}"/m;
+ $content =~ s/RCINFO6=.*$/RCINFO6=""/m;
+ $content =~ s/RCINFOLANG=.*$/RCINFOLANG="en"/m;
+ $content =~ s%(archive=)(/.*)$%\1$self->{proxy_url}\2%m;
+
+ $content = "<html><head></head><body>" . $content . "</body></html>";
+
+ $self->{java_html} = $content;
+
+ print $content;
+
+
+
+
+ my $webserver_pid = fork();
+
+ if ( $webserver_pid == 0 ) {
+ $SIG{INT} = sub { kill 'KILL', ( @{ $self->{to_kill} } ); die; };
+ $SIG{TERM} = sub { kill 'KILL', ( @{ $self->{to_kill} } ); die; };
+
+ $self->{server}->start;
+ print STDERR "failed to web server";
+ sleep(100000);
+ }
+
+ push @{ $self->{to_kill} }, $webserver_pid;
+
+ $SIG{INT} = sub { kill 'INT', ( @{ $self->{to_kill} } ); die; };
+ $SIG{TERM} = sub { kill 'TERM', ( @{ $self->{to_kill} } ); die; };
+
+ system(
+ "echo",
+ "appletviewer",
+ "-J-Djava.security.manager",
+
+ # "-J-Djava.security.debug=access,failure,policy",
+ "-J-Djava.security.policy=/usr/local/share/inf/ilo5/mypolicy",
+ "-J-Djavax.net.ssl.trustStore=/usr/local/share/inf/ilo5/server.jks",
+ $self->{proxy_url} . "/html/java_irc.html"
+ );
+
+ system(
+ "appletviewer",
+ "-J-Djava.security.manager",
+
+ # "-J-Djava.security.debug=access,failure,policy",
+ "-J-Djava.security.policy=/usr/local/share/inf/ilo5/mypolicy",
+ "-J-Djavax.net.ssl.trustStore=/usr/local/share/inf/ilo5/server.jks",
+ $self->{proxy_url} . "/html/java_irc.html"
+ );
+
+ kill 'TERM', ( @{ $self->{to_kill} } );
+}
+
+sub get_host_power($) {
+ my ($self) = @_;
+
+ $self->login() unless defined $self->{skey};
+
+ my $get = GET( $self->{ilo_url} . '/json/host_power' );
+
+ $get->header( 'cookie' => 'sessionKey=' . $self->{skey} );
+
+ my $res = $self->{ua}->request($get);
+
+ unless ( $res->is_success ) {
+ print STDERR " get host power - did not get 200\n";
+ return undef;
+ }
+
+ my $state = decode_json $res->content;
+
+ return $state->{'hostpwr_state'};
+
+}
+
+sub set_host_power($$) {
+ my ( $self, $what ) = @_;
+
+ $self->login() unless defined $self->{skey};
+
+ my $post = POST( $self->{ilo_url} . '/json/host_power' );
+ my $json =
+ '{"method":"' . $what . '","session_key":"' . $self->{skey} . '"}';
+ $post->header( 'Content-Type' => 'application/json' );
+ $post->header( 'Content-Length' => length($json) );
+ $post->content($json);
+ $post->header( 'cookie' => 'sessionKey=' . $self->{skey} );
+
+ my $res = $self->{ua}->request($post);
+
+ unless ( $res->is_success ) {
+ print STDERR " $what - did not get 200\n";
+ return 0;
+ }
+
+ return 1;
+}
+
+sub cold_boot($) {
+ my $self = shift;
+ return $self->set_host_power('system_coldboot');
+}
+
+sub reset($) {
+ my $self = shift;
+ return $self->set_host_power('system_reset');
+}
+
+sub off($) {
+ my $self = shift;
+ if ( $self->get_host_power =~ /ON/i ) {
+ return $self->set_host_power('hold_power_button');
+ }
+ return 1;
+}
+
+sub on($) {
+ my $self = shift;
+ if ( $self->get_host_power =~ /OFF/i ) {
+ return $self->set_host_power('press_power_button');
+ }
+ return 1;
+}
+
+sub port_on($$) {
+ my $self = shift;
+ return $self->on();
+}
+
+sub port_off($$) {
+ my $self = shift;
+ return $self->off();
+}
+
+sub port_cycle($$) {
+ my $self = shift;
+ return $self->cold_boot();
+}
+
+sub port_state_get_no_cache($$) {
+ my $self = shift;
+ return $self->get_host_power();
+}
+
+sub port_state_get($$) {
+ my $self = shift;
+ return $self->get_host_power();
+}
+
+sub port_name_get($$) {
+ my $self = shift;
+ return $self->{name};
+}
+
+sub name_get($) {
+ my $self = shift;
+ return $self->{name};
+}
+
+sub pdu_load_get($) {
+ return "N/A";
+}
+
+sub psu_status($) {
+ return "N/A";
+}
+
+sub port_count($) {
+ return 1;
+}
+
+sub port_id_get_by_number($$) {
+ return "K0";
+}
+
+sub logout($) {
+ my $self = shift;
+}
+
+sub new ($;$) {
+ my ( $class, $parm ) = @_;
+ my $self;
+
+ $self->{ua} = my $ua = LWP::UserAgent->new;
+
+ $self->{host} = $parm->{host} || "127.0.0.1";
+
+ $self->{user} = $parm->{user} || "Administrator";
+ $self->{password} = $parm->{password} || "";
+
+ $self->{name} = $parm->{name} || $self->{host};
+
+ $self->{ilo_url} = $parm->{ilo_url}
+ || 'https://' . $self->{host};
+ $self->{userid} = undef;
+
+ $self->{ua}->ssl_opts(
+
+ # SSL_verify_mode => SSL_VERIFY_NONE,
+ SSL_verify_mode => Net::SSLeay::VERIFY_NONE(),
+ verify_hostname => 0,
+ );
+
+ if ( defined $parm->{proxy_host} ) {
+ $self->{ua}->proxy( [qw(http https)] => "socks://"
+ . $parm->{proxy_host} . ":"
+ . $parm->{proxy_port} );
+ $self->{proxy_host} = $parm->{proxy_host};
+ $self->{proxy_port} = $parm->{proxy_port};
+ }
+
+ my $local_port = int( rand(30000) ) + 30000;
+
+ $self->{proxy_url} = 'https://127.0.0.1:' . $local_port;
+
+ $self->{server} = HTTP::Server::Brick->new(
+ port => $local_port,
+ daemon_class => 'HTTP::Daemon::SSL',
+ daemon_args => [
+ LocalAddr => '127.0.0.1',
+ SSL_key_file => '/usr/local/share/inf/ilo5/server.key',
+ SSL_cert_file => '/usr/local/share/inf/ilo5/server.crt',
+ SSL_verify_mode => Net::SSLeay::VERIFY_NONE(),
+ ],
+ );
+ $self->{server}->mount(
+ '/' => {
+ handler => sub {
+ my ( $req, $res ) = @_;
+
+ $self->proxy( $req, $res );
+ 1;
+ },
+ wildcard => 1,
+ }
+ );
+
+ $self->{skey} = undef;
+ $self->{to_kill} = [];
+
+ return bless $self, $class;
+
+}
+
+1;
+
diff --git a/Makefile b/Makefile
index 0fee28b..d2c2715 100644
--- a/Makefile
+++ b/Makefile
@@ -4,6 +4,7 @@ install:
mkdir -p /usr/local/share/inf/HTTP/Server
mkdir -p /usr/local/share/inf/avocent
mkdir -p /usr/local/share/inf/ilo
+ mkdir -p /usr/local/share/inf/ilo5
mkdir -p /usr/local/share/inf/supermicro/1.69.21.0x0
mkdir -p /usr/local/share/inf/supermicro/1.69.25.0x0
mkdir -p /usr/local/share/inf/supermicro/1.69.37.0x0
@@ -15,6 +16,7 @@ install:
install -m 644 INF/DSRx020.pm /usr/local/share/inf/INF
install -m 644 INF/ILO.pm /usr/local/share/inf/INF
install -m 644 INF/ILO2.pm /usr/local/share/inf/INF
+ install -m 644 INF/ILO5.pm /usr/local/share/inf/INF
install -m 644 INF/Cyclades.pm /usr/local/share/inf/INF
install -m 644 INF/SuperMicro.pm /usr/local/share/inf/INF
install -m 644 mibs/PowerNet-MIB.mib /usr/local/share/inf/mibs/
@@ -45,6 +47,14 @@ install:
install -m 644 ilo/server.crt /usr/local/share/inf/ilo/
install -m 644 ilo/server.jks /usr/local/share/inf/ilo/
install -m 644 ilo/server.key /usr/local/share/inf/ilo/
+ install -m 644 ilo5/certs /usr/local/share/inf/ilo/
+ install -m 644 ilo5/intgapp4_251.jar /usr/local/share/inf/ilo5/
+ install -m 644 ilo5/mypolicy /usr/local/share/inf/ilo5/
+ install -m 644 ilo5/myvtdpolicy /usr/local/share/inf/ilo5/
+ install -m 644 ilo5/server.cnf /usr/local/share/inf/ilo5/
+ install -m 644 ilo5/server.crt /usr/local/share/inf/ilo5/
+ install -m 644 ilo5/server.jks /usr/local/share/inf/ilo5/
+ install -m 644 ilo5/server.key /usr/local/share/inf/ilo5/
install -m 644 supermicro/1.69.21.0x0/iKVM32.dll /usr/local/share/inf/supermicro/1.69.21.0x0/
install -m 644 supermicro/1.69.21.0x0/iKVM64.dll /usr/local/share/inf/supermicro/1.69.21.0x0/
install -m 644 supermicro/1.69.21.0x0/iKVM__V1.69.21.0x0.jar /usr/local/share/inf/supermicro/1.69.21.0x0/
diff --git a/ilo5/certs b/ilo5/certs
new file mode 100755
index 0000000..4b4e262
--- /dev/null
+++ b/ilo5/certs
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+rm -f server.jks server.key server.csr server.crt server.cnf
+
+cat << EOF > server.cnf
+
+[req]
+distinguished_name = req_distinguished_name
+x509_extensions = v3_req
+prompt = no
+
+[ req_distinguished_name ]
+commonName = localhost
+
+[v3_req]
+subjectKeyIdentifier = hash
+authorityKeyIdentifier = keyid,issuer
+basicConstraints = CA:TRUE
+subjectAltName = @alt_names
+
+[alt_names]
+DNS.1 = localhost
+IP.1 = 127.0.0.1
+
+EOF
+
+
+
+#openssl genrsa -out server.key 1024
+#openssl req -config server.cnf -new -key server.key -out server.csr
+#openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
+
+openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout server.key -out server.crt -config server.cnf
+
+yes | keytool -import -v -trustcacerts -alias 127.0.0.1 -file server.crt -keystore server.jks -keypass changeit -storepass changeit
+
+
+
diff --git a/ilo5/intgapp4_251.jar b/ilo5/intgapp4_251.jar
new file mode 100644
index 0000000..6d021d6
--- /dev/null
+++ b/ilo5/intgapp4_251.jar
Binary files differ
diff --git a/ilo5/mypolicy b/ilo5/mypolicy
new file mode 100644
index 0000000..5e96ff0
--- /dev/null
+++ b/ilo5/mypolicy
@@ -0,0 +1,8 @@
+grant {
+ permission java.security.AllPermission;
+ permission java.net.SocketPermission "127.0.0.1:*", "connect, accept ,resolve, listen";
+ permission java.util.PropertyPermission "java.io.tmpdir","read";
+ permission java.io.FilePermission "/tmp/-", "read, write";
+ permission java.io.FilePermission "/tmp", "read, write";
+ permission java.lang.RuntimePermission "loadLibrary.*";
+};
diff --git a/ilo5/myvtdpolicy b/ilo5/myvtdpolicy
new file mode 100644
index 0000000..e3311ae
--- /dev/null
+++ b/ilo5/myvtdpolicy
@@ -0,0 +1,10 @@
+grant {
+ permission java.net.SocketPermission "localhost", "connect, accept ,resolve, listen";
+ permission java.util.PropertyPermission "java.io.tmpdir","read";
+ permission java.io.FilePermission "/tmp/-", "read, write";
+ permission java.io.FilePermission "/tmp", "read, write";
+ permission java.io.FilePermission "/", "read, write";
+ permission java.io.FilePermission "/-", "read, write";
+ permission java.util.PropertyPermission "*", "read,write";
+ permission java.lang.RuntimePermission "loadLibrary.*";
+};
diff --git a/ilo5/server.cnf b/ilo5/server.cnf
new file mode 100644
index 0000000..fd38814
--- /dev/null
+++ b/ilo5/server.cnf
@@ -0,0 +1,19 @@
+
+[req]
+distinguished_name = req_distinguished_name
+x509_extensions = v3_req
+prompt = no
+
+[ req_distinguished_name ]
+commonName = localhost
+
+[v3_req]
+subjectKeyIdentifier = hash
+authorityKeyIdentifier = keyid,issuer
+basicConstraints = CA:TRUE
+subjectAltName = @alt_names
+
+[alt_names]
+DNS.1 = localhost
+IP.1 = 127.0.0.1
+
diff --git a/ilo5/server.crt b/ilo5/server.crt
new file mode 100644
index 0000000..cee5434
--- /dev/null
+++ b/ilo5/server.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICHTCCAYagAwIBAgIUVWCoIXglNUcB6UMo5VOqVVSfzsEwDQYJKoZIhvcNAQEL
+BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIxMDgzMTEzMzE0NFoXDTMxMDgy
+OTEzMzE0NFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDS4suzn7TFzI0WDPSLe9z9w2Pz02C280Dn/GSczQdH3Gw4gYo+
+CKnuDHMM9TfVVpqno9jodt40fi//JAPKDvbiOXcRjJx7zOSmx46Xzpy+ujvsde57
+xfP4SzDq5DGsxdqGaZyRUu85wYxyOTI63Uz5Xq/xgdxXCURkButA+EFPnQIDAQAB
+o2wwajAdBgNVHQ4EFgQUidzfhdg/wQEm0ztynAsHj+in3ucwHwYDVR0jBBgwFoAU
+idzfhdg/wQEm0ztynAsHj+in3ucwDAYDVR0TBAUwAwEB/zAaBgNVHREEEzARggls
+b2NhbGhvc3SHBH8AAAEwDQYJKoZIhvcNAQELBQADgYEAklwwpCa7MvMeaFg5aWCB
+xhSx+1KhGVDy1d/HOQ2Xv1d0roDy6JQrfxC0skkjhQ2HmlZDzS7qBRThNG34HQYn
+Ez5sN1KMfyujGE51cR2uGwFKyI5JIAVG7fle6Gb0EVTQdIyRyI3rk7+gAQqkqYtv
+SNNRVxgpR4QLJcRyP7BmKEw=
+-----END CERTIFICATE-----
diff --git a/ilo5/server.jks b/ilo5/server.jks
new file mode 100644
index 0000000..adeafa7
--- /dev/null
+++ b/ilo5/server.jks
Binary files differ
diff --git a/ilo5/server.key b/ilo5/server.key
new file mode 100644
index 0000000..0bfa865
--- /dev/null
+++ b/ilo5/server.key
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANLiy7OftMXMjRYM
+9It73P3DY/PTYLbzQOf8ZJzNB0fcbDiBij4Iqe4Mcwz1N9VWmqej2Oh23jR+L/8k
+A8oO9uI5dxGMnHvM5KbHjpfOnL66O+x17nvF8/hLMOrkMazF2oZpnJFS7znBjHI5
+MjrdTPler/GB3FcJRGQG60D4QU+dAgMBAAECgYBgEV8YidWREfjnpak1bYyjsYH0
+DkQNs8zKoai34ZLCgsBuEV0Hm2zF+7fhnEf+EMDNQ4/JfnUFVsLIqQBs6NpAKcrc
+peqyDBJbgJLioJZs7uc0kK3mmX2Q1O/2zUf4upmY/oazr11a1exZss6mhJ0IJGrF
+0kiANRPhkPc13gk9RQJBAP2MHKWeDxZPucXmkxHGxcF0j4KxyISM797FMY3HTBLl
+J2bmE/YGEodQK88odtzm3Hl1UER8wAiil3IHNp1cO6MCQQDU7Qla5WvBPJnFjWjE
+Vptd38wUi88IzrmVK34XoglZ+adHG55rCqloSfsVW/XuI3IxhzNYS6HT0/tXV8r1
+qPu/AkEA8nOiDSk4yiAQyFJ1fkEyZ4ybkuGIml/fHIo6mZXjhAoHBJmsqs0huK0M
+R3stNo24dJie2e7k/xzjbxHAwvcouwJAFq14RZoRs+8EYaoB8odW3NStI7MQRdve
+oCiVsWasoEyaqFQktznXeSgH+eplcwuLagMAUPMdNTZqmo7bKvboeQJBAJP808j5
+NYPsJk6Bgxj6wwSIQg+u9TwJnv+JCUk03O4GmCM7h4bqdIRV5mHjMMmEeXnEiaCN
+VmNDS8UcMXSWuDg=
+-----END PRIVATE KEY-----