<?php
/*
* ipcheck.php
*
*/
$api_key = '[APIキー]';
$server_id = 'xsvx1023505';
$servername = $server_id.'.xsrv.jp';
$api_base_url = 'https://api.xserver.ne.jp';
$api_base_url .= '/v1/server/'.$servername;
$target = 'silverfox';
$domain = 'noizumi.org';
$url_ip_prog = 'https://irc.noizumi.org/cgi-bin/ip.py';
/**
* DNSレコード全部を取得する
* @global string $api_key
* @global string $api_base_url
* @return array
*/
function getDNSRecord(){
global $api_key;
global $api_base_url;
$headers = array(
'Content-Type: application/json',
'Authorization: Bearer '.$api_key
);
$ch = curl_init();
//curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); // IPv4 Only.
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // HTTPレスポンス 30x を追跡する。
curl_setopt($ch, CURLOPT_HEADER, false);
$command = '/dns';
curl_setopt($ch, CURLOPT_URL, $api_base_url.$command);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
return json_decode($output, true);
}
/**
* DNSレコードを更新する
* @global string $api_base_url
* @global string $api_key
* @param string $dns_id
* @param array $params
*/
function setDNS($dns_id, $params){
global $api_base_url;
global $api_key;
$fields = json_encode($params);
$headers = array(
'Content-Type: application/json',
'Content-Length: ' . strlen($fields),
'Authorization: Bearer '.$api_key
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // HTTPレスポンス 30x を追跡する。
curl_setopt($ch, CURLOPT_HEADER, false);
$command = '/dns/'.$dns_id;
curl_setopt($ch, CURLOPT_URL, $api_base_url.$command);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
}
// DNS一覧から変更するレコードのIDと設定値を取り出す。
// ※事前にDNSレコードは登録しておく。
$dns_record = getDNSRecord();
$ipv4_done=false;
$ipv6_done=false;
foreach($dns_record['records'] as $index=>$rec){
// ホスト名に合致し、IPv4のレコードなら処理する。
if(strpos($rec['host'], $target)!==false && $rec['type']=='A' && !$ipv4_done){
$dns_id4 = $rec['id'];
$hosts4 = $rec['content'];
$ipv4_done=true;
}
// ホスト名に合致し、IPv6のレコードなら処理する。
if(strpos($rec['host'], $target)!==false && $rec['type']=='AAAA' && !$ipv6_done){
$dns_id6 = $rec['id'];
$hosts6 = $rec['content'];
$ipv6_done=true;
}
if($ipv4_done && $ipv6_done){
break;
}
}
// IPv4を明示的に指定して接続するコンテキストを作成
$context4 = stream_context_create([
'socket' => [
// IPv4アドレスでバインドする(通常は0.0.0.0:0)
'bindto' => '0.0.0.0:0',
],
]);
// IPv4でサイトにアクセスしてIPアドレスを得る
$response4 = file_get_contents($url_ip_prog, false, $context4);
if(preg_match('/Your IP address is ([0-9.]*)/', $response4, $matches)){
$myip = $matches[1];
if(!empty($hosts4) && $myip != $hosts4){
$params = array(
'domain' => $domain,
'host' => $target,
'type' => 'A',
'content' => $myip
);
setDNS($dns_id4, $params);
}
}
// IPv6を明示的に指定して接続するコンテキストを作成
$context6 = stream_context_create([
'socket' => [
// IPv6アドレスでバインドする(通常は[::]:0)
'bindto' => '[::]:0',
],
]);
// IPv6でサイトにアクセスしてIPアドレスを得る
// ※IPv4環境だと、IPv4のIPアドレスが返ってくるので、IPv6のパターンにマッチした時だけ登録する。
$response6 = file_get_contents($url_ip_prog, false, $context6);
if(preg_match('/Your IP address is ((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/', $response6, $matches)){
$myip = $matches[1];
if(!empty($hosts6) && $myip != $hosts6){
$params = array(
'domain' => $domain,
'host' => $target,
'type' => 'AAAA',
'content' => $myip
);
setDNS($dns_id6, $params);
}
}
?>