You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
8.3 KiB

3 years ago
  1. <?php
  2. namespace app\controller;
  3. use think\facade\Db;
  4. use app\BaseController;
  5. use app\lib\Plugins;
  6. class Api extends BaseController
  7. {
  8. //获取插件列表
  9. public function get_plugin_list(){
  10. if(!$this->checklist()) return '';
  11. $record = Db::name('record')->where('ip',$this->clientip)->find();
  12. if($record){
  13. Db::name('record')->where('id',$record['id'])->update(['usetime'=>date("Y-m-d H:i:s")]);
  14. }else{
  15. Db::name('record')->insert(['ip'=>$this->clientip, 'addtime'=>date("Y-m-d H:i:s"), 'usetime'=>date("Y-m-d H:i:s")]);
  16. }
  17. $json_arr = Plugins::get_plugin_list();
  18. if(!$json_arr) return json((object)[]);
  19. return json($json_arr);
  20. }
  21. //下载插件包
  22. public function download_plugin(){
  23. $plugin_name = input('post.name');
  24. $version = input('post.version');
  25. if(!$plugin_name || !$version){
  26. return '参数不能为空';
  27. }
  28. if(!preg_match('/^[a-zA-Z0-9_]+$/', $plugin_name) || !preg_match('/^[0-9.]+$/', $version)){
  29. return '参数不正确';
  30. }
  31. if(!$this->checklist()) '你的服务器被禁止使用此云端';
  32. $filepath = get_data_dir().'plugins/package/'.$plugin_name.'-'.$version.'.zip';
  33. if(file_exists($filepath)){
  34. $filename = $plugin_name.'.zip';
  35. $this->output_file($filepath, $filename);
  36. }else{
  37. return '云端不存在该插件包';
  38. }
  39. }
  40. //下载插件主文件
  41. public function download_plugin_main(){
  42. $plugin_name = input('post.name');
  43. $version = input('post.version');
  44. if(!$plugin_name || !$version){
  45. return '参数不能为空';
  46. }
  47. if(!preg_match('/^[a-zA-Z0-9_]+$/', $plugin_name) || !preg_match('/^[0-9.]+$/', $version)){
  48. return '参数不正确';
  49. }
  50. if(!$this->checklist()) '你的服务器被禁止使用此云端';
  51. $filepath = get_data_dir().'plugins/main/'.$plugin_name.'-'.$version.'.dat';
  52. if(file_exists($filepath)){
  53. $filename = $plugin_name.'_main.py';
  54. $this->output_file($filepath, $filename);
  55. }else{
  56. $filepath = get_data_dir().'plugins/folder/'.$plugin_name.'-'.$version.'/'.$plugin_name.'/'.$plugin_name.'_main.py';
  57. if(file_exists($filepath)){
  58. $filename = $plugin_name.'_main.py';
  59. $this->output_file($filepath, $filename);
  60. }else{
  61. return '云端不存在该插件主文件';
  62. }
  63. }
  64. }
  65. //下载插件其他文件
  66. public function download_plugin_other(){
  67. $fname = input('get.fname');
  68. if(!$fname){
  69. return json(['status'=>false, 'msg'=>'参数不能为空']);
  70. }
  71. if(strpos(dirname($fname),'.')!==false)return json(['status'=>false, 'msg'=>'参数不正确']);
  72. if(!$this->checklist()) return json(['status'=>false, 'msg'=>'你的服务器被禁止使用此云端']);
  73. $filepath = get_data_dir().'plugins/other/'.$fname;
  74. if(file_exists($filepath)){
  75. $filename = basename($fname);
  76. $this->output_file($filepath, $filename);
  77. }else{
  78. return json(['status'=>false, 'msg'=>'云端不存在该插件文件']);
  79. }
  80. }
  81. public function get_update_logs(){
  82. $version = config_get('new_version');
  83. $data = [
  84. [
  85. 'title' => 'Linux面板'.$version,
  86. 'body' => config_get('update_msg'),
  87. 'addtime' => config_get('update_date')
  88. ]
  89. ];
  90. return jsonp($data);
  91. }
  92. public function get_version(){
  93. $version = config_get('new_version');
  94. return $version;
  95. }
  96. //安装统计
  97. public function setup_count(){
  98. return 'ok';
  99. }
  100. //检测更新
  101. public function check_update(){
  102. $version = config_get('new_version');
  103. $down_url = request()->root(true).'/install/update/LinuxPanel-'.$version.'.zip';
  104. $data = [
  105. 'force' => false,
  106. 'version' => $version,
  107. 'downUrl' => $down_url,
  108. 'updateMsg' => config_get('update_msg'),
  109. 'uptime' => config_get('update_date'),
  110. 'is_beta' => 0,
  111. 'adviser' => -1,
  112. 'btb' => '',
  113. 'beta' => [
  114. 'version' => $version,
  115. 'downUrl' => $down_url,
  116. 'updateMsg' => config_get('update_msg'),
  117. 'uptime' => config_get('update_date'),
  118. ]
  119. ];
  120. return json($data);
  121. }
  122. //获取内测版更新日志
  123. public function get_beta_logs(){
  124. return json(['beta_ps'=>'当前暂无内测版', 'list'=>[]]);
  125. }
  126. //检查用户绑定是否正确
  127. public function check_auth_key(){
  128. return '1';
  129. }
  130. //从云端验证域名是否可访问
  131. public function check_domain(){
  132. $domain = input('post.domain',null,'trim');
  133. $ssl = input('post.ssl/d');
  134. if(!$domain) return json(['status'=>false, 'msg'=>'域名不能为空']);
  135. if(!strpos($domain,'.')) return json(['status'=>false, 'msg'=>'域名格式不正确']);
  136. $domain = str_replace('*.','',$domain);
  137. $ip = gethostbyname($domain);
  138. if(!$ip || $ip == $domain){
  139. return json(['status'=>false, 'msg'=>'无法访问']);
  140. }else{
  141. return json(['status'=>true, 'msg'=>'访问正常']);
  142. }
  143. }
  144. //同步时间
  145. public function get_time(){
  146. return time();
  147. }
  148. //查询是否专业版(废弃)
  149. public function is_pro(){
  150. return json(['endtime'=>true, 'code'=>1]);
  151. }
  152. //获取产品推荐信息
  153. public function get_plugin_remarks(){
  154. return json(['list'=>[], 'pro_list'=>[], 'kfqq'=>'', 'kf'=>'', 'qun'=>'']);
  155. }
  156. //获取指定插件评分
  157. public function get_plugin_socre(){
  158. return json(['total'=>0, 'split'=>[0,0,0,0,0],'page'=>"<div><span class='Pcurrent'>1</span><span class='Pcount'>共计0条数据</span></div>",'data'=>[]]);
  159. }
  160. //提交插件评分
  161. public function plugin_score(){
  162. return json(['status'=>true, 'msg'=>'您的评分已成功提交,感谢您的支持!']);
  163. }
  164. //获取IP地址
  165. public function get_ip_address(){
  166. return $this->clientip;
  167. }
  168. //绑定账号
  169. public function get_auth_token(){
  170. return json(['status'=>false, 'msg'=>'不支持绑定宝塔官网账号', 'data'=>'5b5d']);
  171. }
  172. public function return_success(){
  173. return json(['status'=>true, 'msg'=>1, 'data'=>(object)[]]);
  174. }
  175. public function return_error(){
  176. return json(['status'=>false, 'msg'=>'不支持当前操作']);
  177. }
  178. public function return_empty(){
  179. return '';
  180. }
  181. public function return_empty_array(){
  182. return json([]);
  183. }
  184. public function return_page_data(){
  185. return json(['page'=>"<div><span class='Pcurrent'>1</span><span class='Pnumber'>1/0</span><span class='Pline'>从1-1000条</span><span class='Pcount'>共计0条数据</span></div>", 'data'=>[]]);
  186. }
  187. //检查黑白名单
  188. private function checklist(){
  189. if(config_get('whitelist') == 1){
  190. if(Db::name('white')->where('ip', $this->clientip)->where('enable', 1)->find()){
  191. return true;
  192. }
  193. return false;
  194. }else{
  195. if(Db::name('black')->where('ip', $this->clientip)->where('enable', 1)->find()){
  196. return false;
  197. }
  198. return true;
  199. }
  200. }
  201. //下载大文件
  202. private function output_file($filepath, $filename){
  203. $filesize = filesize($filepath);
  204. $filemd5 = md5_file($filepath);
  205. ob_clean();
  206. header("Content-Type: application/octet-stream");
  207. header("Content-Disposition: attachment; filename={$filename}.zip");
  208. header("Content-Length: {$filesize}");
  209. header("File-size: {$filesize}");
  210. header("Content-md5: {$filemd5}");
  211. $read_buffer = 1024 * 100;
  212. $handle = fopen($filepath, 'rb');
  213. $sum_buffer = 0;
  214. while(!feof($handle) && $sum_buffer<$filesize) {
  215. echo fread($handle, min($read_buffer, ($filesize - $sum_buffer) + 1));
  216. $sum_buffer += $read_buffer;
  217. flush();
  218. }
  219. fclose($handle);
  220. exit;
  221. }
  222. }