Возникла необходимость перейти с одного IP адреса на другой. Сейчас у нас сайтов примерно 2500 и менять их вручную было бы самоубийством. Поэтому пришла мысль написать просто скрипт, который бы через API IspManager поменял бы мне IP на заданный.
Ниже приведен скрипт, который быстро и безболезненно поменяет IP адрес:
#!/usr/bin/perl -w
use CGI;
BEGIN { push @INC, '/usr/local/ispmgr/lib/perl' }
use Mgr;
use CGI::Carp qw(fatalsToBrowser);
print "Content-type: text/html\n\n";
use LWP::UserAgent;
use XML::LibXML;
my $result;
# Create a pseudo-browser that will run as MSIE and send the request
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
my $req = HTTP::Request->new(POST => 'https://IP_ISPManager/manager/ispmgr');
$req->content("authinfo=login_password&out=xml&func=wwwdomain");
my $res = $ua->request($req);
# Check the result
if ($res->is_success) {
$result = $res->content;
} else {
die $res->status_line."\n";
}
# The $result variable contains either an XML document with the list of WWW domains,
# or an error message
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string( $result );
my $root = $doc->documentElement();
my $xmldoc;
my $xmlroot;
#
sub change_it ($elid)
{
($xmldoc, $xmlroot) = Mgr::query ('wwwdomain.edit', [ ['authinfo', 'login:password'],['elid','$elid'] ]);
my $ip = $xmlroot->getElementsByTagName("ip");
my $admin= $xmlroot->getElementsByTagName("admin");
my $index=$xmlroot->getElementsByTagName("index");
my $domain=$xmlroot->getElementsByTagName("domain");
my $alias=$xmlroot->getElementsByTagName("alias");
my $docroot=$xmlroot->getElementsByTagName("docroot");
my $owner=$xmlroot->getElementsByTagName("owner");
my $version=$xmlroot->getElementsByTagName("version");
my $charset=$xmlroot->getElementsByTagName("charset");
my $autosubdomain=$xmlroot->getElementsByTagName("autosubdomain");
my $php=$xmlroot->getElementsByTagName("php");
my $cgi=$xmlroot->getElementsByTagName("cgi");
my $wsgi=$xmlroot->getElementsByTagName("wsgi");
my $ssi=$xmlroot->getElementsByTagName("ssi");
my $ssiext=$xmlroot->getElementsByTagName("ssiext");
my $ror=$xmlroot->getElementsByTagName("ror");
my $logrequests=$xmlroot->getElementsByTagName("logrequests");
my $new_ip="xxx.xx.xx.xx";
$req->content("authinfo=login:password&func=wwwdomain.edit&elid=$elid&ip=$new_ip&admin=$admin&index=$index&domain=$domain&alis=$alias&docroot=$docroot&owner=$owner&version=$version&charset=$charset&autosubdomain=$autosubdomain&php=$php&cgi=$cgi&wsgi=$wsgi&ssi=$ssi&ssiext=$ssiext&ror=$ror&logrequests=$logrequests&sok=yes");
$res = $ua->request($req);
if ($res->is_success) {#
$result = $res->content;
} else {
die $res->status_line."\n";
}
}
#my $docroot
#exit;
#
# Get the list of WWW domains
#my @sites = ();
#for( $root->findnodes( "elem/name" ) ){
# push @sites, $_->textContent;
#}
# Display the result
for( sort @sites ){
change_it(chomp($_));
}
Сам проверял только на тестовом аккаунте, но скоро нужно будет делать уже со всеми