API-Plesk

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

    - Fixed bug in service_plan->get method

2.00_3 2011-08-01

    - Added site-alias component
    - Fixed add and set webspace
    - Added tests
    - Fixed site component
    - Added sitebuilder component
    - Added ftp-user component
    - Fixed hosting ftp_password bug
    - Added dns component 
    - Added mail component
    - Fixed is_connection_error function
    - Added set and del opetations to service-plan
    - Added test of service-plan component
    - Reformated Changes
    - Fixed Pod

2.00_2 2011-05-16
    

README  view on Meta::CPAN

NAME
    API::Plesk - OO interface to the Plesk XML API
    (http://www.parallels.com/en/products/plesk/).

SYNOPSIS
        use API::Plesk;

        my $api = API::Plesk->new(
            username    => 'user', # required
            password    => 'pass', # required
            url         => 'https://127.0.0.1:8443/enterprise/control/agent.php', # required
            api_version => '1.6.3.1',
            debug       => 0,
            timeout     => 30,
        );

        my $res = $api->customer->get();

        if ($res->is_success) {
            for ( @{$res->data} ) {

README  view on Meta::CPAN

    API::Plesk::WebUser

COMPATIBILITY WITH VERSION 1.*
    This is develover release. Comapatibility with Plesk::API 1.* is not
    implemented yet.

METHODS
    new(%params)
       Create new class instance.

       Required params: username password url

       Additional params: api_version - default 1.6.3.1 debug - default 0
       timeout - default 30 sec.

    send($operator, $operation, $data, %params)
       This method prepare and sends request to Plesk API.

       Returns API::Plesk::Response object.

       $operator - name of operator XML section of Plesk API.

lib/API/Plesk.pm  view on Meta::CPAN

    Domains  => [['1.5.0.0', 'Domains']],
);

# constructor
sub new {
    my $class = shift;
    $class = ref ($class) || $class;

    my $self = {
        username    => '',
        password    => '',
        secret_key  => '',
        url         => '',
        api_version => '1.6.3.1',
        debug       => 0,
        timeout     => 30,
        (@_)
    };

    if (!$self->{secret_key}) {
        confess "Required username!" unless $self->{username};
        confess "Required password!" unless $self->{password};
    }
    confess "Required url!"      unless $self->{url};

    return bless $self, $class;
}

# sends request to Plesk API
sub send {
    my ( $self, $operator, $operation, $data, %params ) = @_;

lib/API/Plesk.pm  view on Meta::CPAN

    # HTTP::Request undestends only bytes
    utf8::encode($xml) if utf8::is_utf8($xml);

    my $ua = new LWP::UserAgent( parse_head => 0 );
    my $req = new HTTP::Request POST => $self->{url};

    if ($self->{secret_key}) {
        $req->push_header(':KEY',  $self->{secret_key});
    } else {
        $req->push_header(':HTTP_AUTH_LOGIN',  $self->{username});
        $req->push_header(':HTTP_AUTH_PASSWD', $self->{password});
    }
    $req->content_type('text/xml; charset=UTF-8');
    $req->content($xml);

    # LWP6 hack to prevent verification of hostname
    $ua->ssl_opts(verify_hostname => 0) if $ua->can('ssl_opts');

    warn $req->as_string   if defined $self->{debug}  &&  $self->{debug} > 1;

    my $res = eval {

lib/API/Plesk.pm  view on Meta::CPAN

=head1 NAME

API::Plesk - OO interface to the Plesk XML API (http://www.parallels.com/en/products/plesk/).

=head1 SYNOPSIS

    use API::Plesk;

    my $api = API::Plesk->new(
        username    => 'user', # required
        password    => 'pass', # required
        url         => 'https://127.0.0.1:8443/enterprise/control/agent.php', # required
        api_version => '1.6.3.1',
        debug       => 0,
        timeout     => 30,
    );

    my $res = $api->customer->get();

    if ($res->is_success) {
        for ( @{$res->data} ) {

lib/API/Plesk.pm  view on Meta::CPAN

=head1 METHODS

=over 3

=item new(%params)

Create new class instance.

Required params:
username
password
url

Additional params:
api_version - default 1.6.3.1
debug       - default 0
timeout     - default 30 sec.

=item send($operator, $operation, $data, %params)

This method prepare and sends request to Plesk API.

lib/API/Plesk/Component.pm  view on Meta::CPAN

    }

    my $hosting = $params->{hosting};
    my $type = delete $hosting->{type};
    my $ip = delete $hosting->{ip_address};
    
    #confess "Required ip_address" unless $ip;
    
    if ( $type eq 'vrt_hst' ) {

        $self->check_required_params($hosting, qw(ftp_login ftp_password));

        my @properties;
        for my $key ( sort keys %$hosting ) {
            push @properties, { property => [
                {name => $key}, 
                {value => $hosting->{$key}} 
            ]};
            delete $hosting->{$key};
        }
        push(@properties, { ip_address => $ip }) if $ip;

lib/API/Plesk/Database.pm  view on Meta::CPAN

    };

    return $bulk_send ? $data : 
        $self->plesk->send('database', 'del-db', $data);
}

sub add_db_user {
    my ( $self, %params ) = @_;
    my $bulk_send = delete $params{bulk_send};

    $self->check_required_params(\%params, qw(db-id login password));

    my $data = $self->sort_params(\%params, qw(db-id login password));
 
    return $bulk_send ? $data : 
        $self->plesk->send('database', 'add-db-user', $data);
}

sub del_db_user {
    my ($self, %filter) = @_;
    my $bulk_send = delete $filter{bulk_send};

    my $data = {

lib/API/Plesk/FTPUser.pm  view on Meta::CPAN


use base 'API::Plesk::Component';

#TODO
sub add {
    my ( $self, %params ) = @_;
    my $bulk_send = delete $params{bulk_send};

    my @sort_fields = (
        'name',
        'password',
        'home',
        'create_non_existent',
        'quota',
        'permissions',
        [qw(site-id site-name)],        
    );
    my @required_fields = (
        'name',
        'password',
        [qw(site-id site-name)],        
    );

    $self->check_required_params(\%params, @required_fields);
    
    my $data = $self->sort_params(\%params, @sort_fields);

    return $bulk_send ? $data : 
        $self->plesk->send('ftp-user', 'add', $data);
}

lib/API/Plesk/FTPUser.pm  view on Meta::CPAN

        $self->plesk->send('ftp-user', 'get', $data);
}

sub set {
    my ( $self, %params ) = @_;
    my $bulk_send = delete $params{bulk_send}; 
    my $filter    = delete $params{filter} || '';
   
     my @sort_fields = (
        'name',
        'password',
        'home',
        'create_non_existent',
        'quota',
        'permissions',
    );

    my $data = {
        filter  => $filter,
        values  => $self->sort_params(\%params, @sort_fields),
    };

lib/API/Plesk/Mock.pm  view on Meta::CPAN

=head1 NAME

API::Plesk::Mock - Module for testing API::Plesk without sending real requests to Plesk API.

=head1 SYNOPSIS

    use API::Plesk::Mock;

    my $api = API::Plesk::Mock->new(
        username    => 'user', # required
        password    => 'pass', # required
        url         => 'https://127.0.0.1:8443/enterprise/control/agent.php', # required
        api_version => '1.6.3.1',
        debug       => 0,
        timeout     => 30,
    );
    $api->mock_response($some_response_xml);
    $api->mock_error($some_error_text);

=head1 DESCRIPTION

lib/API/Plesk/WebUser.pm  view on Meta::CPAN


use base 'API::Plesk::Component';

#TODO
sub add {
    my ( $self, %params ) = @_;
    my $bulk_send = delete $params{bulk_send};

    $self->check_required_params(\%params, qw(site-id login));

    my $data = $self->sort_params(\%params, qw(site-id login password password-type ftp-quota services));

    return $bulk_send ? $data : 
        $self->plesk->send('webuser', 'add', $data);
}

sub get {
    my ($self, %filter) = @_;
    my $bulk_send = delete $filter{bulk_send};

    my $data = { 

lib/API/Plesk/WebUser.pm  view on Meta::CPAN

        $self->plesk->send('webuser', 'get-prefs', $data);
}

sub set {
    my ( $self, %params ) = @_;
    my $bulk_send = delete $params{bulk_send}; 
    my $filter    = delete $params{filter} || '';
    
    my $data = {
        filter  => $filter,
        values  => $self->sort_params(\%params, qw(password password-type ftp-quota services)),
    };

    return $bulk_send ? $data : 
        $self->plesk->send('webuser', 'set', $data);
}

sub del {
    my ($self, %filter) = @_;
    my $bulk_send = delete $filter{bulk_send}; 

t/TestData.pm  view on Meta::CPAN


my $online_plesk_url = 'https://127.0.0.1:8443/enterprise/control/agent.php';

our $online_manual_created_template_name = $ENV{'template_name'};
our $online_manual_created_template_id  = $ENV{'template_id'};
our $online_new_tariff_name = $ENV{'new_tariff'};

our %online_plesk_valid_params = (
    api_version   => $ENV{'plesk_api_version'}  || '1.5.0.0',
    username      => $ENV{'plesk_username'}     || 'admin',
    password      => $ENV{'plesk_password'}     || 'qwerty',
    url           => $ENV{'plesk_url'}          || $online_plesk_url,
    debug         => '',
);

# END online  configs

our $test_user_data =  { 
    pname   => 'pavel', 
    login   => 'pav_perl',
    passwd  => 'password',
    phone   => '8 555 1111111',
    email   => 'nrg@nrg.name',
    country => 'RU'                 # optional field
};


our $stress_test_data = {
    pname => [ # 1 .. 60 symbols 
        'pavel',
        '2342134123412',

t/TestData.pm  view on Meta::CPAN

    ],
};



my $plesk_url = 'https://192.168.1.1:8443/enterprise/control/agent.php';

our %plesk_valid_params = (
    api_version   => '1.6.3.0',
    username      => 'admin',
    password      => 'qwerty',
    url           => $plesk_url,
    debug         => 0,
);


my $manual_created_template_name = $ENV{'template_name'} || 'name';
my $manual_created_template_id = $ENV{'template_id'} || 1;


sub iterate {

t/TestData.pm  view on Meta::CPAN

    my $checked = shift;
    my $template = shift;

    return '' unless ref $checked eq 'HASH' &&  ref $template eq 'HASH';
    
    foreach my $key (keys %$template) {
        my $key_name_from;  # field name in response from Plesk
        my $key_name_to;    # field name  

        # in request to Plesk field named "passwd"
        # in response from Plesk -- it named "password" :(

        if ($key =~ /pass/) {

            $key_name_from  = 'password';
            $key_name_to    = 'passwd';

        } else {
            $key_name_to = $key_name_from = $key;
        }

        if ($checked->{$key_name_from}) {
            return '' unless $template->{$key_name_to} eq 
                             $checked->{$key_name_from};
        } else {

t/compoment.t  view on Meta::CPAN

        {key3 => 3},
        {key  => 1},
    ]
);

eval {
    $c->check_hosting({
        hosting => {
            type => 'vrt_hst',
            ftp_login => 'ert',
            ftp_password => '123',
            ip_address => '12.34.56.78',
        }
    })
};
ok(!$@);

eval {
    $c->check_hosting({
        hosting => {
            type => 'vrt_hst',
            ftp_login => 'ert',
            ftp_password => '123',
        }
    })
};
ok(!$@);

eval {
    $c->check_hosting({
        hosting => {
            type => 'vrt_ht',
            ftp_login => 'ert',
            ftp_password => '123',
        }
    })
};
like($@, qr/Unknown hosting type!/); 

is_deeply(
    $c->prepare_filter({id => [qw(1 2 3)], name => 'id'}, sort_keys => [qw(id name)]),
    [
        { id => 1 },
        { id => 2 },

t/database.t  view on Meta::CPAN

    ),
    { 
        filter => {name => 'test_db'},
    },
    'del_db'
);
is_deeply(
    $api->database->add_db_user(
        'db-id'   => 1,
        login     => 'test_db_user',
        password  => '12345',
        bulk_send => 1
    ),
    [ 
        {'db-id'   => 1},
        {login     => 'test_db_user'},
        {password  => '12345'},
    ],
    'add_db_user'
);
 is_deeply(
    $api->database->del_db_user(
        'db-id' => 1,
        bulk_send => 1
    ),
    {
        filter => {'db-id' => 1} 

t/plesk.t  view on Meta::CPAN

is ( $api->render_xml({ prop => [
    {value1 => '0'},
    {value2 => ''},
    {value3 => undef},
]}), '<?xml version="1.0" encoding="UTF-8"?><packet version="1.6.3.0"><prop><value1>0</value1><value2/><value3/></prop></packet>', 'render_xml');
# compoments

$api = API::Plesk->new(
    api_version   => '1.6.3.1',
    username      => 'admin',
    password      => 'qwerty',
    url           => 'https://12.34.56.78',
);
my %pkgs = (
    customer => 'API::Plesk::Customer',
    webspace => 'API::Plesk::Webspace',
);
for my $accessor ( keys %pkgs ) {
    isa_ok($api->$accessor(), $pkgs{$accessor}, "$accessor component");
}

t/service-plan.t  view on Meta::CPAN

my $api = API::Plesk->new( %TestData::plesk_valid_params );

isa_ok($api->service_plan, 'API::Plesk::ServicePlan');

is_deeply(
    $api->service_plan->set(
        filter => { name => '123' },
        hosting     => {
            type       => 'vrt_hst',
            ftp_login  => '123',
            ftp_password => '123',
            ip_address => '123',
        },
        limits => '',
        bulk_send   => 1,
    ),
    [
        { filter => { name => '123' } },
        { limits => '' },
        {
            hosting     => {
                vrt_hst => [
                    { property => [ {name => 'ftp_login'}, {value  => '123'} ] },
                    { property => [ {name => 'ftp_password'}, {value => '123'} ] },
                    { ip_address => '123' },
                ]
            },
        },
    ],
    'set'
);

is_deeply(
    $api->service_plan->del(

t/site.t  view on Meta::CPAN

is_deeply(
    $api->site->set(
        filter => {name => 'test.ru'},
        gen_setup => {
            name => 'test.ru',
        },
        hosting => {
            type => 'vrt_hst',
            ip_address => '12.34.56.78',
            ftp_login => 'qwerty',
            ftp_password => '12345',
            ip_address => '12.34.56.78',
        },
        bulk_send => 1
    ),
    {
        filter => {name => 'test.ru'},
        values => [
            {gen_setup => {
                name => 'test.ru',
            }},
            {hosting => {
                vrt_hst => [
                    { property => [
                        {name => 'ftp_login'},
                        {value => 'qwerty'}
                    ]},
                    { property => [
                        {name => 'ftp_password'},
                        {value => '12345'}
                    ]},
                    {ip_address => '12.34.56.78'},
                ]
            }}
        ]

    },
    'set'
);

t/webspace.t  view on Meta::CPAN

    $api->webspace->add(
        'plan-name' => '123',
        gen_setup   => {
            name          => '123',
            ip_address    => '123',
            'owner-login' => '123',
        },
        hosting     => {
            type       => 'vrt_hst',
            ftp_login  => '123',
            ftp_password => '123',
            ip_address => '123',
        },
        prefs => { www => 'true' },
        bulk_send   => 1,
    ),
    [
        {
            gen_setup   => [
                {name          => '123'},
                {'owner-login' => '123'},
                {ip_address    => '123'},
            ],
        },
        {
            hosting     => {
                vrt_hst => [
                    { property => [ {name => 'ftp_login'}, {value  => '123'} ] },
                    { property => [ {name => 'ftp_password'}, {value => '123'} ] },
                    { ip_address => '123' },
                ]
            },
        },
        {   prefs => { www => 'true' } },
        { 'plan-name' => '123' },
    ],
    'add'
);

t/webspace.t  view on Meta::CPAN

    $api->webspace->set(
        filter => { name => '123' },
        gen_setup   => {
            name          => '123',
            ip_address    => '123',
            'owner-login' => '123',
        },
        hosting     => {
            type       => 'vrt_hst',
            ftp_login  => '123',
            ftp_password => '123',
            ip_address => '123',
        },
        prefs => { www => 'true' },
        bulk_send   => 1,
    ),
    [
        { filter => { name => '123' } },
        { values => [
            {
                gen_setup   => [
                    {name          => '123'},
                    {'owner-login' => '123'},
                    {ip_address    => '123'},
                ],
            },
            {
                hosting     => {
                    vrt_hst => [
                        { property => [ {name => 'ftp_login'}, {value  => '123'} ] },
                        { property => [ {name => 'ftp_password'}, {value => '123'} ] },
                        { ip_address => '123' },
                    ]
                },
            },
            { prefs => { www => 'true' } },
       ]},
    ],
    'set'
);



( run in 0.675 second using v1.01-cache-2.11-cpan-49f99fa48dc )