From 21a57211e96a5ce5989ca006af8f26ffe391e0c9 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 1 Sep 2021 00:11:37 +0100 Subject: add asrock support --- INF.pm | 3 + INF/ASRock.pm | 303 +++++++++++++++++++++++++++++++++++++ Makefile | 16 ++ asrock/JViewer-AVIStream.jar | Bin 0 -> 19674 bytes asrock/JViewer-FolderRedir.jar | Bin 0 -> 60684 bytes asrock/JViewer-OEM.jar | Bin 0 -> 55312 bytes asrock/JViewer-SOC.jar | Bin 0 -> 53319 bytes asrock/JViewer.jar | Bin 0 -> 690125 bytes asrock/Linux_x86_64.jar | Bin 0 -> 45246 bytes asrock/Win64.jar | Bin 0 -> 118117 bytes asrock/libjavacdromwrapper.so | Bin 0 -> 42299 bytes asrock/libjavaclientconfwrapper.so | Bin 0 -> 9601 bytes asrock/libjavaharddiskwrapper.so | Bin 0 -> 60182 bytes asrock/mypolicy | 8 + asrock/myvtdpolicy | 10 ++ 15 files changed, 340 insertions(+) create mode 100644 INF/ASRock.pm create mode 100644 asrock/JViewer-AVIStream.jar create mode 100644 asrock/JViewer-FolderRedir.jar create mode 100644 asrock/JViewer-OEM.jar create mode 100644 asrock/JViewer-SOC.jar create mode 100644 asrock/JViewer.jar create mode 100644 asrock/Linux_x86_64.jar create mode 100644 asrock/Win64.jar create mode 100644 asrock/libjavacdromwrapper.so create mode 100644 asrock/libjavaclientconfwrapper.so create mode 100644 asrock/libjavaharddiskwrapper.so create mode 100644 asrock/mypolicy create mode 100644 asrock/myvtdpolicy diff --git a/INF.pm b/INF.pm index 58a5964..9b03767 100644 --- a/INF.pm +++ b/INF.pm @@ -5,6 +5,7 @@ use INF::ILO2; use INF::ILO; #ilo 4 confusingly use INF::ILO5; use INF::SuperMicro; +use INF::ASRock; use INF::Cyclades; @@ -36,6 +37,8 @@ sub new ($;$) { return INF::APC->new($inf); } elsif ( $inf->{inf_type} eq 'supermicro' ) { return INF::SuperMicro->new($inf); + } elsif ( $inf->{inf_type} eq 'asrock' ) { + return INF::ASRock->new($inf); } elsif ( $inf->{inf_type} eq 'ilo2' ) { return INF::ILO2->new($inf); } elsif ( $inf->{inf_type} eq 'ilo' ) { diff --git a/INF/ASRock.pm b/INF/ASRock.pm new file mode 100644 index 0000000..d4449c0 --- /dev/null +++ b/INF/ASRock.pm @@ -0,0 +1,303 @@ +#!/usr/bin/env perl + +IO::Socket::SSL::set_ctx_defaults( SSL_verify_mode => SSL_VERIFY_NONE ); + +package INF::ASRock; + +use HTTP::Status; +use HTTP::Cookies; + +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; + +sub login($) { + my $self = shift; + + my $post = POST( $self->{bmc_url} . '/api/session' ); + my $form_content = + 'username=' . $self->{user} . '&' . 'password=' . $self->{password}; + + $post->header( 'Content-Type' => 'application/x-www-form-urlencoded' ); + $post->header( 'Content-Length' => length($form_content) ); + $post->content($form_content); + + my $res = $self->{ua}->request($post); + + unless ( $res->is_success ) { + print STDERR "Login failed - did not get 200\n"; + + print Dumper($res); + + $self->{logged_in} = undef; + return -1; + } + + + $self->{logged_in} = 1; + + my $json = decode_json( $res->content ); + + $self->{csrftoken} = $json->{CSRFToken}; + + print "csrftoken ".$self->{csrftoken}."\n"; + + return 0; +} + +sub view($) { + my $self = shift; + + $self->login() unless defined $self->{logged_in}; + + my $get = GET( $self->{bmc_url} + . '/api/remote_control/get/kvm/launch' ); + + $get->header('X-CSRFTOKEN' => $self->{csrftoken}); + $get->header('Cookie' => 'lang=en-us'); + + my $res = $self->{ua}->request($get); + + unless ( $res->is_success ) { + print STDERR "JWSK frequest failed - did not get 200\n"; + + print Dumper ($res); + return -1; + } + + + my $xml = new XML::Simple; + + my $c = $res->content; + + $c =~ s/^[\s\n\r]+//s; + my $data = $xml->XMLin($c); + + return undef unless defined $data->{'application-desc'}; + + my $args = $data->{'application-desc'}->{'argument'}; + + return undef unless defined $args; + + mkdir $ENV{HOME} . "/.supermicro_kvm"; + chdir $ENV{HOME} . "/.supermicro_kvm"; + + my $prefix = "/usr/local/share/inf/asrock/"; + + 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"; + } + + my $jars = [ ]; + + push @$jars, $prefix.'JViewer.jar'; + push @$jars, $prefix.'JViewer-SOC.jar'; + push @$jars, $prefix.'JViewer-OEM.jar'; + push @$jars, $prefix.'JViewer-AVIStream.jar'; + push @$jars, $prefix.'Linux_x86_64.jar'; + push @$jars, $prefix.'JViewer-FolderRedir.jar'; + + my $cp = join( ':', @$jars ); + + push @$java_args, "-cp"; + push @$java_args, $cp; + push @$java_args, "-Djava.library.path=" . $prefix; +# push @$java_args, "-Djava.security.manager"; +# push @$java_args, "-Djava.security.policy=/usr/local/share/inf/asrock/mypolicy"; +# push @$java_args, "-Dcom.sun.net.ssl.checkRevocation=false"; + push @$java_args,"-Xms100m"; + push @$java_args,"-Xmx256m"; + + push @$java_args, "com.ami.kvm.jviewer.JViewer"; + + system( "echo", "java", @$java_args, @$args ); + system( "java", @$java_args, @$args ); + +} + +sub get_host_power($) { + my ($self) = @_; + + $self->login() unless defined $self->{logged_in}; + + my $post = POST( $self->{bmc_url} . '/cgi/ipmi.cgi' ); + my $form_content = 'op=POWER_INFO.XML&r=(0%2C0)'; + + $post->header( 'Content-Type' => 'application/x-www-form-urlencoded' ); + $post->header( 'Content-Length' => length($form_content) ); + $post->content($form_content); + + my $res = $self->{ua}->request($post); + + unless ( $res->is_success ) { + print STDERR " get host power - did not get 200\n"; + return undef; + } + + my $xml = new XML::Simple; + + my $c = $res->content; + + $c =~ s/^[\s\n\r]+//s; + + my $data = $xml->XMLin($c); + + return undef unless defined $data->{'POWER_INFO'}; + return undef unless defined $data->{'POWER_INFO'}->{'POWER'}; + return undef unless defined $data->{'POWER_INFO'}->{'POWER'}->{'STATUS'}; + + return $data->{'POWER_INFO'}->{'POWER'}->{'STATUS'}; +} + +sub set_host_power($$) { + my ( $self, $what ) = @_; + + $self->login() unless defined $self->{logged_in}; + + my $post = POST( $self->{bmc_url} . '/cgi/ipmi.cgi' ); + my $form_content = 'op=POWER_INFO.XML&r=(1%2C' . $what . ')'; + + $post->header( 'Content-Type' => 'application/x-www-form-urlencoded' ); + $post->header( 'Content-Length' => length($form_content) ); + $post->content($form_content); + + my $res = $self->{ua}->request($post); + + unless ( $res->is_success ) { + print STDERR " get host power - did not get 200\n"; + return 0; + } + + my $xml = new XML::Simple; + + my $c = $res->content; + + $c =~ s/^[\s\n\r]+//s; + + my $data = $xml->XMLin($c); + + return 0 unless defined $data->{'POWER_INFO'}; + return 0 unless defined $data->{'POWER_INFO'}->{'POWER'}; + return 0 unless defined $data->{'POWER_INFO'}->{'POWER'}->{'STATUS'}; + + return 1; +} + +sub reset($) { + my $self = shift; + return $self->set_host_power('0'); +} + +sub port_off($) { + my $self = shift; + return $self->set_host_power('1'); +} + +sub orderly_shutdown($) { + my $self = shift; + return $self->set_host_power('2'); +} + +sub port_on($) { + my $self = shift; + return $self->set_host_power('3'); +} + +sub port_cycle($) { + my $self = shift; + return $self->set_host_power('5'); +} + +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->{cookie_jar} = HTTP::Cookies->new(); + $self->{ua}->cookie_jar( $self->{cookie_jar} ); + + $self->{host} = $parm->{host} || "127.0.0.1"; + + $self->{user} = $parm->{user} || "ADMIN"; + $self->{password} = $parm->{password} || "ADMIN"; + + $self->{name} = $parm->{name} || $self->{host}; + + $self->{bmc_url} = $parm->{bmc_url} + || 'https://' . $self->{host}; + + $self->{ua}->ssl_opts( + SSL_version => 'TLSv1_2', + 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}; + } + + $self->{logged_in} = undef; + + return bless $self, $class; + +} + +1; + diff --git a/Makefile b/Makefile index d2c2715..b5b6696 100644 --- a/Makefile +++ b/Makefile @@ -2,9 +2,11 @@ install: mkdir -p /usr/local/share/inf/mibs/compiled mkdir -p /usr/local/share/inf/INF mkdir -p /usr/local/share/inf/HTTP/Server + mkdir -p /usr/local/share/inf/asrock 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/asrock 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 @@ -19,11 +21,24 @@ install: 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 INF/ASRock.pm /usr/local/share/inf/INF install -m 644 mibs/PowerNet-MIB.mib /usr/local/share/inf/mibs/ install -m 644 mibs/RFC1155-SMI.mib /usr/local/share/inf/mibs/ install -m 644 mibs/RFC-1212.mib /usr/local/share/inf/mibs/ install -m 644 mibs/RFC1213-MIB.mib /usr/local/share/inf/mibs/ install -m 644 mibs/RFC-1215.mib /usr/local/share/inf/mibs/ + install -m 644 asrock/JViewer-AVIStream.jar /usr/local/share/inf/asrock/ + install -m 644 asrock/JViewer-FolderRedir.jar /usr/local/share/inf/asrock/ + install -m 644 asrock/JViewer.jar /usr/local/share/inf/asrock/ + install -m 644 asrock/JViewer-OEM.jar /usr/local/share/inf/asrock/ + install -m 644 asrock/JViewer-SOC.jar /usr/local/share/inf/asrock/ + install -m 644 asrock/Linux_x86_64.jar /usr/local/share/inf/asrock/ + install -m 644 asrock/Win64.jar /usr/local/share/inf/asrock/ + install -m 644 asrock/mypolicy /usr/local/share/inf/asrock/ + install -m 644 asrock/myvtdpolicy /usr/local/share/inf/asrock/ + install -m 644 asrock/libjavacdromwrapper.so /usr/local/share/inf/asrock/ + install -m 644 asrock/libjavaclientconfwrapper.so /usr/local/share/inf/asrock/ + install -m 644 asrock/libjavaharddiskwrapper.so /usr/local/share/inf/asrock/ install -m 644 avocent/avctLinuxLib.jar /usr/local/share/inf/avocent/ install -m 644 avocent/avctMacOSXLib.jar /usr/local/share/inf/avocent/ install -m 644 avocent/avctSolarisLib.jar /usr/local/share/inf/avocent/ @@ -82,3 +97,4 @@ install: install -m 644 supermicro/1.69.37.0x0/libSharedLibrary64.so /usr/local/share/inf/supermicro/1.69.37.0x0/ install -m 644 supermicro/1.69.37.0x0/SharedLibrary32.dll /usr/local/share/inf/supermicro/1.69.37.0x0/ install -m 644 supermicro/1.69.37.0x0/SharedLibrary64.dll /usr/local/share/inf/supermicro/1.69.37.0x0/ + diff --git a/asrock/JViewer-AVIStream.jar b/asrock/JViewer-AVIStream.jar new file mode 100644 index 0000000..0c43a43 Binary files /dev/null and b/asrock/JViewer-AVIStream.jar differ diff --git a/asrock/JViewer-FolderRedir.jar b/asrock/JViewer-FolderRedir.jar new file mode 100644 index 0000000..4daae36 Binary files /dev/null and b/asrock/JViewer-FolderRedir.jar differ diff --git a/asrock/JViewer-OEM.jar b/asrock/JViewer-OEM.jar new file mode 100644 index 0000000..a99b9c2 Binary files /dev/null and b/asrock/JViewer-OEM.jar differ diff --git a/asrock/JViewer-SOC.jar b/asrock/JViewer-SOC.jar new file mode 100644 index 0000000..f068b11 Binary files /dev/null and b/asrock/JViewer-SOC.jar differ diff --git a/asrock/JViewer.jar b/asrock/JViewer.jar new file mode 100644 index 0000000..0b4641e Binary files /dev/null and b/asrock/JViewer.jar differ diff --git a/asrock/Linux_x86_64.jar b/asrock/Linux_x86_64.jar new file mode 100644 index 0000000..8ef0cb0 Binary files /dev/null and b/asrock/Linux_x86_64.jar differ diff --git a/asrock/Win64.jar b/asrock/Win64.jar new file mode 100644 index 0000000..aaf9b06 Binary files /dev/null and b/asrock/Win64.jar differ diff --git a/asrock/libjavacdromwrapper.so b/asrock/libjavacdromwrapper.so new file mode 100644 index 0000000..517d06c Binary files /dev/null and b/asrock/libjavacdromwrapper.so differ diff --git a/asrock/libjavaclientconfwrapper.so b/asrock/libjavaclientconfwrapper.so new file mode 100644 index 0000000..e668997 Binary files /dev/null and b/asrock/libjavaclientconfwrapper.so differ diff --git a/asrock/libjavaharddiskwrapper.so b/asrock/libjavaharddiskwrapper.so new file mode 100644 index 0000000..5b56b1c Binary files /dev/null and b/asrock/libjavaharddiskwrapper.so differ diff --git a/asrock/mypolicy b/asrock/mypolicy new file mode 100644 index 0000000..658c4fc --- /dev/null +++ b/asrock/mypolicy @@ -0,0 +1,8 @@ +grant { + permission java.security.AllPermission; + permission java.net.SocketPermission "*", "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/asrock/myvtdpolicy b/asrock/myvtdpolicy new file mode 100644 index 0000000..ee0dcd9 --- /dev/null +++ b/asrock/myvtdpolicy @@ -0,0 +1,10 @@ +grant { + permission java.net.SocketPermission "*", "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.*"; +}; -- cgit v1.2.3