<?php
/*
Plesk DynDNS Control Panel (Version see version.php) - GUI for Plesk to build and administrate a DynDNS Service
Copyright (C) [2013 [Matthias Hackbarth / www.haggybear.de]
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 3 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, see <http://www.gnu.org/licenses/>.
*/
require("dbs/hosts.php");
// bevor ich die funktionalität unter php mühsam suche ....
function strtokenizer( $s, $delim) {
$n00 = 0;
$pos = 0;
$posOld = 0;
$a00 = array();
while( ($pos = strpos( $s, $delim, $pos)) !== FALSE) {
$a00[$n00] = substr( $s, $posOld, $pos-$posOld);
$n00 += 1;
$pos += strlen( $delim);
$posOld = $pos;
}
$a00[$n00] = substr( $s, $posOld);
return $a00;
}
function parse_query( $s) {
$a01 = array();
$a00 = strtokenizer( $s, "&");
foreach( $a00 as $key => $value) {
if( ($pos = strpos( $value, "=")) === FALSE) {
// simple param
$a01[$key]=$value;
$a01[$value]="";
}
else {
$a01[$key]=substr( $value, 0, $pos);
$a01[$a01[$key]]=substr( $value, $pos + strlen( "="));
}
}
return $a01;
}
// SCRIPT_URI funktionierte bei mir nicht ....
//$url = parse_url($_SERVER["SCRIPT_URI"]);
//$host = str_replace("dynupd.","",$url["host"]);
$url = parse_url( $_SERVER["REQUEST_URI"]);
$host = $_SERVER['HTTP_HOST'];
if( strcasecmp( substr( $host, 0, 7), "dynupd.") == 0) {
$host = substr( $host, 7);
}
$token = "";
$type = "";
// Aktualisierung mit Token habe ich nicht gefunden ... ich nehme mal den dyndns-Request zusätzlich mit auf
if( ( $url['path'] == "/dyndns/update") ||
( $url['path'] == "/nic/update")) {
// protocols: 3322
// protocols: allinkl, direktdomains, dyndns2, gratisdns_de, gratisdns_dk?, joker, opendns, ovh, selfhost, spdns,
// strato, changeip, cloudflare1
$q = parse_query( $url['query']);
if( !isset( $q['system'])) {
// changeip, cloudflare1
$token = $q['hostname'];
$type = "dyndns";
}
else if( $q['system'] == "dyndns") {
// 3322, allinkl, direktdomains, dyndns2, gratisdns_de, gratisdns_dk?, joker, opendns, ovh, selfhost, spdns, strato, changeip, cloudflare1
$token = $q['hostname'];
$type = "dyndns";
}
}
else {
$token = substr($url["path"], 1);
}
if( !empty($token) && $token == $dynhost[$host]["token"]){
exec('sh/wrapper "1" "configs"',$out);
$outNew = array();
for($i=0;$i<count($out);$i++){
$tmp = trim($out[$i]);
if(!empty($tmp)) {
$outNew[]=$tmp;
}
}
DEFINE("DB_PWD",$outNew[0]);
DEFINE("PSA_PATH",$outNew[1]);
DEFINE("VHOSTS_PATH",$outNew[2]);
require("../config.inc.php");
require("../paa.class.php");
require("../dcp.class.php");
// ich klau' mir mal die alte IP aus der "lokalen" Datenbank
require("dbs/hosts.php");
$oldIP = $dynhost[$host];
$dom = explode(".",$host);
$domain = $dom[count($dom)-2].".".$dom[count($dom)-1];
$dcp = new dcp(new s(),$_GET,array(DB_HOST,DB_NAME,DB_USR,DB_PWD));
$ip = str_replace("::ffff:","",$_SERVER["REMOTE_ADDR"]);
// netter Variablenname ... is changed ist aber die Langform
$ischg = false;
// und jetzt wird nur noch aktualisiert, wenn die ausgelieferte IP mit der letzten übergebenen nicht überein stimmt
// Update 1: wenn man es schon in textform schreibt, sollte man es auch programmieren
// if( $oldIP == $ip) {
if( $oldIP != $ip) {
$_POST["hostname"] = $host;
$dcp->deactivate();
$dcp->activate($ip,$dynhost[$host]["token"],$dynhost[$host]["orgip"]);
$dcp->setSqlEntry($host,$ip);
// komischerweise versucht man hier die "master domain" zu aktualisieren, also abc.de, nicht eine
// mögliche subdomain, z.B. ddns.abc.de ... also aktualisiert sich hier das DNS nicht.
// Update 1: ich habe es wieder entfernt. keine Ahnung, warum es mit der Änderung plötzlich funktioniert hatte :-/
// exec('sh/wrapper "1" "refreshdns" "'.PSA_PATH.'/bin/dns" "'.$host.'"');
exec('sh/wrapper "1" "refreshdns" "'.PSA_PATH.'/bin/dns" "'.$domain.'"');
// merke, es hat sich was geändert (für dyndns notwendig)
$ischg = true;
}
// und jetzt Rückgabewerte mit dyndns Berücksichtigung
if( $type == "dyndns") {
if( $ischg) {
// ip hat sich geändert
echo "good ".$ip;
}
else {
// ip hat sich nicht geändert
echo "nochg ".$ip;
}
}
else {
// token Lösung
echo "OK";
}
}
else {
if( $type == "dyndns") {
// dyndns fehlermeldung ... host unbekannt
echo "nohost";
}
else {
// token Lösung
echo "ERROR";
}
}
class s{
function chkLevel($i){
return true;
}
}
?>