better-staridc-MNBT
1<?php
2if($egn=='addbt') {
3 $ip=daddslashes($_POST['ip']);
4 $dk=daddslashes($_POST['dk']);
5 $key=daddslashes($_POST['key']);
6 $bh=daddslashes($_POST['bh']);
7 $btos=daddslashes($_POST['btos']);
8 $urlla=daddslashes($_POST['urlla']);
9 $ftpdz=daddslashes($_POST['ftpdz']);
10 $xieyi=daddslashes($_POST['xieyi']);
11 $kg=daddslashes($_POST['kg']);
12 $rowe=$DB->get_row_prepare("SELECT * FROM MN_bt WHERE 1 order by id desc limit 1");
13 $id=$rowe['id']+1;
14 $dati='ikj'.$date.mt_rand(100,10000).mt_rand(10,99999).'sql';
15 $kiterw=mt_rand(1,100);
16 $ktmy=md5($dati);
17 $qmk=md5($kiterw);
18 logjl($user,'添加宝塔','添加了一个编号为'.$bh.'的宝塔','添加成功',$DB);
19 if($DB->query_prepare("INSERT INTO `MN_bt` (`id`, `btip`, `btdk`, `btmy`, `date`, `ktmy`, `qmk`, `btdh`, `qk`, `btos`, `als`, `ptl`, `ftpdz`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", [$id, $ip, $dk, $key, $date, $ktmy, $qmk, $bh, $kg, $btos, $urlla, $xieyi, $ftpdz])) {
20 // 添加成功后自动检测并设置默认 PHP 版本(非阻塞)
21 if (is_file(SYSTEM_ROOT . 'bt_php.function.php')) {
22 require_once SYSTEM_ROOT . 'bt_php.function.php';
23 mnbt_node_auto_detect_php($bh);
24 }
25 json_exit('添加成功');
26 } else {
27 json_exit('添加失败'.$DB->error());
28 }
29 return;
30}
31if($egn=='btsc') {
32 $id=$_POST['id'];
33 logjl($user,'删除宝塔','删除了ID为'.$id.'的宝塔','删除成功',$DB);
34 $cres=$DB->get_row_prepare("SELECT * FROM MN_bt WHERE id=? limit 1", [$id]);
35 $ssbt=$cres['btdh'];
36 if($DB->query_prepare("DELETE FROM MN_bt WHERE id=? limit 1", [$id])) {
37 $rs=$DB->get_all_prepare("SELECT * FROM MN_zj WHERE ssbt=? order by id desc limit 9999", [$ssbt]);
38 if (is_array($rs)) {
39 foreach($rs as $res) {
40 $bjyr=$res['id'];
41 $DB->query_prepare("DELETE FROM MN_zj WHERE id=? limit 1", [$bjyr]);
42 }
43 }
44 json_exit('删除成功');
45 } else {
46 json_exit('删除失败'.$DB->error());
47 }
48 return;
49}
50if($egn=='btsj') {
51 $id=$_POST['id'];
52 $cres=$DB->get_row_prepare("SELECT * FROM MN_bt WHERE id=? limit 1", [$id]);
53 exit('{"code":"1","ip":"'.$cres['btip'].'","dk":"'.$cres['btdk'].'","my":"'.$cres['btmy'].'","kg":"'.$cres['qk'].'","btos":"'.$cres['btos'].'"}');
54 return;
55}
56if($egn=='xgjl') {
57 $id=daddslashes($_POST['id']);
58 $ip=daddslashes($_POST['ip']);
59 $dk=daddslashes($_POST['dk']);
60 $key=daddslashes($_POST['key']);
61 $kg=daddslashes($_POST['kg']);
62 $btos=daddslashes($_POST['btos']);
63 $urlla=daddslashes($_POST['urlla']);
64 $ftpdz=daddslashes($_POST['ftpdz']);
65 $xieyi=daddslashes($_POST['xieyi']);
66 logjl($user,'修改宝塔','对ID为'.$id.'的宝塔进行了修改','修改成功',$DB);
67 if($DB->query_prepare("update `MN_bt` set `btip` =?,`btdk` =?,`btmy` =?,`qk` =?,`btos` =?,`als` =?,`ptl` =?,`ftpdz` =? where `id`=?", [$ip,$dk,$key,$kg,$btos,$urlla,$xieyi,$ftpdz,$id]))json_exit('修改成功'); else json_exit('修改失败'.$DB->error());
68 return;
69}
70if($egn=='mnbt') {
71 include("../MPHX/BL.php");
72 include_once("../MPHX/github_updater.php");
73 // 只走 GitHub Release 检查更新,不再回连自建服务器,也不再校验 authcode
74 $content = mnbt_updater_check();
75 $total = mnbt_version();
76 if($content['ok']!=1) {
77 $cl='mdi-cloud-off';
78 $gx='暂时无法检查更新:'.$content['error'];
79 } elseif($content['can_update']==1) {
80 $cl='mdi-arrow-up-bold-circle';
81 $gx='已经有新版本推出!请前往系统管理->系统更新处进行更新';
82 } else {
83 $cl='mdi-bookmark-check';
84 $gx='您使用的已是最新版本!';
85 }
86 exit(json_encode([
87 'cl'=>$cl,
88 'gx'=>$gx,
89 'vs'=>$total,
90 'gg'=>'',
91 'newver'=>$content['latest'],
92 'cver'=>$content['current'],
93 'canupdate'=>$content['can_update'],
94 ],256));
95}
96if($egn=='listbt') {
97 //宝塔列表
98 $sorting=strtoupper($_POST['sortOrder']??'')==='DESC'?'DESC':'ASC';
99 $paixu=preg_replace('/[^a-zA-Z0-9_]/','',$_POST['sort']??'id')?:'id';
100 $pagesize=intval($_POST['limit']);
101 $pageu=(intval($_POST['page'])-1) * $pagesize;
102 $countdata=$DB->count_prepare("SELECT count(*) from MN_bt WHERE 1");
103 $data=["total"=>$countdata];
104 $rows=$DB->get_all_prepare("SELECT * FROM MN_bt order by $paixu $sorting limit $pageu,$pagesize");
105 // 计算调用密钥 dymy = md5(ktmy.qmk),前端直接用不需要算 md5
106 foreach($rows as &$r){
107 $r['dymy']=md5($r['ktmy'].$r['qmk']);
108 }
109 unset($r);
110 $data["rows"]=$rows;
111 exit(json_encode($data));
112 return;
113}
114if($egn=='btztjc') {
115 $btid = intval($_POST['btid']);
116 $cert = $DB->get_row_prepare("SELECT * FROM MN_bt WHERE id=? limit 1", [$btid]);
117 if(!$cert) {
118 exit(json_encode(['qk'=>0,'code'=>'宝塔不存在','titco'=>'text-danger']));
119 }
120 include_once(SYSTEM_ROOT."bt_api.php");
121 $protocol = $cert['ptl']=='true'?'https':'http';
122 $bt_url = $protocol.'://'.$cert['btip'].':'.$cert['btdk'];
123 $api = new bt_api($bt_url, $cert['btmy']);
124 try {
125 $result = $api->btapi_listphp();
126 if(is_array($result) && isset($result['status']) && ($result['status'] === false || $result['status'] === 0 || $result['status'] === '0')) {
127 // 面板返回业务错误(连接失败/鉴权失败等),透出真实原因
128 exit(json_encode(['qk'=>0,'code'=>($result['msg'] ?? '面板返回错误'),'titco'=>'text-danger'], JSON_UNESCAPED_UNICODE));
129 }
130 if(is_array($result)) {
131 exit(json_encode(['qk'=>1,'code'=>'通信正常','titco'=>'text-success']));
132 } else {
133 exit(json_encode(['qk'=>0,'code'=>'无法获取面板信息:'.json_encode($result,256),'titco'=>'text-danger']));
134 }
135 } catch (Throwable $e) {
136 exit(json_encode(['qk'=>0,'code'=>'连接失败:'.$e->getMessage(),'titco'=>'text-danger']));
137 }
138}
139
140// ====== 节点 PHP 版本管理(系统底层,独立于插件) ======
141
142if ($egn === 'list_node_php') {
143 $btdh = trim((string)($_POST['btdh'] ?? ''));
144 if ($btdh === '') {
145 exit(json_encode(['qk' => 0, 'msg' => '请指定节点']));
146 }
147 require_once SYSTEM_ROOT . 'bt_php.function.php';
148 $result = mnbt_node_php_list($btdh);
149 if (!$result['ok']) {
150 exit(json_encode(['qk' => 0, 'msg' => $result['msg'], 'raw' => $result['raw'] ?? null], JSON_UNESCAPED_UNICODE));
151 }
152 $currentDefault = mnbt_node_get_php($btdh);
153 exit(json_encode(['qk' => 1, 'versions' => $result['versions'], 'latest' => $result['latest'], 'current_default' => $currentDefault]));
154}
155
156if ($egn === 'auto_detect_node_php') {
157 $btdh = trim((string)($_POST['btdh'] ?? ''));
158 if ($btdh === '') {
159 exit(json_encode(['qk' => 0, 'msg' => '请指定节点']));
160 }
161 require_once SYSTEM_ROOT . 'bt_php.function.php';
162 $result = mnbt_node_auto_detect_php($btdh);
163 if (!$result['ok']) {
164 exit(json_encode(['qk' => 0, 'msg' => $result['msg']]));
165 }
166 exit(json_encode(['qk' => 1, 'version' => $result['version'], 'msg' => $result['msg']]));
167}
168
169if ($egn === 'set_node_php') {
170 $btdh = trim((string)($_POST['btdh'] ?? ''));
171 $version = trim((string)($_POST['version'] ?? ''));
172 if ($btdh === '' || $version === '') {
173 exit(json_encode(['qk' => 0, 'msg' => '参数不完整']));
174 }
175 require_once SYSTEM_ROOT . 'bt_php.function.php';
176 if (!mnbt_node_set_php($btdh, $version)) {
177 exit(json_encode(['qk' => 0, 'msg' => '保存失败']));
178 }
179 exit(json_encode(['qk' => 1, 'msg' => '已设置节点 ' . htmlspecialchars($btdh) . ' 的默认 PHP 版本为 ' . $version]));
180}
181
182return;