API-CPanel

 view release on metacpan or  search on metacpan

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

    die "Cannot delete account";
 }


=cut

# Last raw answer from server
our $last_answer = '';

# Public!
sub is_ok {
    my $answer = shift;

    return 1 if $answer && ( ref $answer eq 'HASH' || ref $answer eq 'ARRAY' );
}


sub get_error {
    my $answer = shift;

    return '' if is_success( $answer ); # ok == no error

    return Dumper( $answer->{statusmsg } );
}

# Get data from @_
sub get_params {
    my @params = @_;

    if (scalar @params == 1 && ref $params[0] eq 'HASH' ) {
        return { %{ $params[0] } };
    } else {
        return { @params };
    }
}

# Make query string
# STATIC(HASHREF: params)
sub mk_query_string {
    my $params = shift;

    return '' unless $params &&
        ref $params eq 'HASH' && %$params ;

    my $result = join '&', map { "$_=$params->{$_}" } sort keys %$params;
    warn $result if $DEBUG;

    return $result;
}

# Kill slashes at start / end string
# STATIC(STRING:input_string)
sub kill_start_end_slashes {
    my $str = shift;

    for ($str) {
        s/^\/+//sgi;
        s/\/+$//sgi;
    }
    
    return $str;
}

# Make full query string (with host, path and protocol)
# STATIC(HASHREF: params)
# params:
# host*
# path
# allow_http
# param1
# param2
# ...
sub mk_full_query_string {
    my $params = shift;

    return '' unless
        $params               &&
        ref $params eq 'HASH' &&
        %$params              &&
        $params->{host}       &&
        $params->{func};

    my $host       = delete $params->{host};

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

    $func = kill_start_end_slashes( $func );

    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 );

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

    } else {
        return '';
    }
}

# Parse answer
# STATIC(HASHREF: params)
# params:
#  STRING: answer
#  HASHREF: xml_parser_params)
sub parse_answer {
    my %params = @_;

    my $answer_string =
        $params{answer};
    my $parser_params =
        $params{parser_params} || { };

    return '' unless $answer_string;

    my $deparsed = XMLin( $answer_string, %$parser_params );
    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 );

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

    return $answer ?
        parse_answer(
            answer        => $answer,
            parser_params => $xml_parser_params
        ) : '';
}

