diff --git a/app/BaseController.php b/app/BaseController.php index de6004f..5b9d541 100644 --- a/app/BaseController.php +++ b/app/BaseController.php @@ -102,15 +102,17 @@ abstract class BaseController if ($url) { $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : (string)$this->app->route->buildUrl($url); } - if(empty($msg)) $msg = '未知错误'; + if (empty($msg)) { + $msg = '未知错误'; + } - if (request()->isApi) { - return json(['code'=>$code=='success'?0:-1, 'msg'=>$msg]); + if ($this->request->isApi) { + return json(['code' => $code == 'success' ? 0 : -1, 'msg' => $msg]); } - if (request()->isAjax()) { - return json(['code'=>$code=='success'?0:-1, 'msg'=>$msg, 'url'=>$url]); + if ($this->request->isAjax()) { + return json(['code' => $code == 'success' ? 0 : -1, 'msg' => $msg, 'url' => $url]); } - + View::assign([ 'code' => $code, 'msg' => $msg, diff --git a/app/command/Dmtask.php b/app/command/Dmtask.php index 618f4a8..3df1c3b 100644 --- a/app/command/Dmtask.php +++ b/app/command/Dmtask.php @@ -1,5 +1,6 @@ cache('configs',0)->column('value','key'); + $res = Db::name('config')->cache('configs', 0)->column('value', 'key'); Config::set($res, 'sys'); config_set('run_error', ''); - if(!extension_loaded('swoole')){ + if (!extension_loaded('swoole')) { $output->writeln('[Error] 未安装Swoole扩展'); config_set('run_error', '未安装Swoole扩展'); return; } - try{ + try { $output->writeln('进程启动成功.'); $this->runtask(); - }catch(Exception $e){ - $output->writeln('[Error] '.$e->getMessage()); + } catch (Exception $e) { + $output->writeln('[Error] ' . $e->getMessage()); config_set('run_error', $e->getMessage()); } } - private function runtask(){ - \Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]); - \Co\run(function() { + private function runtask() + { + \Co::set(['hook_flags' => SWOOLE_HOOK_ALL]); + \Co\run(function () { $date = date("Ymd"); $count = config_get('run_count', null, true) ?? 0; - while(true){ + while (true) { sleep(1); - if($date != date("Ymd")){ + if ($date != date("Ymd")) { $count = 0; $date = date("Ymd"); } $rows = Db::name('dmtask')->where('checknexttime', '<=', time())->where('active', 1)->order('id', 'ASC')->select(); - foreach($rows as $row){ - \go(function () use($row) { - try{ + foreach ($rows as $row) { + \go(function () use ($row) { + try { (new TaskRunner())->execute($row); } catch (\Swoole\ExitException $e) { - echo $e->getStatus()."\n"; + echo $e->getStatus() . "\n"; } catch (Exception $e) { - echo $e->__toString()."\n"; + echo $e->__toString() . "\n"; } }); Db::name('dmtask')->where('id', $row['id'])->update([ diff --git a/app/command/Opiptask.php b/app/command/Opiptask.php index e227a56..030cf1f 100644 --- a/app/command/Opiptask.php +++ b/app/command/Opiptask.php @@ -1,5 +1,6 @@ cache('configs',0)->column('value','key'); + $res = Db::name('config')->cache('configs', 0)->column('value', 'key'); Config::set($res, 'sys'); - + (new OptimizeService())->execute(); } } diff --git a/app/common.php b/app/common.php index b63c4a0..7c058ee 100644 --- a/app/common.php +++ b/app/common.php @@ -1,228 +1,254 @@ 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { - return substr($result, 26); - } else { - return ''; - } - } else { - return $keyc.base64_encode($result); - } +function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) +{ + $ckey_length = 4; + $key = md5($key); + $keya = md5(substr($key, 0, 16)); + $keyb = md5(substr($key, 16, 16)); + $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : ''; + $cryptkey = $keya.md5($keya.$keyc); + $key_length = strlen($cryptkey); + $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; + $string_length = strlen($string); + $result = ''; + $box = range(0, 255); + $rndkey = array(); + for ($i = 0; $i <= 255; $i++) { + $rndkey[$i] = ord($cryptkey[$i % $key_length]); + } + for ($j = $i = 0; $i < 256; $i++) { + $j = ($j + $box[$i] + $rndkey[$i]) % 256; + $tmp = $box[$i]; + $box[$i] = $box[$j]; + $box[$j] = $tmp; + } + for ($a = $j = $i = 0; $i < $string_length; $i++) { + $a = ($a + 1) % 256; + $j = ($j + $box[$a]) % 256; + $tmp = $box[$a]; + $box[$a] = $box[$j]; + $box[$j] = $tmp; + $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); + } + if ($operation == 'DECODE') { + if (((int)substr($result, 0, 10) == 0 || (int)substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { + return substr($result, 26); + } else { + return ''; + } + } else { + return $keyc.base64_encode($result); + } } -function random($length, $numeric = 0) { - $seed = base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35); - $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed)); - $hash = ''; - $max = strlen($seed) - 1; - for($i = 0; $i < $length; $i++) { - $hash .= $seed[mt_rand(0, $max)]; - } - return $hash; +function random($length, $numeric = 0) +{ + $seed = base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35); + $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed)); + $hash = ''; + $max = strlen($seed) - 1; + for ($i = 0; $i < $length; $i++) { + $hash .= $seed[mt_rand(0, $max)]; + } + return $hash; } -function checkDomain($domain){ - if(empty($domain) || !preg_match('/^[-$a-z0-9_*.]{2,512}$/i', $domain) || (stripos($domain, '.') === false) || substr($domain, -1) == '.' || substr($domain, 0 ,1) == '.' || substr($domain, 0 ,1) == '*' && substr($domain, 1 ,1) != '.' || substr_count($domain, '*')>1 || strpos($domain, '*')>0 || strlen($domain)<4) return false; - return true; +function checkDomain($domain) +{ + if (empty($domain) || !preg_match('/^[-$a-z0-9_*.]{2,512}$/i', $domain) || (stripos($domain, '.') === false) || substr($domain, -1) == '.' || substr($domain, 0, 1) == '.' || substr($domain, 0, 1) == '*' && substr($domain, 1, 1) != '.' || substr_count($domain, '*') > 1 || strpos($domain, '*') > 0 || strlen($domain) < 4) return false; + return true; } function getSubstr($str, $leftStr, $rightStr) { - $left = strpos($str, $leftStr); - $start = $left+strlen($leftStr); - $right = strpos($str, $rightStr, $start); - if($left < 0) return ''; - if($right>0){ - return substr($str, $start, $right-$start); - }else{ - return substr($str, $start); - } + $left = strpos($str, $leftStr); + $start = $left + strlen($leftStr); + $right = strpos($str, $rightStr, $start); + if ($left < 0) return ''; + if ($right > 0) { + return substr($str, $start, $right - $start); + } else { + return substr($str, $start); + } } -function checkRefererHost(){ - if(!request()->header('referer'))return false; - $url_arr = parse_url(request()->header('referer')); - $http_host = request()->header('host'); - if(strpos($http_host,':'))$http_host = substr($http_host, 0, strpos($http_host, ':')); +function checkRefererHost() +{ + if (!Request::header('referer')) { + return false; + } + $url_arr = parse_url(Request::header('referer')); + $http_host = Request::header('host'); + if (strpos($http_host, ':')) { + $http_host = substr($http_host, 0, strpos($http_host, ':')); + } return $url_arr['host'] === $http_host; } -function checkIfActive($string) { - $array=explode(',',$string); - $action = request()->action(); - if (in_array($action,$array)){ - return 'active'; - }else - return null; +function checkIfActive($string) +{ + $array = explode(',', $string); + $action = Request::action(); + if (in_array($action, $array)) { + return 'active'; + } else { + return null; + } } -function getSid() { +function getSid() +{ return md5(uniqid(mt_rand(), true) . microtime()); } -function getMd5Pwd($pwd, $salt=null) { +function getMd5Pwd($pwd, $salt = null) +{ return md5(md5($pwd) . md5('1277180438'.$salt)); } -function isNullOrEmpty($str){ - return $str === null || $str === ''; +function isNullOrEmpty($str) +{ + return $str === null || $str === ''; } -function checkPermission($type, $domain = null){ - $user = request()->user; - if(empty($user)) return false; - if($user['level'] == 2) return true; - if($type == 1 && $user['level'] == 1 || $type == 0 && $user['level'] >= 0){ - if($domain == null) return true; - if(in_array($domain, $user['permission'])){ - return true; - } - } - return false; +function checkPermission($type, $domain = null) +{ + $user = Request()->user; + if (empty($user)) { + return false; + } + if ($user['level'] == 2) { + return true; + } + if ($type == 1 && $user['level'] == 1 || $type == 0 && $user['level'] >= 0) { + if ($domain == null) { + return true; + } + if (in_array($domain, $user['permission'])) { + return true; + } + } + return false; } -function getAdminSkin(){ - $skin = cookie('admin_skin'); - if(empty($skin)){ - $skin = config_get('admin_skin'); - } - if(empty($skin)){ - $skin = 'skin-black-blue'; - } - return $skin; +function getAdminSkin() +{ + $skin = cookie('admin_skin'); + if (empty($skin)) { + $skin = config_get('admin_skin'); + } + if (empty($skin)) { + $skin = 'skin-black-blue'; + } + return $skin; } function config_get($key, $default = null, $force = false) { - if ($force) { - $value = Db::name('config')->where('key', $key)->value('value'); - } else { - $value = config('sys.'.$key); - } + if ($force) { + $value = Db::name('config')->where('key', $key)->value('value'); + } else { + $value = config('sys.' . $key); + } return $value ?: $default; } function config_set($key, $value) { - $res = Db::name('config')->replace()->insert(['key'=>$key, 'value'=>$value]); - return $res!==false; + $res = Db::name('config')->replace()->insert(['key' => $key, 'value' => $value]); + return $res !== false; } function getMillisecond() @@ -231,24 +257,105 @@ function getMillisecond() return (int)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000); } -function getDnsType($value){ - if(filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))return 'A'; - else if(filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))return 'AAAA'; - else return 'CNAME'; +function getDnsType($value) +{ + if (filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + return 'A'; + } elseif (filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + return 'AAAA'; + } else { + return 'CNAME'; + } } -function convert_second($s){ - $m = floor($s/60); - if($m == 0){ - return $s.'秒'; - }else{ - $s = $s%60; - $h = floor($m/60); - if($h == 0){ - return $m.'分钟'.$s.'秒'; - }else{ - $m = $m%60; - return $h.'小时'.$m.'分钟'.$s.'秒'; - } - } +function convert_second($s) +{ + $m = floor($s / 60); + if ($m == 0) { + return $s.'秒'; + } else { + $s = $s % 60; + $h = floor($m / 60); + if ($h == 0) { + return $m.'分钟'.$s.'秒'; + } else { + $m = $m % 60; + return $h.'小时'.$m.'分钟'.$s.'秒'; + } + } +} + +function check_proxy($url, $proxy_server, $proxy_port, $type, $proxy_user, $proxy_pwd) +{ + $ch = curl_init($url); + if ($type == 'https') { + $proxy_type = CURLPROXY_HTTPS; + } elseif ($type == 'sock4') { + $proxy_type = CURLPROXY_SOCKS4; + } elseif ($type == 'sock5') { + $proxy_type = CURLPROXY_SOCKS5; + } else { + $proxy_type = CURLPROXY_HTTP; + } + curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); + curl_setopt($ch, CURLOPT_PROXY, $proxy_server); + curl_setopt($ch, CURLOPT_PROXYPORT, intval($proxy_port)); + if (!empty($proxy_user) && !empty($proxy_pwd)) { + curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_user . ':' . $proxy_pwd); + } + curl_setopt($ch, CURLOPT_PROXYTYPE, $proxy_type); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'); + curl_setopt($ch, CURLOPT_TIMEOUT, 3); + curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $errmsg = curl_error($ch); + curl_close($ch); + throw new Exception($errmsg); + } + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + if ($httpCode >= 200 && $httpCode < 400) { + return true; + } else { + throw new Exception('HTTP状态码异常:' . $httpCode); + } +} + +function clearDirectory($dir): bool +{ + // 确保路径是目录 + if (!is_dir($dir)) { + return false; + } + + // 打开目录 + $items = scandir($dir); + foreach ($items as $item) { + // 跳过 '.' 和 '..' + if ($item == '.' || $item == '..') { + continue; + } + + // 完整路径 + $path = $dir . DIRECTORY_SEPARATOR . $item; + + // 如果是目录,递归删除其内容 + if (is_dir($path)) { + clearDirectory($path); + // 删除空目录 + rmdir($path); + } else { + // 删除文件 + unlink($path); + } + } + return true; } \ No newline at end of file diff --git a/app/controller/Auth.php b/app/controller/Auth.php index 389cb2c..e6581c4 100644 --- a/app/controller/Auth.php +++ b/app/controller/Auth.php @@ -1,61 +1,55 @@ getRuntimePath() . '@login.lock'; - public function login(){ - $login_limit_count = 5;//登录失败次数 - $login_limit_file = app()->getRuntimePath().'@login.lock'; - - if(request()->islogin){ + if ($this->request->islogin) { return redirect('/'); } - if(request()->isAjax()){ - $username = input('post.username',null,'trim'); - $password = input('post.password',null,'trim'); - $code = input('post.code',null,'trim'); - - if(empty($username) || empty($password)){ - return json(['code'=>-1, 'msg'=>'用户名或密码不能为空']); + if ($this->request->isAjax()) { + $username = input('post.username', null, 'trim'); + $password = input('post.password', null, 'trim'); + $code = input('post.code', null, 'trim'); + + if (empty($username) || empty($password)) { + return json(['code' => -1, 'msg' => '用户名或密码不能为空']); } - if(!captcha_check($code)){ - return json(['code'=>-1, 'msg'=>'验证码错误', 'vcode'=>1]); + if (!captcha_check($code)) { + return json(['code' => -1, 'msg' => '验证码错误', 'vcode' => 1]); } if (file_exists($login_limit_file)) { $login_limit = unserialize(file_get_contents($login_limit_file)); if ($login_limit['count'] >= $login_limit_count && $login_limit['time'] > time() - 7200) { - exit(json_encode(['code' => -1, 'msg' => '多次登录失败,暂时禁止登录。可删除/runtime/@login.lock文件解除限制', 'vcode'=>1])); + return json(['code' => -1, 'msg' => '多次登录失败,暂时禁止登录。可删除/runtime/@login.lock文件解除限制', 'vcode' => 1]); } } $user = Db::name('user')->where('username', $username)->find(); - if($user && password_verify($password, $user['password'])){ - if($user['status'] == 0) return json(['code'=>-1, 'msg'=>'此用户已被封禁', 'vcode'=>1]); - Db::name('log')->insert(['uid' => $user['id'], 'action' => '登录后台', 'data' => 'IP:'.$this->clientip, 'addtime' => date("Y-m-d H:i:s")]); + if ($user && password_verify($password, $user['password'])) { + if ($user['status'] == 0) return json(['code' => -1, 'msg' => '此用户已被封禁', 'vcode' => 1]); + Db::name('log')->insert(['uid' => $user['id'], 'action' => '登录后台', 'data' => 'IP:' . $this->clientip, 'addtime' => date("Y-m-d H:i:s")]); DB::name('user')->where('id', $user['id'])->update(['lasttime' => date("Y-m-d H:i:s")]); - $session = md5($user['id'].$user['password']); - $expiretime = time()+2562000; + $session = md5($user['id'] . $user['password']); + $expiretime = time() + 2562000; $token = authcode("user\t{$user['id']}\t{$session}\t{$expiretime}", 'ENCODE', config_get('sys_key')); cookie('user_token', $token, ['expire' => $expiretime, 'httponly' => true]); if (file_exists($login_limit_file)) { unlink($login_limit_file); } - return json(['code'=>0]); - }else{ - if($user){ - Db::name('log')->insert(['uid' => $user['id'], 'action' => '登录失败', 'data' => 'IP:'.$this->clientip, 'addtime' => date("Y-m-d H:i:s")]); + return json(['code' => 0]); + } else { + if ($user) { + Db::name('log')->insert(['uid' => $user['id'], 'action' => '登录失败', 'data' => 'IP:' . $this->clientip, 'addtime' => date("Y-m-d H:i:s")]); } if (!file_exists($login_limit_file)) { $login_limit = ['count' => 0, 'time' => 0]; @@ -83,36 +77,41 @@ class Auth extends BaseController public function quicklogin() { - $domain = input('get.domain',null,'trim'); - $timestamp = input('get.timestamp',null,'trim'); - $token = input('get.token',null,'trim'); - $sign = input('get.sign',null,'trim'); - if(empty($domain) || empty($timestamp) || empty($token) || empty($sign)){ + $domain = input('get.domain', null, 'trim'); + $timestamp = input('get.timestamp', null, 'trim'); + $token = input('get.token', null, 'trim'); + $sign = input('get.sign', null, 'trim'); + if (empty($domain) || empty($timestamp) || empty($token) || empty($sign)) { return $this->alert('error', '参数错误'); } - if($timestamp < time()-300 || $timestamp > time()+300){ + if ($timestamp < time() - 300 || $timestamp > time() + 300) { return $this->alert('error', '时间戳无效'); } - if(md5(config_get('sys_key').$domain.$timestamp.$token.config_get('sys_key')) !== $sign){ + if (md5(config_get('sys_key') . $domain . $timestamp . $token . config_get('sys_key')) !== $sign) { return $this->alert('error', '签名错误'); } - if($token != cache('quicklogin_'.$domain)){ + if ($token != cache('quicklogin_' . $domain)) { return $this->alert('error', 'Token无效'); } $row = Db::name('domain')->where('name', $domain)->find(); - if(!$row){ + if (!$row) { return $this->alert('error', '该域名不存在'); } - if(!$row['is_sso']){ + if (!$row['is_sso']) { return $this->alert('error', '该域名不支持快捷登录'); } - Db::name('log')->insert(['uid' => 0, 'action' => '域名快捷登录', 'data' => 'IP:'.$this->clientip, 'addtime' => date("Y-m-d H:i:s"), 'domain' => $domain]); + Db::name('log')->insert(['uid' => 0, 'action' => '域名快捷登录', 'data' => 'IP:' . $this->clientip, 'addtime' => date("Y-m-d H:i:s"), 'domain' => $domain]); - $session = md5($row['id'].$row['name']); - $expiretime = time()+2562000; + $session = md5($row['id'] . $row['name']); + $expiretime = time() + 2562000; $token = authcode("domain\t{$row['id']}\t{$session}\t{$expiretime}", 'ENCODE', config_get('sys_key')); cookie('user_token', $token, ['expire' => $expiretime, 'httponly' => true]); - return redirect('/record/'.$row['id']); + return redirect('/record/' . $row['id']); + } + + public function verifycode() + { + return captcha(); } } diff --git a/app/controller/Dmonitor.php b/app/controller/Dmonitor.php index a3c0344..0ed4683 100644 --- a/app/controller/Dmonitor.php +++ b/app/controller/Dmonitor.php @@ -1,4 +1,5 @@ alert('error', '无权限'); - $switch_count = Db::name('dmlog')->where('date', '>=', date("Y-m-d H:i:s",strtotime("-1 days")))->count(); - $fail_count = Db::name('dmlog')->where('date', '>=', date("Y-m-d H:i:s",strtotime("-1 days")))->where('action', 1)->count(); + if (!checkPermission(2)) return $this->alert('error', '无权限'); + $switch_count = Db::name('dmlog')->where('date', '>=', date("Y-m-d H:i:s", strtotime("-1 days")))->count(); + $fail_count = Db::name('dmlog')->where('date', '>=', date("Y-m-d H:i:s", strtotime("-1 days")))->where('action', 1)->count(); $run_time = config_get('run_time', null, true); - $run_state = $run_time ? (time()-strtotime($run_time) > 10 ? 0 : 1) : 0; + $run_state = $run_time ? (time() - strtotime($run_time) > 10 ? 0 : 1) : 0; View::assign('info', [ 'run_count' => config_get('run_count', null, true) ?? 0, 'run_time' => $run_time ?? '无', @@ -32,47 +32,48 @@ class Dmonitor extends BaseController public function task() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!checkPermission(2)) return $this->alert('error', '无权限'); return View::fetch(); } - public function task_data(){ - if(!checkPermission(2)) return json(['total'=>0, 'rows'=>[]]); + public function task_data() + { + if (!checkPermission(2)) return json(['total' => 0, 'rows' => []]); $type = input('post.type/d', 1); $kw = input('post.kw', null, 'trim'); $offset = input('post.offset/d'); $limit = input('post.limit/d'); - $select = Db::name('dmtask')->alias('A')->join('domain B','A.did = B.id'); - if(!empty($kw)){ - if($type == 1){ - $select->whereLike('rr|B.name', '%'.$kw.'%'); - }elseif($type == 2){ + $select = Db::name('dmtask')->alias('A')->join('domain B', 'A.did = B.id'); + if (!empty($kw)) { + if ($type == 1) { + $select->whereLike('rr|B.name', '%' . $kw . '%'); + } elseif ($type == 2) { $select->where('recordid', $kw); - }elseif($type == 3){ + } elseif ($type == 3) { $select->where('main_value', $kw); - }elseif($type == 4){ + } elseif ($type == 4) { $select->where('backup_value', $kw); - }elseif($type == 5){ - $select->whereLike('remark', '%'.$kw.'%'); + } elseif ($type == 5) { + $select->whereLike('remark', '%' . $kw . '%'); } } $total = $select->count(); - $list = $select->order('A.id','desc')->limit($offset, $limit)->field('A.*,B.name domain')->select()->toArray(); + $list = $select->order('A.id', 'desc')->limit($offset, $limit)->field('A.*,B.name domain')->select()->toArray(); - foreach($list as &$row){ + foreach ($list as &$row) { $row['checktimestr'] = date('Y-m-d H:i:s', $row['checktime']); } - return json(['total'=>$total, 'rows'=>$list]); + return json(['total' => $total, 'rows' => $list]); } public function taskform() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!checkPermission(2)) return $this->alert('error', '无权限'); $action = input('param.action'); - if(request()->isPost()){ - if($action == 'add'){ + if ($this->request->isPost()) { + if ($action == 'add') { $task = [ 'did' => input('post.did/d'), 'rr' => input('post.rr', null, 'trim'), @@ -92,22 +93,22 @@ class Dmonitor extends BaseController 'addtime' => time(), 'active' => 1 ]; - - if(empty($task['did']) || empty($task['rr']) || empty($task['recordid']) || empty($task['main_value']) || empty($task['frequency']) || empty($task['cycle'])){ - return json(['code'=>-1, 'msg'=>'必填项不能为空']); + + if (empty($task['did']) || empty($task['rr']) || empty($task['recordid']) || empty($task['main_value']) || empty($task['frequency']) || empty($task['cycle'])) { + return json(['code' => -1, 'msg' => '必填项不能为空']); } - if($task['checktype'] > 0 && $task['timeout'] > $task['frequency']){ - return json(['code'=>-1, 'msg'=>'为保障容灾切换任务正常运行,最大超时时间不能大于检测间隔']); + if ($task['checktype'] > 0 && $task['timeout'] > $task['frequency']) { + return json(['code' => -1, 'msg' => '为保障容灾切换任务正常运行,最大超时时间不能大于检测间隔']); } - if($task['type'] == 2 && $task['backup_value'] == $task['main_value']){ - return json(['code'=>-1, 'msg'=>'主备地址不能相同']); + if ($task['type'] == 2 && $task['backup_value'] == $task['main_value']) { + return json(['code' => -1, 'msg' => '主备地址不能相同']); } - if(Db::name('dmtask')->where('recordid', $task['recordid'])->find()){ - return json(['code'=>-1, 'msg'=>'当前容灾切换策略已存在']); + if (Db::name('dmtask')->where('recordid', $task['recordid'])->find()) { + return json(['code' => -1, 'msg' => '当前容灾切换策略已存在']); } Db::name('dmtask')->insert($task); - return json(['code'=>0, 'msg'=>'添加成功']); - }elseif($action == 'edit'){ + return json(['code' => 0, 'msg' => '添加成功']); + } elseif ($action == 'edit') { $id = input('post.id/d'); $task = [ 'did' => input('post.did/d'), @@ -126,176 +127,197 @@ class Dmonitor extends BaseController 'remark' => input('post.remark', null, 'trim'), 'recordinfo' => input('post.recordinfo', null, 'trim'), ]; - - if(empty($task['did']) || empty($task['rr']) || empty($task['recordid']) || empty($task['main_value']) || empty($task['frequency']) || empty($task['cycle'])){ - return json(['code'=>-1, 'msg'=>'必填项不能为空']); + + if (empty($task['did']) || empty($task['rr']) || empty($task['recordid']) || empty($task['main_value']) || empty($task['frequency']) || empty($task['cycle'])) { + return json(['code' => -1, 'msg' => '必填项不能为空']); } - if($task['checktype'] > 0 && $task['timeout'] > $task['frequency']){ - return json(['code'=>-1, 'msg'=>'为保障容灾切换任务正常运行,最大超时时间不能大于检测间隔']); + if ($task['checktype'] > 0 && $task['timeout'] > $task['frequency']) { + return json(['code' => -1, 'msg' => '为保障容灾切换任务正常运行,最大超时时间不能大于检测间隔']); } - if($task['type'] == 2 && $task['backup_value'] == $task['main_value']){ - return json(['code'=>-1, 'msg'=>'主备地址不能相同']); + if ($task['type'] == 2 && $task['backup_value'] == $task['main_value']) { + return json(['code' => -1, 'msg' => '主备地址不能相同']); } - if(Db::name('dmtask')->where('recordid', $task['recordid'])->where('id', '<>', $id)->find()){ - return json(['code'=>-1, 'msg'=>'当前容灾切换策略已存在']); + if (Db::name('dmtask')->where('recordid', $task['recordid'])->where('id', '<>', $id)->find()) { + return json(['code' => -1, 'msg' => '当前容灾切换策略已存在']); } Db::name('dmtask')->where('id', $id)->update($task); - return json(['code'=>0, 'msg'=>'修改成功']); - }elseif($action == 'setactive'){ + return json(['code' => 0, 'msg' => '修改成功']); + } elseif ($action == 'setactive') { $id = input('post.id/d'); $active = input('post.active/d'); - Db::name('dmtask')->where('id', $id)->update(['active'=>$active]); - return json(['code'=>0, 'msg'=>'设置成功']); - }elseif($action == 'del'){ + Db::name('dmtask')->where('id', $id)->update(['active' => $active]); + return json(['code' => 0, 'msg' => '设置成功']); + } elseif ($action == 'del') { $id = input('post.id/d'); Db::name('dmtask')->where('id', $id)->delete(); Db::name('dmlog')->where('taskid', $id)->delete(); - return json(['code'=>0, 'msg'=>'删除成功']); - }else{ - return json(['code'=>-1, 'msg'=>'参数错误']); + return json(['code' => 0, 'msg' => '删除成功']); + } else { + return json(['code' => -1, 'msg' => '参数错误']); } } $task = null; - if($action == 'edit'){ + if ($action == 'edit') { $id = input('get.id/d'); $task = Db::name('dmtask')->where('id', $id)->find(); - if(empty($task)) return $this->alert('error', '切换策略不存在'); + if (empty($task)) return $this->alert('error', '切换策略不存在'); } $domains = []; - foreach(Db::name('domain')->select() as $row){ + foreach (Db::name('domain')->select() as $row) { $domains[$row['id']] = $row['name']; } View::assign('domains', $domains); View::assign('info', $task); View::assign('action', $action); - View::assign('support_ping', function_exists('exec')?'1':'0'); + View::assign('support_ping', function_exists('exec') ? '1' : '0'); return View::fetch(); } public function taskinfo() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!checkPermission(2)) return $this->alert('error', '无权限'); $id = input('param.id/d'); $task = Db::name('dmtask')->where('id', $id)->find(); - if(empty($task)) return $this->alert('error', '切换策略不存在'); + if (empty($task)) return $this->alert('error', '切换策略不存在'); - $switch_count = Db::name('dmlog')->where('taskid', $id)->where('date', '>=', date("Y-m-d H:i:s",strtotime("-1 days")))->count(); - $fail_count = Db::name('dmlog')->where('taskid', $id)->where('date', '>=', date("Y-m-d H:i:s",strtotime("-1 days")))->where('action', 1)->count(); + $switch_count = Db::name('dmlog')->where('taskid', $id)->where('date', '>=', date("Y-m-d H:i:s", strtotime("-1 days")))->count(); + $fail_count = Db::name('dmlog')->where('taskid', $id)->where('date', '>=', date("Y-m-d H:i:s", strtotime("-1 days")))->where('action', 1)->count(); $task['switch_count'] = $switch_count; $task['fail_count'] = $fail_count; - if($task['type'] == 3){ + if ($task['type'] == 3) { $task['action_name'] = ['未知', '开启解析', '暂停解析']; - }elseif($task['type'] == 2){ + } elseif ($task['type'] == 2) { $task['action_name'] = ['未知', '切换备用解析记录', '恢复主解析记录']; - }else{ + } else { $task['action_name'] = ['未知', '暂停解析', '启用解析']; } View::assign('info', $task); return View::fetch(); } - public function tasklog_data(){ - if(!checkPermission(2)) return json(['total'=>0, 'rows'=>[]]); + public function tasklog_data() + { + if (!checkPermission(2)) return json(['total' => 0, 'rows' => []]); $taskid = input('param.id/d'); $offset = input('post.offset/d'); $limit = input('post.limit/d'); $action = input('post.action/d', 0); $select = Db::name('dmlog')->where('taskid', $taskid); - if($action > 0){ + if ($action > 0) { $select->where('action', $action); } $total = $select->count(); - $list = $select->order('id','desc')->limit($offset, $limit)->select(); + $list = $select->order('id', 'desc')->limit($offset, $limit)->select(); - return json(['total'=>$total, 'rows'=>$list]); + return json(['total' => $total, 'rows' => $list]); } public function noticeset() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); - if(request()->isPost()){ + if (!checkPermission(2)) return $this->alert('error', '无权限'); + if ($this->request->isPost()) { $params = input('post.'); - if(isset($params['mail_type']) && isset($params['mail_name2']) && $params['mail_type'] > 0){ + if (isset($params['mail_type']) && isset($params['mail_name2']) && $params['mail_type'] > 0) { $params['mail_name'] = $params['mail_name2']; unset($params['mail_name2']); } - foreach ($params as $key=>$value){ + foreach ($params as $key => $value) { if (empty($key)) { continue; } config_set($key, $value); - Cache::delete('configs'); + Cache::delete('configs'); } - return json(['code'=>0, 'msg'=>'succ']); + return json(['code' => 0, 'msg' => 'succ']); } return View::fetch(); } public function proxyset() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); - if(request()->isPost()){ + if (!checkPermission(2)) return $this->alert('error', '无权限'); + if ($this->request->isPost()) { $params = input('post.'); - foreach ($params as $key=>$value){ + foreach ($params as $key => $value) { if (empty($key)) { continue; } config_set($key, $value); - Cache::delete('configs'); + Cache::delete('configs'); } - return json(['code'=>0, 'msg'=>'succ']); + return json(['code' => 0, 'msg' => 'succ']); } return View::fetch(); } public function mailtest() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); - $mail_name = config_get('mail_recv')?config_get('mail_recv'):config_get('mail_name'); - if(empty($mail_name)) return json(['code'=>-1, 'msg'=>'您还未设置邮箱!']); - $result = \app\lib\MsgNotice::send_mail($mail_name,'邮件发送测试。','这是一封测试邮件!

来自:'.request()->root(true)); - if($result === true){ - return json(['code'=>0, 'msg'=>'邮件发送成功!']); - }else{ - return json(['code'=>-1, 'msg'=>'邮件发送失败!'.$result]); + if (!checkPermission(2)) return $this->alert('error', '无权限'); + $mail_name = config_get('mail_recv') ? config_get('mail_recv') : config_get('mail_name'); + if (empty($mail_name)) return json(['code' => -1, 'msg' => '您还未设置邮箱!']); + $result = \app\lib\MsgNotice::send_mail($mail_name, '邮件发送测试。', '这是一封测试邮件!

来自:' . $this->request->root(true)); + if ($result === true) { + return json(['code' => 0, 'msg' => '邮件发送成功!']); + } else { + return json(['code' => -1, 'msg' => '邮件发送失败!' . $result]); } } public function tgbottest() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!checkPermission(2)) return $this->alert('error', '无权限'); $tgbot_token = config_get('tgbot_token'); $tgbot_chatid = config_get('tgbot_chatid'); - if(empty($tgbot_token) || empty($tgbot_chatid)) return json(['code'=>-1, 'msg'=>'请先保存设置']); - $content = "消息发送测试\n\n这是一封测试消息!\n\n来自:".request()->root(true); + if (empty($tgbot_token) || empty($tgbot_chatid)) return json(['code' => -1, 'msg' => '请先保存设置']); + $content = "消息发送测试\n\n这是一封测试消息!\n\n来自:" . $this->request->root(true); $result = \app\lib\MsgNotice::send_telegram_bot($content); - if($result === true){ - return json(['code'=>0, 'msg'=>'消息发送成功!']); - }else{ - return json(['code'=>-1, 'msg'=>'消息发送失败!'.$result]); + if ($result === true) { + return json(['code' => 0, 'msg' => '消息发送成功!']); + } else { + return json(['code' => -1, 'msg' => '消息发送失败!' . $result]); } } + public function proxytest() + { + if (!checkPermission(2)) return $this->alert('error', '无权限'); + $proxy_server = trim($_POST['proxy_server']); + $proxy_port = $_POST['proxy_port']; + $proxy_user = trim($_POST['proxy_user']); + $proxy_pwd = trim($_POST['proxy_pwd']); + $proxy_type = $_POST['proxy_type']; + try { + check_proxy('https://dl.amh.sh/ip.htm', $proxy_server, $proxy_port, $proxy_type, $proxy_user, $proxy_pwd); + } catch (Exception $e) { + try { + check_proxy('https://myip.ipip.net/', $proxy_server, $proxy_port, $proxy_type, $proxy_user, $proxy_pwd); + } catch (Exception $e) { + return json(['code' => -1, 'msg' => $e->getMessage()]); + } + } + return json(['code' => 0]); + } + public function clean() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); - if(request()->isPost()){ + if (!checkPermission(2)) return $this->alert('error', '无权限'); + if ($this->request->isPost()) { $days = input('post.days/d'); - if(!$days || $days < 0) return json(['code'=>-1, 'msg'=>'参数错误']); - Db::execute("DELETE FROM `".config('database.connections.mysql.prefix')."dmlog` WHERE `date`<'".date("Y-m-d H:i:s",strtotime("-".$days." days"))."'"); - Db::execute("OPTIMIZE TABLE `".config('database.connections.mysql.prefix')."dmlog`"); - return json(['code'=>0, 'msg'=>'清理成功']); + if (!$days || $days < 0) return json(['code' => -1, 'msg' => '参数错误']); + Db::execute("DELETE FROM `" . config('database.connections.mysql.prefix') . "dmlog` WHERE `date`<'" . date("Y-m-d H:i:s", strtotime("-" . $days . " days")) . "'"); + Db::execute("OPTIMIZE TABLE `" . config('database.connections.mysql.prefix') . "dmlog`"); + return json(['code' => 0, 'msg' => '清理成功']); } } public function status() { $run_time = config_get('run_time', null, true); - $run_state = $run_time ? (time()-strtotime($run_time) > 10 ? 0 : 1) : 0; + $run_state = $run_time ? (time() - strtotime($run_time) > 10 ? 0 : 1) : 0; return $run_state == 1 ? 'ok' : 'error'; } -} \ No newline at end of file +} diff --git a/app/controller/Domain.php b/app/controller/Domain.php index 1f1dd6b..2392fde 100644 --- a/app/controller/Domain.php +++ b/app/controller/Domain.php @@ -11,52 +11,55 @@ use Exception; class Domain extends BaseController { - - public function account(){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + + public function account() + { + if (!checkPermission(2)) return $this->alert('error', '无权限'); View::assign('dnsconfig', DnsHelper::$dns_config); return view(); } - public function account_data(){ - if(!checkPermission(2)) return json(['total'=>0, 'rows'=>[]]); - $kw = input('post.kw', null, 'trim'); + public function account_data() + { + if (!checkPermission(2)) return json(['total' => 0, 'rows' => []]); + $kw = $this->request->post('kw', null, 'trim'); $offset = input('post.offset/d'); $limit = input('post.limit/d'); $select = Db::name('account'); - if(!empty($kw)){ - $select->whereLike('ak|remark', '%'.$kw.'%'); + if (!empty($kw)) { + $select->whereLike('ak|remark', '%' . $kw . '%'); } $total = $select->count(); - $rows = $select->order('id','desc')->limit($offset, $limit)->select(); + $rows = $select->order('id', 'desc')->limit($offset, $limit)->select(); $list = []; - foreach($rows as $row){ + foreach ($rows as $row) { $row['typename'] = DnsHelper::$dns_config[$row['type']]['name']; $list[] = $row; } - return json(['total'=>$total, 'rows'=>$list]); + return json(['total' => $total, 'rows' => $list]); } - public function account_op(){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + public function account_op() + { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $act = input('param.act'); - if($act == 'get'){ + if ($act == 'get') { $id = input('post.id/d'); $row = Db::name('account')->where('id', $id)->find(); - if(!$row) return json(['code'=>-1, 'msg'=>'域名账户不存在']); - return json(['code'=>0, 'data'=>$row]); - }elseif($act == 'add'){ + if (!$row) return json(['code' => -1, 'msg' => '域名账户不存在']); + return json(['code' => 0, 'data' => $row]); + } elseif ($act == 'add') { $type = input('post.type'); $ak = input('post.ak', null, 'trim'); $sk = input('post.sk', null, 'trim'); $ext = input('post.ext', null, 'trim'); $remark = input('post.remark', null, 'trim'); - if(empty($ak) || empty($sk)) return json(['code'=>-1, 'msg'=>'AccessKey和SecretKey不能为空']); - if(Db::name('account')->where('type', $type)->where('ak', $ak)->find()){ - return json(['code'=>-1, 'msg'=>'域名账户已存在']); + if (empty($ak) || empty($sk)) return json(['code' => -1, 'msg' => 'AccessKey和SecretKey不能为空']); + if (Db::name('account')->where('type', $type)->where('ak', $ak)->find()) { + return json(['code' => -1, 'msg' => '域名账户已存在']); } Db::startTrans(); $id = Db::name('account')->insertGetId([ @@ -68,31 +71,30 @@ class Domain extends BaseController 'addtime' => date('Y-m-d H:i:s'), ]); $dns = DnsHelper::getModel($id); - if($dns){ - if($dns->check()){ + if ($dns) { + if ($dns->check()) { Db::commit(); - return json(['code'=>0, 'msg'=>'添加域名账户成功!']); - }else{ + return json(['code' => 0, 'msg' => '添加域名账户成功!']); + } else { Db::rollback(); - return json(['code'=>-1, 'msg'=>'验证域名账户失败,'.$dns->getError()]); + return json(['code' => -1, 'msg' => '验证域名账户失败,' . $dns->getError()]); } - }else{ + } else { Db::rollback(); - return json(['code'=>-1, 'msg'=>'DNS模块('.$type.')不存在']); + return json(['code' => -1, 'msg' => 'DNS模块(' . $type . ')不存在']); } - - }elseif($act == 'edit'){ + } elseif ($act == 'edit') { $id = input('post.id/d'); $row = Db::name('account')->where('id', $id)->find(); - if(!$row) return json(['code'=>-1, 'msg'=>'域名账户不存在']); + if (!$row) return json(['code' => -1, 'msg' => '域名账户不存在']); $type = input('post.type'); $ak = input('post.ak', null, 'trim'); $sk = input('post.sk', null, 'trim'); $ext = input('post.ext', null, 'trim'); $remark = input('post.remark', null, 'trim'); - if(empty($ak) || empty($sk)) return json(['code'=>-1, 'msg'=>'AccessKey和SecretKey不能为空']); - if(Db::name('account')->where('type', $type)->where('ak', $ak)->where('id', '<>', $id)->find()){ - return json(['code'=>-1, 'msg'=>'域名账户已存在']); + if (empty($ak) || empty($sk)) return json(['code' => -1, 'msg' => 'AccessKey和SecretKey不能为空']); + if (Db::name('account')->where('type', $type)->where('ak', $ak)->where('id', '<>', $id)->find()) { + return json(['code' => -1, 'msg' => '域名账户已存在']); } Db::startTrans(); Db::name('account')->where('id', $id)->update([ @@ -103,43 +105,44 @@ class Domain extends BaseController 'remark' => $remark, ]); $dns = DnsHelper::getModel($id); - if($dns){ - if($dns->check()){ + if ($dns) { + if ($dns->check()) { Db::commit(); - return json(['code'=>0, 'msg'=>'修改域名账户成功!']); - }else{ + return json(['code' => 0, 'msg' => '修改域名账户成功!']); + } else { Db::rollback(); - return json(['code'=>-1, 'msg'=>'验证域名账户失败,'.$dns->getError()]); + return json(['code' => -1, 'msg' => '验证域名账户失败,' . $dns->getError()]); } - }else{ + } else { Db::rollback(); - return json(['code'=>-1, 'msg'=>'DNS模块('.$type.')不存在']); + return json(['code' => -1, 'msg' => 'DNS模块(' . $type . ')不存在']); } - }elseif($act == 'del'){ + } elseif ($act == 'del') { $id = input('post.id/d'); $dcount = DB::name('domain')->where('aid', $id)->count(); - if($dcount > 0) return json(['code'=>-1, 'msg'=>'该域名账户下存在域名,无法删除']); + if ($dcount > 0) return json(['code' => -1, 'msg' => '该域名账户下存在域名,无法删除']); Db::name('account')->where('id', $id)->delete(); - return json(['code'=>0]); + return json(['code' => 0]); } - return json(['code'=>-3]); + return json(['code' => -3]); } - public function domain(){ - if(request()->user['type'] == 'domain'){ - return redirect('/record/'.request()->user['id']); + public function domain() + { + if (request()->user['type'] == 'domain') { + return redirect('/record/' . request()->user['id']); } $list = Db::name('account')->select(); $accounts = []; $types = []; - foreach($list as $row){ - $accounts[$row['id']] = $row['id'].'_'.DnsHelper::$dns_config[$row['type']]['name']; - if(!array_key_exists($row['type'], $types)){ + foreach ($list as $row) { + $accounts[$row['id']] = $row['id'] . '_' . DnsHelper::$dns_config[$row['type']]['name']; + if (!array_key_exists($row['type'], $types)) { $types[$row['type']] = DnsHelper::$dns_config[$row['type']]['name']; } - if(!empty($row['remark'])){ - $accounts[$row['id']] .= '('.$row['remark'].')'; + if (!empty($row['remark'])) { + $accounts[$row['id']] .= '(' . $row['remark'] . ')'; } } View::assign('accounts', $accounts); @@ -147,52 +150,54 @@ class Domain extends BaseController return view(); } - public function domain_data(){ - if(!checkPermission(1)) return json(['total'=>0, 'rows'=>[]]); + public function domain_data() + { + if (!checkPermission(1)) return json(['total' => 0, 'rows' => []]); $kw = input('post.kw', null, 'trim'); $type = input('post.type', null, 'trim'); $offset = input('post.offset/d', 0); $limit = input('post.limit/d', 10); - $select = Db::name('domain')->alias('A')->join('account B','A.aid = B.id'); - if(!empty($kw)){ - $select->whereLike('name|A.remark', '%'.$kw.'%'); + $select = Db::name('domain')->alias('A')->join('account B', 'A.aid = B.id'); + if (!empty($kw)) { + $select->whereLike('name|A.remark', '%' . $kw . '%'); } - if(!empty($type)){ + if (!empty($type)) { $select->whereLike('B.type', $type); } - if(request()->user['level'] == 1){ + if (request()->user['level'] == 1) { $select->where('is_hide', 0)->where('A.name', 'in', request()->user['permission']); } $total = $select->count(); - $rows = $select->fieldRaw('A.*,B.type,B.remark aremark')->order('A.id','desc')->limit($offset, $limit)->select(); + $rows = $select->fieldRaw('A.*,B.type,B.remark aremark')->order('A.id', 'desc')->limit($offset, $limit)->select(); $list = []; - foreach($rows as $row){ + foreach ($rows as $row) { $row['typename'] = DnsHelper::$dns_config[$row['type']]['name']; $list[] = $row; } - return json(['total'=>$total, 'rows'=>$list]); + return json(['total' => $total, 'rows' => $list]); } - public function domain_op(){ - if(!checkPermission(1)) return $this->alert('error', '无权限'); + public function domain_op() + { + if (!checkPermission(1)) return $this->alert('error', '无权限'); $act = input('param.act'); - if($act == 'get'){ + if ($act == 'get') { $id = input('post.id/d'); $row = Db::name('domain')->where('id', $id)->find(); - if(!$row) return json(['code'=>-1, 'msg'=>'域名不存在']); - return json(['code'=>0, 'data'=>$row]); - }elseif($act == 'add'){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!$row) return json(['code' => -1, 'msg' => '域名不存在']); + return json(['code' => 0, 'data' => $row]); + } elseif ($act == 'add') { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $aid = input('post.aid/d'); $name = input('post.name', null, 'trim'); $thirdid = input('post.thirdid', null, 'trim'); $recordcount = input('post.recordcount/d', 0); - if(empty($name) || empty($thirdid)) return json(['code'=>-1, 'msg'=>'参数不能为空']); - if(Db::name('domain')->where('aid', $aid)->where('name', $name)->find()){ - return json(['code'=>-1, 'msg'=>'域名已存在']); + if (empty($name) || empty($thirdid)) return json(['code' => -1, 'msg' => '参数不能为空']); + if (Db::name('domain')->where('aid', $aid)->where('name', $name)->find()) { + return json(['code' => -1, 'msg' => '域名已存在']); } Db::name('domain')->insert([ 'aid' => $aid, @@ -203,12 +208,12 @@ class Domain extends BaseController 'is_sso' => 1, 'recordcount' => $recordcount, ]); - return json(['code'=>0, 'msg'=>'添加域名成功!']); - }elseif($act == 'edit'){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + return json(['code' => 0, 'msg' => '添加域名成功!']); + } elseif ($act == 'edit') { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $id = input('post.id/d'); $row = Db::name('domain')->where('id', $id)->find(); - if(!$row) return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$row) return json(['code' => -1, 'msg' => '域名不存在']); $is_hide = input('post.is_hide/d'); $is_sso = input('post.is_sso/d'); $remark = input('post.remark', null, 'trim'); @@ -217,69 +222,72 @@ class Domain extends BaseController 'is_sso' => $is_sso, 'remark' => $remark, ]); - return json(['code'=>0, 'msg'=>'修改域名配置成功!']); - }elseif($act == 'del'){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + return json(['code' => 0, 'msg' => '修改域名配置成功!']); + } elseif ($act == 'del') { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $id = input('post.id/d'); Db::name('domain')->where('id', $id)->delete(); Db::name('dmtask')->where('did', $id)->delete(); Db::name('optimizeip')->where('did', $id)->delete(); - return json(['code'=>0]); + return json(['code' => 0]); } - return json(['code'=>-3]); + return json(['code' => -3]); } - public function domain_list(){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + public function domain_list() + { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $aid = input('post.aid/d'); $kw = input('post.kw', null, 'trim'); $page = input('?post.page') ? input('post.page/d') : 1; $pagesize = input('?post.pagesize') ? input('post.pagesize/d') : 10; $dns = DnsHelper::getModel($aid); $result = $dns->getDomainList($kw, $page, $pagesize); - if(!$result) return json(['code'=>-1, 'msg'=>'获取域名列表失败,'.$dns->getError()]); + if (!$result) return json(['code' => -1, 'msg' => '获取域名列表失败,' . $dns->getError()]); $newlist = []; - foreach($result['list'] as $row){ - if(!Db::name('domain')->where('aid', $aid)->where('name', $row['Domain'])->find()){ + foreach ($result['list'] as $row) { + if (!Db::name('domain')->where('aid', $aid)->where('name', $row['Domain'])->find()) { $newlist[] = $row; } } - return json(['code'=>0, 'data'=>['total'=>$result['total'], 'list'=>$newlist]]); + return json(['code' => 0, 'data' => ['total' => $result['total'], 'list' => $newlist]]); } //获取解析线路和最小TTL - private function get_line_and_ttl($drow){ - $recordLine = cache('record_line_'.$drow['id']); - $minTTL = cache('min_ttl_'.$drow['id']); - if(empty($recordLine)){ + private function get_line_and_ttl($drow) + { + $recordLine = cache('record_line_' . $drow['id']); + $minTTL = cache('min_ttl_' . $drow['id']); + if (empty($recordLine)) { $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - if(!$dns) throw new Exception('DNS模块不存在'); + if (!$dns) throw new Exception('DNS模块不存在'); $recordLine = $dns->getRecordLine(); - if(!$recordLine) throw new Exception('获取解析线路列表失败,'.$dns->getError()); - cache('record_line_'.$drow['id'], $recordLine, 604800); + if (!$recordLine) throw new Exception('获取解析线路列表失败,' . $dns->getError()); + cache('record_line_' . $drow['id'], $recordLine, 604800); $minTTL = $dns->getMinTTL(); - if($minTTL){ - cache('min_ttl_'.$drow['id'], $minTTL, 604800); + if ($minTTL) { + cache('min_ttl_' . $drow['id'], $minTTL, 604800); } } return [$recordLine, $minTTL]; } - public function domain_info(){ + public function domain_info() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ + if (!$drow) { return $this->alert('error', '域名不存在'); } $dnstype = Db::name('account')->where('id', $drow['aid'])->value('type'); - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); list($recordLine, $minTTL) = $this->get_line_and_ttl($drow); $recordLineArr = []; - foreach($recordLine as $key=>$item){ - $recordLineArr[] = ['id'=>strval($key), 'name'=>$item['name'], 'parent'=>$item['parent']]; + foreach ($recordLine as $key => $item) { + $recordLineArr[] = ['id' => strval($key), 'name' => $item['name'], 'parent' => $item['parent']]; } $dnsconfig = DnsHelper::$dns_config[$dnstype]; @@ -287,32 +295,33 @@ class Domain extends BaseController $drow['config'] = $dnsconfig; $drow['recordLine'] = $recordLineArr; - $drow['minTTL'] = $minTTL?$minTTL:1; - if(input('?post.loginurl') && input('post.loginurl') == '1'){ + $drow['minTTL'] = $minTTL ? $minTTL : 1; + if (input('?post.loginurl') && input('post.loginurl') == '1') { $token = getSid(); - cache('quicklogin_'.$drow['name'], $token, 3600); + cache('quicklogin_' . $drow['name'], $token, 3600); $timestamp = time(); - $sign = md5(config_get('sys_key').$drow['name'].$timestamp.$token.config_get('sys_key')); - $drow['loginurl'] = request()->root(true).'/quicklogin?domain='.$drow['name'].'×tamp='.$timestamp.'&token='.$token.'&sign='.$sign; + $sign = md5(config_get('sys_key') . $drow['name'] . $timestamp . $token . config_get('sys_key')); + $drow['loginurl'] = request()->root(true) . '/quicklogin?domain=' . $drow['name'] . '×tamp=' . $timestamp . '&token=' . $token . '&sign=' . $sign; } - return json(['code'=>0, 'data'=>$drow]); + return json(['code' => 0, 'data' => $drow]); } - public function record(){ + public function record() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ + if (!$drow) { return $this->alert('error', '域名不存在'); } $dnstype = Db::name('account')->where('id', $drow['aid'])->value('type'); - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); list($recordLine, $minTTL) = $this->get_line_and_ttl($drow); $recordLineArr = []; - foreach($recordLine as $key=>$item){ - $recordLineArr[] = ['id'=>strval($key), 'name'=>$item['name'], 'parent'=>$item['parent']]; + foreach ($recordLine as $key => $item) { + $recordLineArr[] = ['id' => strval($key), 'name' => $item['name'], 'parent' => $item['parent']]; } $dnsconfig = DnsHelper::$dns_config[$dnstype]; @@ -321,12 +330,13 @@ class Domain extends BaseController View::assign('domainId', $id); View::assign('domainName', $drow['name']); View::assign('recordLine', $recordLineArr); - View::assign('minTTL', $minTTL?$minTTL:1); + View::assign('minTTL', $minTTL ? $minTTL : 1); View::assign('dnsconfig', $dnsconfig); return view(); } - public function record_data(){ + public function record_data() + { $id = input('param.id/d'); $keyword = input('post.keyword', null, 'trim'); $subdomain = input('post.subdomain', null, 'trim'); @@ -336,71 +346,73 @@ class Domain extends BaseController $status = input('post.status', null, 'trim'); $offset = input('post.offset/d'); $limit = input('post.limit/d'); - if($limit == 0){ + if ($limit == 0) { $page = 1; - }else{ - $page = $offset/$limit + 1; + } else { + $page = $offset / $limit + 1; } $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['total'=>0, 'rows'=>[]]); + if (!$drow) { + return json(['total' => 0, 'rows' => []]); } - if(!checkPermission(0, $drow['name'])) return json(['total'=>0, 'rows'=>[]]); + if (!checkPermission(0, $drow['name'])) return json(['total' => 0, 'rows' => []]); $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $domainRecords = $dns->getDomainRecords($page, $limit, $keyword, $subdomain, $value, $type, $line, $status); - if(!$domainRecords) return json(['total'=>0, 'rows'=>[]]); + if (!$domainRecords) return json(['total' => 0, 'rows' => []]); - if(empty($keyword) && empty($subdomain) && empty($type) && empty($line) && empty($status) && empty($value) && $domainRecords['total'] != $drow['recordcount']){ - Db::name('domain')->where('id', $id)->update(['recordcount'=>$domainRecords['total']]); + if (empty($keyword) && empty($subdomain) && empty($type) && empty($line) && empty($status) && empty($value) && $domainRecords['total'] != $drow['recordcount']) { + Db::name('domain')->where('id', $id)->update(['recordcount' => $domainRecords['total']]); } - $recordLine = cache('record_line_'.$id); + $recordLine = cache('record_line_' . $id); - foreach($domainRecords['list'] as &$row){ + foreach ($domainRecords['list'] as &$row) { $row['LineName'] = isset($recordLine[$row['Line']]) ? $recordLine[$row['Line']]['name'] : $row['Line']; } $dnstype = Db::name('account')->where('id', $drow['aid'])->value('type'); - if($dnstype == 'baidu'){ + if ($dnstype == 'baidu') { return json($domainRecords['list']); } - return json(['total'=>$domainRecords['total'], 'rows'=>$domainRecords['list']]); + return json(['total' => $domainRecords['total'], 'rows' => $domainRecords['list']]); } - public function record_list(){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + public function record_list() + { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $id = input('post.id/d'); $rr = input('post.rr', null, 'trim'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return json(['code'=>-1, 'msg'=>'无权限']); + if (!checkPermission(0, $drow['name'])) return json(['code' => -1, 'msg' => '无权限']); $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $domainRecords = $dns->getSubDomainRecords($rr, 1, 100); - if(!$domainRecords) return json(['code'=>-1, 'msg'=>'获取记录列表失败,'.$dns->getError()]); + if (!$domainRecords) return json(['code' => -1, 'msg' => '获取记录列表失败,' . $dns->getError()]); list($recordLine, $minTTL) = $this->get_line_and_ttl($drow); - foreach($domainRecords['list'] as &$row){ + foreach ($domainRecords['list'] as &$row) { $row['LineName'] = isset($recordLine[$row['Line']]) ? $recordLine[$row['Line']]['name'] : $row['Line']; } - return json(['code'=>0, 'data'=>$domainRecords['list']]); + return json(['code' => 0, 'data' => $domainRecords['list']]); } - public function record_add(){ + public function record_add() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); $name = input('post.name', null, 'trim'); $type = input('post.type', null, 'trim'); @@ -411,27 +423,28 @@ class Domain extends BaseController $mx = input('post.mx/d', 1); $remark = input('post.remark', null, 'trim'); - if(empty($name) || empty($type) || empty($value)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($name) || empty($type) || empty($value)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } - + $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $recordid = $dns->addDomainRecord($name, $type, $value, $line, $ttl, $mx, $weight, $remark); - if($recordid){ - $this->add_log($drow['name'], '添加解析', $type.'记录 '.$name.' '.$value.' (线路:'.$line.' TTL:'.$ttl.')'); - return json(['code'=>0, 'msg'=>'添加解析记录成功!']); - }else{ - return json(['code'=>-1, 'msg'=>'添加解析记录失败,'.$dns->getError()]); + if ($recordid) { + $this->add_log($drow['name'], '添加解析', $type . '记录 ' . $name . ' ' . $value . ' (线路:' . $line . ' TTL:' . $ttl . ')'); + return json(['code' => 0, 'msg' => '添加解析记录成功!']); + } else { + return json(['code' => -1, 'msg' => '添加解析记录失败,' . $dns->getError()]); } } - public function record_update(){ + public function record_update() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); $recordid = input('post.recordid', null, 'trim'); $name = input('post.name', null, 'trim'); @@ -443,216 +456,223 @@ class Domain extends BaseController $mx = input('post.mx/d', 1); $remark = input('post.remark', null, 'trim'); - if(empty($recordid) || empty($name) || empty($type) || empty($value)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($recordid) || empty($name) || empty($type) || empty($value)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $recordid = $dns->updateDomainRecord($recordid, $name, $type, $value, $line, $ttl, $mx, $weight, $remark); - if($recordid){ - $this->add_log($drow['name'], '修改解析', $type.'记录 '.$name.' '.$value.' (线路:'.$line.' TTL:'.$ttl.')'); - return json(['code'=>0, 'msg'=>'修改解析记录成功!']); - }else{ - return json(['code'=>-1, 'msg'=>'修改解析记录失败,'.$dns->getError()]); + if ($recordid) { + $this->add_log($drow['name'], '修改解析', $type . '记录 ' . $name . ' ' . $value . ' (线路:' . $line . ' TTL:' . $ttl . ')'); + return json(['code' => 0, 'msg' => '修改解析记录成功!']); + } else { + return json(['code' => -1, 'msg' => '修改解析记录失败,' . $dns->getError()]); } } - public function record_delete(){ + public function record_delete() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); $recordid = input('post.recordid', null, 'trim'); - if(empty($recordid)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($recordid)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - if($dns->deleteDomainRecord($recordid)){ - $this->add_log($drow['name'], '删除解析', '记录ID:'.$recordid); - return json(['code'=>0, 'msg'=>'删除解析记录成功!']); - }else{ - return json(['code'=>-1, 'msg'=>'删除解析记录失败,'.$dns->getError()]); + if ($dns->deleteDomainRecord($recordid)) { + $this->add_log($drow['name'], '删除解析', '记录ID:' . $recordid); + return json(['code' => 0, 'msg' => '删除解析记录成功!']); + } else { + return json(['code' => -1, 'msg' => '删除解析记录失败,' . $dns->getError()]); } } - public function record_status(){ + public function record_status() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); $recordid = input('post.recordid', null, 'trim'); $status = input('post.status', null, 'trim'); - if(empty($recordid)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($recordid)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - if($dns->setDomainRecordStatus($recordid, $status)){ + if ($dns->setDomainRecordStatus($recordid, $status)) { $action = $status == '1' ? '启用解析' : '暂停解析'; - $this->add_log($drow['name'], $action, '记录ID:'.$recordid); - return json(['code'=>0, 'msg'=>'操作成功!']); - }else{ - return json(['code'=>-1, 'msg'=>'操作失败,'.$dns->getError()]); + $this->add_log($drow['name'], $action, '记录ID:' . $recordid); + return json(['code' => 0, 'msg' => '操作成功!']); + } else { + return json(['code' => -1, 'msg' => '操作失败,' . $dns->getError()]); } } - public function record_remark(){ + public function record_remark() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); $recordid = input('post.recordid', null, 'trim'); $remark = input('post.remark', null, 'trim'); - if(empty($recordid)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($recordid)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } - if(empty($remark)) $remark = null; + if (empty($remark)) $remark = null; $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - if($dns->updateDomainRecordRemark($recordid, $remark)){ - return json(['code'=>0, 'msg'=>'操作成功!']); - }else{ - return json(['code'=>-1, 'msg'=>'操作失败,'.$dns->getError()]); + if ($dns->updateDomainRecordRemark($recordid, $remark)) { + return json(['code' => 0, 'msg' => '操作成功!']); + } else { + return json(['code' => -1, 'msg' => '操作失败,' . $dns->getError()]); } } - public function record_batch(){ + public function record_batch() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); $recordids = input('post.recordids', null, 'trim'); $action = input('post.action', null, 'trim'); - if(empty($recordids) || empty($action)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($recordids) || empty($action)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } $success = 0; $fail = 0; $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - if($action == 'open'){ - foreach($recordids as $recordid){ - if($dns->setDomainRecordStatus($recordid, '1')){ - $this->add_log($drow['name'], '启用解析', '记录ID:'.$recordid); + if ($action == 'open') { + foreach ($recordids as $recordid) { + if ($dns->setDomainRecordStatus($recordid, '1')) { + $this->add_log($drow['name'], '启用解析', '记录ID:' . $recordid); $success++; } } - $msg = '成功启用'.$success.'条解析记录'; - }else if($action == 'pause'){ - foreach($recordids as $recordid){ - if($dns->setDomainRecordStatus($recordid, '0')){ - $this->add_log($drow['name'], '暂停解析', '记录ID:'.$recordid); + $msg = '成功启用' . $success . '条解析记录'; + } else if ($action == 'pause') { + foreach ($recordids as $recordid) { + if ($dns->setDomainRecordStatus($recordid, '0')) { + $this->add_log($drow['name'], '暂停解析', '记录ID:' . $recordid); $success++; } } - $msg = '成功暂停'.$success.'条解析记录'; - }else if($action == 'delete'){ - foreach($recordids as $recordid){ - if($dns->deleteDomainRecord($recordid)){ - $this->add_log($drow['name'], '删除解析', '记录ID:'.$recordid); + $msg = '成功暂停' . $success . '条解析记录'; + } else if ($action == 'delete') { + foreach ($recordids as $recordid) { + if ($dns->deleteDomainRecord($recordid)) { + $this->add_log($drow['name'], '删除解析', '记录ID:' . $recordid); $success++; } } - $msg = '成功删除'.$success.'条解析记录'; - }else if($action == 'remark'){ + $msg = '成功删除' . $success . '条解析记录'; + } else if ($action == 'remark') { $remark = input('post.remark', null, 'trim'); - if(empty($remark)) $remark = null; - foreach($recordids as $recordid){ - if($dns->updateDomainRecordRemark($recordid, $remark)){ + if (empty($remark)) $remark = null; + foreach ($recordids as $recordid) { + if ($dns->updateDomainRecordRemark($recordid, $remark)) { $success++; - }else{ + } else { $fail++; } } - $msg = '批量修改备注,成功'.$success.'条,失败'.$fail.'条'; + $msg = '批量修改备注,成功' . $success . '条,失败' . $fail . '条'; } - return json(['code'=>0, 'msg'=>$msg]); + return json(['code' => 0, 'msg' => $msg]); } - public function record_batch_edit(){ + public function record_batch_edit() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ - return json(['code'=>-1, 'msg'=>'域名不存在']); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); $action = input('post.action', null, 'trim'); $recordinfo = input('post.recordinfo', null, 'trim'); $recordinfo = json_decode($recordinfo, true); - if($action == 'value'){ + if ($action == 'value') { $type = input('post.type', null, 'trim'); $value = input('post.value', null, 'trim'); - - if(empty($recordinfo) || empty($type) || empty($value)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + + if (empty($recordinfo) || empty($type) || empty($value)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } - + $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - - $success = 0; $fail = 0; - foreach($recordinfo as $record){ + + $success = 0; + $fail = 0; + foreach ($recordinfo as $record) { $recordid = $dns->updateDomainRecord($record['recordid'], $record['name'], $type, $value, $record['line'], $record['ttl'], $record['mx'], $record['weight'], $record['remark']); - if($recordid){ - $this->add_log($drow['name'], '修改解析', $type.'记录 '.$record['name'].' '.$value.' (线路:'.$record['line'].' TTL:'.$record['ttl'].')'); + if ($recordid) { + $this->add_log($drow['name'], '修改解析', $type . '记录 ' . $record['name'] . ' ' . $value . ' (线路:' . $record['line'] . ' TTL:' . $record['ttl'] . ')'); $success++; - }else{ + } else { $fail++; } } - return json(['code'=>0, 'msg'=>'批量修改解析记录,成功'.$success.'条,失败'.$fail.'条']); - - }else if($action == 'line'){ + return json(['code' => 0, 'msg' => '批量修改解析记录,成功' . $success . '条,失败' . $fail . '条']); + } else if ($action == 'line') { $line = input('post.line', null, 'trim'); - if(empty($recordinfo) || empty($line)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($recordinfo) || empty($line)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - - $success = 0; $fail = 0; - foreach($recordinfo as $record){ + + $success = 0; + $fail = 0; + foreach ($recordinfo as $record) { $recordid = $dns->updateDomainRecord($record['recordid'], $record['name'], $record['type'], $record['value'], $line, $record['ttl'], $record['mx'], $record['weight'], $record['remark']); - if($recordid){ - $this->add_log($drow['name'], '修改解析', $record['type'].'记录 '.$record['name'].' '.$record['value'].' (线路:'.$line.' TTL:'.$record['ttl'].')'); + if ($recordid) { + $this->add_log($drow['name'], '修改解析', $record['type'] . '记录 ' . $record['name'] . ' ' . $record['value'] . ' (线路:' . $line . ' TTL:' . $record['ttl'] . ')'); $success++; - }else{ + } else { $fail++; } } - return json(['code'=>0, 'msg'=>'批量修改解析线路,成功'.$success.'条,失败'.$fail.'条']); + return json(['code' => 0, 'msg' => '批量修改解析线路,成功' . $success . '条,失败' . $fail . '条']); } } - public function record_batch_add(){ + public function record_batch_add() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ + if (!$drow) { return $this->alert('error', '域名不存在'); } $dnstype = Db::name('account')->where('id', $drow['aid'])->value('type'); - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); - if(request()->isAjax()){ + if (request()->isAjax()) { $record = input('post.record', null, 'trim'); $type = input('post.type', null, 'trim'); $line = input('post.line', null, 'trim'); @@ -660,34 +680,35 @@ class Domain extends BaseController $mx = input('post.mx/d', 1); $recordlist = explode("\n", $record); - if(empty($record) || empty($recordlist)){ - return json(['code'=>-1, 'msg'=>'参数不能为空']); + if (empty($record) || empty($recordlist)) { + return json(['code' => -1, 'msg' => '参数不能为空']); } - + $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); - $success = 0; $fail = 0; - foreach($recordlist as $record){ + $success = 0; + $fail = 0; + foreach ($recordlist as $record) { $record = trim($record); $arr = explode(' ', $record); - if(empty($record) || empty($arr[0]) || empty($arr[1])) continue; + if (empty($record) || empty($arr[0]) || empty($arr[1])) continue; $thistype = empty($type) ? getDnsType($arr[1]) : $type; $recordid = $dns->addDomainRecord($arr[0], $thistype, $arr[1], $line, $ttl, $mx); - if($recordid){ - $this->add_log($drow['name'], '添加解析', $thistype.'记录 '.$arr[0].' '.$arr[1].' (线路:'.$line.' TTL:'.$ttl.')'); + if ($recordid) { + $this->add_log($drow['name'], '添加解析', $thistype . '记录 ' . $arr[0] . ' ' . $arr[1] . ' (线路:' . $line . ' TTL:' . $ttl . ')'); $success++; - }else{ + } else { $fail++; } } - return json(['code'=>0, 'msg'=>'批量添加解析,成功'.$success.'条,失败'.$fail.'条']); + return json(['code' => 0, 'msg' => '批量添加解析,成功' . $success . '条,失败' . $fail . '条']); } list($recordLine, $minTTL) = $this->get_line_and_ttl($drow); $recordLineArr = []; - foreach($recordLine as $key=>$item){ - $recordLineArr[] = ['id'=>strval($key), 'name'=>$item['name'], 'parent'=>$item['parent']]; + foreach ($recordLine as $key => $item) { + $recordLineArr[] = ['id' => strval($key), 'name' => $item['name'], 'parent' => $item['parent']]; } $dnsconfig = DnsHelper::$dns_config[$dnstype]; @@ -696,27 +717,28 @@ class Domain extends BaseController View::assign('domainId', $id); View::assign('domainName', $drow['name']); View::assign('recordLine', $recordLineArr); - View::assign('minTTL', $minTTL?$minTTL:1); + View::assign('minTTL', $minTTL ? $minTTL : 1); View::assign('dnsconfig', $dnsconfig); return view('batchadd'); } - public function record_log(){ + public function record_log() + { $id = input('param.id/d'); $drow = Db::name('domain')->where('id', $id)->find(); - if(!$drow){ + if (!$drow) { return $this->alert('error', '域名不存在'); } - if(!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); - if(request()->isPost()){ + if (request()->isPost()) { $offset = input('post.offset/d'); $limit = input('post.limit/d'); - $page = $offset/$limit + 1; + $page = $offset / $limit + 1; $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $domainRecords = $dns->getDomainRecordLog($page, $limit); - if(!$domainRecords) return json(['total'=>0, 'rows'=>[]]); - return json(['total'=>$domainRecords['total'], 'rows'=>$domainRecords['list']]); + if (!$domainRecords) return json(['total' => 0, 'rows' => []]); + return json(['total' => $domainRecords['total'], 'rows' => $domainRecords['list']]); } View::assign('domainId', $id); @@ -724,7 +746,8 @@ class Domain extends BaseController return view('log'); } - private function add_log($domain, $action, $data){ + private function add_log($domain, $action, $data) + { Db::name('log')->insert(['uid' => request()->user['id'], 'domain' => $domain, 'action' => $action, 'data' => $data, 'addtime' => date("Y-m-d H:i:s")]); } -} \ No newline at end of file +} diff --git a/app/controller/Index.php b/app/controller/Index.php index 339cec6..6a2467e 100644 --- a/app/controller/Index.php +++ b/app/controller/Index.php @@ -1,4 +1,5 @@ user['type'] == 'domain'){ - return redirect('/record/'.request()->user['id']); + if ($this->request->user['type'] == 'domain') { + return redirect('/record/' . $this->request->user['id']); } - if(request()->isAjax()){ - if(input('post.do') == 'stat'){ - $stat = ['domains'=>0, 'users'=>0, 'records'=>0, 'types'=>count(DnsHelper::$dns_config)]; - if(request()->user['level'] == 2){ + if ($this->request->isAjax()) { + if (input('post.do') == 'stat') { + $stat = ['domains' => 0, 'users' => 0, 'records' => 0, 'types' => count(DnsHelper::$dns_config)]; + if ($this->request->user['level'] == 2) { $stat['domains'] = Db::name('domain')->count(); $stat['users'] = Db::name('user')->count(); $stat['records'] = Db::name('domain')->sum('recordcount'); - }else{ - $stat['domains'] = Db::name('domain')->where('name', 'in', request()->user['permission'])->count(); + } else { + $stat['domains'] = Db::name('domain')->where('name', 'in', $this->request->user['permission'])->count(); $stat['users'] = 1; - $stat['records'] = Db::name('domain')->where('name', 'in', request()->user['permission'])->sum('recordcount'); + $stat['records'] = Db::name('domain')->where('name', 'in', $this->request->user['permission'])->sum('recordcount'); } return json($stat); } - return json(['code'=>-3]); + return json(['code' => -3]); } - if(config('app.dbversion') && config_get('version') != config('app.dbversion')){ + if (config('app.dbversion') && config_get('version') != config('app.dbversion')) { $this->db_update(); config_set('version', config('app.dbversion')); Cache::clear(); @@ -49,74 +50,86 @@ class Index extends BaseController 'date' => date("Y-m-d H:i:s"), ]; View::assign('info', $info); - View::assign('checkupdate', '//auth.cccyun.cc/app/dnsmgr.php?ver='.config('app.version')); + View::assign('checkupdate', '//auth.cccyun.cc/app/dnsmgr.php?ver=' . config('app.version')); return view(); } - private function db_update(){ - $sqls=file_get_contents(app()->getAppPath().'sql/update.sql'); + private function db_update() + { + $sqls = file_get_contents(app()->getAppPath() . 'sql/update.sql'); $mysql_prefix = env('database.prefix', 'dnsmgr_'); - $sqls=explode(';', $sqls); + $sqls = explode(';', $sqls); foreach ($sqls as $value) { - $value=trim($value); - if(empty($value))continue; - $value = str_replace('dnsmgr_',$mysql_prefix,$value); - try{ + $value = trim($value); + if (empty($value)) continue; + $value = str_replace('dnsmgr_', $mysql_prefix, $value); + try { Db::execute($value); - }catch(Exception $e){ - + } catch (Exception $e) { } } } - public function changeskin(){ + public function changeskin() + { $skin = input('post.skin'); - if(request()->user['level'] == 2){ - if(cookie('admin_skin')){ + if ($this->request->user['level'] == 2) { + if (cookie('admin_skin')) { cookie('admin_skin', null); } config_set('admin_skin', $skin); Cache::delete('configs'); - }else{ + } else { cookie('admin_skin', $skin); } - return json(['code'=>0,'msg'=>'succ']); + return json(['code' => 0, 'msg' => 'succ']); } - public function cleancache(){ - if(!checkPermission(1)) return $this->alert('error', '无权限'); + public function cleancache() + { + if (!checkPermission(1)) return $this->alert('error', '无权限'); Cache::clear(); - return json(['code'=>0,'msg'=>'succ']); + clearDirectory(app()->getRuntimePath().'cache/'); + clearDirectory(app()->getRuntimePath().'temp/'); + return json(['code' => 0, 'msg' => 'succ']); } - public function doc(){ - if(!checkPermission(1)) return $this->alert('error', '无权限'); - View::assign('siteurl', request()->root(true)); + public function doc() + { + if (!checkPermission(1)) return $this->alert('error', '无权限'); + View::assign('siteurl', $this->request->root(true)); return view(); } - public function setpwd(){ - if(!checkPermission(1)) return $this->alert('error', '无权限'); - if(request()->isPost()){ + public function setpwd() + { + if (!checkPermission(1)) return $this->alert('error', '无权限'); + if ($this->request->isPost()) { $oldpwd = input('post.oldpwd'); $newpwd = input('post.newpwd'); $newpwd2 = input('post.newpwd2'); - if(empty($oldpwd) || empty($newpwd) || empty($newpwd2)){ - return json(['code'=>-1, 'msg'=>'密码不能为空']); + if (empty($oldpwd) || empty($newpwd) || empty($newpwd2)) { + return json(['code' => -1, 'msg' => '密码不能为空']); } - if($newpwd != $newpwd2){ - return json(['code'=>-1, 'msg'=>'两次输入的密码不一致']); + if ($newpwd != $newpwd2) { + return json(['code' => -1, 'msg' => '两次输入的密码不一致']); } - if(!password_verify($oldpwd, request()->user['password'])){ - return json(['code'=>-1, 'msg'=>'原密码错误']); + if (!password_verify($oldpwd, $this->request->user['password'])) { + return json(['code' => -1, 'msg' => '原密码错误']); } - Db::name('user')->where('id', request()->user['id'])->update(['password'=>password_hash($newpwd, PASSWORD_DEFAULT)]); - return json(['code'=>0, 'msg'=>'succ']); + Db::name('user')->where('id', $this->request->user['id'])->update(['password' => password_hash($newpwd, PASSWORD_DEFAULT)]); + return json(['code' => 0, 'msg' => 'succ']); } return view(); } - public function test(){ - + public function test() + { + //$a = \app\lib\DnsQueryUtils::query_dns_doh('www.cccyun.cc', 'A'); + //print_r($a); + $dnsList = json_decode('{"cccyun.net":[{"name":"@","type":"CAA","value":"0 issue \"letsencrypt.org\""},{"name":"verify","type":"TXT","value":"TXTTEST1"},{"name":"verify","type":"TXT","value":"TXTTEST2"}],"yuncname.com":[{"name":"@","type":"CAA","value":"0 issue \"letsencrypt.org\""},{"name":"verify.testhost1","type":"CNAME","value":"i.trust.com"},{"name":"verify.testhost2","type":"CNAME","value":"i.trust.com"}]}', true); + \app\lib\CertDnsUtils::addDns($dnsList, function ($txt) { + echo $txt . PHP_EOL; + }); } } diff --git a/app/controller/Install.php b/app/controller/Install.php index 0b0ceb9..94be257 100644 --- a/app/controller/Install.php +++ b/app/controller/Install.php @@ -1,20 +1,21 @@ getRootPath().'.env')){ + if (file_exists(app()->getRootPath() . '.env')) { return '当前已经安装成功,如果需要重新安装,请手动删除根目录.env文件'; } - if(request()->isPost()){ + if (Request::isPost()) { $mysql_host = input('post.mysql_host', null, 'trim'); $mysql_port = intval(input('post.mysql_port', '3306')); $mysql_user = input('post.mysql_user', null, 'trim'); @@ -24,62 +25,64 @@ class Install extends BaseController $admin_username = input('post.admin_username', null, 'trim'); $admin_password = input('post.admin_password', null, 'trim'); - if(!$mysql_host || !$mysql_user || !$mysql_pwd || !$mysql_name || !$admin_username || !$admin_password){ - return json(['code'=>0, 'msg'=>'必填项不能为空']); + if (!$mysql_host || !$mysql_user || !$mysql_pwd || !$mysql_name || !$admin_username || !$admin_password) { + return json(['code' => 0, 'msg' => '必填项不能为空']); } - $configdata = file_get_contents(app()->getRootPath().'.example.env'); - $configdata = str_replace(['{dbhost}','{dbname}','{dbuser}','{dbpwd}','{dbport}','{dbprefix}'], [$mysql_host, $mysql_name, $mysql_user, $mysql_pwd, $mysql_port, $mysql_prefix], $configdata); + $configData = file_get_contents(app()->getRootPath() . '.example.env'); + $configData = str_replace(['{dbhost}', '{dbname}', '{dbuser}', '{dbpwd}', '{dbport}', '{dbprefix}'], [$mysql_host, $mysql_name, $mysql_user, $mysql_pwd, $mysql_port, $mysql_prefix], $configData); - try{ - $DB=new PDO("mysql:host=".$mysql_host.";dbname=".$mysql_name.";port=".$mysql_port,$mysql_user,$mysql_pwd); - }catch(Exception $e){ - if($e->getCode() == 2002){ - $errorMsg='连接数据库失败:数据库地址填写错误!'; - }elseif($e->getCode() == 1045){ - $errorMsg='连接数据库失败:数据库用户名或密码填写错误!'; - }elseif($e->getCode() == 1049){ - $errorMsg='连接数据库失败:数据库名不存在!'; - }else{ - $errorMsg='连接数据库失败:'.$e->getMessage(); + try { + $DB = new PDO("mysql:host=" . $mysql_host . ";dbname=" . $mysql_name . ";port=" . $mysql_port, $mysql_user, $mysql_pwd); + } catch (Exception $e) { + if ($e->getCode() == 2002) { + $errorMsg = '连接数据库失败:数据库地址填写错误!'; + } elseif ($e->getCode() == 1045) { + $errorMsg = '连接数据库失败:数据库用户名或密码填写错误!'; + } elseif ($e->getCode() == 1049) { + $errorMsg = '连接数据库失败:数据库名不存在!'; + } else { + $errorMsg = '连接数据库失败:' . $e->getMessage(); } - return json(['code'=>0, 'msg'=>$errorMsg]); + return json(['code' => 0, 'msg' => $errorMsg]); } $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $DB->exec("set sql_mode = ''"); $DB->exec("set names utf8"); - $sqls=file_get_contents(app()->getAppPath().'sql/install.sql'); - $sqls=explode(';', $sqls); + $sqls = file_get_contents(app()->getAppPath() . 'sql/install.sql'); + $sqls = explode(';', $sqls); $password = password_hash($admin_password, PASSWORD_DEFAULT); - $sqls[]="REPLACE INTO `".$mysql_prefix."config` VALUES ('sys_key', '".random(16)."')"; - $sqls[]="INSERT INTO `".$mysql_prefix."user` (`username`,`password`,`level`,`regtime`,`lasttime`,`status`) VALUES ('".addslashes($admin_username)."', '$password', 2, NOW(), NOW(), 1)"; + $sqls[] = "REPLACE INTO `" . $mysql_prefix . "config` VALUES ('sys_key', '" . random(16) . "')"; + $sqls[] = "INSERT INTO `" . $mysql_prefix . "user` (`username`,`password`,`level`,`regtime`,`lasttime`,`status`) VALUES ('" . addslashes($admin_username) . "', '$password', 2, NOW(), NOW(), 1)"; - $success=0;$error=0;$errorMsg=null; + $success = 0; + $error = 0; + $errorMsg = null; foreach ($sqls as $value) { - $value=trim($value); - if(empty($value))continue; - $value = str_replace('dnsmgr_',$mysql_prefix,$value); - if($DB->exec($value)===false){ + $value = trim($value); + if (empty($value)) continue; + $value = str_replace('dnsmgr_', $mysql_prefix, $value); + if ($DB->exec($value) === false) { $error++; - $dberror=$DB->errorInfo(); - $errorMsg.=$dberror[2]."\n"; - }else{ + $dberror = $DB->errorInfo(); + $errorMsg .= $dberror[2] . "\n"; + } else { $success++; } } - if(empty($errorMsg)){ - if(!file_put_contents(app()->getRootPath().'.env', $configdata)){ - return json(['code'=>0, 'msg'=>'保存失败,请确保网站根目录有写入权限']); + if (empty($errorMsg)) { + if (!file_put_contents(app()->getRootPath() . '.env', $configData)) { + return json(['code' => 0, 'msg' => '保存失败,请确保网站根目录有写入权限']); } Cache::clear(); - return json(['code'=>1, 'msg'=>'安装完成!成功执行SQL语句'.$success.'条']); - }else{ - return json(['code'=>0, 'msg'=>$errorMsg]); + return json(['code' => 1, 'msg' => '安装完成!成功执行SQL语句' . $success . '条']); + } else { + return json(['code' => 0, 'msg' => $errorMsg]); } } return view(); } - + } diff --git a/app/controller/Optimizeip.php b/app/controller/Optimizeip.php index 695182d..61a5941 100644 --- a/app/controller/Optimizeip.php +++ b/app/controller/Optimizeip.php @@ -1,4 +1,5 @@ alert('error', '无权限'); - if(request()->isPost()){ + if (!checkPermission(2)) return $this->alert('error', '无权限'); + if ($this->request->isPost()) { $params = input('post.'); - foreach ($params as $key=>$value){ + foreach ($params as $key => $value) { if (empty($key)) { continue; } config_set($key, $value); Cache::delete('configs'); } - return json(['code'=>0, 'msg'=>'succ']); + return json(['code' => 0, 'msg' => 'succ']); } return View::fetch(); } public function opiplist() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!checkPermission(2)) return $this->alert('error', '无权限'); return View::fetch(); } - public function opiplist_data(){ - if(!checkPermission(2)) return json(['total'=>0, 'rows'=>[]]); + public function opiplist_data() + { + if (!checkPermission(2)) return json(['total' => 0, 'rows' => []]); $type = input('post.type/d', 1); $kw = input('post.kw', null, 'trim'); $offset = input('post.offset/d'); $limit = input('post.limit/d'); - $select = Db::name('optimizeip')->alias('A')->join('domain B','A.did = B.id'); - if(!empty($kw)){ - if($type == 1){ - $select->whereLike('rr|B.name', '%'.$kw.'%'); - }elseif($type == 2){ - $select->whereLike('remark', '%'.$kw.'%'); + $select = Db::name('optimizeip')->alias('A')->join('domain B', 'A.did = B.id'); + if (!empty($kw)) { + if ($type == 1) { + $select->whereLike('rr|B.name', '%' . $kw . '%'); + } elseif ($type == 2) { + $select->whereLike('remark', '%' . $kw . '%'); } } $total = $select->count(); - $list = $select->order('A.id','desc')->limit($offset, $limit)->field('A.*,B.name domain')->select(); + $list = $select->order('A.id', 'desc')->limit($offset, $limit)->field('A.*,B.name domain')->select(); - return json(['total'=>$total, 'rows'=>$list]); + return json(['total' => $total, 'rows' => $list]); } public function opipform() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!checkPermission(2)) return $this->alert('error', '无权限'); $action = input('param.action'); - if(request()->isPost()){ - if($action == 'add'){ + if ($this->request->isPost()) { + if ($action == 'add') { $task = [ 'did' => input('post.did/d'), 'rr' => input('post.rr', null, 'trim'), @@ -72,19 +74,19 @@ class Optimizeip extends BaseController 'addtime' => date('Y-m-d H:i:s'), 'active' => 1 ]; - - if(empty($task['did']) || empty($task['rr']) || empty($task['ip_type']) || empty($task['recordnum']) || empty($task['ttl'])){ - return json(['code'=>-1, 'msg'=>'必填项不能为空']); + + if (empty($task['did']) || empty($task['rr']) || empty($task['ip_type']) || empty($task['recordnum']) || empty($task['ttl'])) { + return json(['code' => -1, 'msg' => '必填项不能为空']); } - if($task['recordnum'] > 5){ - return json(['code'=>-1, 'msg'=>'解析数量不能超过5个']); + if ($task['recordnum'] > 5) { + return json(['code' => -1, 'msg' => '解析数量不能超过5个']); } - if(Db::name('optimizeip')->where('did', $task['did'])->where('rr', $task['rr'])->find()){ - return json(['code'=>-1, 'msg'=>'当前域名的优选IP任务已存在']); + if (Db::name('optimizeip')->where('did', $task['did'])->where('rr', $task['rr'])->find()) { + return json(['code' => -1, 'msg' => '当前域名的优选IP任务已存在']); } Db::name('optimizeip')->insert($task); - return json(['code'=>0, 'msg'=>'添加成功']); - }elseif($action == 'edit'){ + return json(['code' => 0, 'msg' => '添加成功']); + } elseif ($action == 'edit') { $id = input('post.id/d'); $task = [ 'did' => input('post.did/d'), @@ -96,52 +98,52 @@ class Optimizeip extends BaseController 'ttl' => input('post.ttl/d'), 'remark' => input('post.remark', null, 'trim'), ]; - - if(empty($task['did']) || empty($task['rr']) || empty($task['ip_type']) || empty($task['recordnum']) || empty($task['ttl'])){ - return json(['code'=>-1, 'msg'=>'必填项不能为空']); + + if (empty($task['did']) || empty($task['rr']) || empty($task['ip_type']) || empty($task['recordnum']) || empty($task['ttl'])) { + return json(['code' => -1, 'msg' => '必填项不能为空']); } - if($task['recordnum'] > 5){ - return json(['code'=>-1, 'msg'=>'解析数量不能超过5个']); + if ($task['recordnum'] > 5) { + return json(['code' => -1, 'msg' => '解析数量不能超过5个']); } - if(Db::name('optimizeip')->where('did', $task['did'])->where('rr', $task['rr'])->where('id', '<>', $id)->find()){ - return json(['code'=>-1, 'msg'=>'当前域名的优选IP任务已存在']); + if (Db::name('optimizeip')->where('did', $task['did'])->where('rr', $task['rr'])->where('id', '<>', $id)->find()) { + return json(['code' => -1, 'msg' => '当前域名的优选IP任务已存在']); } Db::name('optimizeip')->where('id', $id)->update($task); - return json(['code'=>0, 'msg'=>'修改成功']); - }elseif($action == 'setactive'){ + return json(['code' => 0, 'msg' => '修改成功']); + } elseif ($action == 'setactive') { $id = input('post.id/d'); $active = input('post.active/d'); - Db::name('optimizeip')->where('id', $id)->update(['active'=>$active]); - return json(['code'=>0, 'msg'=>'设置成功']); - }elseif($action == 'del'){ + Db::name('optimizeip')->where('id', $id)->update(['active' => $active]); + return json(['code' => 0, 'msg' => '设置成功']); + } elseif ($action == 'del') { $id = input('post.id/d'); Db::name('optimizeip')->where('id', $id)->delete(); - return json(['code'=>0, 'msg'=>'删除成功']); - }elseif($action == 'run'){ + return json(['code' => 0, 'msg' => '删除成功']); + } elseif ($action == 'run') { $id = input('post.id/d'); $task = Db::name('optimizeip')->where('id', $id)->find(); - if(empty($task)) return json(['code'=>-1, 'msg'=>'任务不存在']); - try{ + if (empty($task)) return json(['code' => -1, 'msg' => '任务不存在']); + try { $result = (new OptimizeService())->execute_one($task); Db::name('optimizeip')->where('id', $id)->update(['status' => 1, 'errmsg' => null, 'updatetime' => date('Y-m-d H:i:s')]); - return json(['code'=>0, 'msg'=>'优选任务执行成功:'.$result]); - }catch(Exception $e){ + return json(['code' => 0, 'msg' => '优选任务执行成功:' . $result]); + } catch (Exception $e) { Db::name('optimizeip')->where('id', $id)->update(['status' => 2, 'errmsg' => $e->getMessage(), 'updatetime' => date('Y-m-d H:i:s')]); - return json(['code'=>-1, 'msg'=>'优选任务执行失败:'.$e->getMessage(), 'stack'=>$e->__toString()]); + return json(['code' => -1, 'msg' => '优选任务执行失败:' . $e->getMessage(), 'stack' => $e->__toString()]); } - }else{ - return json(['code'=>-1, 'msg'=>'参数错误']); + } else { + return json(['code' => -1, 'msg' => '参数错误']); } } $task = null; - if($action == 'edit'){ + if ($action == 'edit') { $id = input('get.id/d'); $task = Db::name('optimizeip')->where('id', $id)->find(); - if(empty($task)) return $this->alert('error', '任务不存在'); + if (empty($task)) return $this->alert('error', '任务不存在'); } $domains = []; - foreach(Db::name('domain')->alias('A')->join('account B','A.aid = B.id')->field('A.*')->where('B.type', '<>', 'cloudflare')->select() as $row){ + foreach (Db::name('domain')->alias('A')->join('account B', 'A.aid = B.id')->field('A.*')->where('B.type', '<>', 'cloudflare')->select() as $row) { $domains[$row['id']] = $row['name']; } View::assign('domains', $domains); @@ -153,22 +155,22 @@ class Optimizeip extends BaseController public function queryapi() { - if(!checkPermission(2)) return $this->alert('error', '无权限'); + if (!checkPermission(2)) return $this->alert('error', '无权限'); $optimize_ip_api = input('post.optimize_ip_api/d'); $optimize_ip_key = input('post.optimize_ip_key', null, 'trim'); - if(empty($optimize_ip_key)) return json(['code'=>-1, 'msg'=>'参数不能为空']); - try{ + if (empty($optimize_ip_key)) return json(['code' => -1, 'msg' => '参数不能为空']); + try { $result = (new OptimizeService())->get_license($optimize_ip_api, $optimize_ip_key); - return json(['code'=>0, 'msg'=>'当前积分余额:'.$result]); - }catch(Exception $e){ - return json(['code'=>-1, 'msg'=>$e->getMessage()]); + return json(['code' => 0, 'msg' => '当前积分余额:' . $result]); + } catch (Exception $e) { + return json(['code' => -1, 'msg' => $e->getMessage()]); } } public function status() { $run_time = Db::name('optimizeip')->where('active', 1)->order('updatetime', 'desc')->value('updatetime'); - $run_state = $run_time ? (time()-strtotime($run_time) > 3600 ? 0 : 1) : 0; + $run_state = $run_time ? (time() - strtotime($run_time) > 3600 ? 0 : 1) : 0; return $run_state == 1 ? 'ok' : 'error'; } -} \ No newline at end of file +} diff --git a/app/controller/User.php b/app/controller/User.php index 99b8ab2..092b690 100644 --- a/app/controller/User.php +++ b/app/controller/User.php @@ -9,53 +9,62 @@ use think\facade\Request; class User extends BaseController { - - public function user(){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + + public function user() + { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $list = Db::name('domain')->select(); $domains = []; - foreach($list as $row){ + foreach ($list as $row) { $domains[] = $row['name']; } View::assign('domains', $domains); return view(); } - public function user_data(){ - if(!checkPermission(2)) return json(['total'=>0, 'rows'=>[]]); + public function user_data() + { + if (!checkPermission(2)) return json(['total' => 0, 'rows' => []]); $kw = input('post.kw', null, 'trim'); $offset = input('post.offset/d'); $limit = input('post.limit/d'); $select = Db::name('user'); - if(!empty($kw)){ + if (!empty($kw)) { $select->whereLike('id|username', $kw); } $total = $select->count(); - $rows = $select->order('id','desc')->limit($offset, $limit)->select(); + $rows = $select->order('id', 'desc')->limit($offset, $limit)->select(); - return json(['total'=>$total, 'rows'=>$rows]); + return json(['total' => $total, 'rows' => $rows]); } - public function user_op(){ - if(!checkPermission(2)) return $this->alert('error', '无权限'); + public function user_op() + { + if (!checkPermission(2)) return $this->alert('error', '无权限'); $act = input('param.act'); - if($act == 'get'){ + if ($act == 'get') { $id = input('post.id/d'); $row = Db::name('user')->where('id', $id)->find(); - if(!$row) return json(['code'=>-1, 'msg'=>'用户不存在']); + if (!$row) { + return json(['code' => -1, 'msg' => '用户不存在']); + } $row['permission'] = Db::name('permission')->where('uid', $id)->column('domain'); - return json(['code'=>0, 'data'=>$row]); - }elseif($act == 'add'){ + return json(['code' => 0, 'data' => $row]); + } elseif ($act == 'add') { $username = input('post.username', null, 'trim'); $password = input('post.password', null, 'trim'); $is_api = input('post.is_api/d'); $apikey = input('post.apikey', null, 'trim'); $level = input('post.level/d'); - if(empty($username) || empty($password)) return json(['code'=>-1, 'msg'=>'用户名或密码不能为空']); - if($is_api ==1 && empty($apikey)) return json(['code'=>-1, 'msg'=>'API密钥不能为空']); - if(Db::name('user')->where('username', $username)->find()){ - return json(['code'=>-1, 'msg'=>'用户名已存在']); + if (empty($username) || empty($password)) { + return json(['code' => -1, 'msg' => '用户名或密码不能为空']); + } + if ($is_api == 1 && empty($apikey)) { + return json(['code' => -1, 'msg' => 'API密钥不能为空']); + } + if (Db::name('user')->where('username', $username)->find()) { + return json(['code' => -1, 'msg' => '用户名已存在']); } $uid = Db::name('user')->insertGetId([ 'username' => $username, @@ -66,75 +75,91 @@ class User extends BaseController 'regtime' => date('Y-m-d H:i:s'), 'status' => 1, ]); - if($level == 1){ + if ($level == 1) { $permission = input('post.permission/a'); - if(!empty($permission)){ + if (!empty($permission)) { $data = []; - foreach($permission as $domain){ - $data[] = ['uid'=>$uid, 'domain'=>$domain]; + foreach ($permission as $domain) { + $data[] = ['uid' => $uid, 'domain' => $domain]; } Db::name('permission')->insertAll($data); } } - return json(['code'=>0, 'msg'=>'添加用户成功!']); - }elseif($act == 'edit'){ + return json(['code' => 0, 'msg' => '添加用户成功!']); + } elseif ($act == 'edit') { $id = input('post.id/d'); $row = Db::name('user')->where('id', $id)->find(); - if(!$row) return json(['code'=>-1, 'msg'=>'用户不存在']); + if (!$row) return json(['code' => -1, 'msg' => '用户不存在']); $username = input('post.username', null, 'trim'); $is_api = input('post.is_api/d'); $apikey = input('post.apikey', null, 'trim'); $level = input('post.level/d'); $repwd = input('post.repwd', null, 'trim'); - if(empty($username)) return json(['code'=>-1, 'msg'=>'用户名不能为空']); - if($is_api ==1 && empty($apikey)) return json(['code'=>-1, 'msg'=>'API密钥不能为空']); - if(Db::name('user')->where('username', $username)->where('id', '<>', $id)->find()){ - return json(['code'=>-1, 'msg'=>'用户名已存在']); + if (empty($username)) { + return json(['code' => -1, 'msg' => '用户名不能为空']); + } + if ($is_api == 1 && empty($apikey)) { + return json(['code' => -1, 'msg' => 'API密钥不能为空']); + } + if (Db::name('user')->where('username', $username)->where('id', '<>', $id)->find()) { + return json(['code' => -1, 'msg' => '用户名已存在']); + } + if ($level == 1 && ($id == 1000 || $id == $this->request->user['id'])) { + $level = 2; } - if($level == 1 && ($id == 1000 || $id == request()->user['id'])) $level = 2; Db::name('user')->where('id', $id)->update([ 'username' => $username, 'is_api' => $is_api, 'apikey' => $apikey, 'level' => $level, ]); - Db::name('permission')->where(['uid'=>$id])->delete(); - if($level == 1){ + Db::name('permission')->where(['uid' => $id])->delete(); + if ($level == 1) { $permission = input('post.permission/a'); - if(!empty($permission)){ + if (!empty($permission)) { $data = []; - foreach($permission as $domain){ - $data[] = ['uid'=>$id, 'domain'=>$domain]; + foreach ($permission as $domain) { + $data[] = ['uid' => $id, 'domain' => $domain]; } Db::name('permission')->insertAll($data); } } - if(!empty($repwd)){ - Db::name('user')->where('id', $id)->update(['password'=>password_hash($repwd, PASSWORD_DEFAULT)]); + if (!empty($repwd)) { + Db::name('user')->where('id', $id)->update(['password' => password_hash($repwd, PASSWORD_DEFAULT)]); } - return json(['code'=>0, 'msg'=>'修改用户成功!']); - }elseif($act == 'set'){ + return json(['code' => 0, 'msg' => '修改用户成功!']); + } elseif ($act == 'set') { $id = input('post.id/d'); $status = input('post.status/d'); - if($id == 1000) return json(['code'=>-1, 'msg'=>'此用户无法修改状态']); - if($id == request()->user['id']) return json(['code'=>-1, 'msg'=>'当前登录用户无法修改状态']); - Db::name('user')->where('id', $id)->update(['status'=>$status]); - return json(['code'=>0]); - }elseif($act == 'del'){ + if ($id == 1000) { + return json(['code' => -1, 'msg' => '此用户无法修改状态']); + } + if ($id == $this->request->user['id']) { + return json(['code' => -1, 'msg' => '当前登录用户无法修改状态']); + } + Db::name('user')->where('id', $id)->update(['status' => $status]); + return json(['code' => 0]); + } elseif ($act == 'del') { $id = input('post.id/d'); - if($id == 1000) return json(['code'=>-1, 'msg'=>'此用户无法删除']); - if($id == request()->user['id']) return json(['code'=>-1, 'msg'=>'当前登录用户无法删除']); + if ($id == 1000) { + return json(['code' => -1, 'msg' => '此用户无法删除']); + } + if ($id == $this->request->user['id']) { + return json(['code' => -1, 'msg' => '当前登录用户无法删除']); + } Db::name('user')->where('id', $id)->delete(); - return json(['code'=>0]); + return json(['code' => 0]); } - return json(['code'=>-3]); + return json(['code' => -3]); } - public function log(){ + public function log() + { return view(); } - public function log_data(){ + public function log_data() + { $uid = input('post.uid', null, 'trim'); $kw = input('post.kw', null, 'trim'); $domain = input('post.domain', null, 'trim'); @@ -142,23 +167,22 @@ class User extends BaseController $limit = input('post.limit/d'); $select = Db::name('log'); - if(request()->user['type'] == 'domain'){ - $select->where('domain', request()->user['name']); - }elseif(request()->user['level'] == 1){ - $select->where('uid', request()->user['id']); - }elseif(!empty($uid)){ + if ($this->request->user['type'] == 'domain') { + $select->where('domain', $this->request->user['name']); + } elseif ($this->request->user['level'] == 1) { + $select->where('uid', $this->request->user['id']); + } elseif (!empty($uid)) { $select->where('uid', $uid); } - if(!empty($kw)){ - $select->whereLike('action|data', '%'.$kw.'%'); + if (!empty($kw)) { + $select->whereLike('action|data', '%' . $kw . '%'); } - if(!empty($domain)){ + if (!empty($domain)) { $select->where('domain', $domain); } $total = $select->count(); - $rows = $select->order('id','desc')->limit($offset, $limit)->select(); + $rows = $select->order('id', 'desc')->limit($offset, $limit)->select(); - return json(['total'=>$total, 'rows'=>$rows]); + return json(['total' => $total, 'rows' => $rows]); } - -} \ No newline at end of file +} diff --git a/app/lib/CheckUtils.php b/app/lib/CheckUtils.php index 2b4ba21..d35b52e 100644 --- a/app/lib/CheckUtils.php +++ b/app/lib/CheckUtils.php @@ -19,24 +19,24 @@ class CheckUtils } } $ch = curl_init(); - if($proxy){ + if ($proxy) { $proxy_server = config_get('proxy_server'); $proxy_port = intval(config_get('proxy_port')); $proxy_userpwd = config_get('proxy_user').':'.config_get('proxy_pwd'); $proxy_type = config_get('proxy_type'); - if($proxy_type == 'https'){ + if ($proxy_type == 'https') { $proxy_type = CURLPROXY_HTTPS; - }elseif($proxy_type == 'sock4'){ + } elseif ($proxy_type == 'sock4') { $proxy_type = CURLPROXY_SOCKS4; - }elseif($proxy_type == 'sock5'){ + } elseif ($proxy_type == 'sock5') { $proxy_type = CURLPROXY_SOCKS5; - }else{ + } else { $proxy_type = CURLPROXY_HTTP; } curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_PROXY, $proxy_server); curl_setopt($ch, CURLOPT_PROXYPORT, $proxy_port); - if($proxy_userpwd != ':'){ + if ($proxy_userpwd != ':') { curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_userpwd); } curl_setopt($ch, CURLOPT_PROXYTYPE, $proxy_type); @@ -52,7 +52,7 @@ class CheckUtils curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); - if(!empty($resolve)){ + if (!empty($resolve)) { curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false); curl_setopt($ch, CURLOPT_RESOLVE, [$resolve]); } @@ -63,19 +63,20 @@ class CheckUtils $errmsg = curl_error($ch); } $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - if($status && ($httpcode < 200 || $httpcode >= 400)){ + if ($status && ($httpcode < 200 || $httpcode >= 400)) { $status = false; $errmsg = 'http_code='.$httpcode; } $usetime = round(curl_getinfo($ch, CURLINFO_TOTAL_TIME) * 1000); curl_close($ch); - return ['status'=>$status, 'errmsg'=>$errmsg, 'usetime'=>$usetime]; + return ['status' => $status, 'errmsg' => $errmsg, 'usetime' => $usetime]; } - public static function tcp($target, $port, $timeout){ - if(!filter_var($target,FILTER_VALIDATE_IP) && checkDomain($target)){ + public static function tcp($target, $port, $timeout) + { + if (!filter_var($target, FILTER_VALIDATE_IP) && checkDomain($target)) { $target = gethostbyname($target); - if(!$target)return ['status'=>false, 'error'=>'DNS resolve failed', 'usetime'=>0]; + if (!$target) return ['status' => false, 'error' => 'DNS resolve failed', 'usetime' => 0]; } $starttime = getMillisecond(); $fp = @fsockopen($target, $port, $errCode, $errStr, $timeout); @@ -86,27 +87,28 @@ class CheckUtils $status = false; } $endtime = getMillisecond(); - $usetime = $endtime-$starttime; - return ['status'=>$status, 'errmsg'=>$errStr, 'usetime'=>$usetime]; + $usetime = $endtime - $starttime; + return ['status' => $status, 'errmsg' => $errStr, 'usetime' => $usetime]; } - public static function ping($target){ - if(!function_exists('exec'))return ['status'=>false, 'error'=>'exec函数不可用', 'usetime'=>0]; - if(!filter_var($target,FILTER_VALIDATE_IP) && checkDomain($target)){ + public static function ping($target) + { + if (!function_exists('exec')) return ['status' => false, 'error' => 'exec函数不可用', 'usetime' => 0]; + if (!filter_var($target, FILTER_VALIDATE_IP) && checkDomain($target)) { $target = gethostbyname($target); - if(!$target)return ['status'=>false, 'error'=>'DNS resolve failed', 'usetime'=>0]; + if (!$target) return ['status' => false, 'error' => 'DNS resolve failed', 'usetime' => 0]; } - if(!filter_var($target,FILTER_VALIDATE_IP)){ - return ['status'=>false, 'error'=>'Invalid IP address', 'usetime'=>0]; + if (!filter_var($target, FILTER_VALIDATE_IP)) { + return ['status' => false, 'error' => 'Invalid IP address', 'usetime' => 0]; } $timeout = 1; exec('ping -c 1 -w '.$timeout.' '.$target.'', $output, $return_var); $usetime = !empty($output[1]) ? round(getSubstr($output[1], 'time=', ' ms')) : 0; $errmsg = null; - if($return_var !== 0){ - $usetime = $usetime == 0 ? $timeout*1000 : $usetime; + if ($return_var !== 0) { + $usetime = $usetime == 0 ? $timeout * 1000 : $usetime; $errmsg = 'ping timeout'; } - return ['status'=>$return_var===0, 'errmsg'=>$errmsg, 'usetime'=>$usetime]; + return ['status' => $return_var === 0, 'errmsg' => $errmsg, 'usetime' => $usetime]; } -} \ No newline at end of file +} diff --git a/app/lib/DnsHelper.php b/app/lib/DnsHelper.php index 8bcf329..d1fd5f3 100644 --- a/app/lib/DnsHelper.php +++ b/app/lib/DnsHelper.php @@ -1,6 +1,7 @@ '阿里云', 'config' => [ 'ak' => 'AccessKeyId', - 'sk' => 'AccessKeySecret' + 'sk' => 'AccessKeySecret', ], 'remark' => 1, //是否支持备注,1单独设置备注,2和记录一起设置 'status' => true, //是否支持启用暂停 @@ -22,7 +23,7 @@ class DnsHelper 'name' => '腾讯云', 'config' => [ 'ak' => 'SecretId', - 'sk' => 'SecretKey' + 'sk' => 'SecretKey', ], 'remark' => 1, 'status' => true, @@ -34,7 +35,7 @@ class DnsHelper 'name' => '华为云', 'config' => [ 'ak' => 'AccessKeyId', - 'sk' => 'SecretAccessKey' + 'sk' => 'SecretAccessKey', ], 'remark' => 2, 'status' => true, @@ -46,7 +47,7 @@ class DnsHelper 'name' => '百度云', 'config' => [ 'ak' => 'AccessKey', - 'sk' => 'SecretKey' + 'sk' => 'SecretKey', ], 'remark' => 2, 'status' => false, @@ -58,7 +59,7 @@ class DnsHelper 'name' => '西部数码', 'config' => [ 'ak' => '用户名', - 'sk' => 'API密码' + 'sk' => 'API密码', ], 'remark' => 0, 'status' => true, @@ -70,7 +71,7 @@ class DnsHelper 'name' => '火山引擎', 'config' => [ 'ak' => 'AccessKeyId', - 'sk' => 'SecretAccessKey' + 'sk' => 'SecretAccessKey', ], 'remark' => 2, 'status' => true, @@ -82,7 +83,7 @@ class DnsHelper 'name' => 'DNSLA', 'config' => [ 'ak' => 'APIID', - 'sk' => 'API密钥' + 'sk' => 'API密钥', ], 'remark' => 0, 'status' => true, @@ -94,7 +95,7 @@ class DnsHelper 'name' => 'Cloudflare', 'config' => [ 'ak' => '邮箱地址', - 'sk' => 'API密钥/令牌' + 'sk' => 'API密钥/令牌', ], 'remark' => 2, 'status' => false, @@ -104,24 +105,39 @@ class DnsHelper ], ]; + public static $line_name = [ + 'aliyun' => ['DEF' => 'default', 'CT' => 'telecom', 'CU' => 'unicom', 'CM' => 'mobile', 'AB' => 'oversea'], + 'dnspod' => ['DEF' => '0', 'CT' => '10=0', 'CU' => '10=1', 'CM' => '10=3', 'AB' => '3=0'], + 'huawei' => ['DEF' => 'default_view', 'CT' => 'Dianxin', 'CU' => 'Liantong', 'CM' => 'Yidong', 'AB' => 'Abroad'], + 'west' => ['DEF' => '', 'CT' => 'LTEL', 'CU' => 'LCNC', 'CM' => 'LMOB', 'AB' => 'LFOR'], + 'dnsla' => ['DEF' => '', 'CT' => '84613316902921216', 'CU' => '84613316923892736', 'CM' => '84613316953252864', 'AB' => ''], + 'huoshan' => ['DEF' => 'default', 'CT' => 'telecom', 'CU' => 'unicom', 'CM' => 'mobile', 'AB' => 'oversea'], + 'baidu' => ['DEF' => 'default', 'CT' => 'ct', 'CU' => 'cnc', 'CM' => 'cmnet', 'AB' => ''], + 'cloudflare' => ['DEF' => '0'], + ]; + public static function getList() { return self::$dns_config; } - private static function getConfig($aid){ + private static function getConfig($aid) + { $account = Db::name('account')->where('id', $aid)->find(); - if(!$account) return false; + if (!$account) return false; return $account; } + /** + * @return DnsInterface|false + */ public static function getModel($aid, $domain = null, $domainid = null) { $config = self::getConfig($aid); - if(!$config) return false; + if (!$config) return false; $dnstype = $config['type']; $class = "\\app\\lib\\dns\\{$dnstype}"; - if(class_exists($class)){ + if (class_exists($class)) { $config['domain'] = $domain; $config['domainid'] = $domainid; $model = new $class($config); @@ -130,11 +146,14 @@ class DnsHelper return false; } + /** + * @return DnsInterface|false + */ public static function getModel2($config) { $dnstype = $config['type']; $class = "\\app\\lib\\dns\\{$dnstype}"; - if(class_exists($class)){ + if (class_exists($class)) { $config['domain'] = $config['name']; $config['domainid'] = $config['thirdid']; $model = new $class($config); @@ -142,4 +161,4 @@ class DnsHelper } return false; } -} \ No newline at end of file +} diff --git a/app/lib/DnsInterface.php b/app/lib/DnsInterface.php index 166030c..9c45d68 100644 --- a/app/lib/DnsInterface.php +++ b/app/lib/DnsInterface.php @@ -8,11 +8,11 @@ interface DnsInterface function check(); - function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20); + function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20); - function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null); + function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null); - function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null); + function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null); function getDomainRecordInfo($RecordId); @@ -31,5 +31,4 @@ interface DnsInterface function getRecordLine(); function getMinTTL(); - -} \ No newline at end of file +} diff --git a/app/lib/MsgNotice.php b/app/lib/MsgNotice.php index 34dd722..7d54b8f 100644 --- a/app/lib/MsgNotice.php +++ b/app/lib/MsgNotice.php @@ -8,65 +8,70 @@ class MsgNotice public static function send($action, $task, $result) { - if($action == 1){ + if ($action == 1) { $mail_title = 'DNS容灾切换-发生告警通知'; $mail_content = '尊敬的系统管理员,您好:
您的域名 '.$task['domain'].''.$task['main_value'].' 记录发生了异常'; - if($task['type'] == 2){ + if ($task['type'] == 2) { $mail_content .= ',已自动切换为备用解析记录 '.$task['backup_value'].' '; - }elseif($task['type'] == 1){ + } elseif ($task['type'] == 1) { $mail_content .= ',已自动暂停解析'; - }else{ + } else { $mail_content .= ',请及时处理'; } - if(!empty($result['errmsg'])){ + if (!empty($result['errmsg'])) { $mail_content .= '。
异常信息:'.$result['errmsg']; } - }else{ + } else { $mail_title = 'DNS容灾切换-恢复正常通知'; $mail_content = '尊敬的系统管理员,您好:
您的域名 '.$task['domain'].''.$task['main_value'].' 记录已恢复正常'; - if($task['type'] == 2){ + if ($task['type'] == 2) { $mail_content .= ',已自动切换回当前解析记录'; - }elseif($task['type'] == 1){ + } elseif ($task['type'] == 1) { $mail_content .= ',已自动开启解析'; } $lasttime = convert_second(time() - $task['switchtime']); $mail_content .= '。
异常持续时间:'.$lasttime; } - if(!empty($task['remark'])) $mail_title .= '('.$task['remark'].')'; - if(!empty($task['remark'])) $mail_content .= '
备注:'.$task['remark']; + if (!empty($task['remark'])) { + $mail_title .= '('.$task['remark'].')'; + } + if (!empty($task['remark'])) { + $mail_content .= '
备注:'.$task['remark']; + } $mail_content .= '
'.self::$sitename.'
'.date('Y-m-d H:i:s'); - if(config_get('notice_mail') == 1){ - $mail_name = config_get('mail_recv')?config_get('mail_recv'):config_get('mail_name'); + if (config_get('notice_mail') == 1) { + $mail_name = config_get('mail_recv') ? config_get('mail_recv') : config_get('mail_name'); self::send_mail($mail_name, $mail_title, $mail_content); } - if(config_get('notice_wxtpl') == 1){ + if (config_get('notice_wxtpl') == 1) { $content = str_replace(['
', '', ''], ["\n\n", '**', '**'], $mail_content); self::send_wechat_tplmsg($mail_title, $content); } - if(config_get('notice_tgbot') == 1){ + if (config_get('notice_tgbot') == 1) { $content = str_replace('
', "\n", $mail_content); $content = "".$mail_title."\n".$content; self::send_telegram_bot($content); } } - - public static function send_mail($to, $sub, $msg){ + + public static function send_mail($to, $sub, $msg) + { $mail_type = config_get('mail_type'); - if($mail_type == 1){ + if ($mail_type == 1) { $mail = new \app\lib\mail\Sendcloud(config_get('mail_apiuser'), config_get('mail_apikey')); - return $mail->send($to, $sub, $msg, config_get('mail_name'), self::$sitename); - }elseif($mail_type == 2){ + return $mail->send($to, $sub, $msg, config_get('mail_name'), self::$sitename); + } elseif ($mail_type == 2) { $mail = new \app\lib\mail\Aliyun(config_get('mail_apiuser'), config_get('mail_apikey')); return $mail->send($to, $sub, $msg, config_get('mail_name'), self::$sitename); - }else{ + } else { $mail_name = config_get('mail_name'); $mail_port = intval(config_get('mail_port')); $mail_smtp = config_get('mail_smtp'); $mail_pwd = config_get('mail_pwd'); - if(!$mail_name || !$mail_port || !$mail_smtp || !$mail_pwd)return false; + if (!$mail_name || !$mail_port || !$mail_smtp || !$mail_pwd) return false; $mail = new \app\lib\mail\PHPMailer\PHPMailer(true); - try{ + try { $mail->SMTPDebug = 0; $mail->CharSet = 'UTF-8'; $mail->Timeout = 5; @@ -75,8 +80,8 @@ class MsgNotice $mail->SMTPAuth = true; $mail->Username = $mail_name; $mail->Password = $mail_pwd; - if($mail_port == 587) $mail->SMTPSecure = 'tls'; - else if($mail_port >= 465) $mail->SMTPSecure = 'ssl'; + if ($mail_port == 587) $mail->SMTPSecure = 'tls'; + else if ($mail_port >= 465) $mail->SMTPSecure = 'ssl'; else $mail->SMTPAutoTLS = false; $mail->Port = $mail_port; $mail->setFrom($mail_name, self::$sitename); @@ -93,56 +98,59 @@ class MsgNotice } } - public static function send_wechat_tplmsg($title, $content){ + public static function send_wechat_tplmsg($title, $content) + { $wechat_apptoken = config_get('wechat_apptoken'); $wechat_appuid = config_get('wechat_appuid'); - if(!$wechat_apptoken||!$wechat_appuid)return false; - $url = 'https://wxpusher.zjiecode.com/api/send/message'; - $post = ['appToken'=>$wechat_apptoken, 'content'=>$content, 'summary'=>$title, 'contentType'=>3, 'uids'=>[$wechat_appuid]]; - $result = get_curl($url, json_encode($post),0,0,0,0,0,['Content-Type: application/json; charset=UTF-8']); - $arr = json_decode($result, true); - if(isset($arr['success']) && $arr['success']==true){ - return true; - }else{ - return $arr['msg']; - } + if (!$wechat_apptoken || !$wechat_appuid) return false; + $url = 'https://wxpusher.zjiecode.com/api/send/message'; + $post = ['appToken' => $wechat_apptoken, 'content' => $content, 'summary' => $title, 'contentType' => 3, 'uids' => [$wechat_appuid]]; + $result = get_curl($url, json_encode($post), 0, 0, 0, 0, 0, ['Content-Type: application/json; charset=UTF-8']); + $arr = json_decode($result, true); + if (isset($arr['success']) && $arr['success'] == true) { + return true; + } else { + return $arr['msg']; + } } - public static function send_telegram_bot($content){ + public static function send_telegram_bot($content) + { $tgbot_token = config_get('tgbot_token'); $tgbot_chatid = config_get('tgbot_chatid'); - if(!$tgbot_token||!$tgbot_chatid)return false; + if (!$tgbot_token || !$tgbot_chatid) return false; $url = 'https://api.telegram.org/bot'.$tgbot_token.'/sendMessage'; - $post = ['chat_id'=>$tgbot_chatid, 'text'=>$content, 'parse_mode'=>'HTML']; + $post = ['chat_id' => $tgbot_chatid, 'text' => $content, 'parse_mode' => 'HTML']; $result = self::telegram_curl($url, http_build_query($post)); $arr = json_decode($result, true); - if(isset($arr['ok']) && $arr['ok']==true){ + if (isset($arr['ok']) && $arr['ok'] == true) { return true; - }else{ + } else { return $arr['description']; } } - private static function telegram_curl($url, $post){ + private static function telegram_curl($url, $post) + { $ch = curl_init(); - if(config_get('tgbot_proxy') == 1){ + if (config_get('tgbot_proxy') == 1) { $proxy_server = config_get('proxy_server'); $proxy_port = intval(config_get('proxy_port')); $proxy_userpwd = config_get('proxy_user').':'.config_get('proxy_pwd'); $proxy_type = config_get('proxy_type'); - if($proxy_type == 'https'){ + if ($proxy_type == 'https') { $proxy_type = CURLPROXY_HTTPS; - }elseif($proxy_type == 'sock4'){ + } elseif ($proxy_type == 'sock4') { $proxy_type = CURLPROXY_SOCKS4; - }elseif($proxy_type == 'sock5'){ + } elseif ($proxy_type == 'sock5') { $proxy_type = CURLPROXY_SOCKS5; - }else{ + } else { $proxy_type = CURLPROXY_HTTP; } curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_PROXY, $proxy_server); curl_setopt($ch, CURLOPT_PROXYPORT, $proxy_port); - if($proxy_userpwd != ':'){ + if ($proxy_userpwd != ':') { curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_userpwd); } curl_setopt($ch, CURLOPT_PROXYTYPE, $proxy_type); @@ -164,4 +172,4 @@ class MsgNotice curl_close($ch); return $ret; } -} \ No newline at end of file +} diff --git a/app/lib/OptimizeService.php b/app/lib/OptimizeService.php index 45c3799..964629b 100644 --- a/app/lib/OptimizeService.php +++ b/app/lib/OptimizeService.php @@ -7,53 +7,45 @@ use think\facade\Db; class OptimizeService { - private static $line_name = [ - 'aliyun' => ['DEF'=>'default', 'CT'=>'telecom', 'CU'=>'unicom', 'CM'=>'mobile', 'AB'=>'oversea'], - 'dnspod' => ['DEF'=>'0', 'CT'=>'10=0', 'CU'=>'10=1', 'CM'=>'10=3', 'AB'=>'3=0'], - 'huawei' => ['DEF'=>'default_view', 'CT'=>'Dianxin', 'CU'=>'Liantong', 'CM'=>'Yidong', 'AB'=>'Abroad'], - 'west' => ['DEF'=>'', 'CT'=>'LTEL', 'CU'=>'LCNC', 'CM'=>'LMOB', 'AB'=>'LFOR'], - 'dnsla' => ['DEF'=>'', 'CT'=>'84613316902921216', 'CU'=>'84613316923892736', 'CM'=>'84613316953252864', 'AB'=>''], - 'huoshan' => ['DEF'=>'default', 'CT'=>'telecom', 'CU'=>'unicom', 'CM'=>'mobile', 'AB'=>'oversea'], - 'baidu' => ['DEF'=>'default', 'CT'=>'ct', 'CU'=>'cnc', 'CM'=>'cmnet', 'AB'=>''], - ]; - private $ip_address = []; private $add_num = 0; private $change_num = 0; private $del_num = 0; - public static function get_license($api, $key){ - if($api == 2){ + public static function get_license($api, $key) + { + if ($api == 2) { throw new Exception('当前接口暂不支持'); - }elseif($api == 1){ + } elseif ($api == 1) { $url = 'https://api.hostmonit.com/get_license?license='.$key; - }else{ + } else { $url = 'https://www.wetest.vip/api/cf2dns/get_license?license='.$key; } $response = get_curl($url); $arr = json_decode($response, true); - if(isset($arr['code']) && $arr['code'] == 200 && isset($arr['count'])){ + if (isset($arr['code']) && $arr['code'] == 200 && isset($arr['count'])) { return $arr['count']; - }elseif(isset($arr['info'])){ + } elseif (isset($arr['info'])) { throw new Exception('获取剩余请求次数失败,'.$arr['info']); - }else{ + } else { throw new Exception('获取剩余请求次数失败'); } } - public function get_ip_address($cdn_type = 1, $ip_type = 'v4'){ + public function get_ip_address($cdn_type = 1, $ip_type = 'v4') + { $api = config_get('optimize_ip_api', 0); - if($api == 2){ + if ($api == 2) { $url = 'https://api.345673.xyz/get_data'; - }elseif($api == 1){ + } elseif ($api == 1) { $url = 'https://api.hostmonit.com/get_optimization_ip'; - }else{ + } else { $url = 'https://www.wetest.vip/api/cf2dns/'; - if($cdn_type == 1){ + if ($cdn_type == 1) { $url .= 'get_cloudflare_ip'; - }elseif($cdn_type == 2){ + } elseif ($cdn_type == 2) { $url .= 'get_cloudfront_ip'; - }elseif($cdn_type == 3){ + } elseif ($cdn_type == 3) { $url .= 'get_gcore_ip'; } } @@ -63,41 +55,51 @@ class OptimizeService ]; $response = get_curl($url, json_encode($params), 0, 0, 0, 0, 0, ['Content-Type: application/json; charset=UTF-8']); $arr = json_decode($response, true); - if(isset($arr['code']) && $arr['code'] == 200){ + if (isset($arr['code']) && $arr['code'] == 200) { return $arr['info']; - }elseif(isset($arr['info'])){ + } elseif (isset($arr['info'])) { throw new Exception('获取优选IP数据失败,'.$arr['info']); - }elseif(isset($arr['msg'])){ + } elseif (isset($arr['msg'])) { throw new Exception('获取优选IP数据失败,'.$arr['msg']); - }else{ + } else { throw new Exception('获取优选IP数据失败,原因未知'); } } - public function get_ip_address2($cdn_type = 1, $ip_type = 'v4'){ + public function get_ip_address2($cdn_type = 1, $ip_type = 'v4') + { $key = $cdn_type.'_'.$ip_type; - if(!isset($this->ip_address[$key])){ + if (!isset($this->ip_address[$key])) { $info = $this->get_ip_address($cdn_type, $ip_type); $res = []; - if(isset($info['DEF'])) $res['DEF'] = $info['DEF']; - if(isset($info['CT'])) $res['CT'] = $info['CT']; - if(isset($info['CU'])) $res['CU'] = $info['CU']; - if(isset($info['CM'])) $res['CM'] = $info['CM']; + if (isset($info['DEF'])) { + $res['DEF'] = $info['DEF']; + } + if (isset($info['CT'])) { + $res['CT'] = $info['CT']; + } + if (isset($info['CU'])) { + $res['CU'] = $info['CU']; + } + if (isset($info['CM'])) { + $res['CM'] = $info['CM']; + } $this->ip_address[$key] = $res; } return $this->ip_address[$key]; } //批量执行优选任务 - public function execute(){ + public function execute() + { $list = Db::name('optimizeip')->where('active', 1)->select(); echo '开始执行IP优选任务,共获取到'.count($list).'个待执行任务'."\n"; - foreach($list as $row){ - try{ + foreach ($list as $row) { + try { $result = $this->execute_one($row); Db::name('optimizeip')->where('id', $row['id'])->update(['status' => 1, 'errmsg' => null, 'updatetime' => date('Y-m-d H:i:s')]); echo '优选任务'.$row['id'].'执行成功:'.$result."\n"; - }catch(Exception $e){ + } catch (Exception $e) { Db::name('optimizeip')->where('id', $row['id'])->update(['status' => 2, 'errmsg' => $e->getMessage(), 'updatetime' => date('Y-m-d H:i:s')]); echo '优选任务'.$row['id'].'执行失败:'.$e->getMessage()."\n"; } @@ -105,19 +107,22 @@ class OptimizeService } //执行单个优选任务 - public function execute_one($row){ + public function execute_one($row) + { $this->add_num = 0; $this->change_num = 0; $this->del_num = 0; $ip_types = explode(',', $row['ip_type']); - foreach($ip_types as $ip_type){ - if(empty($ip_type)) continue; + foreach ($ip_types as $ip_type) { + if (empty($ip_type)) { + continue; + } - $drow = Db::name('domain')->alias('A')->join('account B','A.aid = B.id')->where('A.id', $row['did'])->field('A.*,B.type,B.ak,B.sk,B.ext')->find(); - if(!$drow){ + $drow = Db::name('domain')->alias('A')->join('account B', 'A.aid = B.id')->where('A.id', $row['did'])->field('A.*,B.type,B.ak,B.sk,B.ext')->find(); + if (!$drow) { throw new Exception('域名不存在(ID:'.$row['did'].')'); } - if(!isset(self::$line_name[$drow['type']])){ + if (!isset(DnsHelper::$line_name[$drow['type']])) { throw new Exception('不支持的DNS服务商'); } @@ -125,18 +130,28 @@ class OptimizeService $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $domainRecords = $dns->getSubDomainRecords($row['rr'], 1, 100); - if(!$domainRecords){ + if (!$domainRecords) { throw new Exception('获取记录列表失败,'.$dns->getError()); } - if($row['type'] == 1 && isset($info['DEF']) && !empty($info['DEF'])) $row['type'] = 0; + if ($row['type'] == 1 && isset($info['DEF']) && !empty($info['DEF'])) { + $row['type'] = 0; + } - foreach($info as $line=>$iplist){ - if(empty($iplist)) continue; + foreach ($info as $line => $iplist) { + if (empty($iplist)) { + continue; + } $get_ips = array_column($iplist, 'ip'); - if($drow['type']=='huawei') {sort($get_ips); $get_ips = [implode(',',$get_ips)]; $row['recordnum'] = 1;} - if($row['type'] == 1 && $line == 'CT') $line = 'DEF'; - $line_name = self::$line_name[$drow['type']][$line]; + if ($drow['type'] == 'huawei') { + sort($get_ips); + $get_ips = [implode(',', $get_ips)]; + $row['recordnum'] = 1; + } + if ($row['type'] == 1 && $line == 'CT') { + $line = 'DEF'; + } + $line_name = DnsHelper::$line_name[$drow['type']][$line]; $this->process_dns_line($dns, $row, $domainRecords['list'], $get_ips, $line_name, $ip_type); } } @@ -145,29 +160,30 @@ class OptimizeService } //处理单个线路的解析记录 - private function process_dns_line($dns, $row, $record_list, $get_ips, $line_name, $ip_type){ + private function process_dns_line($dns, $row, $record_list, $get_ips, $line_name, $ip_type) + { $record_num = $row['recordnum']; - $records = array_filter($record_list, function($v) use($line_name){ + $records = array_filter($record_list, function ($v) use ($line_name) { return $v['Line'] == $line_name; }); //删除CNAME记录 - $cname_records = array_filter($records, function($v){ + $cname_records = array_filter($records, function ($v) { return $v['Type'] == 'CNAME'; }); - if(!empty($cname_records)){ - foreach($cname_records as $record){ + if (!empty($cname_records)) { + foreach ($cname_records as $record) { $dns->deleteDomainRecord($record['RecordId']); } } - + //处理A/AAAA记录 - $ip_records = array_filter($records, function($v) use ($ip_type){ + $ip_records = array_filter($records, function ($v) use ($ip_type) { return $v['Type'] == ($ip_type == 'v6' ? 'AAAA' : 'A'); }); - if(!empty($ip_records) && is_array($ip_records[array_key_first($ip_records)]['Value'])){ //处理华为云记录 - foreach($ip_records as &$ip_record){ + if (!empty($ip_records) && is_array($ip_records[array_key_first($ip_records)]['Value'])) { //处理华为云记录 + foreach ($ip_records as &$ip_record) { sort($ip_record['Value']); $ip_record['Value'] = implode(',', $ip_record['Value']); } @@ -178,20 +194,20 @@ class OptimizeService $del_ips = array_diff($exist_ips, $get_ips); $correct_ips = array_diff($exist_ips, $del_ips); $correct_count = count($correct_ips); - if(!empty($del_ips)){ - foreach($ip_records as $record){ - if(in_array($record['Value'], $del_ips)){ + if (!empty($del_ips)) { + foreach ($ip_records as $record) { + if (in_array($record['Value'], $del_ips)) { $add_ip = array_pop($add_ips); - if($add_ip){ + if ($add_ip) { $res = $dns->updateDomainRecord($record['RecordId'], $row['rr'], $ip_type == 'v6' ? 'AAAA' : 'A', $add_ip, $line_name, $row['ttl']); - if(!$res){ + if (!$res) { throw new Exception('修改解析失败,'.$dns->getError()); } $this->change_num++; $correct_count++; - }else{ + } else { $res = $dns->deleteDomainRecord($record['RecordId']); - if(!$res){ + if (!$res) { throw new Exception('删除解析失败,'.$dns->getError()); } $this->del_num++; @@ -199,16 +215,18 @@ class OptimizeService } } } - if($correct_count < $record_num && !empty($add_ips)){ - foreach($add_ips as $add_ip){ + if ($correct_count < $record_num && !empty($add_ips)) { + foreach ($add_ips as $add_ip) { $res = $dns->addDomainRecord($row['rr'], $ip_type == 'v6' ? 'AAAA' : 'A', $add_ip, $line_name, $row['ttl']); - if(!$res){ + if (!$res) { throw new Exception('添加解析失败,'.$dns->getError()); } $this->add_num++; $correct_count++; - if($correct_count >= $record_num) break; + if ($correct_count >= $record_num) { + break; + } } } } -} \ No newline at end of file +} diff --git a/app/lib/TaskRunner.php b/app/lib/TaskRunner.php index 8cef5b0..fb005ec 100644 --- a/app/lib/TaskRunner.php +++ b/app/lib/TaskRunner.php @@ -1,4 +1,5 @@ conn){ + if (!$this->conn) { $this->conn = NewDb::connect(); } return $this->conn; @@ -20,92 +21,92 @@ class TaskRunner private function closeDb() { - if($this->conn){ + if ($this->conn) { $this->conn->close(); } } public function execute($row) { - if($row['type'] == 3){ //条件开启解析 + if ($row['type'] == 3) { //条件开启解析 $action = 0; - $remain = $this->db()->name('dmtask')->where(['did'=>$row['did'], 'rr'=>$row['rr'], 'type'=>1, 'status'=>0])->count(); - if($remain<=$row['cycle'] && $row['status']==0){ + $remain = $this->db()->name('dmtask')->where(['did' => $row['did'], 'rr' => $row['rr'], 'type' => 1, 'status' => 0])->count(); + if ($remain <= $row['cycle'] && $row['status'] == 0) { $action = 2; - $this->db()->name('dmtask')->where('id', $row['id'])->update(['status'=>1, 'errcount'=>0, 'switchtime'=>time()]); - }elseif($remain>$row['cycle'] && $row['status']==1){ + $this->db()->name('dmtask')->where('id', $row['id'])->update(['status' => 1, 'errcount' => 0, 'switchtime' => time()]); + } elseif ($remain > $row['cycle'] && $row['status'] == 1) { $action = 1; - $this->db()->name('dmtask')->where('id', $row['id'])->update(['status'=>0, 'errcount'=>0, 'switchtime'=>time()]); - } - }else{ - if($row['checktype'] == 2){ + $this->db()->name('dmtask')->where('id', $row['id'])->update(['status' => 0, 'errcount' => 0, 'switchtime' => time()]); + } + } else { + if ($row['checktype'] == 2) { $result = CheckUtils::curl($row['checkurl'], $row['timeout'], $row['main_value'], $row['proxy'] == 1); - }else if($row['checktype'] == 1){ + } elseif ($row['checktype'] == 1) { $result = CheckUtils::tcp($row['main_value'], $row['tcpport'], $row['timeout']); - }else{ + } else { $result = CheckUtils::ping($row['main_value']); } - + $action = 0; - if($result['status'] && $row['status']==1){ - if($row['cycle'] <= 1 || $row['errcount'] >= $row['cycle']){ - $this->db()->name('dmtask')->where('id', $row['id'])->update(['status'=>0, 'errcount'=>0, 'switchtime'=>time()]); + if ($result['status'] && $row['status'] == 1) { + if ($row['cycle'] <= 1 || $row['errcount'] >= $row['cycle']) { + $this->db()->name('dmtask')->where('id', $row['id'])->update(['status' => 0, 'errcount' => 0, 'switchtime' => time()]); $action = 2; - }else{ + } else { $this->db()->name('dmtask')->where('id', $row['id'])->inc('errcount')->update(); } - }elseif(!$result['status'] && $row['status']==0){ - if($row['cycle'] <= 1 || $row['errcount'] >= $row['cycle']){ - $this->db()->name('dmtask')->where('id', $row['id'])->update(['status'=>1, 'errcount'=>0, 'switchtime'=>time()]); + } elseif (!$result['status'] && $row['status'] == 0) { + if ($row['cycle'] <= 1 || $row['errcount'] >= $row['cycle']) { + $this->db()->name('dmtask')->where('id', $row['id'])->update(['status' => 1, 'errcount' => 0, 'switchtime' => time()]); $action = 1; - }else{ + } else { $this->db()->name('dmtask')->where('id', $row['id'])->inc('errcount')->update(); } - }elseif($row['errcount'] > 0){ - $this->db()->name('dmtask')->where('id', $row['id'])->update(['errcount'=>0]); + } elseif ($row['errcount'] > 0) { + $this->db()->name('dmtask')->where('id', $row['id'])->update(['errcount' => 0]); } } - if($action > 0){ - $drow = $this->db()->name('domain')->alias('A')->join('account B','A.aid = B.id')->where('A.id', $row['did'])->field('A.*,B.type,B.ak,B.sk,B.ext')->find(); - if(!$drow){ + if ($action > 0) { + $drow = $this->db()->name('domain')->alias('A')->join('account B', 'A.aid = B.id')->where('A.id', $row['did'])->field('A.*,B.type,B.ak,B.sk,B.ext')->find(); + if (!$drow) { echo '域名不存在(ID:'.$row['did'].')'."\n"; $this->closeDb(); return; } $row['domain'] = $row['rr'] . '.' . $drow['name']; } - if($action == 1){ - if($row['type'] == 2){ + if ($action == 1) { + if ($row['type'] == 2) { $dns = DnsHelper::getModel2($drow); $recordinfo = json_decode($row['recordinfo'], true); $res = $dns->updateDomainRecord($row['recordid'], $row['rr'], getDnsType($row['backup_value']), $row['backup_value'], $recordinfo['Line'], $recordinfo['TTL']); - if(!$res){ + if (!$res) { $this->db()->name('log')->insert(['uid' => 0, 'domain' => $drow['name'], 'action' => '修改解析失败', 'data' => $dns->getError(), 'addtime' => date("Y-m-d H:i:s")]); } - }elseif($row['type'] == 1 || $row['type'] == 3){ + } elseif ($row['type'] == 1 || $row['type'] == 3) { $dns = DnsHelper::getModel2($drow); $res = $dns->setDomainRecordStatus($row['recordid'], '0'); - if(!$res){ + if (!$res) { $this->db()->name('log')->insert(['uid' => 0, 'domain' => $drow['name'], 'action' => '暂停解析失败', 'data' => $dns->getError(), 'addtime' => date("Y-m-d H:i:s")]); } } - }elseif($action == 2){ - if($row['type'] == 2){ + } elseif ($action == 2) { + if ($row['type'] == 2) { $dns = DnsHelper::getModel2($drow); $recordinfo = json_decode($row['recordinfo'], true); $res = $dns->updateDomainRecord($row['recordid'], $row['rr'], getDnsType($row['main_value']), $row['main_value'], $recordinfo['Line'], $recordinfo['TTL']); - if(!$res){ + if (!$res) { $this->db()->name('log')->insert(['uid' => 0, 'domain' => $drow['name'], 'action' => '修改解析失败', 'data' => $dns->getError(), 'addtime' => date("Y-m-d H:i:s")]); } - }elseif($row['type'] == 1 || $row['type'] == 3){ + } elseif ($row['type'] == 1 || $row['type'] == 3) { $dns = DnsHelper::getModel2($drow); $res = $dns->setDomainRecordStatus($row['recordid'], '1'); - if(!$res){ + if (!$res) { $this->db()->name('log')->insert(['uid' => 0, 'domain' => $drow['name'], 'action' => '启用解析失败', 'data' => $dns->getError(), 'addtime' => date("Y-m-d H:i:s")]); } } - }else{ + } else { $this->closeDb(); return; } @@ -118,8 +119,8 @@ class TaskRunner ]); $this->closeDb(); - if($row['type'] != 3){ + if ($row['type'] != 3) { MsgNotice::send($action, $row, $result); } } -} \ No newline at end of file +} diff --git a/app/lib/dns/aliyun.php b/app/lib/dns/aliyun.php index 6660353..5a37a95 100644 --- a/app/lib/dns/aliyun.php +++ b/app/lib/dns/aliyun.php @@ -1,314 +1,338 @@ AccessKeyId = $config['ak']; - $this->AccessKeySecret = $config['sk']; - $this->domain = $config['domain']; - } + public function __construct($config) + { + $this->AccessKeyId = $config['ak']; + $this->AccessKeySecret = $config['sk']; + $this->domain = $config['domain']; + } - public function getError(){ - return $this->error; - } + public function getError() + { + return $this->error; + } - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } + public function check() + { + if ($this->getDomainList() != false) { + return true; + } + return false; + } - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $param = ['Action' => 'DescribeDomains', 'KeyWord' => $KeyWord, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize]; - $data = $this->request($param, true); - if($data){ - $list = []; - foreach($data['Domains']['Domain'] as $row){ - $list[] = [ - 'DomainId' => $row['DomainId'], - 'Domain' => $row['DomainName'], - 'RecordCount' => $row['RecordCount'], - ]; - } - return ['total' => $data['TotalCount'], 'list' => $list]; - } - return false; - } + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $param = ['Action' => 'DescribeDomains', 'KeyWord' => $KeyWord, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize]; + $data = $this->request($param, true); + if ($data) { + $list = []; + foreach ($data['Domains']['Domain'] as $row) { + $list[] = [ + 'DomainId' => $row['DomainId'], + 'Domain' => $row['DomainName'], + 'RecordCount' => $row['RecordCount'], + ]; + } + return ['total' => $data['TotalCount'], 'list' => $list]; + } + return false; + } - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - $param = ['Action' => 'DescribeDomainRecords', 'DomainName' => $this->domain, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize]; - if(!empty($SubDomain) || !empty($Type) || !empty($Line) || !empty($Value)){ - $param += ['SearchMode' => 'ADVANCED', 'RRKeyWord' => $SubDomain, 'ValueKeyWord' => $Value, 'Type' => $Type, 'Line' => $Line]; - }elseif(!empty($KeyWord)){ - $param += ['KeyWord' => $KeyWord]; - } - if(!isNullOrEmpty($Status)){ - $Status = $Status == '1' ? 'Enable' : 'Disable'; - $param += ['Status' => $Status]; - } - $data = $this->request($param, true); - if($data){ - $list = []; - foreach($data['DomainRecords']['Record'] as $row){ - $list[] = [ - 'RecordId' => $row['RecordId'], - 'Domain' => $row['DomainName'], - 'Name' => $row['RR'], - 'Type' => $row['Type'], - 'Value' => $row['Value'], - 'Line' => $row['Line'], - 'TTL' => $row['TTL'], - 'MX' => isset($row['Priority']) ? $row['Priority'] : null, - 'Status' => $row['Status'] == 'ENABLE' ? '1' : '0', - 'Weight' => isset($row['Weight']) ? $row['Weight'] : null, - 'Remark' => isset($row['Remark']) ? $row['Remark'] : null, - 'UpdateTime' => isset($row['UpdateTimestamp']) ? date('Y-m-d H:i:s', $row['UpdateTimestamp']/1000) : null, - ]; - } - return ['total' => $data['TotalCount'], 'list' => $list]; - } - return false; - } + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + $param = ['Action' => 'DescribeDomainRecords', 'DomainName' => $this->domain, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize]; + if (!empty($SubDomain) || !empty($Type) || !empty($Line) || !empty($Value)) { + $param += ['SearchMode' => 'ADVANCED', 'RRKeyWord' => $SubDomain, 'ValueKeyWord' => $Value, 'Type' => $Type, 'Line' => $Line]; + } elseif (!empty($KeyWord)) { + $param += ['KeyWord' => $KeyWord]; + } + if (!isNullOrEmpty($Status)) { + $Status = $Status == '1' ? 'Enable' : 'Disable'; + $param += ['Status' => $Status]; + } + $data = $this->request($param, true); + if ($data) { + $list = []; + foreach ($data['DomainRecords']['Record'] as $row) { + $list[] = [ + 'RecordId' => $row['RecordId'], + 'Domain' => $row['DomainName'], + 'Name' => $row['RR'], + 'Type' => $row['Type'], + 'Value' => $row['Value'], + 'Line' => $row['Line'], + 'TTL' => $row['TTL'], + 'MX' => isset($row['Priority']) ? $row['Priority'] : null, + 'Status' => $row['Status'] == 'ENABLE' ? '1' : '0', + 'Weight' => isset($row['Weight']) ? $row['Weight'] : null, + 'Remark' => isset($row['Remark']) ? $row['Remark'] : null, + 'UpdateTime' => isset($row['UpdateTimestamp']) ? date('Y-m-d H:i:s', $row['UpdateTimestamp'] / 1000) : null, + ]; + } + return ['total' => $data['TotalCount'], 'list' => $list]; + } + return false; + } - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - $param = ['Action' => 'DescribeSubDomainRecords', 'SubDomain' => $SubDomain . '.' . $this->domain, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'Type' => $Type, 'Line' => $Line]; - $data = $this->request($param, true); - if($data){ - $list = []; - foreach($data['DomainRecords']['Record'] as $row){ - $list[] = [ - 'RecordId' => $row['RecordId'], - 'Domain' => $row['DomainName'], - 'Name' => $row['RR'], - 'Type' => $row['Type'], - 'Value' => $row['Value'], - 'Line' => $row['Line'], - 'TTL' => $row['TTL'], - 'MX' => isset($row['Priority']) ? $row['Priority'] : null, - 'Status' => $row['Status'] == 'ENABLE' ? '1' : '0', - 'Weight' => isset($row['Weight']) ? $row['Weight'] : null, - 'Remark' => isset($row['Remark']) ? $row['Remark'] : null, - 'UpdateTime' => isset($row['UpdateTimestamp']) ? date('Y-m-d H:i:s', $row['UpdateTimestamp']/1000) : null, - ]; - } - return ['total' => $data['TotalCount'], 'list' => $list]; - } - return false; - } + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + $param = ['Action' => 'DescribeSubDomainRecords', 'SubDomain' => $SubDomain . '.' . $this->domain, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'Type' => $Type, 'Line' => $Line]; + $data = $this->request($param, true); + if ($data) { + $list = []; + foreach ($data['DomainRecords']['Record'] as $row) { + $list[] = [ + 'RecordId' => $row['RecordId'], + 'Domain' => $row['DomainName'], + 'Name' => $row['RR'], + 'Type' => $row['Type'], + 'Value' => $row['Value'], + 'Line' => $row['Line'], + 'TTL' => $row['TTL'], + 'MX' => isset($row['Priority']) ? $row['Priority'] : null, + 'Status' => $row['Status'] == 'ENABLE' ? '1' : '0', + 'Weight' => isset($row['Weight']) ? $row['Weight'] : null, + 'Remark' => isset($row['Remark']) ? $row['Remark'] : null, + 'UpdateTime' => isset($row['UpdateTimestamp']) ? date('Y-m-d H:i:s', $row['UpdateTimestamp'] / 1000) : null, + ]; + } + return ['total' => $data['TotalCount'], 'list' => $list]; + } + return false; + } - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - $param = ['Action' => 'DescribeDomainRecordInfo', 'RecordId' => $RecordId]; - $data = $this->request($param, true); - if($data){ - return [ - 'RecordId' => $data['RecordId'], - 'Domain' => $data['DomainName'], - 'Name' => $data['RR'], - 'Type' => $data['Type'], - 'Value' => $data['Value'], - 'Line' => $data['Line'], - 'TTL' => $data['TTL'], - 'MX' => isset($data['Priority']) ? $data['Priority'] : null, - 'Status' => $data['Status'] == 'ENABLE' ? '1' : '0', - 'Weight' => isset($data['Weight']) ? $data['Weight'] : null, - 'Remark' => isset($data['Remark']) ? $data['Remark'] : null, - 'UpdateTime' => isset($row['UpdateTimestamp']) ? date('Y-m-d H:i:s', $data['UpdateTimestamp']/1000) : null, - ]; - } - return false; - } + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + $param = ['Action' => 'DescribeDomainRecordInfo', 'RecordId' => $RecordId]; + $data = $this->request($param, true); + if ($data) { + return [ + 'RecordId' => $data['RecordId'], + 'Domain' => $data['DomainName'], + 'Name' => $data['RR'], + 'Type' => $data['Type'], + 'Value' => $data['Value'], + 'Line' => $data['Line'], + 'TTL' => $data['TTL'], + 'MX' => isset($data['Priority']) ? $data['Priority'] : null, + 'Status' => $data['Status'] == 'ENABLE' ? '1' : '0', + 'Weight' => isset($data['Weight']) ? $data['Weight'] : null, + 'Remark' => isset($data['Remark']) ? $data['Remark'] : null, + 'UpdateTime' => isset($row['UpdateTimestamp']) ? date('Y-m-d H:i:s', $data['UpdateTimestamp'] / 1000) : null, + ]; + } + return false; + } - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = 'default', $TTL = 600, $MX = null, $Weight = null, $Remark = null){ - $param = ['Action' => 'AddDomainRecord', 'DomainName' => $this->domain, 'RR' => $Name, 'Type' => $Type, 'Value' => $Value, 'Line' => $this->convertLineCode($Line), 'TTL' => intval($TTL)]; - if($MX){ - $param['Priority'] = intval($MX); - } - $data = $this->request($param, true); - if($data){ - return $data['RecordId']; - } - return false; - } + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = 'default', $TTL = 600, $MX = null, $Weight = null, $Remark = null) + { + $param = ['Action' => 'AddDomainRecord', 'DomainName' => $this->domain, 'RR' => $Name, 'Type' => $Type, 'Value' => $Value, 'Line' => $this->convertLineCode($Line), 'TTL' => intval($TTL)]; + if ($MX) { + $param['Priority'] = intval($MX); + } + $data = $this->request($param, true); + if ($data) { + return $data['RecordId']; + } + return false; + } - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = 'default', $TTL = 600, $MX = null, $Weight = null, $Remark = null){ - $param = ['Action' => 'UpdateDomainRecord', 'RecordId' => $RecordId, 'RR' => $Name, 'Type' => $Type, 'Value' => $Value, 'Line' => $this->convertLineCode($Line), 'TTL' => intval($TTL)]; - if($MX){ - $param['Priority'] = intval($MX); - } - return $this->request($param); - } + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = 'default', $TTL = 600, $MX = null, $Weight = null, $Remark = null) + { + $param = ['Action' => 'UpdateDomainRecord', 'RecordId' => $RecordId, 'RR' => $Name, 'Type' => $Type, 'Value' => $Value, 'Line' => $this->convertLineCode($Line), 'TTL' => intval($TTL)]; + if ($MX) { + $param['Priority'] = intval($MX); + } + return $this->request($param); + } - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - $param = ['Action' => 'UpdateDomainRecordRemark', 'RecordId' => $RecordId, 'Remark' => $Remark]; - return $this->request($param); - } + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + $param = ['Action' => 'UpdateDomainRecordRemark', 'RecordId' => $RecordId, 'Remark' => $Remark]; + return $this->request($param); + } - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $param = ['Action' => 'DeleteDomainRecord', 'RecordId' => $RecordId]; - return $this->request($param); - } + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $param = ['Action' => 'DeleteDomainRecord', 'RecordId' => $RecordId]; + return $this->request($param); + } - //删除子域名的解析记录 - public function deleteSubDomainRecords($SubDomain){ - $param = ['Action' => 'DeleteSubDomainRecords', 'DomainName' => $this->domain, 'RR' => $SubDomain]; - return $this->request($param); - } + //删除子域名的解析记录 + public function deleteSubDomainRecords($SubDomain) + { + $param = ['Action' => 'DeleteSubDomainRecords', 'DomainName' => $this->domain, 'RR' => $SubDomain]; + return $this->request($param); + } - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - $Status = $Status == '1' ? 'Enable' : 'Disable'; - $param = ['Action' => 'SetDomainRecordStatus', 'RecordId' => $RecordId, 'Status' => $Status]; - return $this->request($param); - } + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + $Status = $Status == '1' ? 'Enable' : 'Disable'; + $param = ['Action' => 'SetDomainRecordStatus', 'RecordId' => $RecordId, 'Status' => $Status]; + return $this->request($param); + } - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - $param = ['Action' => 'DescribeRecordLogs', 'DomainName' => $this->domain, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'KeyWord' => $KeyWord, 'StartDate' => $StartDate, 'endDate' => $endDate, 'Lang' => 'zh']; - $data = $this->request($param, true); - if($data){ - $list = []; - foreach($data['RecordLogs']['RecordLog'] as $row){ - $list[] = ['time'=>date('Y-m-d H:i:s', intval($row['ActionTimestamp']/1000)), 'data'=>$row['Message']]; - } - return ['total' => $data['TotalCount'], 'list' => $list]; - } - return false; - } + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + $param = ['Action' => 'DescribeRecordLogs', 'DomainName' => $this->domain, 'PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'KeyWord' => $KeyWord, 'StartDate' => $StartDate, 'endDate' => $endDate, 'Lang' => 'zh']; + $data = $this->request($param, true); + if ($data) { + $list = []; + foreach ($data['RecordLogs']['RecordLog'] as $row) { + $list[] = ['time' => date('Y-m-d H:i:s', intval($row['ActionTimestamp'] / 1000)), 'data' => $row['Message']]; + } + return ['total' => $data['TotalCount'], 'list' => $list]; + } + return false; + } - //获取解析线路列表 - public function getRecordLine(){ - $data = $this->getDomainInfo(); - if($data){ - $list = []; - foreach($data['RecordLines']['RecordLine'] as $row){ - $list[$row['LineCode']] = ['name'=>$row['LineDisplayName'], 'parent'=>isset($row['FatherCode']) ? $row['FatherCode'] : null]; - } - return $list; - } - return false; - } + //获取解析线路列表 + public function getRecordLine() + { + $data = $this->getDomainInfo(); + if ($data) { + $list = []; + foreach ($data['RecordLines']['RecordLine'] as $row) { + $list[$row['LineCode']] = ['name' => $row['LineDisplayName'], 'parent' => isset($row['FatherCode']) ? $row['FatherCode'] : null]; + } + return $list; + } + return false; + } - //获取域名信息 - public function getDomainInfo(){ - if(!empty($this->domainInfo)) return $this->domainInfo; - $param = ['Action' => 'DescribeDomainInfo', 'DomainName' => $this->domain, 'NeedDetailAttributes' => 'true']; - $data = $this->request($param, true); - if($data){ - $this->domainInfo = $data; - return $data; - } - return false; - } + //获取域名信息 + public function getDomainInfo() + { + if (!empty($this->domainInfo)) return $this->domainInfo; + $param = ['Action' => 'DescribeDomainInfo', 'DomainName' => $this->domain, 'NeedDetailAttributes' => 'true']; + $data = $this->request($param, true); + if ($data) { + $this->domainInfo = $data; + return $data; + } + return false; + } - //获取域名最低TTL - public function getMinTTL(){ - $data = $this->getDomainInfo(); - if($data){ - return $data['MinTtl']; - } - return false; - } + //获取域名最低TTL + public function getMinTTL() + { + $data = $this->getDomainInfo(); + if ($data) { + return $data['MinTtl']; + } + return false; + } - private function convertLineCode($line){ - $convert_dict = ['0'=>'default', '10=1'=>'unicom', '10=0'=>'telecom', '10=3'=>'mobile', '10=2'=>'edu', '3=0'=>'oversea', '10=22'=>'btvn', '80=0'=>'search', '7=0'=>'internal']; - if(array_key_exists($line, $convert_dict)){ - return $convert_dict[$line]; - } - return $line; - } + private function convertLineCode($line) + { + $convert_dict = ['0' => 'default', '10=1' => 'unicom', '10=0' => 'telecom', '10=3' => 'mobile', '10=2' => 'edu', '3=0' => 'oversea', '10=22' => 'btvn', '80=0' => 'search', '7=0' => 'internal']; + if (array_key_exists($line, $convert_dict)) { + return $convert_dict[$line]; + } + return $line; + } - private function aliyunSignature($parameters, $accessKeySecret, $method) - { - ksort($parameters); - $canonicalizedQueryString = ''; - foreach ($parameters as $key => $value) { - if($value === null) continue; - $canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value); - } - $stringToSign = $method . '&%2F&' . $this->percentEncode(substr($canonicalizedQueryString, 1)); - $signature = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret."&", true)); + private function aliyunSignature($parameters, $accessKeySecret, $method) + { + ksort($parameters); + $canonicalizedQueryString = ''; + foreach ($parameters as $key => $value) { + if ($value === null) continue; + $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value); + } + $stringToSign = $method . '&%2F&' . $this->percentEncode(substr($canonicalizedQueryString, 1)); + $signature = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&", true)); - return $signature; - } - private function percentEncode($str) - { - $search = ['+', '*', '%7E']; - $replace = ['%20', '%2A', '~']; - return str_replace($search, $replace, urlencode($str)); - } - private function request($param, $returnData=false){ - if(empty($this->AccessKeyId)||empty($this->AccessKeySecret))return false; - $result = $this->request_do($param, $returnData); - if(!$returnData && $result!==true){ - usleep(50000); - $result = $this->request_do($param, $returnData); - } - return $result; - } - private function request_do($param, $returnData=false){ - if(empty($this->AccessKeyId)||empty($this->AccessKeySecret))return false; - $url='https://'.$this->Endpoint.'/'; - $data=array( - 'Format' => 'JSON', - 'Version' => $this->Version, - 'AccessKeyId' => $this->AccessKeyId, - 'SignatureMethod' => 'HMAC-SHA1', - 'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), - 'SignatureVersion' => '1.0', - 'SignatureNonce' => random(8)); - $data=array_merge($data, $param); - $data['Signature'] = $this->aliyunSignature($data, $this->AccessKeySecret, 'POST'); - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); - $response = curl_exec($ch); - $errno = curl_errno($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - curl_close($ch); - if ($errno) return false; + return $signature; + } + private function percentEncode($str) + { + $search = ['+', '*', '%7E']; + $replace = ['%20', '%2A', '~']; + return str_replace($search, $replace, urlencode($str)); + } + private function request($param, $returnData = false) + { + if (empty($this->AccessKeyId) || empty($this->AccessKeySecret)) return false; + $result = $this->request_do($param, $returnData); + if (!$returnData && $result !== true) { + usleep(50000); + $result = $this->request_do($param, $returnData); + } + return $result; + } + private function request_do($param, $returnData = false) + { + if (empty($this->AccessKeyId) || empty($this->AccessKeySecret)) return false; + $url = 'https://' . $this->Endpoint . '/'; + $data = array( + 'Format' => 'JSON', + 'Version' => $this->Version, + 'AccessKeyId' => $this->AccessKeyId, + 'SignatureMethod' => 'HMAC-SHA1', + 'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), + 'SignatureVersion' => '1.0', + 'SignatureNonce' => random(8) + ); + $data = array_merge($data, $param); + $data['Signature'] = $this->aliyunSignature($data, $this->AccessKeySecret, 'POST'); + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); + $response = curl_exec($ch); + $errno = curl_errno($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + curl_close($ch); + if ($errno) return false; - $arr = json_decode($response,true); - if($httpCode==200){ - return $returnData ? $arr : true; - }elseif($arr){ - $this->setError($arr['Message']); - return false; - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + $arr = json_decode($response, true); + if ($httpCode == 200) { + return $returnData ? $arr : true; + } elseif ($arr) { + $this->setError($arr['Message']); + return false; + } else { + $this->setError('返回数据解析失败'); + return false; + } + } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } } diff --git a/app/lib/dns/baidu.php b/app/lib/dns/baidu.php index 12796df..bfc9617 100644 --- a/app/lib/dns/baidu.php +++ b/app/lib/dns/baidu.php @@ -1,326 +1,350 @@ AccessKeyId = $config['ak']; - $this->SecretAccessKey = $config['sk']; - $this->domain = $config['domain']; - $this->domainid = $config['domainid']; - } - - public function getError(){ - return $this->error; - } - - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } - - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $query = ['name' => $KeyWord]; - $data = $this->send_reuqest('GET', '/v1/dns/zone', $query); - if($data){ - $list = []; - foreach($data['zones'] as $row){ - $list[] = [ - 'DomainId' => $row['id'], - 'Domain' => rtrim($row['name'], '.'), - 'RecordCount' => 0, - ]; - } - return ['total' => count($list), 'list' => $list]; - } - return false; - } - - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - $query = ['rr' => $KeyWord]; - if(!isNullOrEmpty($SubDomain)){ - $query['rr'] = $SubDomain; - } - $data = $this->send_reuqest('GET', '/v1/dns/zone/'.$this->domain.'/record', $query); - if($data){ - $list = []; - foreach($data['records'] as $row){ - $list[] = [ - 'RecordId' => $row['id'], - 'Domain' => $this->domain, - 'Name' => $row['rr'], - 'Type' => $row['type'], - 'Value' => $row['value'], - 'Line' => $row['line'], - 'TTL' => $row['ttl'], - 'MX' => $row['priority'], - 'Status' => $row['status'] == 'running' ? '1' : '0', - 'Weight' => null, - 'Remark' => $row['description'], - 'UpdateTime' => null, - ]; - } - return ['total' => count($list), 'list' => $list]; - } - return false; - } - - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - if($SubDomain == '')$SubDomain='@'; - return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); - } - - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - $query = ['id' => $RecordId]; - $data = $this->send_reuqest('GET', '/v1/dns/zone/'.$this->domain.'/record', $query); - if($data && !empty($data['records'])){ - $data = $data['records'][0]; - return [ - 'RecordId' => $data['id'], - 'Domain' => rtrim($data['zone_name'], '.'), - 'Name' => str_replace('.'.$data['zone_name'], '', $data['name']), - 'Type' => $data['type'], - 'Value' => $data['value'], - 'Line' => $data['line'], - 'TTL' => $data['ttl'], - 'MX' => $data['priority'], - 'Status' => $data['status'] == 'running' ? '1' : '0', - 'Weight' => null, - 'Remark' => $data['description'], - 'UpdateTime' => null, - ]; - } - return false; - } - - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $params = ['rr' => $Name, 'type' => $this->convertType($Type), 'value' => $Value, 'line'=>$Line, 'ttl' => intval($TTL), 'description' => $Remark]; - if($Type == 'MX')$params['priority'] = intval($MX); - $query = ['clientToken' => getSid()]; - return $this->send_reuqest('POST', '/v1/dns/zone/'.$this->domain.'/record', $query, $params); - } - - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $params = ['rr' => $Name, 'type' => $this->convertType($Type), 'value' => $Value, 'line'=>$Line, 'ttl' => intval($TTL), 'description' => $Remark]; - if($Type == 'MX')$params['priority'] = intval($MX); - $query = ['clientToken' => getSid()]; - return $this->send_reuqest('PUT', '/v1/dns/zone/'.$this->domain.'/record/'.$RecordId, $query, $params); - } - - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - return false; - } - - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $query = ['clientToken' => getSid()]; - return $this->send_reuqest('DELETE', '/v1/dns/zone/'.$this->domain.'/record/'.$RecordId, $query); - } - - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - $Status = $Status == '1' ? 'enable' : 'disable'; - $query = [$Status => '', 'clientToken' => getSid()]; - return $this->send_reuqest('PUT', '/v1/dns/zone/'.$this->domain.'/record/'.$RecordId, $query); - } - - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - return false; - } - - //获取解析线路列表 - public function getRecordLine(){ - return [ - 'default'=>['name'=>'默认', 'parent'=>null], - 'ct'=>['name'=>'电信', 'parent'=>null], - 'cnc'=>['name'=>'联通', 'parent'=>null], - 'cmnet'=>['name'=>'移动', 'parent'=>null], - 'edu'=>['name'=>'教育网', 'parent'=>null], - 'search'=>['name'=>'搜索引擎(百度)', 'parent'=>null], - ]; - } - - //获取域名概览信息 - public function getDomainInfo(){ - $res = $this->getDomainList($this->domain); - if($res && !empty($res['list'])){ - return $res['list'][0]; - } - return false; - } - - //获取域名最低TTL - public function getMinTTL(){ - return false; - } - - private function convertType($type){ - return $type; - } - - private function send_reuqest($method, $path, $query = null, $params = null){ - if(!empty($query)){ - $query = array_filter($query, function($a){ return $a!==null;}); - } - if(!empty($params)){ - $params = array_filter($params, function($a){ return $a!==null;}); - } - - $time = time(); - $date = gmdate("Y-m-d\TH:i:s\Z", $time); - $body = !empty($params) ? json_encode($params) : ''; - $headers = [ - 'Host' => $this->endpoint, - 'x-bce-date' => $date, - ]; - if($body){ - $headers['Content-Type'] = 'application/json'; - } - - $authorization = $this->generateSign($method, $path, $query, $headers, $time); - $headers['Authorization'] = $authorization; - - $url = 'https://'.$this->endpoint.$path; - if(!empty($query)){ - $url .= '?'.http_build_query($query); - } - $header = []; - foreach($headers as $key => $value){ - $header[] = $key.': '.$value; - } - return $this->curl($method, $url, $body, $header); - } - - private function generateSign($method, $path, $query, $headers, $time){ - $algorithm = "bce-auth-v1"; - - // step 1: build canonical request string - $httpRequestMethod = $method; - $canonicalUri = $this->getCanonicalUri($path); - $canonicalQueryString = $this->getCanonicalQueryString($query); - [$canonicalHeaders, $signedHeaders] = $this->getCanonicalHeaders($headers); - $canonicalRequest = $httpRequestMethod."\n" - .$canonicalUri."\n" - .$canonicalQueryString."\n" - .$canonicalHeaders; - - // step 2: calculate signing key - $date = gmdate("Y-m-d\TH:i:s\Z", $time); - $expirationInSeconds = 1800; - $authString = $algorithm . '/' . $this->AccessKeyId . '/' . $date . '/' . $expirationInSeconds; - $signingKey = hash_hmac('sha256', $authString, $this->SecretAccessKey); - - // step 3: sign string - $signature = hash_hmac("sha256", $canonicalRequest, $signingKey); - - // step 4: build authorization - $authorization = $authString . '/' . $signedHeaders . "/" . $signature; - - return $authorization; - } - - private function escape($str) + public function __construct($config) { - $search = ['+', '*', '%7E']; - $replace = ['%20', '%2A', '~']; - return str_replace($search, $replace, urlencode($str)); + $this->AccessKeyId = $config['ak']; + $this->SecretAccessKey = $config['sk']; + $this->domain = $config['domain']; + $this->domainid = $config['domainid']; } - private function getCanonicalUri($path) - { - if(empty($path)) return '/'; - $uri = str_replace('%2F', '/', $this->escape($path)); - if(substr($uri, 0, 1) !== '/') $uri = '/'.$uri; - return $uri; - } - - private function getCanonicalQueryString($parameters) + public function getError() { - if(empty($parameters)) return ''; + return $this->error; + } + + public function check() + { + if ($this->getDomainList() != false) { + return true; + } + return false; + } + + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $query = ['name' => $KeyWord]; + $data = $this->send_reuqest('GET', '/v1/dns/zone', $query); + if ($data) { + $list = []; + foreach ($data['zones'] as $row) { + $list[] = [ + 'DomainId' => $row['id'], + 'Domain' => rtrim($row['name'], '.'), + 'RecordCount' => 0, + ]; + } + return ['total' => count($list), 'list' => $list]; + } + return false; + } + + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + $query = ['rr' => $KeyWord]; + if (!isNullOrEmpty($SubDomain)) { + $query['rr'] = $SubDomain; + } + $data = $this->send_reuqest('GET', '/v1/dns/zone/'.$this->domain.'/record', $query); + if ($data) { + $list = []; + foreach ($data['records'] as $row) { + $list[] = [ + 'RecordId' => $row['id'], + 'Domain' => $this->domain, + 'Name' => $row['rr'], + 'Type' => $row['type'], + 'Value' => $row['value'], + 'Line' => $row['line'], + 'TTL' => $row['ttl'], + 'MX' => $row['priority'], + 'Status' => $row['status'] == 'running' ? '1' : '0', + 'Weight' => null, + 'Remark' => $row['description'], + 'UpdateTime' => null, + ]; + } + return ['total' => count($list), 'list' => $list]; + } + return false; + } + + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + if ($SubDomain == '') $SubDomain = '@'; + return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); + } + + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + $query = ['id' => $RecordId]; + $data = $this->send_reuqest('GET', '/v1/dns/zone/'.$this->domain.'/record', $query); + if ($data && !empty($data['records'])) { + $data = $data['records'][0]; + return [ + 'RecordId' => $data['id'], + 'Domain' => rtrim($data['zone_name'], '.'), + 'Name' => str_replace('.'.$data['zone_name'], '', $data['name']), + 'Type' => $data['type'], + 'Value' => $data['value'], + 'Line' => $data['line'], + 'TTL' => $data['ttl'], + 'MX' => $data['priority'], + 'Status' => $data['status'] == 'running' ? '1' : '0', + 'Weight' => null, + 'Remark' => $data['description'], + 'UpdateTime' => null, + ]; + } + return false; + } + + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $params = ['rr' => $Name, 'type' => $this->convertType($Type), 'value' => $Value, 'line' => $Line, 'ttl' => intval($TTL), 'description' => $Remark]; + if ($Type == 'MX') $params['priority'] = intval($MX); + $query = ['clientToken' => getSid()]; + return $this->send_reuqest('POST', '/v1/dns/zone/'.$this->domain.'/record', $query, $params); + } + + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $params = ['rr' => $Name, 'type' => $this->convertType($Type), 'value' => $Value, 'line' => $Line, 'ttl' => intval($TTL), 'description' => $Remark]; + if ($Type == 'MX') $params['priority'] = intval($MX); + $query = ['clientToken' => getSid()]; + return $this->send_reuqest('PUT', '/v1/dns/zone/'.$this->domain.'/record/'.$RecordId, $query, $params); + } + + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + return false; + } + + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $query = ['clientToken' => getSid()]; + return $this->send_reuqest('DELETE', '/v1/dns/zone/'.$this->domain.'/record/'.$RecordId, $query); + } + + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + $Status = $Status == '1' ? 'enable' : 'disable'; + $query = [$Status => '', 'clientToken' => getSid()]; + return $this->send_reuqest('PUT', '/v1/dns/zone/'.$this->domain.'/record/'.$RecordId, $query); + } + + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + return false; + } + + //获取解析线路列表 + public function getRecordLine() + { + return [ + 'default' => ['name' => '默认', 'parent' => null], + 'ct' => ['name' => '电信', 'parent' => null], + 'cnc' => ['name' => '联通', 'parent' => null], + 'cmnet' => ['name' => '移动', 'parent' => null], + 'edu' => ['name' => '教育网', 'parent' => null], + 'search' => ['name' => '搜索引擎(百度)', 'parent' => null], + ]; + } + + //获取域名概览信息 + public function getDomainInfo() + { + $res = $this->getDomainList($this->domain); + if ($res && !empty($res['list'])) { + return $res['list'][0]; + } + return false; + } + + //获取域名最低TTL + public function getMinTTL() + { + return false; + } + + private function convertType($type) + { + return $type; + } + + private function send_reuqest($method, $path, $query = null, $params = null) + { + if (!empty($query)) { + $query = array_filter($query, function ($a) { return $a !== null;}); + } + if (!empty($params)) { + $params = array_filter($params, function ($a) { return $a !== null;}); + } + + $time = time(); + $date = gmdate("Y-m-d\TH:i:s\Z", $time); + $body = !empty($params) ? json_encode($params) : ''; + $headers = [ + 'Host' => $this->endpoint, + 'x-bce-date' => $date, + ]; + if ($body) { + $headers['Content-Type'] = 'application/json'; + } + + $authorization = $this->generateSign($method, $path, $query, $headers, $time); + $headers['Authorization'] = $authorization; + + $url = 'https://'.$this->endpoint.$path; + if (!empty($query)) { + $url .= '?'.http_build_query($query); + } + $header = []; + foreach ($headers as $key => $value) { + $header[] = $key.': '.$value; + } + return $this->curl($method, $url, $body, $header); + } + + private function generateSign($method, $path, $query, $headers, $time) + { + $algorithm = "bce-auth-v1"; + + // step 1: build canonical request string + $httpRequestMethod = $method; + $canonicalUri = $this->getCanonicalUri($path); + $canonicalQueryString = $this->getCanonicalQueryString($query); + [$canonicalHeaders, $signedHeaders] = $this->getCanonicalHeaders($headers); + $canonicalRequest = $httpRequestMethod."\n" + .$canonicalUri."\n" + .$canonicalQueryString."\n" + .$canonicalHeaders; + + // step 2: calculate signing key + $date = gmdate("Y-m-d\TH:i:s\Z", $time); + $expirationInSeconds = 1800; + $authString = $algorithm . '/' . $this->AccessKeyId . '/' . $date . '/' . $expirationInSeconds; + $signingKey = hash_hmac('sha256', $authString, $this->SecretAccessKey); + + // step 3: sign string + $signature = hash_hmac("sha256", $canonicalRequest, $signingKey); + + // step 4: build authorization + $authorization = $authString . '/' . $signedHeaders . "/" . $signature; + + return $authorization; + } + + private function escape($str) + { + $search = ['+', '*', '%7E']; + $replace = ['%20', '%2A', '~']; + return str_replace($search, $replace, urlencode($str)); + } + + private function getCanonicalUri($path) + { + if (empty($path)) return '/'; + $uri = str_replace('%2F', '/', $this->escape($path)); + if (substr($uri, 0, 1) !== '/') $uri = '/' . $uri; + return $uri; + } + + private function getCanonicalQueryString($parameters) + { + if (empty($parameters)) return ''; ksort($parameters); - $canonicalQueryString = ''; - foreach ($parameters as $key => $value) { - if($key == 'authorization') continue; - $canonicalQueryString .= '&' . $this->escape($key). '=' . $this->escape($value); - } + $canonicalQueryString = ''; + foreach ($parameters as $key => $value) { + if ($key == 'authorization') continue; + $canonicalQueryString .= '&' . $this->escape($key) . '=' . $this->escape($value); + } return substr($canonicalQueryString, 1); } - private function getCanonicalHeaders($oldheaders){ - $headers = array(); + private function getCanonicalHeaders($oldheaders) + { + $headers = array(); foreach ($oldheaders as $key => $value) { $headers[strtolower($key)] = trim($value); } - ksort($headers); + ksort($headers); - $canonicalHeaders = ''; - $signedHeaders = ''; - foreach ($headers as $key => $value) { - $canonicalHeaders .= $this->escape($key) . ':' . $this->escape($value) . "\n"; - $signedHeaders .= $key . ';'; - } - $canonicalHeaders = substr($canonicalHeaders, 0, -1); - $signedHeaders = substr($signedHeaders, 0, -1); - return [$canonicalHeaders, $signedHeaders]; - } + $canonicalHeaders = ''; + $signedHeaders = ''; + foreach ($headers as $key => $value) { + $canonicalHeaders .= $this->escape($key) . ':' . $this->escape($value) . "\n"; + $signedHeaders .= $key . ';'; + } + $canonicalHeaders = substr($canonicalHeaders, 0, -1); + $signedHeaders = substr($signedHeaders, 0, -1); + return [$canonicalHeaders, $signedHeaders]; + } - private function curl($method, $url, $body, $header){ - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_HTTPHEADER, $header); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); - if(!empty($body)){ - curl_setopt($ch, CURLOPT_POSTFIELDS, $body); - } - $response = curl_exec($ch); - $errno = curl_errno($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - curl_close($ch); - if ($errno) return false; + private function curl($method, $url, $body, $header) + { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); + if (!empty($body)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + } + $response = curl_exec($ch); + $errno = curl_errno($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + curl_close($ch); + if ($errno) return false; - if(empty($response) && $httpCode == 200){ - return true; - } - $arr=json_decode($response,true); - if($arr){ - if(isset($arr['code']) && isset($arr['message'])){ - $this->setError($arr['message']); - return false; - }else{ - return $arr; - } - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + if (empty($response) && $httpCode == 200) { + return true; + } + $arr = json_decode($response, true); + if ($arr) { + if (isset($arr['code']) && isset($arr['message'])) { + $this->setError($arr['message']); + return false; + } else { + return $arr; + } + } else { + $this->setError('返回数据解析失败'); + return false; + } + } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } -} \ No newline at end of file + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } +} diff --git a/app/lib/dns/cloudflare.php b/app/lib/dns/cloudflare.php index 002b201..92690bf 100644 --- a/app/lib/dns/cloudflare.php +++ b/app/lib/dns/cloudflare.php @@ -1,247 +1,271 @@ Email = $config['ak']; - $this->ApiKey = $config['sk']; - $this->domain = $config['domain']; - $this->domainid = $config['domainid']; - } + function __construct($config) + { + $this->Email = $config['ak']; + $this->ApiKey = $config['sk']; + $this->domain = $config['domain']; + $this->domainid = $config['domainid']; + } - public function getError(){ - return $this->error; - } + public function getError() + { + return $this->error; + } - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } + public function check() + { + if ($this->getDomainList() !== false) { + return true; + } + return false; + } - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $param = ['page' => $PageNumber, 'per_page' => $PageSize, 'name' => $KeyWord]; - $data = $this->send_reuqest('GET', '/zones', $param); - if($data){ - $list = []; - foreach($data['result'] as $row){ - $list[] = [ - 'DomainId' => $row['id'], - 'Domain' => $row['name'], - 'RecordCount' => 0, - ]; - } - return ['total' => $data['result_info']['total_count'], 'list' => $list]; - } - return false; - } + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $param = ['page' => $PageNumber, 'per_page' => $PageSize]; + if (!empty($KeyWord)) { + $param['name'] = $KeyWord; + } + $data = $this->send_reuqest('GET', '/zones', $param); + if ($data) { + $list = []; + foreach ($data['result'] as $row) { + $list[] = [ + 'DomainId' => $row['id'], + 'Domain' => $row['name'], + 'RecordCount' => 0, + ]; + } + return ['total' => $data['result_info']['total_count'], 'list' => $list]; + } + return false; + } - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - if(!isNullOrEmpty($SubDomain)){ - if($SubDomain == '@')$SubDomain=$this->domain; - else $SubDomain .= '.'.$this->domain; - } - if(!isNullOrEmpty($Value)) $KeyWord = $Value; - $param = ['name' => $SubDomain, 'type' => $Type, 'search' => $KeyWord, 'page' => $PageNumber, 'per_page' => $PageSize]; - if(!isNullOrEmpty($Line)){ - $param['proxied'] = $Line == '1' ? 'true' : 'false'; - } - $data = $this->send_reuqest('GET', '/zones/'.$this->domainid.'/dns_records', $param); - if($data){ - $list = []; - foreach($data['result'] as $row){ - $name = $row['zone_name'] == $row['name'] ? '@' : str_replace('.'.$row['zone_name'], '', $row['name']); - $list[] = [ - 'RecordId' => $row['id'], - 'Domain' => $row['zone_name'], - 'Name' => $name, - 'Type' => $row['type'], - 'Value' => $row['content'], - 'Line' => $row['proxied'] ? '1' : '0', - 'TTL' => $row['ttl'], - 'MX' => isset($row['priority']) ? $row['priority'] : null, - 'Status' => '1', - 'Weight' => null, - 'Remark' => $row['comment'], - 'UpdateTime' => $row['modified_on'], - ]; - } - return ['total' => $data['result_info']['total_count'], 'list' => $list]; - } - return false; - } + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + if (!isNullOrEmpty($SubDomain)) { + if ($SubDomain == '@') $SubDomain = $this->domain; + else $SubDomain .= '.' . $this->domain; + } + if (!isNullOrEmpty($Value)) $KeyWord = $Value; + $param = ['name' => $SubDomain, 'type' => $Type, 'search' => $KeyWord, 'page' => $PageNumber, 'per_page' => $PageSize]; + if (!isNullOrEmpty($Line)) { + $param['proxied'] = $Line == '1' ? 'true' : 'false'; + } + $data = $this->send_reuqest('GET', '/zones/'.$this->domainid.'/dns_records', $param); + if ($data) { + $list = []; + foreach ($data['result'] as $row) { + $name = $row['zone_name'] == $row['name'] ? '@' : str_replace('.'.$row['zone_name'], '', $row['name']); + $list[] = [ + 'RecordId' => $row['id'], + 'Domain' => $row['zone_name'], + 'Name' => $name, + 'Type' => $row['type'], + 'Value' => $row['content'], + 'Line' => $row['proxied'] ? '1' : '0', + 'TTL' => $row['ttl'], + 'MX' => isset($row['priority']) ? $row['priority'] : null, + 'Status' => '1', + 'Weight' => null, + 'Remark' => $row['comment'], + 'UpdateTime' => $row['modified_on'], + ]; + } + return ['total' => $data['result_info']['total_count'], 'list' => $list]; + } + return false; + } - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); - } + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); + } - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - $data = $this->send_reuqest('GET', '/zones/'.$this->domainid.'/dns_records/'.$RecordId); - if($data){ - $name = $data['result']['zone_name'] == $data['result']['name'] ? '@' : str_replace('.'.$data['result']['zone_name'], '', $data['result']['name']); - return [ - 'RecordId' => $data['result']['id'], - 'Domain' => $data['result']['zone_name'], - 'Name' => str_replace('.'.$data['result']['zone_name'], '', $data['result']['name']), - 'Type' => $data['result']['type'], - 'Value' => $data['result']['content'], - 'Line' => $data['result']['proxied'] ? '1' : '0', - 'TTL' => $data['result']['ttl'], - 'MX' => isset($data['result']['priority']) ? $data['result']['priority'] : null, - 'Status' => '1', - 'Weight' => null, - 'Remark' => $data['result']['comment'], - 'UpdateTime' => $data['result']['modified_on'], - ]; - } - return false; - } + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + $data = $this->send_reuqest('GET', '/zones/'.$this->domainid.'/dns_records/'.$RecordId); + if ($data) { + $name = $data['result']['zone_name'] == $data['result']['name'] ? '@' : str_replace('.' . $data['result']['zone_name'], '', $data['result']['name']); + return [ + 'RecordId' => $data['result']['id'], + 'Domain' => $data['result']['zone_name'], + 'Name' => str_replace('.'.$data['result']['zone_name'], '', $data['result']['name']), + 'Type' => $data['result']['type'], + 'Value' => $data['result']['content'], + 'Line' => $data['result']['proxied'] ? '1' : '0', + 'TTL' => $data['result']['ttl'], + 'MX' => isset($data['result']['priority']) ? $data['result']['priority'] : null, + 'Status' => '1', + 'Weight' => null, + 'Remark' => $data['result']['comment'], + 'UpdateTime' => $data['result']['modified_on'], + ]; + } + return false; + } - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $Weight = null, $MX = 1, $Remark = null){ - $param = ['name' => $Name, 'type' => $this->convertType($Type), 'content' => $Value, 'proxied' => $Line=='1', 'ttl' => intval($TTL), 'comment' => $Remark]; - if($Type == 'MX')$param['priority'] = intval($MX); - if($Type == 'CAA' || $Type == 'SRV'){ - unset($param['content']); - $param['data'] = $this->convertValue($Value, $Type); - } - $data = $this->send_reuqest('POST', '/zones/'.$this->domainid.'/dns_records', $param); - return is_array($data) ? $data['result']['id'] : false; - } + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $param = ['name' => $Name, 'type' => $this->convertType($Type), 'content' => $Value, 'proxied' => $Line == '1', 'ttl' => intval($TTL), 'comment' => $Remark]; + if ($Type == 'MX') $param['priority'] = intval($MX); + if ($Type == 'CAA' || $Type == 'SRV') { + unset($param['content']); + $param['data'] = $this->convertValue($Value, $Type); + } + $data = $this->send_reuqest('POST', '/zones/'.$this->domainid.'/dns_records', $param); + return is_array($data) ? $data['result']['id'] : false; + } - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $Weight = null, $MX = 1, $Remark = null){ - $param = ['name' => $Name, 'type' => $this->convertType($Type), 'content' => $Value, 'proxied' => $Line=='1', 'ttl' => intval($TTL), 'comment' => $Remark]; - if($Type == 'MX')$param['priority'] = intval($MX); - if($Type == 'CAA' || $Type == 'SRV'){ - unset($param['content']); - $param['data'] = $this->convertValue($Value, $Type); - } - $data = $this->send_reuqest('PATCH', '/zones/'.$this->domainid.'/dns_records/'.$RecordId, $param); - return is_array($data); - } + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $param = ['name' => $Name, 'type' => $this->convertType($Type), 'content' => $Value, 'proxied' => $Line == '1', 'ttl' => intval($TTL), 'comment' => $Remark]; + if ($Type == 'MX') $param['priority'] = intval($MX); + if ($Type == 'CAA' || $Type == 'SRV') { + unset($param['content']); + $param['data'] = $this->convertValue($Value, $Type); + } + $data = $this->send_reuqest('PATCH', '/zones/'.$this->domainid.'/dns_records/'.$RecordId, $param); + return is_array($data); + } - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - return false; - } + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + return false; + } - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $data = $this->send_reuqest('DELETE', '/zones/'.$this->domainid.'/dns_records/'.$RecordId); - return is_array($data); - } + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $data = $this->send_reuqest('DELETE', '/zones/'.$this->domainid.'/dns_records/'.$RecordId); + return is_array($data); + } - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - return false; - } + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + return false; + } - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - return false; - } + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + return false; + } - //获取解析线路列表 - public function getRecordLine(){ - return ['0'=>['name'=>'仅DNS', 'parent'=>null], '1'=>['name'=>'已代理', 'parent'=>null]]; - } + //获取解析线路列表 + public function getRecordLine() + { + return ['0' => ['name' => '仅DNS', 'parent' => null], '1' => ['name' => '已代理', 'parent' => null]]; + } - //获取域名信息 - public function getDomainInfo(){ - $data = $this->send_reuqest('GET', '/zones/'.$this->domainid); - if($data){ - return $data['result']; - } - return false; - } + //获取域名信息 + public function getDomainInfo() + { + $data = $this->send_reuqest('GET', '/zones/'.$this->domainid); + if ($data) { + return $data['result']; + } + return false; + } - //获取域名最低TTL - public function getMinTTL(){ - return false; - } + //获取域名最低TTL + public function getMinTTL() + { + return false; + } - private function convertType($type){ - $convert_dict = ['REDIRECT_URL'=>'URI', 'FORWARD_URL'=>'URI']; - if(array_key_exists($type, $convert_dict)){ - return $convert_dict[$type]; - } - return $type; - } + private function convertType($type) + { + $convert_dict = ['REDIRECT_URL' => 'URI', 'FORWARD_URL' => 'URI']; + if (array_key_exists($type, $convert_dict)) { + return $convert_dict[$type]; + } + return $type; + } - private function convertValue($value, $type){ - if($type == 'SRV'){ - $arr = explode(' ', $value); - if(count($arr) > 3){ - $data = [ - 'priority' => intval($arr[0]), - 'weight' => intval($arr[1]), - 'port' => intval($arr[2]), - 'target' => $arr[3], - ]; - }else{ - $data = [ - 'weight' => intval($arr[0]), - 'port' => intval($arr[1]), - 'target' => $arr[2], - ]; - } - }elseif($type == 'CAA'){ - $arr = explode(' ', $value); - $data = [ - 'flags' => intval($arr[0]), - 'tag' => $arr[1], - 'value' => trim($arr[2], '"'), - ]; - } - return $data; - } + private function convertValue($value, $type) + { + if ($type == 'SRV') { + $arr = explode(' ', $value); + if (count($arr) > 3) { + $data = [ + 'priority' => intval($arr[0]), + 'weight' => intval($arr[1]), + 'port' => intval($arr[2]), + 'target' => $arr[3], + ]; + } else { + $data = [ + 'weight' => intval($arr[0]), + 'port' => intval($arr[1]), + 'target' => $arr[2], + ]; + } + } elseif ($type == 'CAA') { + $arr = explode(' ', $value); + $data = [ + 'flags' => intval($arr[0]), + 'tag' => $arr[1], + 'value' => trim($arr[2], '"'), + ]; + } + return $data; + } - private function send_reuqest($method, $path, $params = null){ - $url = $this->baseUrl . $path; - - if(preg_match('/^[0-9a-z]+$/i',$this->ApiKey)){ - $headers = [ - 'X-Auth-Email: '.$this->Email, - 'X-Auth-Key: '.$this->ApiKey, - ]; - }else{ - $headers = [ - 'Authorization: Bearer '.$this->ApiKey, - ]; - } + private function send_reuqest($method, $path, $params = null) + { + $url = $this->baseUrl . $path; - $body = ''; + if (preg_match('/^[0-9a-z]+$/i', $this->ApiKey)) { + $headers = [ + 'X-Auth-Email: ' . $this->Email, + 'X-Auth-Key: ' . $this->ApiKey, + ]; + } else { + $headers = [ + 'Authorization: Bearer ' . $this->ApiKey, + ]; + } + + $body = ''; if ($method == 'GET' || $method == 'DELETE') { if ($params) { $url .= '?' . http_build_query($params); } } else { $body = json_encode($params); - $headers[] = 'Content-Type: application/json'; + $headers[] = 'Content-Type: application/json'; } - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - if ($method == 'POST') { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + if ($method == 'POST') { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } elseif ($method == 'PUT') { @@ -253,30 +277,31 @@ class cloudflare implements DnsInterface { } elseif ($method == 'DELETE') { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); } - $response = curl_exec($ch); - $errno = curl_errno($ch); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - curl_close($ch); - if ($errno) return false; + $response = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + curl_close($ch); + if ($errno) return false; - $arr=json_decode($response,true); - if($arr){ - if($arr['success']){ - return $arr; - }else{ - $this->setError(isset($arr['errors'][0])?$arr['errors'][0]['message']:'未知错误'); - return false; - } - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + $arr = json_decode($response, true); + if ($arr) { + if ($arr['success']) { + return $arr; + } else { + $this->setError(isset($arr['errors'][0]) ? $arr['errors'][0]['message'] : '未知错误'); + return false; + } + } else { + $this->setError('返回数据解析失败'); + return false; + } + } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } -} \ No newline at end of file + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } +} diff --git a/app/lib/dns/dnsla.php b/app/lib/dns/dnsla.php index 9652b8c..9ac6fef 100644 --- a/app/lib/dns/dnsla.php +++ b/app/lib/dns/dnsla.php @@ -1,256 +1,289 @@ 'A', 2 => 'NS', 5 => 'CNAME', 15 => 'MX', 16 => 'TXT', 28 => 'AAAA', 33 => 'SRV', 257 => 'CAA', 256 => 'URL转发']; - private $error; - private $domain; - private $domainid; +class dnsla implements DnsInterface +{ + private $apiid; + private $apisecret; + private $baseUrl = 'https://api.dns.la'; + private $typeList = [1 => 'A', 2 => 'NS', 5 => 'CNAME', 15 => 'MX', 16 => 'TXT', 28 => 'AAAA', 33 => 'SRV', 257 => 'CAA', 256 => 'URL转发']; + private $error; + private $domain; + private $domainid; - function __construct($config){ - $this->apiid = $config['ak']; - $this->apisecret = $config['sk']; - $this->domain = $config['domain']; - $this->domainid = $config['domainid']; - } + public function __construct($config) + { + $this->apiid = $config['ak']; + $this->apisecret = $config['sk']; + $this->domain = $config['domain']; + $this->domainid = $config['domainid']; + } - public function getError(){ - return $this->error; - } + public function getError() + { + return $this->error; + } - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } + public function check() + { + if ($this->getDomainList() != false) { + return true; + } + return false; + } - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $param = ['pageIndex' => $PageNumber, 'pageSize' => $PageSize]; - $data = $this->execute('GET', '/api/domainList', $param); - if($data){ - $list = []; - foreach($data['results'] as $row){ - $list[] = [ - 'DomainId' => $row['id'], - 'Domain' => rtrim($row['displayDomain'], '.'), - 'RecordCount' => 0, - ]; - } - return ['total' => $data['total'], 'list' => $list]; - } - return false; - } + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $param = ['pageIndex' => $PageNumber, 'pageSize' => $PageSize]; + $data = $this->execute('GET', '/api/domainList', $param); + if ($data) { + $list = []; + foreach ($data['results'] as $row) { + $list[] = [ + 'DomainId' => $row['id'], + 'Domain' => rtrim($row['displayDomain'], '.'), + 'RecordCount' => 0, + ]; + } + return ['total' => $data['total'], 'list' => $list]; + } + return false; + } - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - $param = ['domainId' => $this->domainid, 'pageIndex' => $PageNumber, 'pageSize' => $PageSize]; - if(!isNullOrEmpty(($KeyWord))){ - $param['host'] = $KeyWord; - } - if(!isNullOrEmpty(($Type))){ - $param['type'] = $this->convertType($Type); - } - if(!isNullOrEmpty(($Line))){ - $param['lineId'] = $Line; - } - if(!isNullOrEmpty(($SubDomain))){ - $param['host'] = $SubDomain; - } - if(!isNullOrEmpty(($Value))){ - $param['data'] = $Value; - } - $data = $this->execute('GET', '/api/recordList', $param); - if($data){ - $list = []; - foreach($data['results'] as $row){ - $list[] = [ - 'RecordId' => $row['id'], - 'Domain' => $this->domain, - 'Name' => $row['host'], - 'Type' => $this->convertTypeId($row['type'], isset($row['domaint']) ? $row['domaint'] : false), - 'Value' => $row['data'], - 'Line' => $row['lineId'], - 'TTL' => $row['ttl'], - 'MX' => isset($row['preference']) ? $row['preference'] : null, - 'Status' => $row['disable'] ? '0' : '1', - 'Weight' => isset($row['weight']) ? $row['weight'] : null, - 'Remark' => null, - 'UpdateTime' => date('Y-m-d H:i:s', $row['updatedAt']), - ]; - } - return ['total' => $data['total'], 'list' => $list]; - } - return false; - } + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + $param = ['domainId' => $this->domainid, 'pageIndex' => $PageNumber, 'pageSize' => $PageSize]; + if (!isNullOrEmpty(($KeyWord))) { + $param['host'] = $KeyWord; + } + if (!isNullOrEmpty(($Type))) { + $param['type'] = $this->convertType($Type); + } + if (!isNullOrEmpty(($Line))) { + $param['lineId'] = $Line; + } + if (!isNullOrEmpty(($SubDomain))) { + $param['host'] = $SubDomain; + } + if (!isNullOrEmpty(($Value))) { + $param['data'] = $Value; + } + $data = $this->execute('GET', '/api/recordList', $param); + if ($data) { + $list = []; + foreach ($data['results'] as $row) { + $list[] = [ + 'RecordId' => $row['id'], + 'Domain' => $this->domain, + 'Name' => $row['host'], + 'Type' => $this->convertTypeId($row['type'], isset($row['domaint']) ? $row['domaint'] : false), + 'Value' => $row['data'], + 'Line' => $row['lineId'], + 'TTL' => $row['ttl'], + 'MX' => isset($row['preference']) ? $row['preference'] : null, + 'Status' => $row['disable'] ? '0' : '1', + 'Weight' => isset($row['weight']) ? $row['weight'] : null, + 'Remark' => null, + 'UpdateTime' => date('Y-m-d H:i:s', $row['updatedAt']), + ]; + } + return ['total' => $data['total'], 'list' => $list]; + } + return false; + } - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - if($SubDomain == '')$SubDomain='@'; - return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); - } + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + if ($SubDomain == '') $SubDomain = '@'; + return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); + } - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - return false; - } + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + return false; + } - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $param = ['domainId' => $this->domainid, 'type' => $this->convertType($Type), 'host' => $Name, 'data' => $Value, 'ttl' => intval($TTL), 'lineId' => $Line]; - if($Type == 'MX')$param['preference'] = intval($MX); - if($Type == 'REDIRECT_URL'){$param['type'] = 256;$param['dominant'] = true;} - elseif($Type == 'FORWARD_URL'){$param['type'] = 256;$param['dominant'] = false;} - if($Weight > 0) $param['weight'] = $Weight; - $data = $this->execute('POST', '/api/record', $param); - return is_array($data) ? $data['id'] : false; - } + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $param = ['domainId' => $this->domainid, 'type' => $this->convertType($Type), 'host' => $Name, 'data' => $Value, 'ttl' => intval($TTL), 'lineId' => $Line]; + if ($Type == 'MX') $param['preference'] = intval($MX); + if ($Type == 'REDIRECT_URL') { + $param['type'] = 256; + $param['dominant'] = true; + } elseif ($Type == 'FORWARD_URL') { + $param['type'] = 256; + $param['dominant'] = false; + } + if ($Weight > 0) $param['weight'] = $Weight; + $data = $this->execute('POST', '/api/record', $param); + return is_array($data) ? $data['id'] : false; + } - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $param = ['id' => $RecordId, 'type' => $this->convertType($Type), 'host' => $Name, 'data' => $Value, 'ttl' => intval($TTL), 'lineId' => $Line]; - if($Type == 'MX')$param['preference'] = intval($MX); - if($Type == 'REDIRECT_URL'){$param['type'] = 256;$param['dominant'] = true;} - elseif($Type == 'FORWARD_URL'){$param['type'] = 256;$param['dominant'] = false;} - if($Weight > 0) $param['weight'] = $Weight; - $data = $this->execute('PUT', '/api/record', $param); - return $data!==false; - } + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $param = ['id' => $RecordId, 'type' => $this->convertType($Type), 'host' => $Name, 'data' => $Value, 'ttl' => intval($TTL), 'lineId' => $Line]; + if ($Type == 'MX') $param['preference'] = intval($MX); + if ($Type == 'REDIRECT_URL') { + $param['type'] = 256; + $param['dominant'] = true; + } elseif ($Type == 'FORWARD_URL') { + $param['type'] = 256; + $param['dominant'] = false; + } + if ($Weight > 0) $param['weight'] = $Weight; + $data = $this->execute('PUT', '/api/record', $param); + return $data !== false; + } - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - return false; - } + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + return false; + } - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $param = ['id' => $RecordId]; - $data = $this->execute('DELETE', '/api/record', $param); - return $data!==false; - } + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $param = ['id' => $RecordId]; + $data = $this->execute('DELETE', '/api/record', $param); + return $data !== false; + } - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - $param = ['id' => $RecordId, 'disable' => $Status == '0' ? true : false]; - $data = $this->execute('PUT', '/api/recordDisable', $param); - return $data!==false; - } + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + $param = ['id' => $RecordId, 'disable' => $Status == '0' ? true : false]; + $data = $this->execute('PUT', '/api/recordDisable', $param); + return $data !== false; + } - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - return false; - } + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + return false; + } - //获取解析线路列表 - public function getRecordLine(){ - $param = ['domain' => $this->domain]; - $data = $this->execute('GET', '/api/availableLine', $param); - if($data){ - array_multisort(array_column($data, 'order'), SORT_ASC, $data); - $list = []; - foreach($data as $row){ - if($row['id'] == '0') $row['id'] = ''; - $list[$row['id']] = ['name'=>$row['value'], 'parent'=>!empty($row['pid']) ? $row['pid'] : null]; - } - return $list; - } - return false; - } - - //获取域名信息 - public function getDomainInfo(){ - $param = ['id' => $this->domainid]; - $data = $this->execute('GET', '/api/domain', $param); - return $data; - } + //获取解析线路列表 + public function getRecordLine() + { + $param = ['domain' => $this->domain]; + $data = $this->execute('GET', '/api/availableLine', $param); + if ($data) { + array_multisort(array_column($data, 'order'), SORT_ASC, $data); + $list = []; + foreach ($data as $row) { + if ($row['id'] == '0') $row['id'] = ''; + $list[$row['id']] = ['name' => $row['value'], 'parent' => !empty($row['pid']) ? $row['pid'] : null]; + } + return $list; + } + return false; + } - //获取域名最低TTL - public function getMinTTL(){ - $param = ['id' => $this->domainid]; - $data = $this->execute('GET', '/api/dnsMeasures', $param); - if($data && isset($data['minTTL'])){ - return $data['minTTL']; - } - return false; - } + //获取域名信息 + public function getDomainInfo() + { + $param = ['id' => $this->domainid]; + $data = $this->execute('GET', '/api/domain', $param); + return $data; + } - private function convertType($type){ - $typeList = array_flip($this->typeList); - return $typeList[$type]; - } + //获取域名最低TTL + public function getMinTTL() + { + $param = ['id' => $this->domainid]; + $data = $this->execute('GET', '/api/dnsMeasures', $param); + if ($data && isset($data['minTTL'])) { + return $data['minTTL']; + } + return false; + } - private function convertTypeId($typeId, $domaint){ - if($typeId == 256) return $domaint ? 'REDIRECT_URL' : 'FORWARD_URL'; - return $this->typeList[$typeId]; - } + private function convertType($type) + { + $typeList = array_flip($this->typeList); + return $typeList[$type]; + } - private function execute($method, $path, $params = null){ - $token = base64_encode($this->apiid.':'.$this->apisecret); - $header = ['Authorization: Basic '.$token, 'Content-Type: application/json; charset=utf-8']; - if($method == 'POST' || $method == 'PUT'){ - $response = $this->curl($method, $path, $header, json_encode($params)); - }else{ - if($params){ - $path .= '?'.http_build_query($params); - } - $response = $this->curl($method, $path, $header); - } - if(!$response){ - return false; - } - $arr=json_decode($response,true); - if($arr){ - if($arr['code'] == 200){ - return $arr['data']; - }else{ - $this->setError($arr['msg']); - return false; - } - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + private function convertTypeId($typeId, $domaint) + { + if ($typeId == 256) return $domaint ? 'REDIRECT_URL' : 'FORWARD_URL'; + return $this->typeList[$typeId]; + } - private function curl($method, $path, $header, $body = null, $isPut = false){ - $url = $this->baseUrl . $path; - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_HTTPHEADER, $header); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); - if ($body) { + private function execute($method, $path, $params = null) + { + $token = base64_encode($this->apiid.':'.$this->apisecret); + $header = ['Authorization: Basic '.$token, 'Content-Type: application/json; charset=utf-8']; + if ($method == 'POST' || $method == 'PUT') { + $response = $this->curl($method, $path, $header, json_encode($params)); + } else { + if ($params) { + $path .= '?'.http_build_query($params); + } + $response = $this->curl($method, $path, $header); + } + if (!$response) { + return false; + } + $arr = json_decode($response, true); + if ($arr) { + if ($arr['code'] == 200) { + return $arr['data']; + } else { + $this->setError($arr['msg']); + return false; + } + } else { + $this->setError('返回数据解析失败'); + return false; + } + } + + private function curl($method, $path, $header, $body = null, $isPut = false) + { + $url = $this->baseUrl . $path; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); + if ($body) { curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } - $response = curl_exec($ch); - $errno = curl_errno($ch); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - if ($errno) return false; - if($httpCode==200){ - return $response; - }elseif($httpCode==401){ - $this->setError('认证失败'); - return false; - }else{ - $this->setError('http code: '.$httpCode); - return false; - } - } + $response = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + if ($errno) return false; + if ($httpCode == 200) { + return $response; + } elseif ($httpCode == 401) { + $this->setError('认证失败'); + return false; + } else { + $this->setError('http code: '.$httpCode); + return false; + } + } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } -} \ No newline at end of file + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } +} diff --git a/app/lib/dns/dnspod.php b/app/lib/dns/dnspod.php index f3b1fe1..9a079b3 100644 --- a/app/lib/dns/dnspod.php +++ b/app/lib/dns/dnspod.php @@ -1,407 +1,436 @@ SecretId = $config['ak']; - $this->SecretKey = $config['sk']; - $this->domain = $config['domain']; - } + public function __construct($config) + { + $this->SecretId = $config['ak']; + $this->SecretKey = $config['sk']; + $this->domain = $config['domain']; + } - public function getError(){ - return $this->error; - } + public function getError() + { + return $this->error; + } - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } + public function check() + { + if ($this->getDomainList() != false) { + return true; + } + return false; + } - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $action = 'DescribeDomainList'; - $offset = ($PageNumber-1)*$PageSize; - $param = ['Offset' => $offset, 'Limit' => $PageSize, 'Keyword' => $KeyWord]; - $data = $this->send_reuqest($action, $param); - if($data){ - $list = []; - foreach($data['DomainList'] as $row){ - $list[] = [ - 'DomainId' => $row['DomainId'], - 'Domain' => $row['Name'], - 'RecordCount' => $row['RecordCount'], - ]; - } - return ['total' => $data['DomainCountInfo']['DomainTotal'], 'list' => $list]; - } - return false; - } + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $action = 'DescribeDomainList'; + $offset = ($PageNumber - 1) * $PageSize; + $param = ['Offset' => $offset, 'Limit' => $PageSize, 'Keyword' => $KeyWord]; + $data = $this->send_reuqest($action, $param); + if ($data) { + $list = []; + foreach ($data['DomainList'] as $row) { + $list[] = [ + 'DomainId' => $row['DomainId'], + 'Domain' => $row['Name'], + 'RecordCount' => $row['RecordCount'], + ]; + } + return ['total' => $data['DomainCountInfo']['DomainTotal'], 'list' => $list]; + } + return false; + } - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - $offset = ($PageNumber-1)*$PageSize; - if(!isNullOrEmpty($Status) || !isNullOrEmpty($Value)){ - $action = 'DescribeRecordFilterList'; - $param = ['Domain' => $this->domain, 'Offset' => $offset, 'Limit' => $PageSize, 'RecordValue' => $Value]; - if(!isNullOrEmpty($SubDomain)) $param['SubDomain'] = $SubDomain; - if(!isNullOrEmpty($KeyWord)) $param['Keyword'] = $KeyWord; - if(!isNullOrEmpty($Value)) $param['RecordValue'] = $Value; - if(!isNullOrEmpty($Status)){ - $Status = $Status == '1' ? 'ENABLE' : 'DISABLE'; - $param['RecordStatus'] = [$Status]; - } - if(!isNullOrEmpty($Type)) $param['RecordType'] = [$this->convertType($Type)]; - if(!isNullOrEmpty($Line)) $param['RecordLine'] = [$Line]; - }else{ - $action = 'DescribeRecordList'; - $param = ['Domain' => $this->domain, 'Subdomain' => $SubDomain, 'RecordType' => $this->convertType($Type), 'RecordLineId' => $Line, 'Keyword' => $KeyWord, 'Offset' => $offset, 'Limit' => $PageSize]; - } - $data = $this->send_reuqest($action, $param); - if($data){ - $list = []; - foreach($data['RecordList'] as $row){ - //if($row['Name'] == '@' && $row['Type'] == 'NS') continue; - $list[] = [ - 'RecordId' => $row['RecordId'], - 'Domain' => $this->domain, - 'Name' => $row['Name'], - 'Type' => $this->convertTypeId($row['Type']), - 'Value' => $row['Value'], - 'Line' => $row['LineId'], - 'TTL' => $row['TTL'], - 'MX' => $row['MX'], - 'Status' => $row['Status'] == 'ENABLE' ? '1' : '0', - 'Weight' => $row['Weight'], - 'Remark' => $row['Remark'], - 'UpdateTime' => $row['UpdatedOn'], - ]; - } - return ['total' => $data['RecordCountInfo']['TotalCount'], 'list' => $list]; - }elseif($this->error == '记录列表为空。' || $this->error == 'No records on the list.'){ - return ['total' => 0, 'list' => []]; - } - return false; - } + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + $offset = ($PageNumber - 1) * $PageSize; + if (!isNullOrEmpty($Status) || !isNullOrEmpty($Value)) { + $action = 'DescribeRecordFilterList'; + $param = ['Domain' => $this->domain, 'Offset' => $offset, 'Limit' => $PageSize, 'RecordValue' => $Value]; + if (!isNullOrEmpty($SubDomain)) $param['SubDomain'] = $SubDomain; + if (!isNullOrEmpty($KeyWord)) $param['Keyword'] = $KeyWord; + if (!isNullOrEmpty($Value)) $param['RecordValue'] = $Value; + if (!isNullOrEmpty($Status)) { + $Status = $Status == '1' ? 'ENABLE' : 'DISABLE'; + $param['RecordStatus'] = [$Status]; + } + if (!isNullOrEmpty($Type)) $param['RecordType'] = [$this->convertType($Type)]; + if (!isNullOrEmpty($Line)) $param['RecordLine'] = [$Line]; + } else { + $action = 'DescribeRecordList'; + $param = ['Domain' => $this->domain, 'Subdomain' => $SubDomain, 'RecordType' => $this->convertType($Type), 'RecordLineId' => $Line, 'Keyword' => $KeyWord, 'Offset' => $offset, 'Limit' => $PageSize]; + } + $data = $this->send_reuqest($action, $param); + if ($data) { + $list = []; + foreach ($data['RecordList'] as $row) { + //if($row['Name'] == '@' && $row['Type'] == 'NS') continue; + $list[] = [ + 'RecordId' => $row['RecordId'], + 'Domain' => $this->domain, + 'Name' => $row['Name'], + 'Type' => $this->convertTypeId($row['Type']), + 'Value' => $row['Value'], + 'Line' => $row['LineId'], + 'TTL' => $row['TTL'], + 'MX' => $row['MX'], + 'Status' => $row['Status'] == 'ENABLE' ? '1' : '0', + 'Weight' => $row['Weight'], + 'Remark' => $row['Remark'], + 'UpdateTime' => $row['UpdatedOn'], + ]; + } + return ['total' => $data['RecordCountInfo']['TotalCount'], 'list' => $list]; + } elseif ($this->error == '记录列表为空。' || $this->error == 'No records on the list.') { + return ['total' => 0, 'list' => []]; + } + return false; + } - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - if($SubDomain == '')$SubDomain='@'; - return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); - } + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + if ($SubDomain == '') $SubDomain = '@'; + return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); + } - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - $action = 'DescribeRecord'; - $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId)]; - $data = $this->send_reuqest($action, $param); - if($data){ - return [ - 'RecordId' => $data['RecordInfo']['Id'], - 'Domain' => $this->domain, - 'Name' => $data['RecordInfo']['SubDomain'], - 'Type' => $this->convertTypeId($data['RecordInfo']['RecordType']), - 'Value' => $data['RecordInfo']['Value'], - 'Line' => $data['RecordInfo']['RecordLineId'], - 'TTL' => $data['RecordInfo']['TTL'], - 'MX' => $data['RecordInfo']['MX'], - 'Status' => $data['RecordInfo']['Enabled'] == 1 ? '1' : '0', - 'Weight' => $data['RecordInfo']['Weight'], - 'Remark' => $data['RecordInfo']['Remark'], - 'UpdateTime' => $data['RecordInfo']['UpdatedOn'], - ]; - } - return false; - } + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + $action = 'DescribeRecord'; + $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId)]; + $data = $this->send_reuqest($action, $param); + if ($data) { + return [ + 'RecordId' => $data['RecordInfo']['Id'], + 'Domain' => $this->domain, + 'Name' => $data['RecordInfo']['SubDomain'], + 'Type' => $this->convertTypeId($data['RecordInfo']['RecordType']), + 'Value' => $data['RecordInfo']['Value'], + 'Line' => $data['RecordInfo']['RecordLineId'], + 'TTL' => $data['RecordInfo']['TTL'], + 'MX' => $data['RecordInfo']['MX'], + 'Status' => $data['RecordInfo']['Enabled'] == 1 ? '1' : '0', + 'Weight' => $data['RecordInfo']['Weight'], + 'Remark' => $data['RecordInfo']['Remark'], + 'UpdateTime' => $data['RecordInfo']['UpdatedOn'], + ]; + } + return false; + } - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $action = 'CreateRecord'; - $param = ['Domain' => $this->domain, 'SubDomain' => $Name, 'RecordType' => $this->convertType($Type), 'Value' => $Value, 'RecordLine'=>$Line, 'RecordLineId' => $this->convertLineCode($Line), 'TTL' => intval($TTL), 'Weight' => $Weight]; - if($Type == 'MX')$param['MX'] = intval($MX); - $data = $this->send_reuqest($action, $param); - return is_array($data) ? $data['RecordId'] : false; - } + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $action = 'CreateRecord'; + $param = ['Domain' => $this->domain, 'SubDomain' => $Name, 'RecordType' => $this->convertType($Type), 'Value' => $Value, 'RecordLine' => $Line, 'RecordLineId' => $this->convertLineCode($Line), 'TTL' => intval($TTL), 'Weight' => $Weight]; + if ($Type == 'MX') $param['MX'] = intval($MX); + $data = $this->send_reuqest($action, $param); + return is_array($data) ? $data['RecordId'] : false; + } - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $action = 'ModifyRecord'; - $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId), 'SubDomain' => $Name, 'RecordType' => $this->convertType($Type), 'Value' => $Value, 'RecordLine'=>$Line, 'RecordLineId' => $this->convertLineCode($Line), 'TTL' => intval($TTL), 'Weight' => $Weight]; - if($Type == 'MX')$param['MX'] = intval($MX); - $data = $this->send_reuqest($action, $param); - return is_array($data); - } + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $action = 'ModifyRecord'; + $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId), 'SubDomain' => $Name, 'RecordType' => $this->convertType($Type), 'Value' => $Value, 'RecordLine' => $Line, 'RecordLineId' => $this->convertLineCode($Line), 'TTL' => intval($TTL), 'Weight' => $Weight]; + if ($Type == 'MX') $param['MX'] = intval($MX); + $data = $this->send_reuqest($action, $param); + return is_array($data); + } - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - $action = 'ModifyRecordRemark'; - $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId), 'Remark' => $Remark]; - $data = $this->send_reuqest($action, $param); - return is_array($data); - } + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + $action = 'ModifyRecordRemark'; + $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId), 'Remark' => $Remark]; + $data = $this->send_reuqest($action, $param); + return is_array($data); + } - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $action = 'DeleteRecord'; - $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId)]; - $data = $this->send_reuqest($action, $param); - return is_array($data); - } - - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - $Status = $Status == '1' ? 'ENABLE' : 'DISABLE'; - $action = 'ModifyRecordStatus'; - $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId), 'Status' => $Status]; - $data = $this->send_reuqest($action, $param); - return is_array($data); - } + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $action = 'DeleteRecord'; + $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId)]; + $data = $this->send_reuqest($action, $param); + return is_array($data); + } - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - $action = 'DescribeDomainLogList'; - $offset = ($PageNumber-1)*$PageSize; - $param = ['Domain' => $this->domain, 'Offset' => $offset, 'Limit' => $PageSize]; - $data = $this->send_reuqest($action, $param); - if($data){ - $list = []; - foreach($data['LogList'] as $row){ - $list[] = ['time'=>substr($row, 0, strpos($row,'(')), 'ip'=>substr($row, strpos($row,'(')+1, strpos($row,')')-strpos($row,'(')-1), 'data'=>substr($row, strpos($row,')')+1, strpos($row,' Uin:')-strpos($row,')')-1)]; - } - return ['total' => $data['TotalCount'], 'list' => $list]; - } - return false; - } + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + $Status = $Status == '1' ? 'ENABLE' : 'DISABLE'; + $action = 'ModifyRecordStatus'; + $param = ['Domain' => $this->domain, 'RecordId' => intval($RecordId), 'Status' => $Status]; + $data = $this->send_reuqest($action, $param); + return is_array($data); + } - //获取解析线路列表 - public function getRecordLine(){ - $action = 'DescribeRecordLineCategoryList'; - $param = ['Domain' => $this->domain]; - $data = $this->send_reuqest($action, $param); - if($data){ - $list = []; - $this->processLineList($list, $data['LineList'], null); - return $list; - }else{ - $data = $this->getRecordLineByGrade(); - if($data){ - $list = []; - foreach($data as $row){ - $list[$row['LineId']] = ['name'=>$row['Name'], 'parent'=>null]; - } - return $list; - } - } - return false; - } + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + $action = 'DescribeDomainLogList'; + $offset = ($PageNumber - 1) * $PageSize; + $param = ['Domain' => $this->domain, 'Offset' => $offset, 'Limit' => $PageSize]; + $data = $this->send_reuqest($action, $param); + if ($data) { + $list = []; + foreach ($data['LogList'] as $row) { + $list[] = ['time' => substr($row, 0, strpos($row, '(')), 'ip' => substr($row, strpos($row, '(') + 1, strpos($row, ')') - strpos($row, '(') - 1), 'data' => substr($row, strpos($row, ')') + 1, strpos($row, ' Uin:') - strpos($row, ')') - 1)]; + } + return ['total' => $data['TotalCount'], 'list' => $list]; + } + return false; + } - private function processLineList(&$list, $line_list, $parent){ - foreach($line_list as $row){ - if(isNullOrEmpty($row['LineId'])) $row['LineId'] = 'N.'.$row['LineName']; - if($row['Useful'] && !isset($list[$row['LineId']])){ - $list[$row['LineId']] = ['name'=>$row['LineName'], 'parent'=>$parent]; - if($row['SubGroup']){ - $this->processLineList($list, $row['SubGroup'], $row['LineId']); - } - } - } - } + //获取解析线路列表 + public function getRecordLine() + { + $action = 'DescribeRecordLineCategoryList'; + $param = ['Domain' => $this->domain]; + $data = $this->send_reuqest($action, $param); + if ($data) { + $list = []; + $this->processLineList($list, $data['LineList'], null); + return $list; + } else { + $data = $this->getRecordLineByGrade(); + if ($data) { + $list = []; + foreach ($data as $row) { + $list[$row['LineId']] = ['name' => $row['Name'], 'parent' => null]; + } + return $list; + } + } + return false; + } - //获取域名概览信息 - public function getDomainInfo(){ - $action = 'DescribeDomain'; - $param = ['Domain' => $this->domain]; - $data = $this->send_reuqest($action, $param); - if($data){ - $this->domainInfo = $data['DomainInfo']; - return $data['DomainInfo']; - } - return false; - } + private function processLineList(&$list, $line_list, $parent) + { + foreach ($line_list as $row) { + if (isNullOrEmpty($row['LineId'])) $row['LineId'] = 'N.' . $row['LineName']; + if ($row['Useful'] && !isset($list[$row['LineId']])) { + $list[$row['LineId']] = ['name' => $row['LineName'], 'parent' => $parent]; + if ($row['SubGroup']) { + $this->processLineList($list, $row['SubGroup'], $row['LineId']); + } + } + } + } - //获取域名权限 - public function getDomainPurview(){ - $action = 'DescribeDomainPurview'; - $param = ['Domain' => $this->domain]; - $data = $this->send_reuqest($action, $param); - if($data){ - return $data['PurviewList']; - } - return false; - } + //获取域名概览信息 + public function getDomainInfo() + { + $action = 'DescribeDomain'; + $param = ['Domain' => $this->domain]; + $data = $this->send_reuqest($action, $param); + if ($data) { + $this->domainInfo = $data['DomainInfo']; + return $data['DomainInfo']; + } + return false; + } - //获取域名最低TTL - public function getMinTTL(){ - if($this->domainInfo){ - return $this->domainInfo['TTL']; - } - $PurviewList = $this->getDomainPurview(); - if($PurviewList){ - foreach($PurviewList as $row){ - if($row['Name'] == '记录 TTL 最低' || $row['Name'] == 'Min TTL value'){ - return intval($row['Value']); - } - } - } - return false; - } - - //获取等级允许的线路 - public function getRecordLineByGrade(){ - $action = 'DescribeRecordLineList'; - $param = ['Domain' => $this->domain, 'DomainGrade' => '']; - $data = $this->send_reuqest($action, $param); - if($data){ - $line_list = $data['LineList']; - if(!empty($data['LineGroupList'])){ - foreach($data['LineGroupList'] as $row){ - $line_list[] = ['Name' => $row['Name'], 'LineId' => $row['LineId']]; - } - } - return $line_list; - } - return false; - } + //获取域名权限 + public function getDomainPurview() + { + $action = 'DescribeDomainPurview'; + $param = ['Domain' => $this->domain]; + $data = $this->send_reuqest($action, $param); + if ($data) { + return $data['PurviewList']; + } + return false; + } - //获取用户信息 - public function getAccountInfo(){ - $action = 'DescribeUserDetail'; - $param = []; - $data = $this->send_reuqest($action, $param); - if($data){ - return $data['UserInfo']; - } - return false; - } + //获取域名最低TTL + public function getMinTTL() + { + if ($this->domainInfo) { + return $this->domainInfo['TTL']; + } + $PurviewList = $this->getDomainPurview(); + if ($PurviewList) { + foreach ($PurviewList as $row) { + if ($row['Name'] == '记录 TTL 最低' || $row['Name'] == 'Min TTL value') { + return intval($row['Value']); + } + } + } + return false; + } - private function convertLineCode($line){ - $convert_dict = ['default'=>'0', 'unicom'=>'10=1', 'telecom'=>'10=0', 'mobile'=>'10=3', 'edu'=>'10=2', 'oversea'=>'3=0', 'btvn'=>'10=22', 'search'=>'80=0', 'internal'=>'7=0']; - if(array_key_exists($line, $convert_dict)){ - return $convert_dict[$line]; - } - return $line; - } + //获取等级允许的线路 + public function getRecordLineByGrade() + { + $action = 'DescribeRecordLineList'; + $param = ['Domain' => $this->domain, 'DomainGrade' => '']; + $data = $this->send_reuqest($action, $param); + if ($data) { + $line_list = $data['LineList']; + if (!empty($data['LineGroupList'])) { + foreach ($data['LineGroupList'] as $row) { + $line_list[] = ['Name' => $row['Name'], 'LineId' => $row['LineId']]; + } + } + return $line_list; + } + return false; + } - private function convertType($type){ - $convert_dict = ['REDIRECT_URL'=>'显性URL', 'FORWARD_URL'=>'隐性URL']; - if(array_key_exists($type, $convert_dict)){ - return $convert_dict[$type]; - } - return $type; - } + //获取用户信息 + public function getAccountInfo() + { + $action = 'DescribeUserDetail'; + $param = []; + $data = $this->send_reuqest($action, $param); + if ($data) { + return $data['UserInfo']; + } + return false; + } - private function convertTypeId($type){ - $convert_dict = ['显性URL'=>'REDIRECT_URL', '隐性URL'=>'FORWARD_URL']; - if(array_key_exists($type, $convert_dict)){ - return $convert_dict[$type]; - } - return $type; - } + private function convertLineCode($line) + { + $convert_dict = ['default' => '0', 'unicom' => '10=1', 'telecom' => '10=0', 'mobile' => '10=3', 'edu' => '10=2', 'oversea' => '3=0', 'btvn' => '10=22', 'search' => '80=0', 'internal' => '7=0']; + if (array_key_exists($line, $convert_dict)) { + return $convert_dict[$line]; + } + return $line; + } + + private function convertType($type) + { + $convert_dict = ['REDIRECT_URL' => '显性URL', 'FORWARD_URL' => '隐性URL']; + if (array_key_exists($type, $convert_dict)) { + return $convert_dict[$type]; + } + return $type; + } + + private function convertTypeId($type) + { + $convert_dict = ['显性URL' => 'REDIRECT_URL', '隐性URL' => 'FORWARD_URL']; + if (array_key_exists($type, $convert_dict)) { + return $convert_dict[$type]; + } + return $type; + } - private function send_reuqest($action, $param){ - $param = array_filter($param, function($a){ return $a!==null;}); - if(!$param) $param = (object)[]; - $payload = json_encode($param); - $time = time(); - $authorization = $this->generateSign($payload, $time); - $header = [ - 'Authorization: '.$authorization, - 'Content-Type: application/json; charset=utf-8', - 'X-TC-Action: '.$action, - 'X-TC-Timestamp: '.$time, - 'X-TC-Version: '.$this->version, - ]; - return $this->curl_post($payload, $header); - } + private function send_reuqest($action, $param) + { + $param = array_filter($param, function ($a) { return $a !== null;}); + if (!$param) $param = (object)[]; + $payload = json_encode($param); + $time = time(); + $authorization = $this->generateSign($payload, $time); + $header = [ + 'Authorization: '.$authorization, + 'Content-Type: application/json; charset=utf-8', + 'X-TC-Action: '.$action, + 'X-TC-Timestamp: '.$time, + 'X-TC-Version: '.$this->version, + ]; + return $this->curl_post($payload, $header); + } - private function generateSign($payload, $time){ - $algorithm = "TC3-HMAC-SHA256"; + private function generateSign($payload, $time) + { + $algorithm = "TC3-HMAC-SHA256"; - // step 1: build canonical request string - $httpRequestMethod = "POST"; - $canonicalUri = "/"; - $canonicalQueryString = ""; - $canonicalHeaders = "content-type:application/json; charset=utf-8\n"."host:".$this->endpoint."\n"; - $signedHeaders = "content-type;host"; - $hashedRequestPayload = hash("SHA256", $payload); - $canonicalRequest = $httpRequestMethod."\n" - .$canonicalUri."\n" - .$canonicalQueryString."\n" - .$canonicalHeaders."\n" - .$signedHeaders."\n" - .$hashedRequestPayload; - - // step 2: build string to sign - $date = gmdate("Y-m-d", $time); - $credentialScope = $date."/".$this->service."/tc3_request"; - $hashedCanonicalRequest = hash("SHA256", $canonicalRequest); - $stringToSign = $algorithm."\n" - .$time."\n" - .$credentialScope."\n" - .$hashedCanonicalRequest; - - // step 3: sign string - $secretDate = hash_hmac("SHA256", $date, "TC3".$this->SecretKey, true); - $secretService = hash_hmac("SHA256", $this->service, $secretDate, true); - $secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true); - $signature = hash_hmac("SHA256", $stringToSign, $secretSigning); + // step 1: build canonical request string + $httpRequestMethod = "POST"; + $canonicalUri = "/"; + $canonicalQueryString = ""; + $canonicalHeaders = "content-type:application/json; charset=utf-8\n"."host:".$this->endpoint."\n"; + $signedHeaders = "content-type;host"; + $hashedRequestPayload = hash("SHA256", $payload); + $canonicalRequest = $httpRequestMethod."\n" + .$canonicalUri."\n" + .$canonicalQueryString."\n" + .$canonicalHeaders."\n" + .$signedHeaders."\n" + .$hashedRequestPayload; - // step 4: build authorization - $authorization = $algorithm - ." Credential=".$this->SecretId."/".$credentialScope - .", SignedHeaders=content-type;host, Signature=".$signature; + // step 2: build string to sign + $date = gmdate("Y-m-d", $time); + $credentialScope = $date."/".$this->service."/tc3_request"; + $hashedCanonicalRequest = hash("SHA256", $canonicalRequest); + $stringToSign = $algorithm."\n" + .$time."\n" + .$credentialScope."\n" + .$hashedCanonicalRequest; - return $authorization; - } + // step 3: sign string + $secretDate = hash_hmac("SHA256", $date, "TC3".$this->SecretKey, true); + $secretService = hash_hmac("SHA256", $this->service, $secretDate, true); + $secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true); + $signature = hash_hmac("SHA256", $stringToSign, $secretSigning); - private function curl_post($payload, $header){ - $url = 'https://'.$this->endpoint.'/'; - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_HTTPHEADER, $header); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); - $response = curl_exec($ch); - $errno = curl_errno($ch); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - curl_close($ch); - if ($errno) return false; + // step 4: build authorization + $authorization = $algorithm + ." Credential=".$this->SecretId."/".$credentialScope + .", SignedHeaders=content-type;host, Signature=".$signature; - $arr=json_decode($response,true); - if($arr){ - if(isset($arr['Response']['Error'])){ - $this->setError($arr['Response']['Error']['Message']); - return false; - }else{ - return $arr['Response']; - } - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + return $authorization; + } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } -} \ No newline at end of file + private function curl_post($payload, $header) + { + $url = 'https://'.$this->endpoint.'/'; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); + $response = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + curl_close($ch); + if ($errno) return false; + + $arr = json_decode($response, true); + if ($arr) { + if (isset($arr['Response']['Error'])) { + $this->setError($arr['Response']['Error']['Message']); + return false; + } else { + return $arr['Response']; + } + } else { + $this->setError('返回数据解析失败'); + return false; + } + } + + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } +} diff --git a/app/lib/dns/huawei.php b/app/lib/dns/huawei.php index c17d770..7548a31 100644 --- a/app/lib/dns/huawei.php +++ b/app/lib/dns/huawei.php @@ -1,360 +1,386 @@ AccessKeyId = $config['ak']; - $this->SecretAccessKey = $config['sk']; - $this->domain = $config['domain']; - $this->domainid = $config['domainid']; - } - - public function getError(){ - return $this->error; - } - - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } - - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $offset = ($PageNumber-1)*$PageSize; - $query = ['offset' => $offset, 'limit' => $PageSize, 'name' => $KeyWord]; - $data = $this->send_reuqest('GET', '/v2/zones', $query); - if($data){ - $list = []; - foreach($data['zones'] as $row){ - $list[] = [ - 'DomainId' => $row['id'], - 'Domain' => rtrim($row['name'], '.'), - 'RecordCount' => $row['record_num'], - ]; - } - return ['total' => $data['metadata']['total_count'], 'list' => $list]; - } - return false; - } - - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - $offset = ($PageNumber-1)*$PageSize; - $query = ['type' => $Type, 'line_id' => $Line, 'name' => $KeyWord, 'offset' => $offset, 'limit' => $PageSize]; - if(!isNullOrEmpty($Status)){ - $Status = $Status == '1' ? 'ACTIVE' : 'DISABLE'; - $query['status'] = $Status; - } - if(!isNullOrEmpty($SubDomain)){ - $SubDomain = $this->getHost($SubDomain); - $query['name'] = $SubDomain; - $query['search_mode'] = 'equal'; - } - $data = $this->send_reuqest('GET', '/v2.1/zones/'.$this->domainid.'/recordsets', $query); - if($data){ - $list = []; - foreach($data['recordsets'] as $row){ - if($row['name'] == $row['zone_name']) $row['name'] = '@'; - if($row['type'] == 'MX') list($row['mx'], $row['records']) = explode(' ', $row['records'][0]); - $list[] = [ - 'RecordId' => $row['id'], - 'Domain' => rtrim($row['zone_name'], '.'), - 'Name' => str_replace('.'.$row['zone_name'], '', $row['name']), - 'Type' => $row['type'], - 'Value' => $row['records'], - 'Line' => $row['line'], - 'TTL' => $row['ttl'], - 'MX' => isset($row['mx']) ? $row['mx'] : null, - 'Status' => $row['status'] == 'ACTIVE' ? '1' : '0', - 'Weight' => $row['weight'], - 'Remark' => $row['description'], - 'UpdateTime' => $row['updated_at'], - ]; - } - return ['total' => $data['metadata']['total_count'], 'list' => $list]; - } - return false; - } - - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); - } - - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - $data = $this->send_reuqest('GET', '/v2.1/zones/'.$this->domainid.'/recordsets/'.$RecordId); - if($data){ - if($data['name'] == $data['zone_name']) $data['name'] = '@'; - if($data['type'] == 'MX') list($data['mx'], $data['records']) = explode(' ', $data['records'][0]); - return [ - 'RecordId' => $data['id'], - 'Domain' => rtrim($data['zone_name'], '.'), - 'Name' => str_replace('.'.$data['zone_name'], '', $data['name']), - 'Type' => $data['type'], - 'Value' => $data['records'], - 'Line' => $data['line'], - 'TTL' => $data['ttl'], - 'MX' => isset($data['mx']) ? $data['mx'] : null, - 'Status' => $data['status'] == 'ACTIVE' ? '1' : '0', - 'Weight' => $data['weight'], - 'Remark' => $data['description'], - 'UpdateTime' => $data['updated_at'], - ]; - } - return false; - } - - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $Name = $this->getHost($Name); - if($Type == 'TXT' && substr($Value, 0, 1) != '"') $Value = '"'.$Value.'"'; - $records = explode(',', $Value); - $params = ['name' => $Name, 'type' => $this->convertType($Type), 'records' => $records, 'line'=>$Line, 'ttl' => intval($TTL), 'description' => $Remark]; - if($Type == 'MX') $params['records'][0] = intval($MX) . ' ' . $Value; - if($Weight > 0) $params['weight'] = intval($Weight); - $data = $this->send_reuqest('POST', '/v2.1/zones/'.$this->domainid.'/recordsets', null, $params); - return is_array($data) ? $data['id'] : false; - } - - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $Name = $this->getHost($Name); - if($Type == 'TXT' && substr($Value, 0, 1) != '"') $Value = '"'.$Value.'"'; - $records = explode(',', $Value); - $params = ['name' => $Name, 'type' => $this->convertType($Type), 'records' => $records, 'line'=>$Line, 'ttl' => intval($TTL), 'description' => $Remark]; - if($Type == 'MX') $params['records'][0] = intval($MX) . ' ' . $Value; - if($Weight > 0) $params['weight'] = intval($Weight); - $data = $this->send_reuqest('PUT', '/v2.1/zones/'.$this->domainid.'/recordsets/'.$RecordId, null, $params); - return is_array($data); - } - - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - return false; - } - - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $data = $this->send_reuqest('DELETE', '/v2.1/zones/'.$this->domainid.'/recordsets/'.$RecordId); - return is_array($data); - } - - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - $Status = $Status == '1' ? 'ENABLE' : 'DISABLE'; - $params = ['status' => $Status]; - $data = $this->send_reuqest('PUT', '/v2.1/recordsets/'.$RecordId.'/statuses/set', null, $params); - return is_array($data); - } - - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - return false; - } - - //获取解析线路列表 - public function getRecordLine(){ - $file_path = app()->getBasePath().'data'.DIRECTORY_SEPARATOR.'huawei_line.json'; - $content = file_get_contents($file_path); - $data = json_decode($content, true); - if($data){ - return $data; - $list = [$data['DEFAULT']['id'] => ['name'=>$data['DEFAULT']['zh'], 'parent'=>null]]; - $this->processLineList($list, $data['ISP'], null, 1, 1); - $this->processLineList($list, $data['REGION'], null, null, 1); - //file_put_contents($file_path, json_encode($list, JSON_UNESCAPED_UNICODE)); - return $list; - } - return false; - } - - private function processLineList(&$list, $line_list, $parent, $rootId = null, $rootName = null){ - foreach($line_list as $row){ - if($rootId && $rootId!==1){ - $row['id'] = $rootId.'_'.$row['id']; - } - if($rootName && $rootName!==1){ - $row['zh'] = $rootName.'_'.$row['zh']; - } - $list[$row['id']] = ['name'=>$row['zh'], 'parent'=>$parent]; - if(isset($row['children']) && !empty($row['children'])){ - $this->processLineList($list, $row['children'], $row['id'], $rootId === 1 ? $row['id'] : $rootId, $rootName === 1 ? $row['zh'] : $rootName); - } - } - } - - //获取域名概览信息 - public function getDomainInfo(){ - return $this->send_reuqest('GET', '/v2/zones/'.$this->domainid); - } - - //获取域名最低TTL - public function getMinTTL(){ - return false; - } - - private function convertType($type){ - return $type; - } - - private function getHost($Name){ - if($Name == '@') $Name = ''; - else $Name .= '.'; - $Name .= $this->domain . '.'; - return $Name; - } - - private function send_reuqest($method, $path, $query = null, $params = null){ - if(!empty($query)){ - $query = array_filter($query, function($a){ return $a!==null;}); - } - if(!empty($params)){ - $params = array_filter($params, function($a){ return $a!==null;}); - } - - $time = time(); - $date = gmdate("Ymd\THis\Z", $time); - $body = !empty($params) ? json_encode($params) : ''; - $headers = [ - 'Host' => $this->endpoint, - 'X-Sdk-Date' => $date, - ]; - if($body){ - $headers['Content-Type'] = 'application/json'; - } - - $authorization = $this->generateSign($method, $path, $query, $headers, $body, $time); - $headers['Authorization'] = $authorization; - - $url = 'https://'.$this->endpoint.$path; - if(!empty($query)){ - $url .= '?'.http_build_query($query); - } - $header = []; - foreach($headers as $key => $value){ - $header[] = $key.': '.$value; - } - return $this->curl($method, $url, $body, $header); - } - - private function generateSign($method, $path, $query, $headers, $body, $time){ - $algorithm = "SDK-HMAC-SHA256"; - - // step 1: build canonical request string - $httpRequestMethod = $method; - $canonicalUri = $path; - if(substr($canonicalUri, -1) != "/") $canonicalUri .= "/"; - $canonicalQueryString = $this->getCanonicalQueryString($query); - [$canonicalHeaders, $signedHeaders] = $this->getCanonicalHeaders($headers); - $hashedRequestPayload = hash("sha256", $body); - $canonicalRequest = $httpRequestMethod."\n" - .$canonicalUri."\n" - .$canonicalQueryString."\n" - .$canonicalHeaders."\n" - .$signedHeaders."\n" - .$hashedRequestPayload; - - // step 2: build string to sign - $date = gmdate("Ymd\THis\Z", $time); - $hashedCanonicalRequest = hash("sha256", $canonicalRequest); - $stringToSign = $algorithm."\n" - .$date."\n" - .$hashedCanonicalRequest; - - // step 3: sign string - $signature = hash_hmac("sha256", $stringToSign, $this->SecretAccessKey); - - // step 4: build authorization - $authorization = $algorithm . ' Access=' . $this->AccessKeyId . ", SignedHeaders=" . $signedHeaders . ", Signature=" . $signature; - - return $authorization; - } - - private function escape($str) + public function __construct($config) { - $search = ['+', '*', '%7E']; - $replace = ['%20', '%2A', '~']; - return str_replace($search, $replace, urlencode($str)); + $this->AccessKeyId = $config['ak']; + $this->SecretAccessKey = $config['sk']; + $this->domain = $config['domain']; + $this->domainid = $config['domainid']; } - private function getCanonicalQueryString($parameters) + public function getError() { - if(empty($parameters)) return ''; + return $this->error; + } + + public function check() + { + if ($this->getDomainList() != false) { + return true; + } + return false; + } + + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $offset = ($PageNumber - 1) * $PageSize; + $query = ['offset' => $offset, 'limit' => $PageSize, 'name' => $KeyWord]; + $data = $this->send_reuqest('GET', '/v2/zones', $query); + if ($data) { + $list = []; + foreach ($data['zones'] as $row) { + $list[] = [ + 'DomainId' => $row['id'], + 'Domain' => rtrim($row['name'], '.'), + 'RecordCount' => $row['record_num'], + ]; + } + return ['total' => $data['metadata']['total_count'], 'list' => $list]; + } + return false; + } + + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + $offset = ($PageNumber - 1) * $PageSize; + $query = ['type' => $Type, 'line_id' => $Line, 'name' => $KeyWord, 'offset' => $offset, 'limit' => $PageSize]; + if (!isNullOrEmpty($Status)) { + $Status = $Status == '1' ? 'ACTIVE' : 'DISABLE'; + $query['status'] = $Status; + } + if (!isNullOrEmpty($SubDomain)) { + $SubDomain = $this->getHost($SubDomain); + $query['name'] = $SubDomain; + $query['search_mode'] = 'equal'; + } + $data = $this->send_reuqest('GET', '/v2.1/zones/'.$this->domainid.'/recordsets', $query); + if ($data) { + $list = []; + foreach ($data['recordsets'] as $row) { + if ($row['name'] == $row['zone_name']) $row['name'] = '@'; + if ($row['type'] == 'MX') list($row['mx'], $row['records']) = explode(' ', $row['records'][0]); + $list[] = [ + 'RecordId' => $row['id'], + 'Domain' => rtrim($row['zone_name'], '.'), + 'Name' => str_replace('.'.$row['zone_name'], '', $row['name']), + 'Type' => $row['type'], + 'Value' => $row['records'], + 'Line' => $row['line'], + 'TTL' => $row['ttl'], + 'MX' => isset($row['mx']) ? $row['mx'] : null, + 'Status' => $row['status'] == 'ACTIVE' ? '1' : '0', + 'Weight' => $row['weight'], + 'Remark' => $row['description'], + 'UpdateTime' => $row['updated_at'], + ]; + } + return ['total' => $data['metadata']['total_count'], 'list' => $list]; + } + return false; + } + + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); + } + + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + $data = $this->send_reuqest('GET', '/v2.1/zones/'.$this->domainid.'/recordsets/'.$RecordId); + if ($data) { + if ($data['name'] == $data['zone_name']) $data['name'] = '@'; + if ($data['type'] == 'MX') list($data['mx'], $data['records']) = explode(' ', $data['records'][0]); + return [ + 'RecordId' => $data['id'], + 'Domain' => rtrim($data['zone_name'], '.'), + 'Name' => str_replace('.'.$data['zone_name'], '', $data['name']), + 'Type' => $data['type'], + 'Value' => $data['records'], + 'Line' => $data['line'], + 'TTL' => $data['ttl'], + 'MX' => isset($data['mx']) ? $data['mx'] : null, + 'Status' => $data['status'] == 'ACTIVE' ? '1' : '0', + 'Weight' => $data['weight'], + 'Remark' => $data['description'], + 'UpdateTime' => $data['updated_at'], + ]; + } + return false; + } + + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $Name = $this->getHost($Name); + if ($Type == 'TXT' && substr($Value, 0, 1) != '"') $Value = '"' . $Value . '"'; + $records = explode(',', $Value); + $params = ['name' => $Name, 'type' => $this->convertType($Type), 'records' => $records, 'line' => $Line, 'ttl' => intval($TTL), 'description' => $Remark]; + if ($Type == 'MX') $params['records'][0] = intval($MX) . ' ' . $Value; + if ($Weight > 0) $params['weight'] = intval($Weight); + $data = $this->send_reuqest('POST', '/v2.1/zones/'.$this->domainid.'/recordsets', null, $params); + return is_array($data) ? $data['id'] : false; + } + + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $Name = $this->getHost($Name); + if ($Type == 'TXT' && substr($Value, 0, 1) != '"') $Value = '"' . $Value . '"'; + $records = explode(',', $Value); + $params = ['name' => $Name, 'type' => $this->convertType($Type), 'records' => $records, 'line' => $Line, 'ttl' => intval($TTL), 'description' => $Remark]; + if ($Type == 'MX') $params['records'][0] = intval($MX) . ' ' . $Value; + if ($Weight > 0) $params['weight'] = intval($Weight); + $data = $this->send_reuqest('PUT', '/v2.1/zones/'.$this->domainid.'/recordsets/'.$RecordId, null, $params); + return is_array($data); + } + + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + return false; + } + + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $data = $this->send_reuqest('DELETE', '/v2.1/zones/'.$this->domainid.'/recordsets/'.$RecordId); + return is_array($data); + } + + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + $Status = $Status == '1' ? 'ENABLE' : 'DISABLE'; + $params = ['status' => $Status]; + $data = $this->send_reuqest('PUT', '/v2.1/recordsets/'.$RecordId.'/statuses/set', null, $params); + return is_array($data); + } + + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + return false; + } + + //获取解析线路列表 + public function getRecordLine() + { + $file_path = app()->getBasePath().'data'.DIRECTORY_SEPARATOR.'huawei_line.json'; + $content = file_get_contents($file_path); + $data = json_decode($content, true); + if ($data) { + return $data; + $list = [$data['DEFAULT']['id'] => ['name' => $data['DEFAULT']['zh'], 'parent' => null]]; + $this->processLineList($list, $data['ISP'], null, 1, 1); + $this->processLineList($list, $data['REGION'], null, null, 1); + //file_put_contents($file_path, json_encode($list, JSON_UNESCAPED_UNICODE)); + return $list; + } + return false; + } + + private function processLineList(&$list, $line_list, $parent, $rootId = null, $rootName = null) + { + foreach ($line_list as $row) { + if ($rootId && $rootId !== 1) { + $row['id'] = $rootId.'_'.$row['id']; + } + if ($rootName && $rootName !== 1) { + $row['zh'] = $rootName.'_'.$row['zh']; + } + $list[$row['id']] = ['name' => $row['zh'], 'parent' => $parent]; + if (isset($row['children']) && !empty($row['children'])) { + $this->processLineList($list, $row['children'], $row['id'], $rootId === 1 ? $row['id'] : $rootId, $rootName === 1 ? $row['zh'] : $rootName); + } + } + } + + //获取域名概览信息 + public function getDomainInfo() + { + return $this->send_reuqest('GET', '/v2/zones/'.$this->domainid); + } + + //获取域名最低TTL + public function getMinTTL() + { + return false; + } + + private function convertType($type) + { + return $type; + } + + private function getHost($Name) + { + if ($Name == '@') $Name = ''; + else $Name .= '.'; + $Name .= $this->domain . '.'; + return $Name; + } + + private function send_reuqest($method, $path, $query = null, $params = null) + { + if (!empty($query)) { + $query = array_filter($query, function ($a) { return $a !== null;}); + } + if (!empty($params)) { + $params = array_filter($params, function ($a) { return $a !== null;}); + } + + $time = time(); + $date = gmdate("Ymd\THis\Z", $time); + $body = !empty($params) ? json_encode($params) : ''; + $headers = [ + 'Host' => $this->endpoint, + 'X-Sdk-Date' => $date, + ]; + if ($body) { + $headers['Content-Type'] = 'application/json'; + } + + $authorization = $this->generateSign($method, $path, $query, $headers, $body, $time); + $headers['Authorization'] = $authorization; + + $url = 'https://'.$this->endpoint.$path; + if (!empty($query)) { + $url .= '?'.http_build_query($query); + } + $header = []; + foreach ($headers as $key => $value) { + $header[] = $key.': '.$value; + } + return $this->curl($method, $url, $body, $header); + } + + private function generateSign($method, $path, $query, $headers, $body, $time) + { + $algorithm = "SDK-HMAC-SHA256"; + + // step 1: build canonical request string + $httpRequestMethod = $method; + $canonicalUri = $path; + if (substr($canonicalUri, -1) != "/") $canonicalUri .= "/"; + $canonicalQueryString = $this->getCanonicalQueryString($query); + [$canonicalHeaders, $signedHeaders] = $this->getCanonicalHeaders($headers); + $hashedRequestPayload = hash("sha256", $body); + $canonicalRequest = $httpRequestMethod."\n" + .$canonicalUri."\n" + .$canonicalQueryString."\n" + .$canonicalHeaders."\n" + .$signedHeaders."\n" + .$hashedRequestPayload; + + // step 2: build string to sign + $date = gmdate("Ymd\THis\Z", $time); + $hashedCanonicalRequest = hash("sha256", $canonicalRequest); + $stringToSign = $algorithm."\n" + .$date."\n" + .$hashedCanonicalRequest; + + // step 3: sign string + $signature = hash_hmac("sha256", $stringToSign, $this->SecretAccessKey); + + // step 4: build authorization + $authorization = $algorithm . ' Access=' . $this->AccessKeyId . ", SignedHeaders=" . $signedHeaders . ", Signature=" . $signature; + + return $authorization; + } + + private function escape($str) + { + $search = ['+', '*', '%7E']; + $replace = ['%20', '%2A', '~']; + return str_replace($search, $replace, urlencode($str)); + } + + private function getCanonicalQueryString($parameters) + { + if (empty($parameters)) return ''; ksort($parameters); - $canonicalQueryString = ''; - foreach ($parameters as $key => $value) { - $canonicalQueryString .= '&' . $this->escape($key). '=' . $this->escape($value); - } + $canonicalQueryString = ''; + foreach ($parameters as $key => $value) { + $canonicalQueryString .= '&' . $this->escape($key). '=' . $this->escape($value); + } return substr($canonicalQueryString, 1); } - private function getCanonicalHeaders($oldheaders){ - $headers = array(); + private function getCanonicalHeaders($oldheaders) + { + $headers = array(); foreach ($oldheaders as $key => $value) { $headers[strtolower($key)] = trim($value); } - ksort($headers); + ksort($headers); - $canonicalHeaders = ''; - $signedHeaders = ''; - foreach ($headers as $key => $value) { - $canonicalHeaders .= $key . ':' . $value . "\n"; - $signedHeaders .= $key . ';'; - } - $signedHeaders = substr($signedHeaders, 0, -1); - return [$canonicalHeaders, $signedHeaders]; - } + $canonicalHeaders = ''; + $signedHeaders = ''; + foreach ($headers as $key => $value) { + $canonicalHeaders .= $key . ':' . $value . "\n"; + $signedHeaders .= $key . ';'; + } + $signedHeaders = substr($signedHeaders, 0, -1); + return [$canonicalHeaders, $signedHeaders]; + } - private function curl($method, $url, $body, $header){ - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_HTTPHEADER, $header); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); - if(!empty($body)){ - curl_setopt($ch, CURLOPT_POSTFIELDS, $body); - } - $response = curl_exec($ch); - $errno = curl_errno($ch); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - curl_close($ch); - if ($errno) return false; + private function curl($method, $url, $body, $header) + { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); + if (!empty($body)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + } + $response = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + curl_close($ch); + if ($errno) return false; - $arr=json_decode($response,true); - if($arr){ - if(isset($arr['error_msg'])){ - $this->setError($arr['error_msg']); - return false; - }elseif(isset($arr['message'])){ - $this->setError($arr['message']); - return false; - }else{ - return $arr; - } - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + $arr = json_decode($response, true); + if ($arr) { + if (isset($arr['error_msg'])) { + $this->setError($arr['error_msg']); + return false; + } elseif (isset($arr['message'])) { + $this->setError($arr['message']); + return false; + } else { + return $arr; + } + } else { + $this->setError('返回数据解析失败'); + return false; + } + } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } -} \ No newline at end of file + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } +} diff --git a/app/lib/dns/huoshan.php b/app/lib/dns/huoshan.php index 4f594fa..e56e9e0 100644 --- a/app/lib/dns/huoshan.php +++ b/app/lib/dns/huoshan.php @@ -1,387 +1,412 @@ ['level' => 1, 'name' => '免费版', 'ttl' => 600], - 'professional_inner' => ['level' => 2, 'name' => '专业版', 'ttl' => 300], - 'enterprise_inner' => ['level' => 3, 'name' => '企业版', 'ttl' => 60], - 'ultimate_inner' => ['level' => 4, 'name' => '旗舰版', 'ttl' => 1], - 'ultimate_exclusive_inner' => ['level' => 5, 'name' => '尊享版', 'ttl' => 1], - ]; + private static $trade_code_list = [ + 'free_inner' => ['level' => 1, 'name' => '免费版', 'ttl' => 600], + 'professional_inner' => ['level' => 2, 'name' => '专业版', 'ttl' => 300], + 'enterprise_inner' => ['level' => 3, 'name' => '企业版', 'ttl' => 60], + 'ultimate_inner' => ['level' => 4, 'name' => '旗舰版', 'ttl' => 1], + 'ultimate_exclusive_inner' => ['level' => 5, 'name' => '尊享版', 'ttl' => 1], + ]; - function __construct($config){ - $this->AccessKeyId = $config['ak']; - $this->SecretAccessKey = $config['sk']; - $this->domain = $config['domain']; - $this->domainid = $config['domainid']; - } - - public function getError(){ - return $this->error; - } - - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } - - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $query = ['PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'Key' => $KeyWord]; - $data = $this->send_reuqest('GET', 'ListZones', $query); - if($data){ - $list = []; - if(!empty($data['Zones'])){ - foreach($data['Zones'] as $row){ - $list[] = [ - 'DomainId' => $row['ZID'], - 'Domain' => $row['ZoneName'], - 'RecordCount' => $row['RecordCount'], - ]; - } - } - return ['total' => $data['Total'], 'list' => $list]; - } - return false; - } - - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - $query = ['ZID' => intval($this->domainid), 'PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'SearchOrder' => 'desc']; - if(!empty($SubDomain) || !empty($Type) || !empty($Line) || !empty($Value)){ - $query += ['Host' => $SubDomain, 'Value' => $Value, 'Type' => $Type, 'Line' => $Line]; - }elseif(!empty($KeyWord)){ - $query += ['Host' => $KeyWord]; - } - $data = $this->send_reuqest('GET', 'ListRecords', $query); - if($data){ - $list = []; - foreach($data['Records'] as $row){ - if($row['Type'] == 'MX') list($row['MX'], $row['Value']) = explode(' ', $row['Value']); - $list[] = [ - 'RecordId' => $row['RecordID'], - 'Domain' => $this->domain, - 'Name' => $row['Host'], - 'Type' => $row['Type'], - 'Value' => $row['Value'], - 'Line' => $row['Line'], - 'TTL' => $row['TTL'], - 'MX' => isset($row['MX']) ? $row['MX'] : null, - 'Status' => $row['Enable'] ? '1' : '0', - 'Weight' => $row['Weight'], - 'Remark' => $row['Remark'], - 'UpdateTime' => $row['UpdatedAt'], - ]; - } - return ['total' => $data['TotalCount'], 'list' => $list]; - } - return false; - } - - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); - } - - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - $data = $this->send_reuqest('GET', 'QueryRecord', ['RecordID' => $RecordId]); - if($data){ - if($data['name'] == $data['zone_name']) $data['name'] = '@'; - if($data['Type'] == 'MX') list($data['MX'], $data['Value']) = explode(' ', $data['Value']); - return [ - 'RecordId' => $data['RecordID'], - 'Domain' => $this->domain, - 'Name' => $data['Host'], - 'Type' => $data['Type'], - 'Value' => $data['Value'], - 'Line' => $data['Line'], - 'TTL' => $data['TTL'], - 'MX' => isset($data['MX']) ? $data['MX'] : null, - 'Status' => $data['Enable'] ? '1' : '0', - 'Weight' => $data['Weight'], - 'Remark' => $data['Remark'], - 'UpdateTime' => $data['UpdatedAt'], - ]; - } - return false; - } - - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $params = ['ZID' => intval($this->domainid), 'Host' => $Name, 'Type' => $this->convertType($Type), 'Value' => $Value, 'Line'=>$Line, 'TTL' => intval($TTL), 'Remark' => $Remark]; - if($Type == 'MX') $params['Value'] = intval($MX) . ' ' . $Value; - if($Weight > 0) $params['Weight'] = $Weight; - $data = $this->send_reuqest('POST', 'CreateRecord', $params); - return is_array($data) ? $data['RecordID'] : false; - } - - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $params = ['RecordID' => $RecordId, 'Host' => $Name, 'Type' => $this->convertType($Type), 'Value' => $Value, 'Line'=>$Line, 'TTL' => intval($TTL), 'Remark' => $Remark]; - if($Type == 'MX') $params['Value'] = intval($MX) . ' ' . $Value; - if($Weight > 0) $params['Weight'] = $Weight; - $data = $this->send_reuqest('POST', 'UpdateRecord', $params); - return is_array($data); - } - - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - return false; - } - - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $data = $this->send_reuqest('POST', 'DeleteRecord', ['RecordID' => $RecordId]); - return $data; - } - - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - $params = ['RecordID' => $RecordId, 'Enable' => $Status == '1']; - $data = $this->send_reuqest('POST', 'UpdateRecordStatus', $params); - return is_array($data); - } - - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - return false; - } - - //获取解析线路列表 - public function getRecordLine(){ - $domainInfo = $this->getDomainInfo(); - if(!$domainInfo) return false; - $level = $this->getTradeInfo($domainInfo['TradeCode'])['level']; - $data = $this->send_reuqest('GET', 'ListLines', []); - if($data){ - $list = []; - $list['default'] = ['name' => '默认', 'parent' => null]; - foreach($data['Lines'] as $row){ - if($row['Value'] == 'default') continue; - if($row['Level'] > $level) continue; - $list[$row['Value']] = ['name' => $row['Name'], 'parent' => isset($row['FatherValue']) ? $row['FatherValue'] : null]; - } - - $data = $this->send_reuqest('GET', 'ListCustomLines', []); - if($data && $data['TotalCount'] > 0){ - $list['N.customer_lines'] = ['name' => '自定义线路', 'parent' => null]; - foreach($data['CustomerLines'] as $row){ - $list[$row['Line']] = ['name' => $row['NameCN'], 'parent' => 'N.customer_lines']; - } - } - - return $list; - } - return false; - } - - //获取域名概览信息 - public function getDomainInfo(){ - if(!empty($this->domainInfo)) return $this->domainInfo; - $query = ['ZID' => intval($this->domainid)]; - $data = $this->send_reuqest('GET', 'QueryZone', $query); - if($data){ - $this->domainInfo = $data; - return $data; - } - return false; - } - - //获取域名最低TTL - public function getMinTTL(){ - $domainInfo = $this->getDomainInfo(); - if($domainInfo){ - $ttl = $this->getTradeInfo($domainInfo['TradeCode'])['ttl']; - return $ttl; - } - return false; - } - - private function convertType($type){ - return $type; - } - - private function getTradeInfo($trade_code){ - if(array_key_exists($trade_code, self::$trade_code_list)){ - $trade_code = $trade_code; - }else{ - $trade_code = 'free_inner'; - } - return self::$trade_code_list[$trade_code]; - } - - private function send_reuqest($method, $action, $params = []){ - if(!empty($params)){ - $params = array_filter($params, function($a){ return $a!==null;}); - } - - $query = [ - 'Action' => $action, - 'Version' => $this->version, - ]; - - $body = ''; - if($method == 'GET'){ - $query = array_merge($query, $params); - }else{ - $body = !empty($params) ? json_encode($params) : ''; - } - - $time = time(); - $headers = [ - 'Host' => $this->endpoint, - 'X-Date' => gmdate("Ymd\THis\Z", $time), - //'X-Content-Sha256' => hash("sha256", $body), - ]; - if($body){ - $headers['Content-Type'] = 'application/json'; - } - $path = '/'; - - $authorization = $this->generateSign($method, $path, $query, $headers, $body, $time); - $headers['Authorization'] = $authorization; - - $url = 'https://'.$this->endpoint.$path.'?'.http_build_query($query); - $header = []; - foreach($headers as $key => $value){ - $header[] = $key.': '.$value; - } - return $this->curl($method, $url, $body, $header); - } - - private function generateSign($method, $path, $query, $headers, $body, $time){ - $algorithm = "HMAC-SHA256"; - - // step 1: build canonical request string - $httpRequestMethod = $method; - $canonicalUri = $path; - if(substr($canonicalUri, -1) != "/") $canonicalUri .= "/"; - $canonicalQueryString = $this->getCanonicalQueryString($query); - [$canonicalHeaders, $signedHeaders] = $this->getCanonicalHeaders($headers); - $hashedRequestPayload = hash("sha256", $body); - $canonicalRequest = $httpRequestMethod."\n" - .$canonicalUri."\n" - .$canonicalQueryString."\n" - .$canonicalHeaders."\n" - .$signedHeaders."\n" - .$hashedRequestPayload; - - // step 2: build string to sign - $date = gmdate("Ymd\THis\Z", $time); - $shortDate = substr($date, 0, 8); - $credentialScope = $shortDate . '/' .$this->region . '/' . $this->service . '/request'; - $hashedCanonicalRequest = hash("sha256", $canonicalRequest); - $stringToSign = $algorithm."\n" - .$date."\n" - .$credentialScope."\n" - .$hashedCanonicalRequest; - - // step 3: sign string - $kDate = hash_hmac("sha256", $shortDate, $this->SecretAccessKey, true); - $kRegion = hash_hmac("sha256", $this->region, $kDate, true); - $kService = hash_hmac("sha256", $this->service, $kRegion, true); - $kSigning = hash_hmac("sha256", "request", $kService, true); - $signature = hash_hmac("sha256", $stringToSign, $kSigning); - - // step 4: build authorization - $credential = $this->AccessKeyId . '/' . $shortDate . '/' . $this->region . '/' . $this->service . '/request'; - $authorization = $algorithm . ' Credential=' . $credential . ", SignedHeaders=" . $signedHeaders . ", Signature=" . $signature; - - return $authorization; - } - - private function escape($str) + public function __construct($config) { - $search = ['+', '*', '%7E']; - $replace = ['%20', '%2A', '~']; - return str_replace($search, $replace, urlencode($str)); + $this->AccessKeyId = $config['ak']; + $this->SecretAccessKey = $config['sk']; + $this->domain = $config['domain']; + $this->domainid = $config['domainid']; } - private function getCanonicalQueryString($parameters) + public function getError() { - if(empty($parameters)) return ''; + return $this->error; + } + + public function check() + { + if ($this->getDomainList() != false) { + return true; + } + return false; + } + + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $query = ['PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'Key' => $KeyWord]; + $data = $this->send_reuqest('GET', 'ListZones', $query); + if ($data) { + $list = []; + if (!empty($data['Zones'])) { + foreach ($data['Zones'] as $row) { + $list[] = [ + 'DomainId' => $row['ZID'], + 'Domain' => $row['ZoneName'], + 'RecordCount' => $row['RecordCount'], + ]; + } + } + return ['total' => $data['Total'], 'list' => $list]; + } + return false; + } + + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + $query = ['ZID' => intval($this->domainid), 'PageNumber' => $PageNumber, 'PageSize' => $PageSize, 'SearchOrder' => 'desc']; + if (!empty($SubDomain) || !empty($Type) || !empty($Line) || !empty($Value)) { + $query += ['Host' => $SubDomain, 'Value' => $Value, 'Type' => $Type, 'Line' => $Line]; + } elseif (!empty($KeyWord)) { + $query += ['Host' => $KeyWord]; + } + $data = $this->send_reuqest('GET', 'ListRecords', $query); + if ($data) { + $list = []; + foreach ($data['Records'] as $row) { + if ($row['Type'] == 'MX') list($row['MX'], $row['Value']) = explode(' ', $row['Value']); + $list[] = [ + 'RecordId' => $row['RecordID'], + 'Domain' => $this->domain, + 'Name' => $row['Host'], + 'Type' => $row['Type'], + 'Value' => $row['Value'], + 'Line' => $row['Line'], + 'TTL' => $row['TTL'], + 'MX' => isset($row['MX']) ? $row['MX'] : null, + 'Status' => $row['Enable'] ? '1' : '0', + 'Weight' => $row['Weight'], + 'Remark' => $row['Remark'], + 'UpdateTime' => $row['UpdatedAt'], + ]; + } + return ['total' => $data['TotalCount'], 'list' => $list]; + } + return false; + } + + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); + } + + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + $data = $this->send_reuqest('GET', 'QueryRecord', ['RecordID' => $RecordId]); + if ($data) { + if ($data['name'] == $data['zone_name']) $data['name'] = '@'; + if ($data['Type'] == 'MX') list($data['MX'], $data['Value']) = explode(' ', $data['Value']); + return [ + 'RecordId' => $data['RecordID'], + 'Domain' => $this->domain, + 'Name' => $data['Host'], + 'Type' => $data['Type'], + 'Value' => $data['Value'], + 'Line' => $data['Line'], + 'TTL' => $data['TTL'], + 'MX' => isset($data['MX']) ? $data['MX'] : null, + 'Status' => $data['Enable'] ? '1' : '0', + 'Weight' => $data['Weight'], + 'Remark' => $data['Remark'], + 'UpdateTime' => $data['UpdatedAt'], + ]; + } + return false; + } + + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $params = ['ZID' => intval($this->domainid), 'Host' => $Name, 'Type' => $this->convertType($Type), 'Value' => $Value, 'Line' => $Line, 'TTL' => intval($TTL), 'Remark' => $Remark]; + if ($Type == 'MX') $params['Value'] = intval($MX) . ' ' . $Value; + if ($Weight > 0) $params['Weight'] = $Weight; + $data = $this->send_reuqest('POST', 'CreateRecord', $params); + return is_array($data) ? $data['RecordID'] : false; + } + + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $params = ['RecordID' => $RecordId, 'Host' => $Name, 'Type' => $this->convertType($Type), 'Value' => $Value, 'Line' => $Line, 'TTL' => intval($TTL), 'Remark' => $Remark]; + if ($Type == 'MX') $params['Value'] = intval($MX) . ' ' . $Value; + if ($Weight > 0) $params['Weight'] = $Weight; + $data = $this->send_reuqest('POST', 'UpdateRecord', $params); + return is_array($data); + } + + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + return false; + } + + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $data = $this->send_reuqest('POST', 'DeleteRecord', ['RecordID' => $RecordId]); + return $data; + } + + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + $params = ['RecordID' => $RecordId, 'Enable' => $Status == '1']; + $data = $this->send_reuqest('POST', 'UpdateRecordStatus', $params); + return is_array($data); + } + + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + return false; + } + + //获取解析线路列表 + public function getRecordLine() + { + $domainInfo = $this->getDomainInfo(); + if (!$domainInfo) return false; + $level = $this->getTradeInfo($domainInfo['TradeCode'])['level']; + $data = $this->send_reuqest('GET', 'ListLines', []); + if ($data) { + $list = []; + $list['default'] = ['name' => '默认', 'parent' => null]; + foreach ($data['Lines'] as $row) { + if ($row['Value'] == 'default') continue; + if ($row['Level'] > $level) continue; + $list[$row['Value']] = ['name' => $row['Name'], 'parent' => isset($row['FatherValue']) ? $row['FatherValue'] : null]; + } + + $data = $this->send_reuqest('GET', 'ListCustomLines', []); + if ($data && $data['TotalCount'] > 0) { + $list['N.customer_lines'] = ['name' => '自定义线路', 'parent' => null]; + foreach ($data['CustomerLines'] as $row) { + $list[$row['Line']] = ['name' => $row['NameCN'], 'parent' => 'N.customer_lines']; + } + } + + return $list; + } + return false; + } + + //获取域名概览信息 + public function getDomainInfo() + { + if (!empty($this->domainInfo)) return $this->domainInfo; + $query = ['ZID' => intval($this->domainid)]; + $data = $this->send_reuqest('GET', 'QueryZone', $query); + if ($data) { + $this->domainInfo = $data; + return $data; + } + return false; + } + + //获取域名最低TTL + public function getMinTTL() + { + $domainInfo = $this->getDomainInfo(); + if ($domainInfo) { + $ttl = $this->getTradeInfo($domainInfo['TradeCode'])['ttl']; + return $ttl; + } + return false; + } + + private function convertType($type) + { + return $type; + } + + private function getTradeInfo($trade_code) + { + if (array_key_exists($trade_code, self::$trade_code_list)) { + $trade_code = $trade_code; + } else { + $trade_code = 'free_inner'; + } + return self::$trade_code_list[$trade_code]; + } + + private function send_reuqest($method, $action, $params = []) + { + if (!empty($params)) { + $params = array_filter($params, function ($a) { return $a !== null;}); + } + + $query = [ + 'Action' => $action, + 'Version' => $this->version, + ]; + + $body = ''; + if ($method == 'GET') { + $query = array_merge($query, $params); + } else { + $body = !empty($params) ? json_encode($params) : ''; + } + + $time = time(); + $headers = [ + 'Host' => $this->endpoint, + 'X-Date' => gmdate("Ymd\THis\Z", $time), + //'X-Content-Sha256' => hash("sha256", $body), + ]; + if ($body) { + $headers['Content-Type'] = 'application/json'; + } + $path = '/'; + + $authorization = $this->generateSign($method, $path, $query, $headers, $body, $time); + $headers['Authorization'] = $authorization; + + $url = 'https://'.$this->endpoint.$path.'?'.http_build_query($query); + $header = []; + foreach ($headers as $key => $value) { + $header[] = $key.': '.$value; + } + return $this->curl($method, $url, $body, $header); + } + + private function generateSign($method, $path, $query, $headers, $body, $time) + { + $algorithm = "HMAC-SHA256"; + + // step 1: build canonical request string + $httpRequestMethod = $method; + $canonicalUri = $path; + if (substr($canonicalUri, -1) != "/") $canonicalUri .= "/"; + $canonicalQueryString = $this->getCanonicalQueryString($query); + [$canonicalHeaders, $signedHeaders] = $this->getCanonicalHeaders($headers); + $hashedRequestPayload = hash("sha256", $body); + $canonicalRequest = $httpRequestMethod."\n" + .$canonicalUri."\n" + .$canonicalQueryString."\n" + .$canonicalHeaders."\n" + .$signedHeaders."\n" + .$hashedRequestPayload; + + // step 2: build string to sign + $date = gmdate("Ymd\THis\Z", $time); + $shortDate = substr($date, 0, 8); + $credentialScope = $shortDate . '/' .$this->region . '/' . $this->service . '/request'; + $hashedCanonicalRequest = hash("sha256", $canonicalRequest); + $stringToSign = $algorithm."\n" + .$date."\n" + .$credentialScope."\n" + .$hashedCanonicalRequest; + + // step 3: sign string + $kDate = hash_hmac("sha256", $shortDate, $this->SecretAccessKey, true); + $kRegion = hash_hmac("sha256", $this->region, $kDate, true); + $kService = hash_hmac("sha256", $this->service, $kRegion, true); + $kSigning = hash_hmac("sha256", "request", $kService, true); + $signature = hash_hmac("sha256", $stringToSign, $kSigning); + + // step 4: build authorization + $credential = $this->AccessKeyId . '/' . $shortDate . '/' . $this->region . '/' . $this->service . '/request'; + $authorization = $algorithm . ' Credential=' . $credential . ", SignedHeaders=" . $signedHeaders . ", Signature=" . $signature; + + return $authorization; + } + + private function escape($str) + { + $search = ['+', '*', '%7E']; + $replace = ['%20', '%2A', '~']; + return str_replace($search, $replace, urlencode($str)); + } + + private function getCanonicalQueryString($parameters) + { + if (empty($parameters)) return ''; ksort($parameters); - $canonicalQueryString = ''; - foreach ($parameters as $key => $value) { - $canonicalQueryString .= '&' . $this->escape($key). '=' . $this->escape($value); - } + $canonicalQueryString = ''; + foreach ($parameters as $key => $value) { + $canonicalQueryString .= '&' . $this->escape($key). '=' . $this->escape($value); + } return substr($canonicalQueryString, 1); } - private function getCanonicalHeaders($oldheaders){ - $headers = array(); + private function getCanonicalHeaders($oldheaders) + { + $headers = array(); foreach ($oldheaders as $key => $value) { $headers[strtolower($key)] = trim($value); } - ksort($headers); + ksort($headers); - $canonicalHeaders = ''; - $signedHeaders = ''; - foreach ($headers as $key => $value) { - $canonicalHeaders .= $key . ':' . $value . "\n"; - $signedHeaders .= $key . ';'; - } - $signedHeaders = substr($signedHeaders, 0, -1); - return [$canonicalHeaders, $signedHeaders]; - } + $canonicalHeaders = ''; + $signedHeaders = ''; + foreach ($headers as $key => $value) { + $canonicalHeaders .= $key . ':' . $value . "\n"; + $signedHeaders .= $key . ';'; + } + $signedHeaders = substr($signedHeaders, 0, -1); + return [$canonicalHeaders, $signedHeaders]; + } - private function curl($method, $url, $body, $header){ - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_HTTPHEADER, $header); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); - if(!empty($body)){ - curl_setopt($ch, CURLOPT_POSTFIELDS, $body); - } - $response = curl_exec($ch); - $errno = curl_errno($ch); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - curl_close($ch); - if ($errno) return false; + private function curl($method, $url, $body, $header) + { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); + if (!empty($body)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + } + $response = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + curl_close($ch); + if ($errno) return false; - $arr=json_decode($response,true); - if($arr){ - if(isset($arr['ResponseMetadata']['Error']['MessageCN'])){ - $this->setError($arr['ResponseMetadata']['Error']['MessageCN']); - return false; - }elseif(isset($arr['ResponseMetadata']['Error']['Message'])){ - $this->setError($arr['ResponseMetadata']['Error']['Message']); - return false; - }elseif(isset($arr['Result'])){ - return $arr['Result']; - }else{ - return true; - } - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + $arr = json_decode($response, true); + if ($arr) { + if (isset($arr['ResponseMetadata']['Error']['MessageCN'])) { + $this->setError($arr['ResponseMetadata']['Error']['MessageCN']); + return false; + } elseif (isset($arr['ResponseMetadata']['Error']['Message'])) { + $this->setError($arr['ResponseMetadata']['Error']['Message']); + return false; + } elseif (isset($arr['Result'])) { + return $arr['Result']; + } else { + return true; + } + } else { + $this->setError('返回数据解析失败'); + return false; + } + } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } -} \ No newline at end of file + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } +} diff --git a/app/lib/dns/west.php b/app/lib/dns/west.php index 54994e7..9303f2a 100644 --- a/app/lib/dns/west.php +++ b/app/lib/dns/west.php @@ -1,4 +1,5 @@ username = $config['ak']; - $this->api_password = $config['sk']; - $this->domain = $config['domain']; - } + public function __construct($config) + { + $this->username = $config['ak']; + $this->api_password = $config['sk']; + $this->domain = $config['domain']; + } - public function getError(){ - return $this->error; - } + public function getError() + { + return $this->error; + } - public function check(){ - if($this->getDomainList() != false){ - return true; - } - return false; - } + public function check() + { + if ($this->getDomainList() != false) { + return true; + } + return false; + } - //获取域名列表 - public function getDomainList($KeyWord=null, $PageNumber=1, $PageSize=20){ - $param = ['act' => 'getdomains', 'page' => $PageNumber, 'limit' => $PageSize, 'domain' => $KeyWord]; - $data = $this->execute('/domain/', $param); - if($data){ - $list = []; - foreach($data['items'] as $row){ - $list[] = [ - 'DomainId' => $row['domain'], - 'Domain' => $row['domain'], - 'RecordCount' => 0, - ]; - } - return ['total' => $data['total'], 'list' => $list]; - } - return false; - } + //获取域名列表 + public function getDomainList($KeyWord = null, $PageNumber = 1, $PageSize = 20) + { + $param = ['act' => 'getdomains', 'page' => $PageNumber, 'limit' => $PageSize, 'domain' => $KeyWord]; + $data = $this->execute('/domain/', $param); + if ($data) { + $list = []; + foreach ($data['items'] as $row) { + $list[] = [ + 'DomainId' => $row['domain'], + 'Domain' => $row['domain'], + 'RecordCount' => 0, + ]; + } + return ['total' => $data['total'], 'list' => $list]; + } + return false; + } - //获取解析记录列表 - public function getDomainRecords($PageNumber=1, $PageSize=20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null){ - $param = ['act' => 'getdnsrecord', 'domain' => $this->domain, 'type' => $Type, 'line' => $Line, 'host' => $KeyWord, 'value' => $Value, 'pageno' => $PageNumber, 'limit' => $PageSize]; - if(!isNullOrEmpty(($SubDomain))){ - $param['host'] = $SubDomain; - } - $data = $this->execute('/domain/', $param); - if($data){ - $list = []; - foreach($data['items'] as $row){ - $list[] = [ - 'RecordId' => $row['id'], - 'Domain' => $this->domain, - 'Name' => $row['item'], - 'Type' => $row['type'], - 'Value' => $row['value'], - 'Line' => $row['line'], - 'TTL' => $row['ttl'], - 'MX' => $row['level'], - 'Status' => $row['pause'] == 1 ? '0' : '1', - 'Weight' => null, - 'Remark' => null, - 'UpdateTime' => null, - ]; - } - return ['total' => $data['total'], 'list' => $list]; - } - return false; - } + //获取解析记录列表 + public function getDomainRecords($PageNumber = 1, $PageSize = 20, $KeyWord = null, $SubDomain = null, $Value = null, $Type = null, $Line = null, $Status = null) + { + $param = ['act' => 'getdnsrecord', 'domain' => $this->domain, 'type' => $Type, 'line' => $Line, 'host' => $KeyWord, 'value' => $Value, 'pageno' => $PageNumber, 'limit' => $PageSize]; + if (!isNullOrEmpty(($SubDomain))) { + $param['host'] = $SubDomain; + } + $data = $this->execute('/domain/', $param); + if ($data) { + $list = []; + foreach ($data['items'] as $row) { + $list[] = [ + 'RecordId' => $row['id'], + 'Domain' => $this->domain, + 'Name' => $row['item'], + 'Type' => $row['type'], + 'Value' => $row['value'], + 'Line' => $row['line'], + 'TTL' => $row['ttl'], + 'MX' => $row['level'], + 'Status' => $row['pause'] == 1 ? '0' : '1', + 'Weight' => null, + 'Remark' => null, + 'UpdateTime' => null, + ]; + } + return ['total' => $data['total'], 'list' => $list]; + } + return false; + } - //获取子域名解析记录列表 - public function getSubDomainRecords($SubDomain, $PageNumber=1, $PageSize=20, $Type = null, $Line = null){ - if($SubDomain == '')$SubDomain='@'; - return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); - } + //获取子域名解析记录列表 + public function getSubDomainRecords($SubDomain, $PageNumber = 1, $PageSize = 20, $Type = null, $Line = null) + { + if ($SubDomain == '') $SubDomain = '@'; + return $this->getDomainRecords($PageNumber, $PageSize, null, $SubDomain, null, $Type, $Line); + } - //获取解析记录详细信息 - public function getDomainRecordInfo($RecordId){ - return false; - } + //获取解析记录详细信息 + public function getDomainRecordInfo($RecordId) + { + return false; + } - //添加解析记录 - public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $param = ['act' => 'adddnsrecord', 'domain' => $this->domain, 'host' => $Name, 'type' => $this->convertType($Type), 'value' => $Value, 'level' => $MX, 'ttl' => intval($TTL), 'line' => $Line]; - $data = $this->execute('/domain/', $param); - return is_array($data) ? $data['id'] : false; - } + //添加解析记录 + public function addDomainRecord($Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $param = ['act' => 'adddnsrecord', 'domain' => $this->domain, 'host' => $Name, 'type' => $this->convertType($Type), 'value' => $Value, 'level' => $MX, 'ttl' => intval($TTL), 'line' => $Line]; + $data = $this->execute('/domain/', $param); + return is_array($data) ? $data['id'] : false; + } - //修改解析记录 - public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null){ - $param = ['act' => 'moddnsrecord', 'domain' => $this->domain, 'id' => $RecordId, 'type' => $this->convertType($Type), 'value' => $Value, 'level' => $MX, 'ttl' => intval($TTL), 'line' => $Line]; - $data = $this->execute('/domain/', $param); - return is_array($data); - } + //修改解析记录 + public function updateDomainRecord($RecordId, $Name, $Type, $Value, $Line = '0', $TTL = 600, $MX = 1, $Weight = null, $Remark = null) + { + $param = ['act' => 'moddnsrecord', 'domain' => $this->domain, 'id' => $RecordId, 'type' => $this->convertType($Type), 'value' => $Value, 'level' => $MX, 'ttl' => intval($TTL), 'line' => $Line]; + $data = $this->execute('/domain/', $param); + return is_array($data); + } - //修改解析记录备注 - public function updateDomainRecordRemark($RecordId, $Remark){ - return false; - } + //修改解析记录备注 + public function updateDomainRecordRemark($RecordId, $Remark) + { + return false; + } - //删除解析记录 - public function deleteDomainRecord($RecordId){ - $param = ['act' => 'deldnsrecord', 'domain' => $this->domain, 'id' => $RecordId]; - $data = $this->execute('/domain/', $param); - return is_array($data); - } + //删除解析记录 + public function deleteDomainRecord($RecordId) + { + $param = ['act' => 'deldnsrecord', 'domain' => $this->domain, 'id' => $RecordId]; + $data = $this->execute('/domain/', $param); + return is_array($data); + } - //设置解析记录状态 - public function setDomainRecordStatus($RecordId, $Status){ - $param = ['act' => 'pause', 'domain' => $this->domain, 'id' => $RecordId, 'val' => $Status == '1' ? '0' : '1']; - $data = $this->execute('/domain/', $param); - return $data !== false; - } + //设置解析记录状态 + public function setDomainRecordStatus($RecordId, $Status) + { + $param = ['act' => 'pause', 'domain' => $this->domain, 'id' => $RecordId, 'val' => $Status == '1' ? '0' : '1']; + $data = $this->execute('/domain/', $param); + return $data !== false; + } - //获取解析记录操作日志 - public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null){ - return false; - } + //获取解析记录操作日志 + public function getDomainRecordLog($PageNumber = 1, $PageSize = 20, $KeyWord = null, $StartDate = null, $endDate = null) + { + return false; + } - //获取解析线路列表 - public function getRecordLine(){ - return [ - ''=>['name'=>'默认', 'parent'=>null], - 'LTEL'=>['name'=>'电信', 'parent'=>null], - 'LCNC'=>['name'=>'联通', 'parent'=>null], - 'LMOB'=>['name'=>'移动', 'parent'=>null], - 'LEDU'=>['name'=>'教育网', 'parent'=>null], - 'LSEO'=>['name'=>'搜索引擎', 'parent'=>null], - 'LFOR'=>['name'=>'境外', 'parent'=>null], - ]; - } + //获取解析线路列表 + public function getRecordLine() + { + return [ + '' => ['name' => '默认', 'parent' => null], + 'LTEL' => ['name' => '电信', 'parent' => null], + 'LCNC' => ['name' => '联通', 'parent' => null], + 'LMOB' => ['name' => '移动', 'parent' => null], + 'LEDU' => ['name' => '教育网', 'parent' => null], + 'LSEO' => ['name' => '搜索引擎', 'parent' => null], + 'LFOR' => ['name' => '境外', 'parent' => null], + ]; + } - //获取域名信息 - public function getDomainInfo(){ - return false; - } + //获取域名信息 + public function getDomainInfo() + { + return false; + } - //获取域名最低TTL - public function getMinTTL(){ - return false; - } + //获取域名最低TTL + public function getMinTTL() + { + return false; + } - private function convertType($type){ - return $type; - } + private function convertType($type) + { + return $type; + } - private function execute($path, $params){ - $params['username'] = $this->username; - $params['time'] = $this->getMillisecond(); - $params['token'] = md5($this->username.$this->api_password.$params['time']); - $response = $this->curl($path, $params); - $response = mb_convert_encoding($response, 'UTF-8', 'GBK'); - $arr=json_decode($response,true); - if($arr){ - if($arr['result'] == 200){ - return isset($arr['data']) ? $arr['data'] : []; - }else{ - $this->setError($arr['msg']); - return false; - } - }else{ - $this->setError('返回数据解析失败'); - return false; - } - } + private function execute($path, $params) + { + $params['username'] = $this->username; + $params['time'] = $this->getMillisecond(); + $params['token'] = md5($this->username.$this->api_password.$params['time']); + $response = $this->curl($path, $params); + $response = mb_convert_encoding($response, 'UTF-8', 'GBK'); + $arr = json_decode($response, true); + if ($arr) { + if ($arr['result'] == 200) { + return isset($arr['data']) ? $arr['data'] : []; + } else { + $this->setError($arr['msg']); + return false; + } + } else { + $this->setError('返回数据解析失败'); + return false; + } + } - private function curl($path, $params = null){ - $url = $this->baseUrl . $path; - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - if ($params) { + private function curl($path, $params = null) + { + $url = $this->baseUrl . $path; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + if ($params) { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); } - $response = curl_exec($ch); - $errno = curl_errno($ch); - if ($errno) { - $this->setError('Curl error: ' . curl_error($ch)); - } - curl_close($ch); - if ($errno) return false; - return $response; - } + $response = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $this->setError('Curl error: ' . curl_error($ch)); + } + curl_close($ch); + if ($errno) return false; + return $response; + } - private function getMillisecond() + private function getMillisecond() { list($s1, $s2) = explode(' ', microtime()); return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000); } - private function setError($message){ - $this->error = $message; - //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); - } -} \ No newline at end of file + private function setError($message) + { + $this->error = $message; + //file_put_contents('logs.txt',date('H:i:s').' '.$message."\r\n", FILE_APPEND); + } +} diff --git a/app/lib/mail/Aliyun.php b/app/lib/mail/Aliyun.php index 82225f8..058625b 100644 --- a/app/lib/mail/Aliyun.php +++ b/app/lib/mail/Aliyun.php @@ -1,72 +1,73 @@ AccessKeyId = $AccessKeyId; - $this->AccessKeySecret = $AccessKeySecret; - } - private function aliyunSignature($parameters, $accessKeySecret, $method) - { - ksort($parameters); - $canonicalizedQueryString = ''; - foreach ($parameters as $key => $value) { - if($value === null) continue; - $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value); - } - $stringToSign = $method . '&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1)); - $signature = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&", true)); + public function __construct($AccessKeyId, $AccessKeySecret) + { + $this->AccessKeyId = $AccessKeyId; + $this->AccessKeySecret = $AccessKeySecret; + } + private function aliyunSignature($parameters, $accessKeySecret, $method) + { + ksort($parameters); + $canonicalizedQueryString = ''; + foreach ($parameters as $key => $value) { + if ($value === null) continue; + $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value); + } + $stringToSign = $method . '&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1)); + $signature = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&", true)); - return $signature; - } - private function percentEncode($str) - { - $search = ['+', '*', '%7E']; - $replace = ['%20', '%2A', '~']; - return str_replace($search, $replace, urlencode($str)); - } - public function send($to, $sub, $msg, $from, $from_name) - { - if (empty($this->AccessKeyId) || empty($this->AccessKeySecret)) return false; - $url = 'https://dm.aliyuncs.com/'; - $data = array( - 'Action' => 'SingleSendMail', - 'AccountName' => $from, - 'ReplyToAddress' => 'false', - 'AddressType' => 1, - 'ToAddress' => $to, - 'FromAlias' => $from_name, - 'Subject' => $sub, - 'HtmlBody' => $msg, - 'Format' => 'JSON', - 'Version' => '2015-11-23', - 'AccessKeyId' => $this->AccessKeyId, - 'SignatureMethod' => 'HMAC-SHA1', - 'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), - 'SignatureVersion' => '1.0', - 'SignatureNonce' => random(8) - ); - $data['Signature'] = $this->aliyunSignature($data, $this->AccessKeySecret, 'POST'); - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); - $json = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - $arr = json_decode($json, true); - if ($httpCode == 200) { - return true; - } else { - return $arr['Message']; - } - } -} \ No newline at end of file + return $signature; + } + private function percentEncode($str) + { + $search = ['+', '*', '%7E']; + $replace = ['%20', '%2A', '~']; + return str_replace($search, $replace, urlencode($str)); + } + public function send($to, $sub, $msg, $from, $from_name) + { + if (empty($this->AccessKeyId) || empty($this->AccessKeySecret)) return false; + $url = 'https://dm.aliyuncs.com/'; + $data = array( + 'Action' => 'SingleSendMail', + 'AccountName' => $from, + 'ReplyToAddress' => 'false', + 'AddressType' => 1, + 'ToAddress' => $to, + 'FromAlias' => $from_name, + 'Subject' => $sub, + 'HtmlBody' => $msg, + 'Format' => 'JSON', + 'Version' => '2015-11-23', + 'AccessKeyId' => $this->AccessKeyId, + 'SignatureMethod' => 'HMAC-SHA1', + 'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), + 'SignatureVersion' => '1.0', + 'SignatureNonce' => random(8) + ); + $data['Signature'] = $this->aliyunSignature($data, $this->AccessKeySecret, 'POST'); + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); + $json = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + $arr = json_decode($json, true); + if ($httpCode == 200) { + return true; + } else { + return $arr['Message']; + } + } +} diff --git a/app/lib/mail/Sendcloud.php b/app/lib/mail/Sendcloud.php index 1cac438..35c8c8d 100644 --- a/app/lib/mail/Sendcloud.php +++ b/app/lib/mail/Sendcloud.php @@ -1,37 +1,42 @@ apiUser = $apiUser; $this->apiKey = $apiKey; } - public function send($to, $sub, $msg, $from, $from_name){ - if(empty($this->apiUser)||empty($this->apiKey))return false; - $url='http://api.sendcloud.net/apiv2/mail/send'; - $data=array( - 'apiUser' => $this->apiUser, - 'apiKey' => $this->apiKey, - 'from' => $from, - 'fromName' => $from_name, - 'to' => $to, - 'subject' => $sub, - 'html' => $msg); - $ch=curl_init($url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, $data); - $json=curl_exec($ch); - curl_close($ch); - $arr=json_decode($json,true); - if($arr['statusCode']==200){ - return true; - }else{ - return implode("\n",$arr['message']); - } - } + public function send($to, $sub, $msg, $from, $from_name) + { + if (empty($this->apiUser) || empty($this->apiKey)) return false; + $url = 'http://api.sendcloud.net/apiv2/mail/send'; + $data = array( + 'apiUser' => $this->apiUser, + 'apiKey' => $this->apiKey, + 'from' => $from, + 'fromName' => $from_name, + 'to' => $to, + 'subject' => $sub, + 'html' => $msg + ); + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + $json = curl_exec($ch); + curl_close($ch); + $arr = json_decode($json, true); + if ($arr['statusCode'] == 200) { + return true; + } else { + return implode("\n", $arr['message']); + } + } } diff --git a/app/middleware/AuthApi.php b/app/middleware/AuthApi.php index 141dc3e..cba9c72 100644 --- a/app/middleware/AuthApi.php +++ b/app/middleware/AuthApi.php @@ -1,4 +1,5 @@ -1, 'msg'=>'认证参数不能为空'])->code(403); + if (!$uid || empty($timestamp) || empty($sign)) { + return json(['code' => -1, 'msg' => '认证参数不能为空'])->code(403); } - if($timestamp < time()-300 || $timestamp > time()+300){ - return json(['code'=>-1, 'msg'=>'时间戳不合法'])->code(403); + if ($timestamp < time() - 300 || $timestamp > time() + 300) { + return json(['code' => -1, 'msg' => '时间戳不合法'])->code(403); } $user = Db::name('user')->where('id', $uid)->find(); - if(!$user) return json(['code'=>-1, 'msg'=>'用户不存在'])->code(403); - if($user['status'] == 0) return json(['code'=>-1, 'msg'=>'该用户已被封禁'])->code(403); - if($user['is_api'] == 0) return json(['code'=>-1, 'msg'=>'该用户未开启API权限'])->code(403); - if(md5($uid.$timestamp.$user['apikey']) !== $sign){ - return json(['code'=>-1, 'msg'=>'签名错误'])->code(403); + if (!$user) { + return json(['code' => -1, 'msg' => '用户不存在'])->code(403); + } + if ($user['status'] == 0) { + return json(['code' => -1, 'msg' => '该用户已被封禁'])->code(403); + } + if ($user['is_api'] == 0) { + return json(['code' => -1, 'msg' => '该用户未开启API权限'])->code(403); + } + if (md5($uid.$timestamp.$user['apikey']) !== $sign) { + return json(['code' => -1, 'msg' => '签名错误'])->code(403); } $user['type'] = 'user'; $user['permission'] = []; - if($user['level'] == 1){ + if ($user['level'] == 1) { $user['permission'] = Db::name('permission')->where('uid', $uid)->column('domain'); } diff --git a/app/middleware/AuthUser.php b/app/middleware/AuthUser.php index 833de49..a953ef3 100644 --- a/app/middleware/AuthUser.php +++ b/app/middleware/AuthUser.php @@ -1,4 +1,5 @@ where('id', $uid)->find(); - if($user && $user['status']==1){ - $session=md5($user['id'].$user['password']); - if($session==$sid && $expiretime>time()) { + if ($user && $user['status'] == 1) { + $session = md5($user['id'].$user['password']); + if ($session == $sid && $expiretime > time()) { $islogin = true; } $user['type'] = 'user'; $user['permission'] = []; - if($user['level'] == 1){ + if ($user['level'] == 1) { $user['permission'] = Db::name('permission')->where('uid', $uid)->column('domain'); } } - }elseif($type == 'domain'){ + } elseif ($type == 'domain') { $user = Db::name('domain')->where('id', $uid)->find(); - if($user && $user['is_sso']==1){ - $session=md5($user['id'].$user['name']); - if($session==$sid && $expiretime>time()) { + if ($user && $user['is_sso'] == 1) { + $session = md5($user['id'].$user['name']); + if ($session == $sid && $expiretime > time()) { $islogin = true; } $user['username'] = $user['name']; diff --git a/app/middleware/CheckLogin.php b/app/middleware/CheckLogin.php index 08016dc..b3689c1 100644 --- a/app/middleware/CheckLogin.php +++ b/app/middleware/CheckLogin.php @@ -1,16 +1,16 @@ islogin) { + if (!$request->islogin) { if ($request->isAjax() || !$request->isGet()) { - return json(['code'=>-1, 'msg'=>'未登录'])->code(401); + return json(['code' => -1, 'msg' => '未登录'])->code(401); } return redirect((string)url('/login')); } diff --git a/app/middleware/LoadConfig.php b/app/middleware/LoadConfig.php index 198c39a..2502714 100644 --- a/app/middleware/LoadConfig.php +++ b/app/middleware/LoadConfig.php @@ -1,5 +1,6 @@ getRootPath().'.env')){ - if(strpos(request()->url(),'/install')===false){ + if (!file_exists(app()->getRootPath().'.env')) { + if (strpos($this->request->url(), '/install') === false) { return redirect((string)url('/install'))->header([ 'Cache-Control' => 'no-store, no-cache, must-revalidate', 'Pragma' => 'no-cache', ]); - }else{ + } else { return $next($request); } } - - try{ - $res = Db::name('config')->cache('configs',0)->column('value','key'); - if(empty($res['sys_key']) && !empty(env('app.sys_key'))){ + + try { + $res = Db::name('config')->cache('configs', 0)->column('value', 'key'); + if (empty($res['sys_key']) && !empty(env('app.sys_key'))) { config_set('sys_key', env('app.sys_key')); Cache::delete('configs'); $res['sys_key'] = env('app.sys_key'); } Config::set($res, 'sys'); - }catch(Exception $e){ - if(!strpos($e->getMessage(), 'doesn\'t exist')){ + } catch (Exception $e) { + if (!strpos($e->getMessage(), 'doesn\'t exist')) { throw $e; } } diff --git a/app/middleware/RefererCheck.php b/app/middleware/RefererCheck.php index 7282761..7994ebd 100644 --- a/app/middleware/RefererCheck.php +++ b/app/middleware/RefererCheck.php @@ -1,4 +1,5 @@ - +
diff --git a/app/view/dmonitor/proxyset.html b/app/view/dmonitor/proxyset.html index 119a3f3..083d817 100644 --- a/app/view/dmonitor/proxyset.html +++ b/app/view/dmonitor/proxyset.html @@ -33,7 +33,8 @@

-
+

+ 测试连通性
@@ -48,16 +49,6 @@ var items = $("select[default]"); for (i = 0; i < items.length; i++) { $(items[i]).val($(items[i]).attr("default")||0); } -$("select[name='mail_type']").change(function(){ - if($(this).val() == 0){ - $("#frame_set1").show(); - $("#frame_set2").hide(); - }else{ - $("#frame_set1").hide(); - $("#frame_set2").show(); - } -}); -$("select[name='mail_type']").change(); function saveSetting(obj){ var ii = layer.load(2, {shade:[0.1,'#fff']}); $.ajax({ @@ -85,42 +76,32 @@ function saveSetting(obj){ }); return false; } -function mailtest(){ +function proxytest(){ + var proxy_server = $("input[name='proxy_server']").val(); + var proxy_port = $("input[name='proxy_port']").val(); + var proxy_user = $("input[name='proxy_user']").val(); + var proxy_pwd = $("input[name='proxy_pwd']").val(); + var proxy_type = $("select[name='proxy_type']").val(); + if(proxy_server=='' || proxy_port==''){ + layer.alert('代理服务器和端口不能为空!'); + return false; + } var ii = layer.load(2, {shade:[0.1,'#fff']}); $.ajax({ - type : 'GET', - url : '/dmonitor/mailtest', + type : 'POST', + url : '/dmonitor/proxytest', + data : {proxy_server:proxy_server, proxy_port:proxy_port, proxy_user:proxy_user, proxy_pwd:proxy_pwd, proxy_type:proxy_type}, dataType : 'json', success : function(data) { layer.close(ii); if(data.code == 0){ - layer.alert(data.msg, {icon: 1}); + layer.alert('连通性测试成功!', {icon: 1}) }else{ - layer.alert(data.msg, {icon: 2}) + layer.alert('连通性测试失败:'+data.msg, {icon: 2}) } }, error:function(data){ - layer.close(ii); - layer.msg('服务器错误'); - } - }); -} -function tgbottest(){ - var ii = layer.load(2, {shade:[0.1,'#fff']}); - $.ajax({ - type : 'GET', - url : '/dmonitor/tgbottest', - dataType : 'json', - success : function(data) { layer.close(ii); - if(data.code == 0){ - layer.alert(data.msg, {icon: 1}); - }else{ - layer.alert(data.msg, {icon: 2}) - } - }, - error:function(data){ - layer.close(ii); layer.msg('服务器错误'); } }); diff --git a/app/view/domain/domain.html b/app/view/domain/domain.html index 60d1811..6b4e871 100644 --- a/app/view/domain/domain.html +++ b/app/view/domain/domain.html @@ -145,7 +145,7 @@ $(document).ready(function(){ field: 'typename', title: '平台账户', formatter: function(value, row, index) { - return ''+value+'('+row.aid+')'; + return ''+(row.aremark?row.aremark:value+'('+row.aid+')'); } }, { @@ -193,10 +193,7 @@ $(document).ready(function(){ return html; } }, - ], - onLoadSuccess: function(data) { - $('[data-toggle="tooltip"]').tooltip() - } + ] }) $("#form-store select[name=aid]").change(function(){ diff --git a/app/view/exception.tpl b/app/view/exception.tpl index 72872ed..302f24e 100644 --- a/app/view/exception.tpl +++ b/app/view/exception.tpl @@ -68,7 +68,7 @@ if (!function_exists('parse_args')) { break; } - $result[] = is_int($key) ? $value : "'{$key}' => {$value}"; + $result[] = is_int($key) ? $value : sprintf('\'%s\' => %s', htmlentities($key), $value); } return implode(', ', $result); diff --git a/app/view/index/index.html b/app/view/index/index.html index 473cbe7..d0669d8 100644 --- a/app/view/index/index.html +++ b/app/view/index/index.html @@ -59,7 +59,7 @@

0

-

平台数量

+

DNS平台数量

diff --git a/composer.json b/composer.json index c24415b..a891706 100644 --- a/composer.json +++ b/composer.json @@ -1,26 +1,43 @@ { - "name": "topthink/think", - "description": "the new thinkphp framework", + "name": "netcccyun/dnsmgr", + "description": "聚合DNS管理系统", "type": "project", "keywords": [ - "framework", "thinkphp", - "ORM" + "dns", + "dnsmanager", + "cccyun" ], - "homepage": "https://www.thinkphp.cn/", + "homepage": "https://blog.cccyun.cn/post-526.html", "license": "Apache-2.0", "authors": [ { "name": "liu21st", - "email": "liu21st@gmail.com" + "email": "liu21st@gmail.com", + "role": "Framework Developer" }, { "name": "yunwuxin", - "email": "448901948@qq.com" - } + "email": "448901948@qq.com", + "role": "Framework Developer" + }, + { + "name": "netcccyun", + "homepage": "https://blog.cccyun.cn", + "role": "Project Owner" + }, + { + "name": "coolxitech", + "email": "admin@kuxi.tech", + "homepage": "https://www.kuxi.tech", + "role": "Project Developer" + } ], "require": { - "php": ">=7.2.5", + "php": ">=7.4.0", + "ext-pdo": "*", + "ext-gd": "*", + "ext-curl": "*", "topthink/framework": "^6.0.0", "topthink/think-orm": "^2.0", "topthink/think-view": "^1.0", diff --git a/config/app.php b/config/app.php index 546c79c..87ae3bc 100644 --- a/config/app.php +++ b/config/app.php @@ -31,7 +31,7 @@ return [ 'show_error_msg' => true, 'exception_tmpl' => \think\facade\App::getAppPath() . 'view/exception.tpl', - 'version' => '1017', + 'version' => '1018', 'dbversion' => '1011' ]; diff --git a/config/captcha.php b/config/captcha.php index 6ec80f6..fa92965 100644 --- a/config/captcha.php +++ b/config/captcha.php @@ -30,7 +30,8 @@ return [ 'imageH' => 0, // 验证码图片宽度 'imageW' => 0, - + // 验证成功后是否重置 + 'reset' => true, // 添加额外的验证码设置 // verify => [ // 'length'=>4, diff --git a/route/app.php b/route/app.php index 992a09e..2a6d686 100644 --- a/route/app.php +++ b/route/app.php @@ -8,19 +8,23 @@ // +---------------------------------------------------------------------- // | Author: liu21st // +---------------------------------------------------------------------- +use app\middleware\AuthApi; +use app\middleware\CheckLogin; +use app\middleware\ViewOutput; use think\facade\Route; +use think\middleware\SessionInit; Route::pattern([ 'id' => '\d+', ]); Route::any('/install', 'install/index') -->middleware(\app\middleware\ViewOutput::class); +->middleware(ViewOutput::class); -Route::get('/verifycode', 'auth/verifycode')->middleware(\think\middleware\SessionInit::class) -->middleware(\app\middleware\ViewOutput::class); -Route::any('/login', 'auth/login')->middleware(\think\middleware\SessionInit::class) -->middleware(\app\middleware\ViewOutput::class); +Route::get('/verifycode', 'auth/verifycode')->middleware(SessionInit::class) +->middleware(ViewOutput::class); +Route::any('/login', 'auth/login')->middleware(SessionInit::class) +->middleware(ViewOutput::class); Route::get('/logout', 'auth/logout'); Route::any('/quicklogin', 'auth/quicklogin'); Route::any('/dmtask/status', 'dmonitor/status'); @@ -72,6 +76,7 @@ Route::group(function () { Route::any('/dmonitor/proxyset', 'dmonitor/proxyset'); Route::get('/dmonitor/mailtest', 'dmonitor/mailtest'); Route::get('/dmonitor/tgbottest', 'dmonitor/tgbottest'); + Route::post('/dmonitor/proxytest', 'dmonitor/proxytest'); Route::post('/dmonitor/clean', 'dmonitor/clean'); Route::any('/optimizeip/opipset', 'optimizeip/opipset'); @@ -80,8 +85,8 @@ Route::group(function () { Route::get('/optimizeip/opiplist', 'optimizeip/opiplist'); Route::any('/optimizeip/opipform/:action', 'optimizeip/opipform'); -})->middleware(\app\middleware\CheckLogin::class) -->middleware(\app\middleware\ViewOutput::class); +})->middleware(CheckLogin::class) +->middleware(ViewOutput::class); Route::group('api', function () { Route::post('/domain/:id', 'domain/domain_info'); @@ -95,7 +100,7 @@ Route::group('api', function () { Route::post('/record/remark/:id', 'domain/record_remark'); Route::post('/record/batch/:id', 'domain/record_batch'); -})->middleware(\app\middleware\AuthApi::class); +})->middleware(AuthApi::class); Route::miss(function() { return response('404 Not Found')->code(404);