API-DirectAdmin

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

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

README  view on Meta::CPAN


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/&#60br&#62|&#\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');



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