API-CPanel
view release on metacpan or search on metacpan
--- #YAML:1.0
name: API-CPanel
version: 0.09
abstract: interface to the CPanel Hosting Panel API ( http://cpanel.net )
author:
- Konstantin Vlasov <knvlasov@reg.ru>
license: unknown
distribution_type: module
configure_requires:
ExtUtils::MakeMaker: 0
build_requires:
ExtUtils::MakeMaker: 0
requires:
Data::Dumper: 0
Exporter::Lite: 0
lib/API/CPanel.pm view on Meta::CPAN
use MIME::Base64;
# Main packages
use API::CPanel::Ip;
use API::CPanel::User;
use API::CPanel::Misc;
use API::CPanel::Package;
use API::CPanel::Domain;
use API::CPanel::Mysql;
our @EXPORT = qw/get_auth_hash refs is_success query_abstract is_ok get_error/;
our @EXPORT_OK = qw//;
our $VERSION = 0.09;
our $DEBUG = '';
our $FAKE_ANSWER = '';
=head1 NAME
API::CPanel - interface to the CPanel Hosting Panel API ( http://cpanel.net )
=head1 SYNOPSIS
use API::CPanel;
my $connection_params = {
auth_user => 'username',
auth_passwd => 'qwerty',
host => '11.22.33.44',
};
### Get all panel IP
my $ip_list = API::CPanel::ip::list( $connection_params );
unless ($ip_list && ref $ip_list eq 'ARRAY' && scalar @$ip_list) {
die 'Cannot get ip list from CPanel';
}
lib/API/CPanel.pm view on Meta::CPAN
my $query_path = ( $allow_http ? 'http' : 'https' ) . "://$host:2087/$path/$func";
return %$params ? $query_path . '?' . mk_query_string( $params ) : $query_path;
}
# Make request to server and get answer
# STATIC (STRING: query_string)
sub mk_query_to_server {
my $auth_hash = shift;
my $query_string = shift;
return '' unless ( $query_string && $auth_hash );
warn "Auth hash: $auth_hash\nQuery string: $query_string\n" if $DEBUG;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new( GET => $query_string );
$request->header( Authorization => $auth_hash );
my $response = $ua->request( $request );
my $content = $response->content;
if ($response->header('content-type') eq 'text/xml') {
warn $content if $DEBUG;
return $content;
} else {
return '';
}
}
lib/API/CPanel.pm view on Meta::CPAN
warn Dumper $deparsed if $DEBUG;
return $deparsed ? $deparsed : '';
}
# Get + deparse
# STATIC(STRING: query_string)
sub process_query {
my %params = @_;
my $auth_hash = $params{auth_hash};
my $query_string = $params{query_string};
my $xml_parser_params = $params{parser_params} || '';
my $fake_answer = $API::CPanel::FAKE_ANSWER || '';
return '' unless $query_string;
my $answer = $fake_answer ? $fake_answer : mk_query_to_server( $auth_hash, $query_string );
warn $answer if $answer && $DEBUG;
return $answer ?
parse_answer(
answer => $answer,
parser_params => $xml_parser_params
) : '';
}
# Filter hash
lib/API/CPanel.pm view on Meta::CPAN
};
}
return $new_hash;
}
# Get access key, time to live -- 30 minutes
# STATIC(HASHREF: params_hash)
# params_hash:
# - all elements from mk_full_query_string +
# - auth_user*
# - auth_passwd*
sub get_auth_hash {
my %params_raw = @_;
warn 'get_auth_hash params: ' . Dumper(\%params_raw) if $DEBUG;
my $params = filter_hash(
\%params_raw,
[ 'auth_user', 'auth_passwd' ]
);
# Check this sub params
unless ($params->{auth_user} && $params->{auth_passwd}) {
return '';
}
return "Basic " . MIME::Base64::encode( $params->{auth_user} . ":" . $params->{auth_passwd} );
}
# Wrapper for "ref" on undef value, without warnings :)
# Possible very stupid sub :)
# STATIC(REF: our_ref)
sub refs {
my $ref = shift;
return '' unless $ref;
lib/API/CPanel.pm view on Meta::CPAN
$data_block->{status} eq '1' ) ||
( $data_block->{result} &&
$data_block->{result} eq '1' ))
) {
return 1;
} else {
return $want_hash ? {} : '';
}
}
# all params derived from get_auth_hash
sub query_abstract {
my %params = @_;
my $params_raw = $params{params};
my $func_name = $params{func};
my $container = $params{container};
my $fields = $params{allowed_fields} || '';
my $allowed_fields;
warn 'query_abstract ' . Dumper( \%params ) if $DEBUG;
return '' unless $params_raw && $func_name;
$fields = "host path allow_http auth_user auth_passwd container $fields";
@$allowed_fields = split(' ', $fields);
my $xml_parser_params = $params{parser_params};
my $auth_hash = get_auth_hash( %$params_raw );
warn "Auth_hash: $auth_hash\n" if $DEBUG;
if ( $auth_hash ) {
my $params = filter_hash( $params_raw, $allowed_fields );
my $query_string = mk_full_query_string( {
func => $func_name,
%$params,
} );
warn Dumper $query_string if $DEBUG;
my $server_answer = process_query(
auth_hash => $auth_hash,
query_string => $query_string,
parser_params => $xml_parser_params,
);
warn Dumper $server_answer if $DEBUG;
if ( $server_answer &&
$container &&
is_ok( $server_answer->{$container} )
) {
$API::CPanel::last_answer = $server_answer->{$container};
lib/API/CPanel.pm view on Meta::CPAN
! $container ) {
$API::CPanel::last_answer = $server_answer;
return $server_answer;
}
else {
$API::CPanel::last_answer = $server_answer;
warn "wrong server answer" if $DEBUG;
return '';
};
} else {
$API::CPanel::last_answer = 'auth_hash not found';
warn "auth_hash not found" if $DEBUG;
return '';
}
}
# Abstract sub for action methods
sub action_abstract {
my %params = @_;
my $result = query_abstract(
params => $params{params},
t/01-test.t view on Meta::CPAN
use strict;
use warnings;
use lib qw( ./lib );
use Data::Dumper;
our $ONLINE;
BEGIN {
#$ENV{auth_user} = 'restest';
#$ENV{auth_passwd} = '123';
#$ENV{host} = '192.168.123.1';
$ONLINE = $ENV{auth_user} && $ENV{auth_passwd} && $ENV{host};
}
my $manipulate_user = 'zsezse';
use Test::More tests => $ONLINE ? 61 : 61;
my $test_host = $ENV{host} || '127.0.0.1';
ok(1, 'Test OK');
use_ok('API::CPanel');
t/01-test.t view on Meta::CPAN
} ),
"https://$test_host:2087/xml-api/test?param1=val1¶m2=val2",
$a
);
$a = 'mk_query_to_server';
is( API::CPanel::mk_query_to_server( '' ), '', $a );
my %correct_params = (
auth_user => $ENV{auth_user} || 'fake',
auth_passwd => $ENV{auth_passwd} || 'fake_pass',
host => $test_host,
);
$API::CPanel::FAKE_ANSWER = ! $ONLINE ? <<THEEND : undef;
<listips>
<result>
( run in 0.661 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )