feat(dmonitor): 同步原仓库添加代理服务器连通性测试功能

- 在代理服务器设置页面添加测试连通性按钮
- 实现代理服务器连通性测试的后端接口和前端逻辑
- 优化代理服务器设置页面的代码结构
This commit is contained in:
coolxitech 2024-11-09 20:04:21 +08:00
parent 9fb1e34715
commit aef7bce4b8
5 changed files with 174 additions and 133 deletions

View File

@ -30,7 +30,7 @@ function get_curl(string $url, $post = 0, $referer = 0, $cookie = 0, $header = 0
$response = $client->post($url, [
'form_params' => $post,
'headers' => $header,
'verify' => false
'verify' => false,
]);
}
@ -83,7 +83,7 @@ function dstrpos($string, $arr)
function checkmobile()
{
$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
$ualist = array('android', 'midp', 'nokia', 'mobile', 'iphone', 'ipod', 'blackberry', 'windows phone');
$ualist = ['android', 'midp', 'nokia', 'mobile', 'iphone', 'ipod', 'blackberry', 'windows phone'];
if ((dstrpos($useragent, $ualist) || strexists($_SERVER['HTTP_ACCEPT'], "VND.WAP") || strexists($_SERVER['HTTP_VIA'], "wap"))) {
return true;
} else {
@ -104,7 +104,7 @@ function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
$rndkey = [];
for ($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
@ -256,7 +256,7 @@ function config_set($key, $value)
function getMillisecond()
{
list($s1, $s2) = explode(' ', microtime());
[$s1, $s2] = explode(' ', microtime());
return (int)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
}
@ -287,3 +287,42 @@ function convert_second($s)
}
}
}
function check_proxy($url, $proxy_server, $proxy_port, $type, $proxy_user, $proxy_pwd)
{
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;
}
$options = [
CURLOPT_PROXYTYPE => $proxy_type,
CURLOPT_PROXYAUTH => CURLAUTH_BASIC,
CURLOPT_PROXY => $proxy_server,
CURLOPT_PROXYUSERPWD => !empty($proxy_user) && !empty($proxy_pwd) ? $proxy_user . ':' . $proxy_pwd : '',
CURLOPT_PROXYPORT => $proxy_port,
];
$client = new Client([
'curl' => $options,
'timeout' => 3,
'verify' => false,
'headers' => [
'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
],
]);
try {
$response = $client->request('GET', $url);
} catch (\GuzzleHttp\Exception\RequestException $e) {
throw new Exception($e->getMessage());
}
$httpCode = $response->getStatusCode();
if ($httpCode >= 200 && $httpCode < 400) {
return true;
} else {
throw new Exception('HTTP状态码异常' . $httpCode);
}
}

View File