# Filter hash
# STATIC(HASHREF: hash, ARRREF: allowed_keys)
# RETURN: hashref only with allowed keys
sub filter_hash {
    my ($hash, $allowed_keys) = @_;

    return unless ref $hash eq 'HASH' &&
        ref $allowed_keys eq 'ARRAY';
    
    my $new_hash = { };

    foreach my $allowed_key (@$allowed_keys) {
        if (exists $hash->{$allowed_key}) {
            $new_hash->{$allowed_key} = $hash->{$allowed_key};

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;

    return ref $ref;
}

# INTERNAL!!! Check server answer result
# STATIC(data_block)
sub is_success {
    my $data_block = shift;
    my $want_hash  = shift;

    if ( $data_block &&
         ref $data_block eq 'HASH' &&
         (( $data_block->{status} &&
           $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;

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

	    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},
	func           => $params{func},
	container      => $params{container},
	allowed_fields => $params{allowed_fields},
    );

    return $params{want_hash} && is_success( $result, $params{want_hash} ) ? $result : is_success( $result );
}

# Abstract sub for fetch arrays
sub fetch_array_abstract {
    my %params = @_;

    my $result_field = $params{result_field} || '';
    my $result_list = [ ];
    my $result = query_abstract(
	params         => $params{params},
	func           => $params{func},
	container      => $params{container},
	allowed_fields => $params{allowed_fields},
    );
    return $result_list  unless $result;
    $result = [ $result ] if ref $result ne 'ARRAY';

    foreach my $elem ( @{ $result } ) {
	push @$result_list, $result_field ? $elem->{$result_field} : $elem;
    };

    return $result_list;
}

# Abstract sub for fetch hash
sub fetch_hash_abstract {
    my %params = @_;

    my $result = query_abstract(
	params         => $params{params},
	func           => $params{func},
	container      => $params{container},
	allowed_fields => $params{allowed_fields},
    );

    my $result_hash = {};

lib/API/CPanel/Domain.pm  view on Meta::CPAN


use strict;
use warnings;

use API::CPanel;
use Data::Dumper;

our $VERSION = 0.09;

# Âîçâðàùàåò ñïèñîê äîìåíîâ
sub list {
    my $params = shift;

    return API::CPanel::action_abstract(
	params       => $params,
	func         => 'listaccts',
	container    => 'acct',
	result_field => 'domain',
	want_hash    => '1',
    );
}


# Èçìåíÿåò îñíîâíîé èï ñàéòà
sub change_site_ip {
    my $params = shift;

    return API::CPanel::action_abstract(
        params         => $params,
        func           => 'setsiteip',
        container      => 'result',
        allowed_fields => 'ip user domain',
    );
}

# Äîáàâèòü äîïîëíèòåëüíûé äîìåí
# IN:
#   - dir       - The path that will serve as the addon domain's home directory.
#   - newdomain - The domain name of the addon domain you wish to create. (e.g. sub.example.com).
#   - pass      - Password to access and edit the addon domain's files.
#   - subdomain - This value is the subdomain and FTP username corresponding to the new addon domain.
# http://docs.cpanel.net/twiki/bin/view/ApiDocs/Api2/ApiAddonDomain
sub add_addon_domain {
    my $params = shift;

    $params->{'cpanel_xmlapi_apiversion'} = 2;
    $params->{'user'} = delete $params->{'do_as_user'};

    $params->{'cpanel_xmlapi_module'} = 'AddonDomain';
    $params->{'cpanel_xmlapi_func'}   = 'addaddondomain';

    return unless $params->{'user'}      &&
                  $params->{'dir'}       &&

lib/API/CPanel/Ip.pm  view on Meta::CPAN


use strict;
use warnings;

use API::CPanel;
use Data::Dumper;

our $VERSION = 0.07;

# Âîçâðàùàåò ñïèñîê ip àäðåñîâ
sub list {
    my $params = shift;

    return API::CPanel::fetch_array_abstract(
	params       => $params,
	func         => 'listips',
	container    => 'result',
	result_field => 'ip',
    );
}

# Äîáàâèòü ip
sub add {
    my $params = shift;

    return API::CPanel::action_abstract( 
	params         => $params,
	func           => 'addip',
	container      => 'addip',
	allowed_fields => 'ip netmask',
    );
}

# Óäàëèòü ip
sub remove {
    my $params = shift;

    return API::CPanel::action_abstract( 
	params         => $params,
	func           => 'delip',
	container      => 'delip',
	allowed_fields => 'ip ethernetdev skipifshutdown',
    );
}

lib/API/CPanel/Misc.pm  view on Meta::CPAN


use strict;
use warnings;

use API::CPanel;
use Data::Dumper;

our $VERSION = 0.07;

# Ïåðåãðóæàåì CPanel
sub reload {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'restartservice',
	container      => 'restart',
	allowed_fields => 'service',
    );
}

lib/API/CPanel/Mysql.pm  view on Meta::CPAN

use Data::Dumper;

our $VERSION = 0.07;

# Äîáàâëÿåò ïîëüçîâàòåëÿ â áàçó mysql
# IN:
#   - do_as_user - cPanel ïîëüçîâàòåëü äëÿ êîòîðîãî ñîçäàåòñÿ mysql-ïîëüçîâàòåëü
#   - username   - Èìÿ mysql-ïîëüçîâàòåëÿ äëÿ ñîçäàíèÿ 
#                  (ôàêòè÷åñêè áóäåò ñîçäàí mysql-ïîëüçîâàòåëü ñ èìåíåì: <do_as_user>_<username>).
#   - password   - Ïàðîëü äëÿ mysql-ïîëüçîâàòåëÿ.
sub adduser {
    my $params = shift;

    # Ìîäóëü Mysql cPanel'à ñ êîòîðûì ðàáîòàåì îòíîñèòñÿ ê ïåðâîé âåðñèè api
    $params->{'cpanel_xmlapi_apiversion'} = 1;
    # Äîáàâëÿåì íîâîãî ïîëüçîâàòåëÿ â áàçó îò èìåíè ïîëüçîâàòåëÿ ïåðåäàâàåìîãî â ïàðàìåòðå do_as_user
    # Ôàêòè÷åñêè ýòî çíà÷èò ÷òî ðàáîòàÿ ñ cPanel îò ðåñåëëåðà ìû ñîçäàåì mysql 
    # þçåðà äëÿ cPanel-ïîëüçîâàòåëÿ ñ ëîãèíîì do_as_user
    $params->{'user'} = delete $params->{'do_as_user'};

    $params->{'cpanel_xmlapi_module'} = 'Mysql';

lib/API/CPanel/Mysql.pm  view on Meta::CPAN

    );

    return $result->{event}->{result};
}

# Äîáàâëÿåò áàçó mysql
# IN:
#   - do_as_user - cPanel ïîëüçîâàòåëü äëÿ êîòîðîãî ñîçäàåòñÿ mysql-áàçà
#   - dbname     - Èìÿ áä äëÿ ñîçäàíèÿ 
#                  (ôàêòè÷åñêè áóäåò ñîçäàíà áä ñ èìåíåì: <do_as_user>_<dbname>).
sub adddb {
    my $params = shift;

    # Ìîäóëü Mysql cPanel'à ñ êîòîðûì ðàáîòàåì îòíîñèòñÿ ê ïåðâîé âåðñèè api
    $params->{'cpanel_xmlapi_apiversion'} = 1;
    # Äîáàâëÿåì áä îò èìåíè ïîëüçîâàòåëÿ ïåðåäàâàåìîãî â ïàðàìåòðå do_as_user
    # Ôàêòè÷åñêè ýòî çíà÷èò ÷òî ðàáîòàÿ ñ cPanel îò ðåñåëëåðà ìû ñîçäàåì áä
    # äëÿ cPanel-ïîëüçîâàòåëÿ ñ ëîãèíîì do_as_user
    $params->{'user'} = delete $params->{'do_as_user'};

    $params->{'cpanel_xmlapi_module'} = 'Mysql';

lib/API/CPanel/Mysql.pm  view on Meta::CPAN

#                       create     => CREATE
#                       delete     => DELETE
#                       drop       => DROP
#                       select     => SELECT
#                       insert     => INSERT
#                       update     => UPDATE
#                       references => REFERENCES
#                       index      => INDEX
#                       lock       => LOCK TABLES
#                       all        => ALL
sub grant_perms {
    my $params = shift;

    # Ìîäóëü Mysql cPanel'à ñ êîòîðûì ðàáîòàåì îòíîñèòñÿ ê ïåðâîé âåðñèè api
    $params->{'cpanel_xmlapi_apiversion'} = 1;
    # Äîáàâëÿåì áä îò èìåíè ïîëüçîâàòåëÿ ïåðåäàâàåìîãî â ïàðàìåòðå do_as_user
    # Ôàêòè÷åñêè ýòî çíà÷èò ÷òî ðàáîòàÿ ñ cPanel îò ðåñåëëåðà ìû ñîçäàåì áä
    # äëÿ cPanel-ïîëüçîâàòåëÿ ñ ëîãèíîì do_as_user
    $params->{'user'} = delete $params->{'do_as_user'};

    $params->{'cpanel_xmlapi_module'} = 'Mysql';

lib/API/CPanel/Package.pm  view on Meta::CPAN

# quota (integer)	-- Disk space quota in Megabytes.
# ip (string)		-- Whether or not the domain has a dedicated IP address.
# cgi (boolean)		-- Whether or not the domain has CGI access.
# frontpage (boolean)	-- Whether or not the domain has FrontPage extensions installed.
# cpmod (string)	-- cPanel theme name.
# language (string)	-- Language to use in the account's cPanel interface.
# maxftp (string)	-- Maximum number of FTP accounts the user can create.
# maxsql (string)	-- Maximum number of SQL databases the user can create.
# maxpop (string)	-- Maximum number of email accounts the user can create.
# maxlst (string)	-- Maximum number of mailing lists the user can create.
# maxsub (string)	-- Maximum number of subdomains the user can create.
# maxpark (string)	-- Maximum number of parked domains the user can create.
# maxaddon (string)	-- Maximum number of addon domains the user can create.
# hasshell (boolean)	-- Whether or not the domain has shell/SSH access.
# bwlimit (string)	-- Bandiwdth limit in Megabytes.

# According to http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddPackage
sub add {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'addpkg',
	container      => 'result',
	allowed_fields =>
	   'name
	    featurelist
	    quota

lib/API/CPanel/Package.pm  view on Meta::CPAN

# quota (integer)	-- Disk space quota in Megabytes.
# ip (string)		-- Whether or not the domain has a dedicated IP address.
# cgi (boolean)		-- Whether or not the domain has CGI access.
# frontpage (boolean)	-- Whether or not the domain has FrontPage extensions installed.
# cpmod (string)	-- cPanel theme name.
# language (string)	-- Language to use in the account's cPanel interface.
# maxftp (string)	-- Maximum number of FTP accounts the user can create.
# maxsql (string)	-- Maximum number of SQL databases the user can create.
# maxpop (string)	-- Maximum number of email accounts the user can create.
# maxlst (string)	-- Maximum number of mailing lists the user can create.
# maxsub (string)	-- Maximum number of subdomains the user can create.
# maxpark (string)	-- Maximum number of parked domains the user can create.
# maxaddon (string)	-- Maximum number of addon domains the user can create.
# hasshell (boolean)	-- Whether or not the domain has shell/SSH access.
# bwlimit (string)	-- Bandiwdth limit in Megabytes.

# According to http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/EditPackage
sub edit {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'editpkg',
	container      => 'result',
	allowed_fields =>
	   'name
	    featurelist
	    quota

lib/API/CPanel/Package.pm  view on Meta::CPAN

	    maxpark
	    maxaddon
	    hasshell
	    bwlimit',
    );
}

# Óäàëèòü ïàêåò
# pkg* (string)	-- Name of package.
# According to http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeletePackage
sub remove {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'killpkg',
	container      => 'result',
	allowed_fields => 'pkg',
    );
}

# 
sub list {
    my $params = shift;

    return API::CPanel::action_abstract(
	params    => $params,
	func      => 'listpkgs',
	container => 'package',
	want_hash => 1,
    );
}

lib/API/CPanel/User.pm  view on Meta::CPAN


use strict;
use warnings;

use API::CPanel;
use Data::Dumper;

our $VERSION = 0.08;

# Âîçâðàùàåò ñïèñîê ïîëüçîâàòåëåé
sub list {
    my $params = shift;

    return API::CPanel::fetch_hash_abstract(
	params       => $params,
	func         => 'listaccts',
	container    => 'acct',
	key_field    => 'user',
    );
}

# Âîçâðàùàåò ñïèñîê ïîëüçîâàòåëåé (âîçâðàùàåò ìàññèâ, òîëüêî èìåíà ïîëüçîâàòåëåé)
sub list_simple {
    my $params = shift;

    return API::CPanel::fetch_array_abstract(
	params       => $params,
	func         => 'listaccts',
	container    => 'acct',
	result_field => 'user',
    );
}

# Âîçâðàùàåò ÷èñëî àêòèâíûõ ïîëüçîâàòåëåé
sub active_user_count {
    my $params = shift;

    my $result = API::CPanel::fetch_array_abstract(
	params       => $params,
	func         => 'listaccts',
	container    => 'acct',
	result_field => 'suspendtime',
    );

    my $count = 0;

lib/API/CPanel/User.pm  view on Meta::CPAN

# ip (string)		-- Whether or not the domain has a dedicated IP address.
# cgi (boolean)		-- Whether or not the domain has CGI access.
# frontpage (boolean)	-- Whether or not the domain has FrontPage extensions installed.
# hasshell (boolean)	-- Whether or not the domain has shell/SSH access.
# contactemail (string)	-- Contact email address for the account.
# cpmod (string)	-- cPanel theme name.
# maxftp (string)	-- Maximum number of FTP accounts the user can create.
# maxsql (string)	-- Maximum number of SQL databases the user can create.
# maxpop (string)	-- Maximum number of email accounts the user can create.
# maxlst (string)	-- Maximum number of mailing lists the user can create.
# maxsub (string)	-- Maximum number of subdomains the user can create.
# maxpark (string)	-- Maximum number of parked domains the user can create.
# maxaddon (string)	-- Maximum number of addon domains the user can create.
# bwlimit (string)	-- Bandiwdth limit in Megabytes.
# customip (string)	-- Specific IP address for the site.
# language (string)	-- Language to use in the account's cPanel interface.
# useregns (boolean)	-- Use the registered nameservers for the domain instead of the ones configured on the server.
# hasuseregns (boolean)	-- Set to 1 if you are using the above option.
# reseller (boolean)	-- Give reseller privileges to the account.
# forcedns (boolean)	-- Overwrite current DNS Zone if a DNS Zone already exists.
# mxcheck (enum)	-- Determines how the server will handle incoming mail for this domain. 

# According to http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CreateAccount
sub create {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'createacct',
	container      => 'result',
	want_hash      => $params->{want_hash},
	allowed_fields =>
	   'username
	    domain

lib/API/CPanel/User.pm  view on Meta::CPAN

# newuser (string)	-- Used when changing the username of an account. This will be the new username.
# owner (string)	-- Change the owner of the account to the specified owner.
# CPTHEME (string)	-- cPanel theme name.
# HASCGI (boolean)	-- Whether or not the domain has CGI access.
# LANG (string)		-- Language to use in the account's cPanel interface.
# LOCALE (string)	-- Locale to use in the account's cPanel interface.
# maxftp (string)	-- Maximum number of FTP accounts the user can create.
# maxsql (string)	-- Maximum number of SQL databases the user can create.
# maxpop (string)	-- Maximum number of email accounts the user can create.
# maxlst (string)	-- Maximum number of mailing lists the user can create.
# maxsub (string)	-- Maximum number of subdomains the user can create.
# maxpark (string)	-- Maximum number of parked domains the user can create.
# maxaddon (string)	-- Maximum number of addon domains the user can create.
# shell (boolean)	-- Whether or not the domain has shell/SSH access.

# According to http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ModifyAccount
sub edit {
    my $params = shift;

    return API::CPanel::action_abstract( 
	params         => $params,
	func           => 'modifyacct',
	container      => 'result',
	allowed_fields =>
	   'user
	    domain
	    newuser

lib/API/CPanel/User.pm  view on Meta::CPAN

	    MAXLST
	    MAXSUB
	    MAXPARK
	    MAXADDON
	    shell',
    );
}

# Delete user from panel
# user* -- user name
sub delete {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'removeacct',
	container      => 'result',
	allowed_fields => 'user',
    );
}

# Switch on user account
# user* -- user name
sub enable {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'unsuspendacct',
	container      => 'result',
	allowed_fields => 'user',
    );
}

# Switch off user account
# user* -- user name
# reason -- reason of suspend
sub disable {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'suspendacct',
	container      => 'result',
	allowed_fields => 'user reason',
    );
}

# This function changes the hosting package associated with a cPanel account.
# user* -- user name
# pkg   -- Name of the package that the account should use.
sub change_package {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'changepackage',
	container      => 'result',
	allowed_fields => 'user pkg',
    );
}

# This function changes the password of a domain owner (cPanel) or reseller (WHM) account
# user* -- user name
# pass* -- New password for the user.
sub change_account_password {
    my $params = shift;

    return API::CPanel::action_abstract(
	params         => $params,
	func           => 'passwd',
	container      => 'passwd',
	allowed_fields => 'user pass',
    );
}

t/01-test.t  view on Meta::CPAN

my $test_host = $ENV{host} || '127.0.0.1';

ok(1, 'Test OK');
use_ok('API::CPanel');

$a = 'refs';

is( refs( undef ),   '',       $a);
is( refs( {} ),      'HASH',   $a );
is( refs( [] ),      'ARRAY',  $a );
is( refs( sub {} ),  'CODE',   $a );
is( refs( \$a ),     'SCALAR', $a );

$a = 'is_success';

ok(! is_success(), $a);
ok(! is_success( { error => {}, data => {} } ), $a);
ok(! is_success( { data  => {} } ), $a);
ok(! is_success( { } ), $a);
ok(  is_success( { status => 1 } ), $a);

t/01-test.t  view on Meta::CPAN

$API::CPanel::FAKE_ANSWER = ! $ONLINE ? <<THEEND : undef;
<changepackage>
  <result>
    <rawout>&lt;pre&gt;
Changing bwlimit to unlimited Meg
Changing Feature List to default
Changing max pop accounts from unlimited to unlimited
Changing max sql accounts from 14 to 99
Changing max ftp accounts from unlimited to unlimited
Changing max lists from unlimited to unlimited
Changing max sub domains from unlimited to unlimited
Changing language from ru to en
Changing max parked domains from 0 to 0
Changing max addon domains from 0 to 0
Shell Access Set Correctly (noshell)
Changing cPanel theme from x to
Changing plan from default to Host-343
Resetting QUOTA....
Using Quota v3 Support
Bandwidth limit (0) is lower than (unlimited) (all limits removed)&lt;br /&gt;&lt;blockquote&gt;&lt;div style='float:left;'&gt;Enabling...&lt;/div&gt;&lt;div style='float:left;'&gt;...zse1.ru...&lt;/div&gt;&lt;div style='float:left;'&gt;Done&lt;/div&...
</rawout>



( run in 0.321 second using v1.01-cache-2.11-cpan-4d50c553e7e )