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/ASRock.pm | 303 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 INF/ASRock.pm (limited to 'INF') 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; + -- cgit v1.2.3