PHP скрипт для редактирования записей DNS в CPanel

Я хотел бы стать самодостаточным, и поэтому обойтись без таких услуг, как 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.

я пыталсяэта ссылка но я не мог понять, что он делал. Заранее спасибо.

 halfer27 мая 2012 г., 15:09
Можем ли мы увидеть код вашей попытки реализовать подход на jordih.net?
 Alfo27 мая 2012 г., 15:48
@halfer Спасибо за указатели - проблема в том, что код на jordih.net на самом деле не объяснен, и есть множество переменных без определения; и поэтому я не знаю, с чего начать.
 halfer27 мая 2012 г., 15:11
Имейте в виду, что (afaik) каждый раз, когда изменяется ваш DNS-адрес, вам придется ждать истечения срока действия TTL, прежде чем изменения будут отражены во всем мире. Я должен думать, что динамические DNS-серверы будут иметь очень низкий TTL по этой причине.
 halfer27 мая 2012 г., 15:58
Если порт 2083 не работает между прочим, попробуйте 2082 с простым http - который оставляет ваш сеанс незашифрованным, но, возможно, будет проще приступить к работе.
 halfer27 мая 2012 г., 15:56
Ну, это было бы$CPANEL_DOMAIN = 'https://mydomain.com:2083/'; (для безопасного доступа) и$core_domain = 'mydomain.com'; плюс первый блок кода. Пытатьсяprint_r($response); ?> чтобы увидеть, что вы получаете, и привести вас к работе над остальным. Единственное, чего не хватает - это аутентификации в системе cPanel - вам может потребоваться войти в систему, получить cookie-файл и предоставить его для будущих вызовов. Это требует "контекста" быть поставленным вfile_get_contentsчто, в свою очередь, требует немного исследований!

Ответы на вопрос(3)

который решает первоначальный вопрос, а именно, как автоматизировать обновление веб-адреса, чтобы указать изменяющийся IP-адрес. Хорошо известный и хорошо работающий ddclient является стандартным инструментом для многих провайдеров, но, к сожалению (пока) не работает для провайдеров, управляемых cPanel (я использую serverprofis.de, но есть длинный список других).

Скрипт bash находится по адресуGitHub и я только что отредактировал в коде учетные данные и т. д., найденные на cPanel, а затем добавил задание cron для его выполнения каждые несколько минут. Скрипт, как и ddclient, проверяет, изменился ли IP, и останавливается, если не обнаружено никаких изменений по сравнению с последним обновлением поставщика. Если IP-адрес изменился, он изменяет запись у провайдера, указывая новый IP-адрес.

Пока это хорошо работает.

Решение Вопроса

окументации и ссылок jordih.net на эту документацию. Это не так хорошо задокументировано, но суть в следующем:

Создайте объект zone_records, вызвав

$zones = new zone_records("cpaneluser", "pass", "website_to_login", "domain_of_records")

Обратите внимание, что веб-сайт для входа обычно 127.0.0.1, если вы запускаете это с сервера, на котором вы хотите изменить записи.

После вызова вы можете получить доступ к члену$zones->DNSrecords, Он содержит массив записей DNS A и записей CNAME (обе из которых являются объектами DNSrecord). Другие (кроме TXT) не имеют значения, так как вы не можете редактировать их без дополнительных дополнений (функций) к классам.

Каждая запись DNS имеет несколько членов (например, target, ttl, name, type), которые, в то время какprivate, можно получить доступ через$record->ttl потому что я добавил «магию»__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 показывает пример).

Edit: Ссылка ниже теперь не работает. Вот весь скрипт для справки:

#!/usr/bin/perl
# -------------------------------------------------------------------------------
# neobitti_update_ip..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";
}

Вам необходимо заменить & quot; имя пользователя & quot; и & quot; пароль & quot; с вашими полномочиями.

Запустите сценарий и передайте имя домена, имя субдомена и новый 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 (или любой другой язык). Автор скрипта выложил несколькосправочная информация здесь.

 17 авг. 2015 г., 18:55
Да, похоже, что теперь он сломан. Я добавил копию сценария к посту для справки.
 16 авг. 2015 г., 17:33
& quot; У вас нет разрешения на просмотр этой страницы & quot; слишком плохая ссылка не работает

Ваш ответ на вопрос