#!/usr/bin/perl use strict; use warnings; use SOAP::Lite; #use SOAP::Lite +trace => 'all'; my $amt_host = shift; my $amt_port = "16992"; $main::amt_user = "admin"; $main::amt_pass = $ENV{'AMT_PASSWORD'}; my $amt_command = shift; $amt_command = "info" if !defined($amt_command); ######################################################################################### # data my @ps = ("S0", "S1", "S2", "S3", "S4", "S5 (soft-off)", "S4/S5", "Off"); my %rcc = ( "reset" => "16", "powerup" => "17", "powerdown" => "18", "powercycle" => "19", ); # incomplete list my %pt_status = ( 0x00 => "success", 0x01 => "internal error", 0x03 => "invalid pt mode", 0x0c => "invalid name", 0x0f => "invalid byte count", 0x10 => "not permitted", 0x17 => "max limit reached", ); ######################################################################################### # soap setup my ($nas, $sas, $rcs); sub SOAP::Transport::HTTP::Client::get_basic_credentials { return $main::amt_user => $main::amt_pass; } sub soap_init() { my $proxybase = "http://$amt_host:$amt_port"; my $schemabase = "http://schemas.intel.com/platform/client"; $nas = SOAP::Lite->new( proxy => "$proxybase/NetworkAdministrationService", default_ns => "$schemabase/NetworkAdministration/2004/01"); $sas = SOAP::Lite->new( proxy => "$proxybase/SecurityAdministrationService", default_ns => "$schemabase/SecurityAdministration/2004/01"); $rcs = SOAP::Lite->new( proxy => "$proxybase/RemoteControlService", default_ns => "$schemabase/RemoteControl/2004/01"); $rcs->autotype(0); } ######################################################################################### # functions sub usage() { print STDERR < [ ] commands: info - print some machine info (default). reset - reset machine. powerup - turn on machine. powerdown - turn off machine. powercycle - powercycle machine. Password is passed via AMT_PASSWORD environment variable. EOF } sub print_info() { printf "### AMT info on machine '%s' ###\n", $amt_host; my $amt_version = $sas->GetCoreVersion()->paramsout; printf "AMT version: %s\n", $amt_version; my $hostname = $nas->GetHostName()->paramsout; my $domainname = $nas->GetDomainName()->paramsout; printf "Hostname: %s.%s\n", $hostname, $domainname; my $powerstate = $rcs->GetSystemPowerState()->paramsout; printf "Powerstate: %s\n", $ps [ $powerstate & 0x0f ]; my @rccaps = $rcs->GetRemoteControlCapabilities()->paramsout; printf "Remote Capabilities:\n"; printf " IanaOemNumber %x\n", $rccaps[0]; printf " OemDefinedCapabilities %s%s%s%s%s\n", $rccaps[1] & 0x01 ? "IDER " : "", $rccaps[1] & 0x02 ? "SOL " : "", $rccaps[1] & 0x04 ? "BiosReflash " : "", $rccaps[1] & 0x08 ? "BiosSetup " : "", $rccaps[1] & 0x10 ? "BiosPause " : ""; printf " SpecialCommandsSupported %s%s%s%s%s\n", $rccaps[2] & 0x0100 ? "PXE-boot " : "", $rccaps[2] & 0x0200 ? "HD-boot " : "", $rccaps[2] & 0x0400 ? "HD-boot-safemode " : "", $rccaps[2] & 0x0800 ? "diag-boot " : "", $rccaps[2] & 0x1000 ? "cd-boot " : ""; printf " SystemCapabilitiesSupported %s%s%s%s\n", $rccaps[3] & 0x01 ? "powercycle " : "", $rccaps[3] & 0x02 ? "powerdown " : "", $rccaps[3] & 0x03 ? "powerup " : "", $rccaps[3] & 0x04 ? "reset " : ""; printf " SystemFirmwareCapabilities %x\n", $rccaps[4]; } sub remote_control($) { my $command = shift; my $hostname = $nas->GetHostName()->paramsout; my $domainname = $nas->GetDomainName()->paramsout; printf "host %s.%s, %s [y/N] ? ", $hostname, $domainname, $command; my $reply = <>; if ($reply =~ m/^(y|yes)$/i) { printf "execute: %s\n", $command; my $arg1 = SOAP::Data->name('Command' => $rcc{$command}); my $arg2 = SOAP::Data->name('IanaOemNumber' => 4542); my $rc = $rcs->RemoteControl($arg1, $arg2)->result; my $msg; if (!defined($rc)) { $msg = "soap failure"; } elsif (!defined($pt_status{$rc})) { $msg = "unknown pt_status code: " . $rc; } else { $msg = "pt_status: " . $pt_status{$rc}; } printf "result: %s\n", $msg; } else { printf "canceled\n"; } } ######################################################################################### # main if (!defined($amt_host)) { usage(); exit 1; } soap_init; if ($amt_command eq "info") { print_info; } elsif ($amt_command =~ m/^(reset|powerup|powerdown|powercycle)$/) { remote_control($amt_command); } else { print "unknown command: $amt_command\n"; }