 |
|
พอดี ลง linux server แล้วมีปัญหา ดัง caption นั่้นแหล่ะ เลยคิดหาวิธีแก้ปัญหา แบบอัตโนมัติ
โดยใช้ CI3 เขียนโปรแกรมนี้ขึ้นมา เอา API ที่เขามี document ให้ เอามาเขียน
ได้เฉพาะเจ้า cloudflare และ google เท่านั้นนะ เพราะใช้งานอยู่ 2 เจ้านี้
Code (PHP)
<?php
// filename DynamicIp
defined('BASEPATH') OR exit('No direct script access allowed');
define('cf_email','??????'); // email reference เอา ที่ลงทะเบียนกับ ผู้ให้บริการ cloudflare
define('cf_key','?????'); // cloudflare: secure-key เอามาจากผู้ให้บริการ cloudflare
function SetGG_Curl($user,$psw,$host,$ip){
$data_post = ['hostname'=>$host,'myip'=>$ip];
$fields_string = http_build_query($data_post);
$ch = curl_init();
$url = 'https://'.$user.':'.$psw.'@domains.google.com/nic/update';
//echo $url; exit;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 ");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$rsp = curl_exec($ch); curl_close($ch);
return (object)['url'=>$url, 'fld'=>$fields_string, 'rs'=>$rsp];
}
function CF_GetZone($zone){
$ch = curl_init();
$url='https://api.cloudflare.com/client/v4/zones?name='.$zone.'&status=active';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-Auth-Email: ' . cf_email,
'X-Auth-Key: '. cf_key,
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 0);
$rsp = json_decode(curl_exec($ch)); curl_close($ch);
return $rsp->result[0]->id;
}
function CF_DnsID($zoneid, $dns,$ty='AAAA'){ //cloudflare
$ch = curl_init();
$url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records?type=$ty&name=$dns";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Auth-Email: '.cf_email,'X-Auth-Key: '.cf_key,'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 0);
$rsp = curl_exec($ch); curl_close($ch);
$js=json_decode($rsp>''? $rsp : '[]');
//print_r($js); die();
return $js->result[0]->id??'';
}
function CF_DnsPut($dns, $zoneid, $dns_id, $ip, $prox, $ty='AAAA'){ //cloudflare
$ar=(object)['type'=>$ty, 'name'=>$dns,'content'=>$ip,'ttl'=>1,'proxied'=>$prox? true : false];
$fields_string = http_build_query($ar);
$url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dns_id";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Auth-Email: ' . cf_email, 'X-Auth-Key: '. cf_key, 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$rsp = curl_exec($ch); curl_close($ch);
return [$url, $fields_string, json_decode($rsp)];
}
class DynamicIp extends CI_Controller {
public function __construct(){
parent::__construct();
define('IPv4',file_get_contents('https://checkip.amazonaws.com'));
define('IPv6',file_get_contents('https://ifconfig.me'));
}
public function IP4(){ echo IPv4; }
public function IP6(){ echo IPv6; }
public function Index(){
$mip=['A'=>IPv4, 'AAAA'=>IPv6];
//************************************ Google Dns
$rs=$this->db->get_where('domains',['uid'=>1])->result();
foreach($rs as $ro){
$gip=$mip[$ro->ty]??IPv4;
if($ro->ip != $gip){
$ro->old_ip=$ro->ip??'-'; $ro->ip=$gip;
SetGG_Curl($ro->uname, $ro->passwd,($ro->sub>''? $ro->sub.'.':'').$ro->domain, $gip);
$this->db->update('domains', ['old_ip'=>$ro->old_ip, 'ip'=>$mip[$ro->ty], 'up2date'=>cur_date_time],['id'=>$ro->id]);
}
}
//************************************
$rs=$this->db->order_by('domain')->get_where('domains',['uid'=>2])->result();
$old_domain='';
foreach($rs as $ro){
$gip=$mip[$ro->ty]??IPv4;
if($ro->ip != $gip){
if($old_domain!=$ro->domain){
$zoneid = CF_GetZone($ro->domain);
$old_domain=$ro->domain;
}
$dns=($ro->sub ? $ro->sub.'.' : '').$ro->domain;
$dns_id=CF_DnsID($zoneid, $dns, $ro->ty);
CF_DnsPut($dns, $zoneid, $dns_id, $gip, $ro->prox, $ro->ty);
$this->db->update('domains',['old_ip'=>$ro->ip??'', 'ip'=>$gip, 'up2date'=>cur_date_time],['id'=>$ro->id]);
}
}
$this->parser->parse('sh', ['loop'=>$ar, 'zoneid'=>$zone, 'em'=>cf_email, 'ky'=>cf_key, 'gg'=>$gg]);
}
}
Code (SQL)
-- ตัวอย่าง ข้อมูล table "domains"
create table domains (
Id int primary key identity(1, 1),
uid int,
domain nvarchar(100),
sub nvarchar(100),
uname varchar(32),
paswd varchar(64),
ip varchar(64) NULL,
old_ip varchar(64) NULL,
up2date datetime NULL,
prox tinyint NULL,
ty varchar(4)
);
insert into domains (uid,domain,sub,uname,paswd,ip,old_ip,up2date,prox,ty)
values (1,"????.com","","????","????","","",getdate(),0,"A");
insert into domains (uid,domain,sub,uname,paswd,ip,old_ip,up2date,prox,ty)
values (2,"????.com","","email@????.com","??????","","","",1,"AAAA");
เปลี่ยนเครื่องหมายคำถามให้ถูกต้องตามที่มีด้วยนะครับ
*******************************************
uid:1 = google dns
uid:2 = cloudflare dns
*******************************************
*/
เสร็จแล้วก็ ตั้ง crontab ให้ตรวจสอบ IP
เป็น ราย นาที ขั่วโมง เอาตามสดวก
Code
#/bin/bash
log=/var/www/log # สร้างไว้ด้วยนะ ที่ไหนก็ได้ ใฟ้ php อ่านได้
oip4=-
if [ -f $log/IP4 ]; then
oip4=$(head -n1 $log/IP4)
fi
ip4=$(curl -s https://checkip.amazonaws.com)
if [ ! "$oip4" == "$ip4" ]; then
tmp=$(curl -s localhost/DynamicIp)
#url ที่ตั้งโปรแกรม จากด้านบน
echo $ip4 > $log/IP4
fi
Tag : PHP
|
ประวัติการแก้ไข 2024-02-12 11:28:16 2024-02-12 11:29:14
|
 |
 |
 |
 |
Date :
2024-02-12 11:20:02 |
By :
Chaidhanan |
View :
338 |
Reply :
3 |
|
 |
 |
 |
 |
|
|
|
 |