view release on metacpan or search on metacpan
Revision history for Perl extension API::DirectAdmin.
0.09 Jun 12 2013 Andrey Kuzmin
-- Fix Bug #85672 https://rt.cpan.org/Public/Bug/Display.html?id=85672
-- Fix Bug #79514 https://rt.cpan.org/Public/Bug/Display.html?id=79514
0.08 Aug 18 2012 Andrey Kuzmin
-- Add Modern::Perl to requires
-- Fix POD
0.07 Jun 05 2012 Andrey Kuzmin
-- Add function show_user_config
-- Add Modern::Perl '2010' to requirements
-- fix README
0.06 Jan 29 2012 Andrey Kuzmin
-- Add 'list' and 'deldb' methods to API::DirectAdmin::Mysql
-- rewrite all 'list' methods
To install this module type the following:
perl Makefile.PL
make
make test
make install
DEPENDENCIES
This module requires these other modules and libraries:
Modern::Perl
LWP::UserAgent
HTTP::Request
URI
Carp
Data::Dumper
COPYRIGHT AND LICENCE
Copyright (C) 2012 by Andrey "Chips" Kuzmin <chipsoid@cpan.org>
lib/API/DirectAdmin.pm view on Meta::CPAN
# Make query string
# STATIC(HASHREF: params)
sub mk_query_string {
my ($self, $params) = @_;
return '' unless ref $params eq 'HASH' && scalar keys %$params;
my %params = %$params;
my $result = join '&', map { "$_=$params{$_}" } sort keys %params;
return $result;
}
# Get + deparse
# STATIC(STRING: query_string)
sub process_query {
my ( $self, %params ) = @_;
my $query_string = $params{query_string};
my $method = $params{method};
lib/API/DirectAdmin.pm view on Meta::CPAN
confess "Unknown request method: '$method'";
}
confess "URL is empty" unless $url;
my $content;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new( $method, $url );
if ( $method eq 'GET' ) {
my $response = $ua->request( $request );
$content = $response->content;
}
else { # Temporary URL for making request
my $temp_uri = URI->new('http:');
$temp_uri->query_form( $params );
$request->content( $temp_uri->query );
$request->content_type('application/x-www-form-urlencoded');
my $response = $ua->request($request);
$content = $response->content;
}
warn "Answer: " . $content if $self->{debug};
return $content if $params->{noparse};
return $self->parse_answer($content);
}
# Parse answer
sub parse_answer {
my ($self, $response) = @_;
return '' unless $response;
my %answer;
$response =~ s/<br>|&#\d+//ig; # Some trash from answer
$response =~ s/\n+/\n/ig;
my @params = split /&/, $response;
foreach my $param ( @params ) {
my ($key, $value) = split /=/, $param;
if ( $key =~ /(.*)\[\]/ ) { # lists
push @{ $answer{$1} }, $value;
}
else {
$answer{$key} = $value;
}
}
lib/API/DirectAdmin.pm view on Meta::CPAN
unless ($ip_list && ref $ip_list eq 'ARRAY' && scalar @$ip_list) {
die 'Cannot get ip list from DirectAdmin';
}
my $ip = $ip_list->[0];
my $dname = 'reg.ru';
my $user_name = 'user1';
my $email = 'user1@example.com';
my $package = 'newpackage';
my $client_creation_result = $da->user->create( {
username => $user_name,
passwd => 'user_password',
passwd2 => 'user_password',
domain => $dname,
email => $email,
package => $package,
ip => $ip,
});
# Switch off account:
my $suspend_result = $da->user->disable( {
select0 => $user_name,
} );
if ( $suspend_result->{error} == 1 ) {
die "Cannot suspend account $suspend_result->{text}";
}
# Switch on account
my $resume_result = $da->user->enable( {
select0 => $user_name,
} );
if ( $resume_result->{error} == 1 ) {
die "Cannot Resume account $resume_result->{text}";
}
# Delete account
my $delete_result = $da->user->delete( {
select0 => $user_name,
} );
if ( $delete_result->{error} == 1 ) {
die "Cannot delete account $delete_result->{text}";
}
# Custom request
my %params = (
action => 'package',
package => 'package_name',
user => 'username',
);
my $responce = $da->query(
command => 'CMD_API_MODIFY_USER',
method => 'POST',
params => \%params,
allowed_fields => 'action
package
user',
);
=head1 PUBLIC METHODS
lib/API/DirectAdmin.pm view on Meta::CPAN
Example:
my $users_list = $da->users->list();
=item create
Create a new user in DirectAdmin panel.
Example:
my $result = $da->user->create( {
username => 'username',
passwd => 'user_password',
passwd2 => 'user_password',
domain => 'example.com',
email => 'email@example.com',
package => 'package_name',
ip => 'IP.ADD.RE.SS',
});
=item delete
Delete DirectAdmin user and all user's data
Note: Some DirectAdmin's API methods required parameter "select0" for choose value from list. Like list of users, databases, ip, etc.
Example:
my $result = $da->user->delete( {
select0 => 'username',
} );
=item disable/enable
Two different methods for disable and enable users with same params.
Example:
my $disable_result = $da->user->disable( {
select0 => 'username',
} );
my $enable_result = $da->user->enable( {
select0 => 'username',
} );
=item change_password
Change password for user
Example:
my $result = $da->user->change_password( {
username => 'username',
passwd => 'new_password',
passwd2 => 'new_password',
} );
=item change_package
Change package (tariff plan) for user
Example:
my $result = $da->user->change_package( {
username => 'username',
package => 'new_package',
} );
=item show_packages
Return list of available packages.
Note: If you created packages through administrator user - you must use admin's login and password for authorisation. Obviously, if packages was created by reseller user - use reseller authorisation.
Example:
my $packages = $da->user->show_packages();
=item show_user_config
Return all user settings.
Example:
lib/API/DirectAdmin.pm view on Meta::CPAN
my %auth = (
auth_user => 'admin_name|customer_name',
auth_passwd => 'admin_passwd',
host => '11.22.33.44',
);
# init
my $da = API::DirectAdmin->new(%auth);
$result = $da->domain->add({
domain => 'newdomain.com',
php => 'ON',
cgi => 'ON',
});
=back
=head2 API::DirectAdmin::Mysql
Control users mysql databases
lib/API/DirectAdmin.pm view on Meta::CPAN
my %auth = (
auth_user => 'admin_name|customer',
auth_passwd => 'admin_passwd',
host => '11.22.33.44',
);
# init
my $da = API::DirectAdmin->new(%auth);
my $result = $da->mysql->adddb( {
name => 'default', # will be 'customer_default'
user => 'default', # will be 'customer_default'
passwd => 'password',
passwd2 => 'password',
} );
=item deldb
Delete selected database from user.
Example:
my $result = $da->mysql->deldb({ select0 => 'database_name' });
=back
=head2 API::DirectAdmin::Ip
=over
=item list
Return array reference of list ip adresses;
Example:
my $ip_list = $da->ip->list();
=item add
Add IP address to server config
Example:
my $result = $da->ip->add({
ip => '123.234.123.234',
status => 'server',
});
=item remove
Remove ip from server
Example:
my $result = $da->ip->remove({
select0 => '123.234.123.234',
});
=back
=head2 API::DirectAdmin::DNS
Show zones, add and remove records.
=over
lib/API/DirectAdmin.pm view on Meta::CPAN
Example:
$da->dns->dumpzone( {domain => 'domain.com'} );
=item add_record
Add zone record to dns for domain. Available types of records: A, AAAA, NS, MX, TXT, PTR, CNAME, SRV
Example:
my $result = $da->dns->add_record({
domain => 'domain.com',
type => 'A',
name => 'subdomain', # will be "subdomain.domain.com." in record
value => '127.127.127.127',
});
Example with MX record:
my $result = $da->dns->add_record( {
domain => 'domain.com',
type => 'MX',
name => 'mx1',
value => 10,
} );
=item remove_record
Remove record from domain zone
Example:
my $result = $da->dns->remove_record({
domain => 'domain.com',
type => 'A',
name => 'subdomain',
value => '127.127.127.127',
});
Example with MX record:
my $result = $da->dns->remove_record({
domain => 'domain.com',
type => 'mx',
name => 'mx1',
value => 10,
});
=back
=head1 INSTALLATION
To install this module type the following:
perl Makefile.PL
make
make test
make install
=head1 DEPENDENCIES
This module requires these other modules and libraries:
Modern::Perl
LWP::UserAgent
HTTP::Request
URI
Carp
Data::Dumper
=head1 COPYRIGHT AND LICENCE
Copyright (C) 2012-2013 by Andrey "Chips" Kuzmin <chipsoid@cpan.org>
lib/API/DirectAdmin/Domain.pm view on Meta::CPAN
use base 'API::DirectAdmin::Component';
our $VERSION = 0.05;
# Return domains list
# INPUT
# connection data for USER, not admin
sub list {
my ($self ) = @_;
my $responce = $self->directadmin->query(
command => 'CMD_API_SHOW_DOMAINS',
);
return $responce->{list} if ref $responce eq 'HASH';
return [];
}
# Add Domain to user account
# params: domain, php (ON|OFF), cgi (ON|OFF)
sub add {
my ($self, $params ) = @_;
my %add_params = (
action => 'create',
);
my %params = (%$params, %add_params);
#warn 'params ' . Dumper(\%params) if $DEBUG;
my $responce = $self->directadmin->query(
params => \%params,
command => 'CMD_API_DOMAIN',
method => 'POST',
allowed_fields =>
'action
domain
php
cgi',
);
warn 'responce ' . Dumper(\$responce) if $self->{debug};
warn "Creating domain: $responce->{text}, $responce->{details}" if $self->{debug};
return $responce;
}
1;
lib/API/DirectAdmin/Ip.pm view on Meta::CPAN
use base 'API::DirectAdmin::Component';
our $VERSION = 0.05;
# Return list of IP
# INPUT
# Admin connect params
sub list {
my ($self ) = @_;
my $responce = $self->directadmin->query(
command => 'CMD_API_SHOW_RESELLER_IPS',
);
return $responce->{list} if ref $responce eq 'HASH';
return [];
}
# Add Ip
# INPUT
# Admin connect params
# ip = 'IP.AD.DRE.SS'
# status = free|shared|owned (optional)
sub add {
my ($self, $params ) = @_;
lib/API/DirectAdmin/Mysql.pm view on Meta::CPAN
# passwd => 'DBPASSWD',
# passwd2 => 'DBPASSWD',
# user => 'DBLOGIN',
sub adddb {
my ($self, $params ) = @_;
$params->{action} = 'create';
carp 'params ' . Dumper($params) if $self->{debug};
my $responce = $self->directadmin->query(
command => 'CMD_API_DATABASES',
method => 'POST',
params => $params,
allowed_fields => 'action
name
passwd
passwd2
user',
);
carp '$responce ' . Dumper(\$responce) if $self->{debug};
return $responce if $responce;
return 'FAIL';
}
# Delete database for user
# Connection data MUST BE for user: auth_user => 'admin_login|user_login'
# auth_passwd => 'admin_passwd'
# INPUT
# select0 => 'DBNAME',
# domain => 'DOMAIN.COM',
sub deldb {
my ($self, $params ) = @_;
$params->{action} = 'delete';
carp 'params ' . Dumper($params) if $self->{debug};
my $responce = $self->directadmin->query(
command => 'CMD_API_DATABASES',
method => 'POST',
params => $params,
allowed_fields => 'action
select0',
);
carp '$responce ' . Dumper(\$responce) if $self->{debug};
return $responce if $responce;
return 'FAIL';
}
# Get list of databases for authorized user.
# No params.
sub list {
my ($self ) = @_;
my $responce = $self->directadmin->query(
command => 'CMD_API_DATABASES',
method => 'GET',
);
carp '$responce ' . Dumper($responce) if $self->{debug};
return $responce->{list} if ref $responce eq 'HASH';
return [];
}
1;
lib/API/DirectAdmin/User.pm view on Meta::CPAN
use Carp;
use base 'API::DirectAdmin::Component';
our $VERSION = 0.06;
# Return list of users (only usernames)
sub list {
my ($self ) = @_;
my $responce = $self->directadmin->query(
command => 'CMD_API_SHOW_ALL_USERS',
);
return $responce->{list} if ref $responce eq 'HASH';
return [];
}
# Create a New User
# params: username, domain, passwd, passwd2, package, ip, email
sub create {
my ($self, $params ) = @_;
my %add_params = (
action => 'create',
add => 'submit',
notify => 'no',
);
my %params = (%$params, %add_params);
my $responce = $self->directadmin->query(
params => \%params,
command => 'CMD_API_ACCOUNT_USER',
allowed_fields =>
'action
add
notify
username
domain
passwd
passwd2
package
ip
email',
);
carp "Creating account: $responce->{text}, $responce->{details}" if $self->{debug};
return $responce;
}
# Suspend user
# params: select0
sub disable {
my ($self, $params ) = @_;
my %add_params = (
suspend => 'Suspend',
location => 'CMD_SELECT_USERS',
);
my %params = (%$params, %add_params);
my $responce = $self->directadmin->query(
command => 'CMD_API_SELECT_USERS',
method => 'POST',
params => \%params,
allowed_fields => 'location
suspend
select0',
);
carp "Suspend account: $responce->{text}, $responce->{details}" if $self->{debug};
return $responce;
}
# Unsuspend user
# params: select0
sub enable {
my ($self, $params ) = @_;
my %add_params = (
suspend => 'Unsuspend',
location => 'CMD_SELECT_USERS',
);
my %params = (%$params, %add_params);
my $responce = $self->directadmin->query(
command => 'CMD_API_SELECT_USERS',
method => 'POST',
params => \%params,
allowed_fields => 'location
suspend
select0',
);
carp "Unsuspend account: $responce->{text}, $responce->{details}" if $self->{debug};
return $responce;
}
# Delete user
# params: select0
sub delete {
my ($self, $params ) = @_;
my %add_params = (
confirmed => 'Confirm',
delete => 'yes',
);
my %params = (%$params, %add_params);
my $responce = $self->directadmin->query(
command => 'CMD_API_SELECT_USERS',
method => 'POST',
params => \%params,
allowed_fields => 'confirmed
delete
select0',
);
carp "Delete account: $responce->{text}, $responce->{details}" if $self->{debug};
return $responce;
}
# Change passwd
# params: username, passwd, passwd2
sub change_password {
my ($self, $params ) = @_;
my $responce = $self->directadmin->query(
command => 'CMD_API_USER_PASSWD',
method => 'POST',
params => $params,
allowed_fields => 'passwd
passwd2
username',
);
carp "Change passwd account: $responce->{text}, $responce->{details}" if $self->{debug};
return $responce;
}
# Change package for user
# params: user, package
sub change_package {
my ($self, $params ) = @_;
my $package = $params->{package};
unless ( $self->{fake_answer} ) {
lib/API/DirectAdmin/User.pm view on Meta::CPAN
return {error => 1, text => "No such package $package on server"};
}
}
my %add_params = (
action => 'package',
);
my %params = (%$params, %add_params);
my $responce = $self->directadmin->query(
command => 'CMD_API_MODIFY_USER',
method => 'POST',
params => \%params,
allowed_fields => 'action
package
user',
);
carp "Change package: $responce->{text}, $responce->{details}" if $self->{debug};
return $responce;
}
# Show a list of user packages
# no params
sub show_packages {
my ($self ) = @_;
my $responce = $self->directadmin->query(
command => 'CMD_API_PACKAGES_USER',
)->{list};
return $responce;
}
# Show user config
# params: user
sub show_user_config {
my ( $self, $params ) = @_;
my $responce = $self->directadmin->query(
command => 'CMD_API_SHOW_USER_CONFIG',
params => $params,
allowed_fields => 'user',
);
return $responce;
}
1;
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 ? 34 : 34;
my %connection_params = (
host => $ENV{host} || '127.0.0.1',
t/01-test.t view on Meta::CPAN
Users data directory created successfully
Domains directory created successfully
Domains directory created successfully in users home
Domain Created Successfully');
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
# User
use_ok('API::DirectAdmin::User');
my $result = $da->user->create(
{
username => $manipulate_user,
domain => 'zse1.ru',
passwd => 'qwerty',
passwd2 => 'qwerty',
email => 'test@example.com',
ip => '127.0.0.1',
package => 'newpackage',
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::User::create' );
%answer = (
text => 'Cannot Create Account',
error => 1,
details => 'That username already exists on the system'
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->user->create(
{
username => $manipulate_user,
domain => 'zse1.ru',
passwd => 'qwerty',
passwd2 => 'qwerty',
email => 'test@example.com',
ip => '127.0.0.1',
package => 'newpackage',
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::User::create repeat');
%answer = (
text => 'Password Changed',
error => 0,
details => 'Password successfully changed'
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->user->change_password(
{
user => $manipulate_user,
pass => 'sdfdsfsdfhsdfj',
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::User::change_password');
%answer = (
text => 'Success',
error => 0,
details => 'All selected Users have been suspended',
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->user->disable(
{
user => $manipulate_user,
reason => 'test reason1',
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::User::disable');
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->user->enable(
{
user => $manipulate_user,
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::User::enable');
$da->{fake_answer} = ! $ONLINE ? { list => ['default','admin'], error => 0, } : undef;
$result = $da->user->list();
ok( ref $result eq 'ARRAY' && scalar @$result, 'API::DirectAdmin::User::list');
%answer = (
text => 'No such package newpackage on server',
error => 1,
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->user->change_package(
{
user => $manipulate_user,
package => 'newpackage',
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::User::change_package');
%answer = (
text => 'Users deleted',
error => 0,
details => "User $manipulate_user Removed",
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->user->delete(
{
user => $manipulate_user,
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::User::delete');
%answer = (
text => 'Error while deleting Users',
error => 1,
details => "User $manipulate_user did not exist on the server. Removing it from your list.",
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->user->delete(
{
user => $manipulate_user,
}
);
is_deeply( $result, \%answer , 'API::DirectAdmin::User::delete repeat');
# Mysql
use_ok('API::DirectAdmin::Mysql');
$connection_params{auth_user} .= '|' . $manipulate_user;
%answer = (
text => 'Database Created',
error => 0,
details => 'Database Created',
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->mysql->adddb(
{
name => 'default',
user => 'default',
passwd => 'default_pass',
passwd2 => 'default_pass',
}
);
is_deeply( $result, \%answer, 'API::DirectAdmin::Mysql::adddb');
# Domain
use_ok('API::DirectAdmin::Domain');
my $addondomain = 'ssssss.ru';
%answer = (
text => 'Domain Created',
error => 0,
details => 'Domain Created Successfully'
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->domain->add(
{
domain => $addondomain,
php => 'ON',
cgi => 'ON',
}
);
is_deeply( $result, \%answer , 'API::DirectAdmin::Domain::add');
%answer = (
text => 'Cannot create that domain',
error => 1,
details => 'That domain already exists'
);
$da->{fake_answer} = ! $ONLINE ? \%answer : undef;
$result = $da->domain->add(
{
domain => $addondomain,
php => 'ON',
cgi => 'ON',
}
);
is_deeply( $result, \%answer , 'API::DirectAdmin::Domain::add repeat');