Я хотел бы стать самодостаточным и, следовательно, обойтись без таких сервисов, как DNSDynamic и DYNDNS. И мне не нравится платить за услуги, которые я мог бы сделать сам.
Итак, вот сценарий – у меня есть мой основной сайт, размещенный с хостинговой компанией. У меня также есть домашний сервер с музыкой и т. Д. Но проблема в том, что мой провайдер (BT) не предлагает пользователям статические IP-адреса.
Я хотел бы иметь субдомен моего основного домена (который указывает на мой основной узел) на мой домашний IP. Это делается с простой записью A, которую я сделал сам.
Это сводится к тому, что я хочу создать PHP-скрипт (выполняемый заданием cron на моем домашнем сервере), чтобы обновить записи A в cPanel до текущего IP-адреса моего домашнего сервера.
Вот пример кода – конечно, бит, который отсутствует, – это код API для связи с cPanel, и я был бы очень благодарен всем, кто мог бы заполнить пробелы для меня.
<?php $current_ip = file_get_contents("http://mydomain.com/getip.php"); $username = "CPANEL_USERNAME"; $password = "CPANEL_PASSWORD"; $domain = "CPANEL_DOMAIN"; $request = file_get_contents("http://someapipage?username=".$username."&pw=".$password."&domain=".$domain."&ip=".$current_ip); ?>
Код в http://mydomain.com/getip.php
– это нечто вроде просто
<?php echo $_SERVER["REMOTE_ADDR"]; ?>
У меня уже есть понимание того, как настроить работу cron, поскольку на моем домашнем сервере работает Ubuntu, и я прочитал учебники, которые вызывают мой cron.php
в моем каталоге localhost с помощью wget
.
Я пробовал эту ссылку, но я не мог понять, что он делает. Заранее спасибо.
Я только что написал эту библиотеку для JSON-API cPanel на основе их документации и ссылок jordih.net на эту документацию. Это не так хорошо документировано, но суть в этом:
Создайте объект zone_records, вызвав
$zones = new zone_records("cpaneluser", "pass", "website_to_login", "domain_of_records")
Обратите внимание, что для входа в систему обычно используется 127.0.0.1, если вы используете это на сервере, на котором хотите изменить записи.
После $zones->DNSrecords
вы можете получить доступ к элементам $zones->DNSrecords
. Он содержит массив записей DNS A и записей CNAME (оба из которых являются объектами DNSrecord). Остальные (кроме TXT) не имеют значения, поскольку вы не можете редактировать их без дополнительных дополнений (функций) к классам.
У каждого DNSrecord есть некоторые члены (например, target, ttl, name, type), к которым, в то время как private
, можно получить доступ через $record->ttl
потому что я добавил метод «magic» __get
. Метод «магия» __set
реализуется для изменения только ttl и target (вы не можете изменять другие свойства с помощью этой функции API, и объект будет вызывать исключение, если вы попытаетесь это сделать).
Вы можете использовать
$zones->addrecord($type, $target, $name, $ttl)
добавить запись или
$zones->deleterecord($line)
для удаления записи, которая находится в строке $line
в файле зоны, вы можете найти ее через $record->line
.
Если вы хотите сделать некоторые из ваших собственных запросов в модуле ZoneEdit, вы можете позвонить
$zones->doquery("function_from_API", array("parameters=>"here"), array("headers"=>"here"))
и он вернет ответ cPanel (как и методы addrecord и deleterecord). Наконец, я бы посоветовал использовать try {...} catch (Exception $e) {...}
так как мои объекты генерируют исключения, если / когда что-то пойдет не так (вы можете их отредактировать, конечно).
Этот код находится в общественном достоянии – вы можете получить его на https://github.com/ShadowLNC/cpanel_dns (classdns.php является основным файлом, а dns_update.php показывает пример).
Изменить : ссылка ниже сломана. Вот полный скрипт для справки:
#!/usr/bin/perl # ------------------------------------------------------------------------------- # neobitti_update_ip.pl # # Version 1.0 - 16.01.2012 # # PERL script to dynamically update the IP of a host via the cPanel-API. This # script was written to work with the Finnish hoster Neobitti but it might work # with other hosters which use cPanel too. # # Copyright (C) 2012 Stefan Gofferje - http://stefan.gofferje.net/ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ------------------------------------------------------------------------------- use strict; use LWP::UserAgent; use MIME::Base64; use XML::Simple; use Data::Dumper; # --- Command line parameters ------------------------------------------------ my $param_domain=$ARGV[0]; my $param_host=$ARGV[1]; my $param_ip=$ARGV[2]; # --- cPanel information ----------------------------------------------------- # Storing passwords in clear text is ugly! my $cpanel_domain = "example.com"; my $user = "username"; my $pass = "password"; my $auth = "Basic " . MIME::Base64::encode( $user . ":" . $pass ); # --- Deactivate SSL certificate validation ---------------------------------- # This is ugly but neccessary because Neobitti uses self-signed SSL # certificates which will fail validation my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 }); # --- Find out the linenumber for the A-record we want to change ------------- sub getlinenumber_a { my $domain=$_[0]; my $hostname=$_[1]."."; my $xml = new XML::Simple; my $request = HTTP::Request->new( GET => "https://$cpanel_domain:2083/xml-api/cpanel?cpanel_xmlapi_module=ZoneEdit&cpanel_xmlapi_func=fetchzone&domain=$domain" ); $request->header( Authorization => $auth ); my $response = $ua->request($request); my $zone = $xml->XMLin($response->content); my $linenumber=""; print $response->content . "\n"; print $zone . "\n"; print $zone->{'data'}->{'status'} . "\n"; print $zone->{'data'}->{'record'} . "\n"; if ($zone->{'data'}->{'status'} eq "1") { my $count = @{$zone->{'data'}->{'record'}}; my $oldip=""; for (my $item=0;$item<=$count;$item++) { my $name=$zone->{'data'}->{'record'}[$item]->{'name'}; my $type=$zone->{'data'}->{'record'}[$item]->{'type'}; print $name; if ( ($name eq $hostname) && ($type eq "A") ) { $linenumber=$zone->{'data'}->{'record'}[$item]->{'Line'}; $oldip=$zone->{'data'}->{'record'}[$item]->{'record'}; print "Found $hostname in line $linenumber with IP $oldip.\n"; # DEBUG } } } else { $linenumber="0"; print $zone->{'event'}->{'data'}->{'statusmsg;'} } return($linenumber); } # --- Change the IP address record for a certain linenumber ------------------ sub setip { my $domain=$_[0]; my $linenumber=$_[1]; my $newip=$_[2]; my $result=""; my $xml = new XML::Simple; my $request = HTTP::Request->new( GET => "https://$cpanel_domain:2083/xml-api/cpanel?cpanel_xmlapi_module=ZoneEdit&cpanel_xmlapi_func=edit_zone_record&domain=$domain&line=$linenumber&address=$newip" ); $request->header( Authorization => $auth ); my $response = $ua->request($request); my $reply = $xml->XMLin($response->content); if ($reply->{'data'}->{'status'} eq "1") { $result="1"; } else { $result=$reply->{'data'}->{'statusmsg'}; } return($result); } # --- Main procedure --------------------------------------------------------- print "Trying to find the linenumber for $param_host in $param_domain...\n"; my $line=getlinenumber_a($param_domain,$param_host); if ( ($line ne "0") && ($line ne "") ) { print "Trying to update IP...\n"; my $result=setip ($param_domain,$line,$param_ip); if ($result eq "1") { print "Update successful!\n"; } else { print "$result\n"; } } else { print "Error - check domain and hostname!\n"; }
Вам нужно заменить «username» и «password» своими собственными учетными данными.
Запустите сценарий и передайте имя домена, имя поддомена и новый IP-адрес субдомена:
./neobitti_update_ip.pl <domain> <subdomain> <ip>
Пример:
./neobitti_update_ip.pl example.com subdomain.example.com 93.184.216.34
Ниже мой первоначальный ответ со ссылкой на источник:
Существует Perl-скрипт, который делает то, что вы запрашиваете здесь:
http://stefan.gofferje.net/it-stuff/scripts/50-dynamic-dns-update-via-cpanel-api
Если это должен быть PHP, я предполагаю, что его довольно просто перевести с Perl на PHP (или на любой другой язык). Автор сценария разместил здесь некоторую справочную информацию .