@ -284,6 +284,26 @@ class Dmonitor extends BaseController
}
}
public function proxytest()
{
if (!checkPermission(2)) return $this->alert('error', '无权限');
$proxy_server = $this->request->post('proxy_server');
$proxy_port = $this->request->post('proxy_port');
$proxy_user = $this->request->post('proxy_user');
$proxy_pwd = $this->request->post('proxy_pwd');
$proxy_type = $this->request->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)) {

View File

@ -16,15 +16,15 @@ class Install extends BaseController
if (file_exists(app()->getRootPath() . '.env')) {
return '当前已经安装成功,如果需要重新安装,请手动删除根目录.env文件';
}
if (Request::isPost()) {
$mysql_host = Request::post('mysql_host');
$mysql_port = intval(Request::post('mysql_port', '3306'));
$mysql_user = Request::post('mysql_user', null, 'trim');
$mysql_pwd = Request::post('mysql_pwd', null, 'trim');
$mysql_name = Request::post('mysql_name', null, 'trim');
$mysql_prefix = Request::post('mysql_prefix', 'cloud_', 'trim');
$admin_username = Request::post('admin_username', null, 'trim');
$admin_password = Request::post('admin_password', null, 'trim');
if ($this->request->isPost()) {
$mysql_host = $this->request->post('mysql_host');
$mysql_port = intval($this->request->post('mysql_port', '3306'));
$mysql_user = $this->request->post('mysql_user', null, 'trim');
$mysql_pwd = $this->request->post('mysql_pwd', null, 'trim');
$mysql_name = $this->request->post('mysql_name', null, 'trim');
$mysql_prefix = $this->request->post('mysql_prefix', 'cloud_', 'trim');
$admin_username = $this->request->post('admin_username', null, 'trim');
$admin_password = $this->request->post('admin_password', null, 'trim');
if (!$mysql_host || !$mysql_user || !$mysql_pwd || !$mysql_name || !$admin_username || !$admin_password) {
return json(['code' => 0, 'msg' => '必填项不能为空']);

View File

@ -2,128 +2,109 @@
{block name="title"}容灾切换代理设置{/block}
{block name="main"}
<div class="row">
<div class="col-xs-12 col-sm-8 col-lg-6 center-block" style="float: none;">
<div class="panel panel-info">
<div class="panel-heading"><h3 class="panel-title">代理服务器设置</h3></div>
<div class="panel-body">
<form onsubmit="return saveSetting(this)" method="post" class="form-horizontal" role="form">
<div class="form-group">
<label class="col-sm-3 control-label">代理IP</label>
<div class="col-sm-9"><input type="text" name="proxy_server" value="{:config_get('proxy_server')}" class="form-control"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理端口</label>
<div class="col-sm-9"><input type="text" name="proxy_port" value="{:config_get('proxy_port')}" class="form-control"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理账号</label>
<div class="col-sm-9"><input type="text" name="proxy_user" value="{:config_get('proxy_user')}" class="form-control" placeholder="没有请留空"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理密码</label>
<div class="col-sm-9"><input type="text" name="proxy_pwd" value="{:config_get('proxy_pwd')}" class="form-control" placeholder="没有请留空"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理协议</label>
<div class="col-sm-9"><select class="form-control" name="proxy_type" default="{:config_get('proxy_type')}">
<option value="http">HTTP</option>
<option value="https">HTTPS</option>
<option value="sock4">SOCK4</option>
<option value="sock5">SOCK5</option>
</select></div>
</div><br/>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9"><input type="submit" name="submit" value="保存" class="btn btn-primary btn-block"/></div>
<div class="col-xs-12 col-sm-8 col-lg-6 center-block" style="float: none;">
<div class="panel panel-info">
<div class="panel-heading"><h3 class="panel-title">代理服务器设置</h3></div>
<div class="panel-body">
<form onsubmit="return saveSetting(this)" method="post" class="form-horizontal" role="form">
<div class="form-group">
<label class="col-sm-3 control-label">代理IP</label>
<div class="col-sm-9"><input type="text" name="proxy_server" value="{:config_get('proxy_server')}" class="form-control"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理端口</label>
<div class="col-sm-9"><input type="text" name="proxy_port" value="{:config_get('proxy_port')}" class="form-control"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理账号</label>
<div class="col-sm-9"><input type="text" name="proxy_user" value="{:config_get('proxy_user')}" class="form-control" placeholder="没有请留空"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理密码</label>
<div class="col-sm-9"><input type="text" name="proxy_pwd" value="{:config_get('proxy_pwd')}" class="form-control" placeholder="没有请留空"/></div>
</div><br/>
<div class="form-group">
<label class="col-sm-3 control-label">代理协议</label>
<div class="col-sm-9"><select class="form-control" name="proxy_type" default="{:config_get('proxy_type')}">
<option value="http">HTTP</option>
<option value="https">HTTPS</option>
<option value="sock4">SOCK4</option>
<option value="sock5">SOCK5</option>
</select></div>
</div><br/>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9"><input type="submit" name="submit" value="保存" class="btn btn-primary btn-block"/><br/>
<a href="javascript:proxytest()" class="btn btn-default btn-block">测试连通性</a></div>
</div>
</form>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="{$cdnpublic}layer/3.1.1/layer.js"></script>
<script>
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();
const items = $("select[default]");
for (let i = 0; i < items.length; i++) {
$(items[i]).val($(items[i]).attr("default")||0);
}
});
$("select[name='mail_type']").change();
function saveSetting(obj){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : '',
data : $(obj).serialize(),
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
layer.alert('设置保存成功!', {
icon: 1,
closeBtn: false
}, function(){
window.location.reload()
});
}else{
layer.alert(data.msg, {icon: 2})
function saveSetting(obj){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : '',
data : $(obj).serialize(),
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
layer.alert('设置保存成功!', {
icon: 1,
closeBtn: false
}, function(){
window.location.reload()
});
}else{
layer.alert(data.msg, {icon: 2})
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
});
return false;
}
function proxytest(){
const proxy_server = $("input[name='proxy_server']").val();
const proxy_port = $("input[name='proxy_port']").val();
const proxy_user = $("input[name='proxy_user']").val();
const proxy_pwd = $("input[name='proxy_pwd']").val();
const proxy_type = $("select[name='proxy_type']").val();
if(proxy_server === '' || proxy_port === ''){
layer.alert('代理服务器和端口不能为空!');
return false;
}
});
return false;
}
function mailtest(){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'GET',
url : '/dmonitor/mailtest',
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})
const ii = layer.load(2, {shade: [0.1, '#fff']});
$.ajax({
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('连通性测试成功!', {icon: 1})
}else{
layer.alert('连通性测试失败:'+data.msg, {icon: 2})
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
},
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('服务器错误');
}
});
}
});
}
</script>
{/block}

View File

@ -19,12 +19,12 @@ Route::pattern([
]);
Route::any('/install', 'install/index')
->middleware(ViewOutput::class);
->middleware(ViewOutput::class);
Route::get('/verifycode', 'auth/verifycode')->middleware(SessionInit::class)
->middleware(ViewOutput::class);
->middleware(ViewOutput::class);
Route::any('/login', 'auth/login')->middleware(SessionInit::class)
->middleware(ViewOutput::class);
->middleware(ViewOutput::class);
Route::get('/logout', 'auth/logout');
Route::any('/quicklogin', 'auth/quicklogin');
Route::any('/dmtask/status', 'dmonitor/status');
@ -40,7 +40,7 @@ Route::group(function () {
Route::post('/user/data', 'user/user_data');
Route::post('/user/op', 'user/user_op');
Route::get('/user', 'user/user');
Route::post('/log/data', 'user/log_data');
Route::get('/log', 'user/log');
@ -76,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');
@ -85,12 +86,12 @@ Route::group(function () {
Route::any('/optimizeip/opipform/:action', 'optimizeip/opipform');
})->middleware(CheckLogin::class)
->middleware(ViewOutput::class);
->middleware(ViewOutput::class);
Route::group('api', function () {
Route::post('/domain/:id', 'domain/domain_info');
Route::post('/domain', 'domain/domain_data');
Route::post('/record/data/:id', 'domain/record_data');
Route::post('/record/add/:id', 'domain/record_add');
Route::post('/record/update/:id', 'domain/record_update');
@ -103,4 +104,4 @@ Route::group('api', function () {
Route::miss(function() {
return response('404 Not Found')->code(404);
});
});