better-staridc-MNBT
1<?php
2if($egn=='zjsc') {
3 //删除主机
4 $id=$_POST['id'];
5 $cres=$DB->get_row_prepare("SELECT * FROM MN_zj WHERE id=? limit 1", [$id]);
6 $ftr=$cres['btid'];
7 $sza=$cres['sqldz'];
8 $yrez=$cres['ssbt'];
9 $cert=$DB->get_row_prepare("SELECT * FROM MN_bt WHERE btdh=? limit 1", [$yrez]);
10 $btipe=($cert['ptl']=='true'?'https':'http').'://'.$cert['btip'].':'.$cert['btdk'];
11 $btkeye=$cert['btmy'];
12 if($cert['btos']=='1') {
13 $l_ler_a='/etc/hosts';
14 } else {
15 $l_ler_a='C:\Windows\System32\drivers\etc\hosts';
16 }
17 include("./class.php");
18//实例化对象
19$api = new bt_api($btipe,$btkeye);
20$r_data = $api->delsite($ftr,$sza);
21 if($r_data['status']=='1' || $r_data['status']=='true' || $r_data['msg']=='指定站点不存在!') {
22 mnbt_log($user,'删除主机','删除ID'.$id.'宝塔成功','删除成功',$DB);
23 if($DB->query_prepare("DELETE FROM MN_zj WHERE id=? limit 1", [$id])){
24 if (function_exists('mnbt_do_action')) {
25 mnbt_do_action('host.deleted', $cres, ['source'=>'admin']);
26 }
27 json_exit('删除成功');
28 } else { mnbt_log($user,'删除主机','删除ID'.$id.'数据库失败','删除失败',$DB); json_exit('删除失败'.$DB->error()); }
29 } else {
30 mnbt_log($user,'删除主机','删除ID'.$id.'宝塔失败','删除失败:'.($r_data['msg'] ?? '未知错误'),$DB);
31 exit(json_encode(['code'=>"删除失败!宝塔返回信息:{$r_data['msg']}"],256));
32 }
33 return;
34}
35if($egn=='zjscxz') {
36 //删除多个主机
37 include("./class.php");
38 $idsz=$_POST['idsz'];
39 $hst_ary=array();
40 $scqkr=0;
41 $scqke=0;
42 foreach($idsz as $id) {
43 $cres=$DB->get_row_prepare("SELECT * FROM MN_zj WHERE id=? limit 1", [$id]);
44 $ftr=$cres['btid'];
45 $sza=$cres['sqldz'];
46 $yrez=$cres['ssbt'];
47 $cert=$DB->get_row_prepare("SELECT * FROM MN_bt WHERE btdh=? limit 1", [$yrez]);
48 $btipe=($cert['ptl']=='true'?'https':'http').'://'.$cert['btip'].':'.$cert['btdk'];
49 $btkeye=$cert['btmy'];
50 //实例化对象
51 $api = new bt_api($btipe,$btkeye);
52 $r_data = $api->delsite($ftr,$sza);
53 if($r_data['status']=='1' || $r_data['status']=='true') {
54 mnbt_log($user,'删除主机','删除ID'.$id.'宝塔成功','删除成功',$DB);
55 if($DB->query_prepare("DELETE FROM MN_zj WHERE id=? limit 1", [$id])) $scqke++; else $scqkr++;
56 } else {
57 $scqkr++;
58 }
59 }
60 mnbt_log($user,'删除主机','批量删除成功'.$scqke.'失败'.$scqkr,'删除完成',$DB);
61 json_exit($scqke, ['codr' => $scqkr]);
62return;
63}
64if($egn=='zjxgjl') {
65 //修改主机
66 $id=daddslashes($_POST['id']);
67 $user=daddslashes($_POST['user']);
68 $pass=daddslashes($_POST['pass']);
69 $sqluser=daddslashes($_POST['sqluser']);
70 $sqlpass=daddslashes($_POST['sqlpass']);
71 $ymbds=daddslashes($_POST['ymbds']);
72 $datar=daddslashes($_POST['datar']);
73 $webkj=daddslashes($_POST['webkj']);
74 $sqlkj=daddslashes($_POST['sqlkj']);
75 $lldx=daddslashes($_POST['llmax']);
76 $kg=daddslashes($_POST['kg']);
77 $cres=$DB->get_row_prepare("SELECT * FROM MN_zj WHERE id=? limit 1", [$id]);
78 $btbh=$cres['ssbt'];
79 $cxbt=$DB->get_row_prepare("SELECT * FROM MN_bt WHERE btdh=? limit 1", [$btbh]);
80 $btipe=($cxbt['ptl']=='true'?'https':'http').'://'.$cxbt['btip'].':'.$cxbt['btdk'];
81 if(is_numeric($ymbds)) {
82 } else {
83 $ymbds=0;
84 }
85 include("./class.php");
86 //实例化对象
87 $api = new bt_api($btipe,$cxbt['btmy']);
88 //获取面板日志
89 $r_data = $api->setdqsj($cres['btid'],$datar);
90 $de=$r_data['status'];
91 if($de=='1' || $de=='true') {
92 if($kg=='true') {
93 $styi='1';
94 } else {
95 $styi='0';
96 }
97 $api->setftpzt($cres['ftpid'],$user,$styi);
98 $api->setmysqlpass($cres['hxd'],$sqluser,$sqlpass);
99 $api->setftppass($cres['ftpid'],$user,$pass);
100 if($kg!=$cres['qk']) {
101 if($kg=='true') {
102 $api->siteqt($cres['btid'],$cres['sqldz'],true);
103 $api->setftpzt($cres['ftpid'],$cres['user'],'1');
104 if (function_exists('mnbt_do_action')) {
105 mnbt_do_action('host.unpaused', $cres, ['source'=>'admin']);
106 }
107 } else {
108 $api->siteqt($cres['btid'],$cres['sqldz'],false);
109 $api->setftpzt($cres['ftpid'],$cres['user'],'0');
110 if (function_exists('mnbt_do_action')) {
111 mnbt_do_action('host.paused', $cres, ['source'=>'admin']);
112 }
113 }
114 }
115 if($kg=='true' && strtotime($date)-strtotime($datar)<0 && $datar!='0000-00-00') {
116 $api->siteqt($cres['btid'],$cres['sqldz'],true);
117 $api->setftpzt($cres['ftpid'],$cres['user'],'1');
118 }
119 $llyl=json_decode($cres['llmax'],true);
120 $llyl['max']=$lldx;
121 $llde=json_encode($llyl);
122 $s_weba=json_decode($cres['hxa'],true);
123 $s_weba['max']=$webkj;
124 $s_web=json_encode($s_weba);
125 $s_sqla=json_decode($cres['hxb'],true);
126 $s_sqla['max']=$sqlkj;
127 $s_sql=json_encode($s_sqla);
128 mnbt_log($user,'修改主机','修改ID'.$id.'配置','修改成功',$DB);
129 if($cres['datae'] != $datar) mnbt_log($user,'主机续费','ID'.$id.'到期'.$cres['datae'].'=>'.$datar,'修改成功',$DB);
130 @header('Content-Type: text/html; charset=UTF-8');
131 if($DB->query_prepare("update `MN_zj` set `datae` =?, `ymbds` =?, `hxa` =?, `hxb` =?, `sqlpass` =?, `pass` =?, `qk` =?, `llmax` =? where `id`=?", [$datar, $ymbds, $s_web, $s_sql, $sqlpass, $pass, $kg, $llde, $id])){
132 if (function_exists('mnbt_do_action') && $cres['datae'] != $datar) {
133 $host_row = $DB->get_row_prepare("SELECT * FROM MN_zj WHERE id=? limit 1", [$id]);
134 mnbt_do_action('host.renewed', $host_row ?: array_merge($cres, ['datae'=>$datar]), ['source'=>'admin','old_date'=>$cres['datae'],'new_date'=>$datar]);
135 }
136 json_exit('修改成功');
137 } else json_exit('修改失败');
138 } else {
139 json_exit('修改失败');
140 }
141 return;
142}
143if($egn=='addzj') {
144 //添加主机
145 $btdh=daddslashes($_POST['btdh']);
146 $user=daddslashes($_POST['user']);
147 $pass=daddslashes($_POST['pass']);
148 $datae=$_POST['datae']=='' ? '0000-00-00' : daddslashes($_POST['datae']);
149 $webdx=json_encode(array('max'=>daddslashes($_POST['webkj']),'dq'=>0));
150 $sqldx=json_encode(array('max'=>daddslashes($_POST['sqlkj']),'dq'=>0));
151 ;
152 $flowratemax=json_encode(array('max'=>daddslashes($_POST['ll']),'dq'=>0,'statistics'=>false));
153 $ymbds=daddslashes($_POST['ymbds']);
154 $kg=daddslashes($_POST['kg']);
155 $cxbt=$DB->get_row_prepare("SELECT * FROM MN_bt WHERE btdh=? limit 1", [$btdh]);
156 $btipe=($cxbt['ptl']=='true'?'https':'http').'://'.$cxbt['btip'].':'.$cxbt['btdk'];
157 $btkeye=$cxbt['btmy'];
158 $rowe=$DB->get_row_prepare("SELECT * FROM MN_zj WHERE 1 order by id desc limit 1");
159 $id=$rowe['id']+1;
160 //以下是计算创建网站的名称(防止重复创建失败)
161 $hskr=mt_rand(4,10);
162 $rqsj=md5($date.$user);
163 $wjler=substr($rqsj, $hskr , 3);
164 $btserw='mnbt.'.$id.mt_rand(1,999).$wjler;
165 include("./class.php");
166 //实例化对象
167 $api = new bt_api($btipe,$btkeye);
168 // 获取节点默认 PHP 版本(优先节点设置,否则自动检测最新版本)
169 $phpVersion = $cxbt['mrbts_php'] ?? '';
170 if ($phpVersion === '' || $phpVersion === '00') {
171 $phpList = $api->btapi_listphp();
172 if (is_array($phpList)) {
173 $versions = [];
174 foreach ($phpList as $v) {
175 if (($v['status'] ?? false) && ($v['version'] ?? '') !== '00') {
176 $versions[] = $v['version'];
177 }
178 }
179 if (!empty($versions)) {
180 usort($versions, function($a, $b) { return strcmp($b, $a); });
181 $phpVersion = $versions[0];
182 $DB->query_prepare("UPDATE MN_bt SET mrbts_php=? WHERE btdh=? LIMIT 1", [$phpVersion, $btdh]);
183 }
184 }
185 }
186 if ($phpVersion === '' || $phpVersion === '00') {
187 json_exit('错误!无法获取该节点的 PHP 版本,请先在宝塔面板安装 PHP 或在节点管理中设置默认 PHP 版本');
188 }
189 //目录设置
190 $mrwww=$cxbt['btos']=='1' ? $conf['hxi'].'/'.$btserw : $conf['hxo'].'/'.$btserw;
191 if(mb_strlen($user)<6 || mb_strlen($pass)<6)json_exit('错误!账号和密码位数均不能小于6位!');
192 if($DB->get_row_prepare("SELECT id FROM MN_zj WHERE user=? limit 1", [$user]))json_exit('错误!该账号已存在!请更换账号!');
193 // 本地查重,BT面板的数据库/FTP重复由webkt接口自行处理并返回错误
194 //开通网站
195 $r_data = $api->webkt($user,$pass,$btserw,'主机','true','true',$phpVersion,$mrwww);
196 $cjqk=$r_data['siteStatus'];
197 //创建情况
198 $zdide=$r_data['siteId'];
199 //站点ID
200 //$api->mysqlqx($user,'%');
201 //新版本不再需要将MySQL设置为外部访问这种危险行为。
202 if($cjqk) {
203 //设置到期时间
204 $r_datan = $api->setdqsj($zdide,$datae);
205 $de=$r_datan['status'];
206 if($de=='1' || $de=='true') {
207 //按账号精确获取 FTP/数据库 ID(原为全表拉取,主机数多时会显著变慢)
208 $aedfs = $api->sjid('ftps', $user);
209 $sqlfs = $api->sjid('databases', $user);
210 $rowe=$DB->get_row_prepare("SELECT * FROM MN_zj WHERE 1 order by id desc limit 1");
211 $id=$rowe['id']+1;
212 mnbt_log($user,'添加主机','添加ID'.$id.'宝塔成功','添加成功',$DB);
213 // max(id)+1 在并发下可能重复导致插入失败,失败时重新取号重试几次(与 api/api.php 开通逻辑一致)
214 $insert_ok = false;
215 for($tryi = 0; $tryi < 3; $tryi++){
216 $rowe=$DB->get_row_prepare("SELECT id FROM MN_zj WHERE 1 order by id desc limit 1");
217 $id=($rowe['id'] ?? 0)+1;
218 if($DB->query_prepare("INSERT INTO `MN_zj` (`id`, `ssbt`, `user`, `pass`, `sqluser`, `sqlpass`, `data`, `datae`, `qk`, `btid`, `sqldz`, `ftpid`, `ymbds`, `hxa`, `hxb`, `hxc`, `hxd`, `llmax`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", [$id, $btdh, $user, $pass, $user, $pass, $date, $datae, $kg, $zdide, $btserw, $aedfs, $ymbds, $webdx, $sqldx, '2', $sqlfs, $flowratemax])){
219 $insert_ok = true;
220 break;
221 }
222 }
223 if($insert_ok){
224 $host_row = $DB->get_row_prepare("SELECT * FROM MN_zj WHERE id=? limit 1", [$id]);
225 if (function_exists('mnbt_do_action')) {
226 mnbt_do_action('host.created', $host_row ?: ['id'=>$id,'user'=>$user,'ssbt'=>$btdh,'btid'=>$zdide,'sqldz'=>$btserw], ['source'=>'admin']);
227 }
228 json_exit('添加成功');
229 } else {
230 // 宝塔站点已开通但本地数据库写入失败:回滚删除宝塔站点,避免留下无主站点
231 $api->delsite($zdide,$btserw);
232 mnbt_log($user,'添加主机','添加ID'.$id.'数据库失败','添加失败',$DB); json_exit('添加失败'.$DB->error());
233 }
234 } else {
235 mnbt_log($user,'添加主机','添加'.$user.'到期设置失败','添加失败',$DB);
236 json_exit('添加失败');
237 }
238 } else {
239 mnbt_log($user,'添加主机','添加'.$user.'宝塔创建失败','添加失败:'.($r_data['msg'] ?? '未知错误'),$DB);
240 json_exit('网站创建失败!'.$r_data['msg']);
241 }
242 return;
243}
244if($egn=='listzj') {
245 //主机列表
246 $sorting=strtoupper($_POST['sortOrder']??'')==='DESC'?'DESC':'ASC';
247 $paixu=preg_replace('/[^a-zA-Z0-9_]/','',$_POST['sort']??'id')?:'id';
248 $pagesize=intval($_POST['limit']);
249 $pageu=(intval($_POST['page']-1)) * $pagesize;
250 $where=json_decode($_POST['where'],true);
251 $pswhere='';
252 $param_arr=[];
253 if($where && $where['name']!=false && $where['type']!=false && $where['value']!=false){
254 if($where['type']!='1' && $where['type']!='2')exit(json_encode(['code'=>4,'msg'=>'搜索方式错误!只能为模糊或者精确搜索!']));
255 $zdm=['ssbt','sqldz','user'];
256 if(!in_array($where['name'],$zdm))exit(json_encode(['code'=>4,'msg'=>'错误!不存在的搜索字段!']));
257 $val=$where['value'];
258 $pswhere='and '.$where['name'].($where['type']=='1'?"=?":" LIKE ?");
259 $param_arr[]=$where['type']=='1'?$val:'%'.$val.'%';
260 }
261 $countdata=$DB->count_prepare("SELECT count(*) from MN_zj WHERE 1 {$pswhere}", $param_arr);
262 $data=["total"=>$countdata];
263 $data["rows"]=$DB->get_all_prepare("SELECT * FROM MN_zj where 1 {$pswhere} order by $paixu $sorting limit $pageu,$pagesize", $param_arr);
264 exit(json_encode($data));
265 return;
266}
267return;