From b6ff4cb4dcc61cb069740b0f0e5098394b4a700d Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 Aug 2021 17:48:59 +0100 Subject: add support for ilo5 (cherry picked from commit 860cff84e4bf068373819bc54bab098a64d3dccb) --- INF.pm | 11 +- INF/ILO5.pm | 499 ++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 10 + ilo5/certs | 38 ++++ ilo5/intgapp4_251.jar | Bin 0 -> 383764 bytes ilo5/mypolicy | 8 + ilo5/myvtdpolicy | 10 + ilo5/server.cnf | 19 ++ ilo5/server.crt | 14 ++ ilo5/server.jks | Bin 0 -> 611 bytes ilo5/server.key | 16 ++ 11 files changed, 622 insertions(+), 3 deletions(-) create mode 100644 INF/ILO5.pm create mode 100755 ilo5/certs create mode 100644 ilo5/intgapp4_251.jar create mode 100644 ilo5/mypolicy create mode 100644 ilo5/myvtdpolicy create mode 100644 ilo5/server.cnf create mode 100644 ilo5/server.crt create mode 100644 ilo5/server.jks create mode 100644 ilo5/server.key 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 = "" . $content . ""; + + $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 Binary files /dev/null and b/ilo5/intgapp4_251.jar 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 Binary files /dev/null and b/ilo5/server.jks 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----- -- cgit v1.2.3