DMTF-WSMan
view release on metacpan or search on metacpan
lib/DMTF/WSMan.pm view on Meta::CPAN
sub get_selectorset_xml
{
my $self=shift;
my $epr=shift;
my $selectorset='';
if(defined $epr->{SelectorSet}) {
$selectorset = " <$self->{Context}{xmlns}{wsman}{prefix}:SelectorSet>\n";
foreach my $name (keys %{$epr->{SelectorSet}}) {
$selectorset .= " <$self->{Context}{xmlns}{wsman}{prefix}:Selector Name=\"$name\">";
if(ref($epr->{SelectorSet}{$name}) eq 'HASH') {
$selectorset .= $self->epr_to_xml($epr->{SelectorSet}{$name});
}
else {
$selectorset .= _XML_escape($epr->{SelectorSet}{$name});
}
$selectorset .= "</$self->{Context}{xmlns}{wsman}{prefix}:Selector>\n";
}
$selectorset .= " </$self->{Context}{xmlns}{wsman}{prefix}:SelectorSet>\n";
}
$selectorset = "\n$selectorset" if($selectorset ne '');
return $selectorset;
}
sub epr_to_xml
{
my $self=shift;
my $epr=shift;
my $selectorset=$self->get_selectorset_xml($epr);
return <<EOF;
<$self->{Context}{xmlns}{addressing}{prefix}:EndpointReference>
<$self->{Context}{xmlns}{addressing}{prefix}:Address>http://$self->{Context}{host}:$self->{Context}{port}/wsman</$self->{Context}{xmlns}{addressing}{prefix}:Address>
<$self->{Context}{xmlns}{addressing}{prefix}:ReferenceParameters>
<$self->{Context}{xmlns}{wsman}{prefix}:ResourceURI>$epr->{ResourceURI}</$self->{Context}{xmlns}{wsman}{prefix}:ResourceURI>
$selectorset
</$self->{Context}{xmlns}{addressing}{prefix}:ReferenceParameters>
</$self->{Context}{xmlns}{addressing}{prefix}:EndpointReference>
EOF
}
################
# Non-exported #
################
sub _XML_escape
{
my $val=shift;
$val=~s/&/&/g;
$val=~s/</</g;
$val=~s/"/"/g;
$val=~s/'/'/g;
return $val;
}
sub _request
{
my $self=shift;
my $postdata=shift;
my $req = HTTP::Request->new(POST => $self->{Context}{protocol}."://$self->{Context}{host}:$self->{Context}{port}/wsman");
$req->header('Content-Type', 'application/soap+xml;charset=UTF-8');
$req->header('Content-Length', length $postdata); # Not really needed
$req->content($postdata);
return $self->_authenticated_request($req);
}
sub _genheaders
{
my $self=shift;
my $action=shift;
my $epr=shift;
my $selectorset=$self->get_selectorset_xml($epr);
my $postdata="<$self->{Context}{xmlns}{soap}{prefix}:Envelope";
foreach my $ns (keys %{$self->{Context}{xmlns}}) {
$postdata .= "\n xmlns:$self->{Context}{xmlns}{$ns}{prefix}=\"$self->{Context}{xmlns}{$ns}{uri}\"";
}
$postdata .= ">\n";
my $uuid=$self->{UUID}->create_str();
$postdata .= <<ENDOFREQUEST;
<$self->{Context}{xmlns}{soap}{prefix}:Header>
<$self->{Context}{xmlns}{addressing}{prefix}:To>$self->{Context}{protocol}://$self->{Context}{host}:$self->{Context}{port}/wsman</$self->{Context}{xmlns}{addressing}{prefix}:To>
<$self->{Context}{xmlns}{wsman}{prefix}:ResourceURI s:mustUnderstand="true">$epr->{ResourceURI}</$self->{Context}{xmlns}{wsman}{prefix}:ResourceURI>
<$self->{Context}{xmlns}{addressing}{prefix}:ReplyTo>
<$self->{Context}{xmlns}{addressing}{prefix}:Address $self->{Context}{xmlns}{soap}{prefix}:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</$self->{Context}{xmlns}{addressing}{prefix}:Address>
</$self->{Context}{xmlns}{addressing}{prefix}:ReplyTo>
<$self->{Context}{xmlns}{addressing}{prefix}:Action $self->{Context}{xmlns}{soap}{prefix}:mustUnderstand="true">$action</$self->{Context}{xmlns}{addressing}{prefix}:Action>
<$self->{Context}{xmlns}{addressing}{prefix}:MessageID>uuid:$uuid</$self->{Context}{xmlns}{addressing}{prefix}:MessageID>$selectorset
</$self->{Context}{xmlns}{soap}{prefix}:Header>
ENDOFREQUEST
return($postdata);
}
sub _authenticated_request
{
my $self=shift;
my $req=shift;
if(defined $self->{challenge_str}) {
my $challenge=$self->{challenge_str};
$challenge =~ tr/,/;/; # "," is used to separate auth-params!!
($challenge) = HTTP::Headers::Util::split_header_words($challenge);
$challenge = { @$challenge }; # make rest into a hash
for (keys %$challenge) { # make sure all keys are lower case
$challenge->{lc $_} = delete $challenge->{$_};
}
my $res;
if(exists $challenge->{digest}) {
$res=LWP::Authen::Digest->authenticate($self->{RA}, undef, $challenge, undef, $req, undef, undef);
}
elsif(exists $challenge->{basic}) {
$res=LWP::Authen::Basic->authenticate($self->{RA}, undef, $challenge, undef, $req, undef, undef);
}
else {
$res=$self->{RA}->request($req);
}
if($res->code == 401) {
$self->{challenge_str}=$res->www_authenticate;
$res=$self->_authenticated_request($req);
( run in 0.739 second using v1.01-cache-2.11-cpan-5837b0d9d2c )