作者 刘锟

update

  1 +<?php
  2 +
  3 +namespace App\Console\Commands;
  4 +
  5 +use App\Repositories\BtRepository;
  6 +use Illuminate\Console\Command;
  7 +
  8 +class SelfSiteSsl extends Command
  9 +{
  10 + protected $signature = 'self_site_ssl';
  11 + protected $description = '自建站项目自动更新证书';
  12 +
  13 + protected $bt_repository;
  14 + protected $bt;
  15 +
  16 + public function __construct()
  17 + {
  18 + parent::__construct();
  19 +
  20 + $this->bt_repository = new BtRepository();
  21 + $this->bt = $this->bt_repository->getBtObject();
  22 + }
  23 +
  24 + public function handle()
  25 + {
  26 + try {
  27 + $this->checkDomainSsl();
  28 + } catch (\Exception $e) {
  29 + $this->output($e->getMessage());
  30 + }
  31 + }
  32 +
  33 + public function checkDomainSsl()
  34 + {
  35 + $end_day = date('Y-m-d H:i:s', time() + 3 * 24 * 3600);//3天后到期
  36 +
  37 + $site_domain = env('DOMAIN', '');
  38 + $site_ip = env('SITE_IP', '');
  39 +
  40 + if (!$site_domain) {
  41 + throw new \Exception('项目主站域名未配置');
  42 + }
  43 +
  44 + if (!$site_ip) {
  45 + throw new \Exception('项目主站IP未配置');
  46 + }
  47 +
  48 + $ssl_time = $this->getDomainSslTime($site_domain);
  49 + if ($ssl_time['to'] < $end_day) {
  50 + //主站证书即将到期
  51 + $site_list = $this->bt->WebSiteList($site_domain);
  52 + if (isset($site_list['data']) && $site_list['data'] && $site_list['data'][0]['status'] == 1) {
  53 + $site_id = $site_list['data'][0]['id'];
  54 + $host = $site_list['data'][0]['name'];
  55 +
  56 + //获取站点可用于设置证书的域名
  57 + $site_domain = $this->bt->WebDoaminList($site_id);
  58 + $apply_ssl_domain_list = [];
  59 + foreach ($site_domain as $val) {
  60 + if (strpos($val['name'], '*') === false && $this->check_domain_record($val['name'], ['ip' => $site_ip])) {
  61 + $apply_ssl_domain_list[] = $val['name'];
  62 + }
  63 + }
  64 + if (empty($apply_ssl_domain_list)) {
  65 + throw new \Exception('主站所有域名都未解析在当前服务器');
  66 + }
  67 +
  68 + //申请证书之前,还原主站配置
  69 + $config_before = file_get_contents(public_path('main_site_default.txt'));
  70 + $re_config_before = $this->bt->SaveFileBody('/www/server/panel/vhost/nginx/' . $host . '.conf', $config_before, 'utf-8', 1);
  71 + if (!($re_config_before['status'] ?? false)) {
  72 + throw new \Exception($re_config_before['msg'] ?? '还原主站nginx配置失败');
  73 + }
  74 +
  75 + //设置站点证书
  76 + $this->setDomainSsl($site_id, $host, $apply_ssl_domain_list);
  77 +
  78 + //申请证书之后,更新主站配置
  79 + $config_after = file_get_contents(public_path('main_site_config.txt'));
  80 + $re_config_after = $this->bt->SaveFileBody('/www/server/panel/vhost/nginx/' . $host . '.conf', $config_after, 'utf-8', 1);
  81 + if (!($re_config_after['status'] ?? false)) {
  82 + throw new \Exception($re_config_after['msg'] ?? '更新主站nginx配置失败');
  83 + }
  84 +
  85 + $this->output('主站证书更新成功');
  86 + }
  87 + }
  88 +
  89 + $amp_domain = env('AMP_DOMAIN', '');
  90 + if ($amp_domain) {
  91 + $amp_ssl_time = $this->getDomainSslTime($amp_domain);
  92 + if ($amp_ssl_time['to'] < $end_day) {
  93 + //AMP证书即将到期
  94 + $amp_site_list = $this->bt->WebSiteList($amp_domain);
  95 + if (isset($amp_site_list['data']) && $amp_site_list['data'] && $amp_site_list['data'][0]['status'] == 1) {
  96 + $amp_site_id = $amp_site_list['data'][0]['id'];
  97 + $amp_host = $amp_site_list['data'][0]['name'];
  98 +
  99 + //设置站点证书
  100 + $this->setDomainSsl($amp_site_id, $amp_host, [$amp_host]);
  101 +
  102 + $this->output('AMP站证书更新成功');
  103 + }
  104 + }
  105 + }
  106 + }
  107 +
  108 + /**
  109 + * 检查域名解析师是否正确
  110 + * @param $domain
  111 + * @param $server_info
  112 + * @return bool
  113 + * @author Akun
  114 + * @date 2025/01/13 14:53
  115 + */
  116 + public function check_domain_record($domain, $server_info)
  117 + {
  118 + try {
  119 + $records = dns_get_record($domain, DNS_A);
  120 + if (count($records) != 1) {
  121 + return false;
  122 + }
  123 +
  124 + $record = $records[0];
  125 + if ($record['host'] == $server_info['domain'] || $record['ip'] == $server_info['ip']) {
  126 + return $domain;
  127 + } else {
  128 + return false;
  129 + }
  130 + } catch (\Exception $e) {
  131 + return false;
  132 + }
  133 + }
  134 +
  135 + /**
  136 + * 设置域名证书
  137 + * @param $site_id
  138 + * @param $host
  139 + * @param $domain_list
  140 + * @param string $key
  141 + * @param string $cer
  142 + * @throws \Exception
  143 + * @author Akun
  144 + * @date 2025/01/13 14:53
  145 + */
  146 + public function setDomainSsl($site_id, $host, $domain_list, $key = '', $cer = '')
  147 + {
  148 + if (empty($key) || empty($cer)) {
  149 + $ssl = $this->bt->GetSSL($host);
  150 + if (isset($ssl['cert_data']['notAfter']) && strtotime($ssl['cert_data']['notAfter']) - time() > 259200) {
  151 + // 如果已经申请了ssl证书, 并且证书有效期超过3天, 那么就使用已经申请好的证书
  152 + $key = $ssl['key'];
  153 + $cer = $ssl['csr'];
  154 + $is_set_status = !$ssl['status'];
  155 + } else {
  156 + $re_apply_cert = $this->bt->ApplyCert(json_encode($domain_list), $site_id);
  157 + if (!($re_apply_cert['status'] ?? false)) {
  158 + $apply_error_msg = '申请免费证书失败';
  159 + if (isset($re_apply_cert['msg'])) {
  160 + if (is_array($re_apply_cert['msg'])) {
  161 + $apply_error_msg = json_encode($re_apply_cert['msg']);
  162 + } else {
  163 + $apply_error_msg = $re_apply_cert['msg'];
  164 + }
  165 + }
  166 + throw new \Exception($apply_error_msg);
  167 + }
  168 +
  169 + $key = $re_apply_cert['private_key'];
  170 + $cer = $re_apply_cert['cert'];
  171 + $is_set_status = true;
  172 + }
  173 + } else {
  174 + $is_set_status = true;
  175 + }
  176 +
  177 + if ($key && $cer && $is_set_status) {
  178 + $re_set_ssl = $this->bt->SetSSL(1, $host, $key, $cer);
  179 + if (!($re_set_ssl['status'] ?? false)) {
  180 + throw new \Exception($re_set_ssl['msg'] ?? '设置证书失败');
  181 + }
  182 + }
  183 + }
  184 +
  185 + /**
  186 + * 获取域名证书有效时间
  187 + * @param $domain
  188 + * @return string[]
  189 + * @author Akun
  190 + * @date 2024/08/29 9:59
  191 + */
  192 + public function getDomainSslTime($domain)
  193 + {
  194 + $valid_from = '';
  195 + $valid_to = '';
  196 + try {
  197 + $context = stream_context_create([
  198 + 'ssl' => [
  199 + 'capture_peer_cert' => true,
  200 + 'capture_peer_cert_chain' => false,
  201 + 'verify_peer' => false,
  202 + 'verify_peer_name' => false
  203 + ],
  204 + ]);
  205 + $stream = stream_socket_client('ssl://' . $domain . ':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
  206 + if ($stream) {
  207 + $remote_cert = stream_context_get_params($stream)['options']['ssl']['peer_certificate'];
  208 + if ($remote_cert) {
  209 + $valid_from = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validFrom_time_t']);
  210 + $valid_to = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validTo_time_t']);
  211 + }
  212 + }
  213 + fclose($stream);
  214 + } catch (\Exception $e) {
  215 + $valid_from = '';
  216 + $valid_to = '';
  217 + }
  218 + return ['from' => $valid_from, 'to' => $valid_to];
  219 + }
  220 +
  221 + /**
  222 + * 输出处理日志
  223 + * @param $message
  224 + */
  225 + public function output($message)
  226 + {
  227 + echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL;
  228 + }
  229 +}
  1 +<?php
  2 +namespace App\Repositories\Bt;
  3 +/**
  4 + * 宝塔面板站点操作类库
  5 + * @author 阿良 or Youngxj(二次开发)
  6 + * @link https://www.bt.cn/api-doc.pdf
  7 + * @link https://gitee.com/youngxj0/Bty1.0
  8 + * @version 1.0
  9 + * @example
  10 + * $bt = new Bt('http://127.0.0.1/8888','xxxxxxxxxxxxxxxx');
  11 + * echo $bt->GetSystemTotal();//获取系统基础统计
  12 + * @return Array
  13 + */
  14 +class Bt
  15 +{
  16 + private $BT_KEY = ""; //接口密钥
  17 + private $BT_PANEL = "http://127.0.0.1/8888"; //面板地址
  18 +
  19 + /**
  20 + * 初始化
  21 + * @param [type] $bt_panel 宝塔接口地址
  22 + * @param [type] $bt_key 宝塔Api密钥
  23 + */
  24 + public function __construct($bt_panel = null,$bt_key = null){
  25 + if($bt_panel) $this->BT_PANEL = $bt_panel;
  26 + if($bt_key) $this->BT_KEY = $bt_key;
  27 + }
  28 +
  29 + /**
  30 + * 获取系统基础统计
  31 + */
  32 + public function GetSystemTotal(){
  33 + $url = $this->BT_PANEL.$this->config("GetSystemTotal");
  34 +
  35 + $p_data = $this->GetKeyData();
  36 +
  37 + $result = $this->HttpPostCookie($url,$p_data);
  38 +
  39 + $data = json_decode($result,true);
  40 + return $data;
  41 + }
  42 +
  43 + /**
  44 + * 获取磁盘分区信息
  45 + */
  46 + public function GetDiskInfo(){
  47 + $url = $this->BT_PANEL.$this->config("GetDiskInfo");
  48 +
  49 + $p_data = $this->GetKeyData();
  50 +
  51 + $result = $this->HttpPostCookie($url,$p_data);
  52 +
  53 + $data = json_decode($result,true);
  54 + return $data;
  55 + }
  56 +
  57 + /**
  58 + * 获取实时状态信息
  59 + * (CPU、内存、网络、负载)
  60 + */
  61 + public function GetNetWork(){
  62 + $url = $this->BT_PANEL.$this->config("GetNetWork");
  63 +
  64 + $p_data = $this->GetKeyData();
  65 +
  66 + $result = $this->HttpPostCookie($url,$p_data);
  67 +
  68 + $data = json_decode($result,true);
  69 + return $data;
  70 + }
  71 +
  72 + /**
  73 + * 检查是否有安装任务
  74 + */
  75 + public function GetTaskCount(){
  76 + $url = $this->BT_PANEL.$this->config("GetTaskCount");
  77 +
  78 + $p_data = $this->GetKeyData();
  79 +
  80 + $result = $this->HttpPostCookie($url,$p_data);
  81 +
  82 + $data = json_decode($result,true);
  83 + return $data;
  84 + }
  85 +
  86 + /**
  87 + * 检查面板更新
  88 + */
  89 + public function UpdatePanel($check=false,$force=false){
  90 + $url = $this->BT_PANEL.$this->config("UpdatePanel");
  91 +
  92 + $p_data = $this->GetKeyData();
  93 + $p_data['check'] = $check;
  94 + $p_data['force'] = $force;
  95 +
  96 + $result = $this->HttpPostCookie($url,$p_data);
  97 +
  98 + $data = json_decode($result,true);
  99 + return $data;
  100 + }
  101 + /**
  102 + * 申请ssl
  103 + */
  104 + public function ApplyCert($domains,$id){
  105 + $url = $this->BT_PANEL.$this->config("ApplyCert");
  106 + $p_data = $this->GetKeyData();
  107 + $p_data['domains'] = $domains;
  108 + $p_data['auth_type'] = "http";
  109 + $p_data['auth_to'] = $id;
  110 + $p_data['auto_wildcard'] = 0;
  111 + $p_data['id'] = $id;
  112 + $result = $this->HttpPostCookie($url,$p_data);
  113 +
  114 + $data = json_decode($result,true);
  115 + return $data;
  116 + }
  117 + /**
  118 + * 续签ssl
  119 + */
  120 + public function RenewCert($index){
  121 + $url = $this->BT_PANEL.$this->config("RenewCert");
  122 + $p_data = $this->GetKeyData();
  123 +
  124 + $p_data['index'] = $index;
  125 +
  126 + $result = $this->HttpPostCookie($url,$p_data);
  127 + $data = json_decode($result,true);
  128 + return $data;
  129 + }
  130 +
  131 +
  132 + /**
  133 + * 获取网站列表
  134 + * @param string $page 当前分页
  135 + * @param string $limit 取出的数据行数
  136 + * @param string $type 分类标识 -1: 分部分类 0: 默认分类
  137 + * @param string $order 排序规则 使用 id 降序:id desc 使用名称升序:name desc
  138 + * @param string $tojs 分页 JS 回调,若不传则构造 URI 分页连接
  139 + * @param string $search 搜索内容
  140 + * @return mixed
  141 + */
  142 + public function Websites($search='',$page='1',$limit='15',$type='-1',$order='id desc',$tojs=''){
  143 + $url = $this->BT_PANEL.$this->config("Websites");
  144 +
  145 + $p_data = $this->GetKeyData();
  146 + $p_data['p'] = $page;
  147 + $p_data['limit'] = $limit;
  148 + $p_data['type'] = $type;
  149 + $p_data['order'] = $order;
  150 + $p_data['tojs'] = $tojs;
  151 + $p_data['search'] = $search;
  152 +
  153 + $result = $this->HttpPostCookie($url,$p_data);
  154 +
  155 + return json_decode($result,true);
  156 + }
  157 +
  158 + /**
  159 + * 获取网站FTP列表
  160 + * @param string $page 当前分页
  161 + * @param string $limit 取出的数据行数
  162 + * @param string $type 分类标识 -1: 分部分类 0: 默认分类
  163 + * @param string $order 排序规则 使用 id 降序:id desc 使用名称升序:name desc
  164 + * @param string $tojs 分页 JS 回调,若不传则构造 URI 分页连接
  165 + * @param string $search 搜索内容
  166 + * @return mixed
  167 + */
  168 + public function WebFtpList($search='',$page='1',$limit='15',$type='-1',$order='id desc',$tojs=''){
  169 + $url = $this->BT_PANEL.$this->config("WebFtpList");
  170 +
  171 + $p_data = $this->GetKeyData();
  172 + $p_data['p'] = $page;
  173 + $p_data['limit'] = $limit;
  174 + $p_data['type'] = $type;
  175 + $p_data['order'] = $order;
  176 + $p_data['tojs'] = $tojs;
  177 + $p_data['search'] = $search;
  178 +
  179 + $result = $this->HttpPostCookie($url,$p_data);
  180 +
  181 + $data = json_decode($result,true);
  182 + return $data;
  183 + }
  184 +
  185 + /**
  186 + * 获取网站SQL列表
  187 + * @param string $page 当前分页
  188 + * @param string $limit 取出的数据行数
  189 + * @param string $type 分类标识 -1: 分部分类 0: 默认分类
  190 + * @param string $order 排序规则 使用 id 降序:id desc 使用名称升序:name desc
  191 + * @param string $tojs 分页 JS 回调,若不传则构造 URI 分页连接
  192 + * @param string $search 搜索内容
  193 + */
  194 + public function WebSqlList($search='',$page='1',$limit='15',$type='-1',$order='id desc',$tojs=''){
  195 + $url = $this->BT_PANEL.$this->config("WebSqlList");
  196 +
  197 + $p_data = $this->GetKeyData();
  198 + $p_data['p'] = $page;
  199 + $p_data['limit'] = $limit;
  200 + $p_data['type'] = $type;
  201 + $p_data['order'] = $order;
  202 + $p_data['tojs'] = $tojs;
  203 + $p_data['search'] = $search;
  204 +
  205 + $result = $this->HttpPostCookie($url,$p_data);
  206 +
  207 + $data = json_decode($result,true);
  208 + return $data;
  209 + }
  210 +
  211 + /**
  212 + * 获取所有网站分类
  213 + */
  214 + public function Webtypes(){
  215 + $url = $this->BT_PANEL.$this->config("Webtypes");
  216 +
  217 + $p_data = $this->GetKeyData();
  218 +
  219 + $result = $this->HttpPostCookie($url,$p_data);
  220 +
  221 + $data = json_decode($result,true);
  222 + return $data;
  223 + }
  224 +
  225 + /**
  226 + * 获取已安装的 PHP 版本列表
  227 + */
  228 + public function GetPHPVersion(){
  229 + //拼接URL地址
  230 + $url = $this->BT_PANEL.$this->config("GetPHPVersion");
  231 +
  232 + //准备POST数据
  233 + $p_data = $this->GetKeyData(); //取签名
  234 +
  235 + //请求面板接口
  236 + $result = $this->HttpPostCookie($url,$p_data);
  237 +
  238 + //解析JSON数据
  239 + $data = json_decode($result,true);
  240 +
  241 + return $data;
  242 + }
  243 +
  244 + /**
  245 + * 修改指定网站的PHP版本
  246 + * @param [type] $site 网站名
  247 + * @param [type] $php PHP版本
  248 + */
  249 + public function SetPHPVersion($site,$php){
  250 +
  251 + $url = $this->BT_PANEL.$this->config("SetPHPVersion");
  252 +
  253 + $p_data = $this->GetKeyData();
  254 + $p_data['siteName'] = $site;
  255 + $p_data['version'] = $php;
  256 + $result = $this->HttpPostCookie($url,$p_data);
  257 +
  258 + $data = json_decode($result,true);
  259 + return $data;
  260 + }
  261 +
  262 + /**
  263 + * 获取指定网站运行的PHP版本
  264 + * @param [type] $site 网站名
  265 + */
  266 + public function GetSitePHPVersion($site){
  267 + $url = $this->BT_PANEL.$this->config("GetSitePHPVersion");
  268 +
  269 + $p_data = $this->GetKeyData();
  270 + $p_data['siteName'] = $site;
  271 + $result = $this->HttpPostCookie($url,$p_data);
  272 +
  273 + $data = json_decode($result,true);
  274 + return $data;
  275 + }
  276 +
  277 +
  278 + /**
  279 + * 新增网站
  280 + * @param [type] $webname 网站域名 json格式
  281 + * @param [type] $path 网站路径
  282 + * @param [type] $type_id 网站分类ID
  283 + * @param string $type 网站类型
  284 + * @param [type] $version PHP版本
  285 + * @param [type] $port 网站端口
  286 + * @param [type] $ps 网站备注
  287 + * @param [type] $ftp 网站是否开通FTP
  288 + * @param [type] $ftp_username FTP用户名
  289 + * @param [type] $ftp_password FTP密码
  290 + * @param [type] $sql 网站是否开通数据库
  291 + * @param [type] $codeing 数据库编码类型 utf8|utf8mb4|gbk|big5
  292 + * @param [type] $datauser 数据库账号
  293 + * @param [type] $datapassword 数据库密码
  294 + */
  295 + public function AddSite($infoArr=[]){
  296 + $url = $this->BT_PANEL.$this->config("WebAddSite");
  297 + //准备POST数据
  298 + $p_data = $this->GetKeyData(); //取签名
  299 + $p_data['webname'] = $infoArr['webname'];
  300 + $p_data['path'] = $infoArr['path'];
  301 + $p_data['type_id'] = $infoArr['type_id'];
  302 + $p_data['type'] = $infoArr['type'];
  303 + $p_data['version'] = $infoArr['version'];
  304 + $p_data['port'] = $infoArr['port'];
  305 + $p_data['ps'] = $infoArr['ps'];
  306 + $p_data['ftp'] = $infoArr['ftp'];
  307 + $p_data['ftp_username'] = $infoArr['ftp_username'];
  308 + $p_data['ftp_password'] = $infoArr['ftp_password'];
  309 + $p_data['sql'] = $infoArr['sql'];
  310 + $p_data['codeing'] = $infoArr['codeing'];
  311 + $p_data['datauser'] = $infoArr['datauser'];
  312 + $p_data['datapassword'] = $infoArr['datapassword'];
  313 +
  314 +
  315 +
  316 + //请求面板接口
  317 + $result = $this->HttpPostCookie($url,$p_data);
  318 + //var_dump($result);
  319 + //解析JSON数据
  320 + $data = json_decode($result,true);
  321 + return $data;
  322 + }
  323 +
  324 + /**
  325 + * 删除网站
  326 + * @param [type] $id 网站ID
  327 + * @param [type] $webname 网站名称
  328 + * @param [type] $ftp 是否删除关联FTP
  329 + * @param [type] $database 是否删除关联数据库
  330 + * @param [type] $path 是否删除关联网站根目录
  331 + *
  332 + */
  333 + public function WebDeleteSite($id,$webname,$ftp,$database,$path){
  334 + $url = $this->BT_PANEL.$this->config("WebDeleteSite");
  335 +
  336 + $p_data = $this->GetKeyData();
  337 + $p_data['id'] = $id;
  338 + $p_data['webname'] = $webname;
  339 + $ftp && $p_data['ftp'] = $ftp;
  340 + $database && $p_data['database'] = $database;
  341 + $path && $p_data['path'] = $path;
  342 +
  343 + $result = $this->HttpPostCookie($url,$p_data);
  344 +
  345 + $data = json_decode($result,true);
  346 + return $data;
  347 + }
  348 +
  349 + /**
  350 + * 停用站点
  351 + * @param [type] $id 网站ID
  352 + * @param [type] $name 网站域名
  353 + * @return mixed
  354 + */
  355 + public function WebSiteStop($id,$name){
  356 + $url = $this->BT_PANEL.$this->config("WebSiteStop");
  357 +
  358 + $p_data = $this->GetKeyData();
  359 + $p_data['id'] = $id;
  360 + $p_data['name'] = $name;
  361 + $result = $this->HttpPostCookie($url,$p_data);
  362 +
  363 + $data = json_decode($result,true);
  364 + return $data;
  365 + }
  366 +
  367 + /**
  368 + * 启用网站
  369 + * @param [type] $id 网站ID
  370 + * @param [type] $name 网站域名
  371 + * @return mixed
  372 + */
  373 + public function WebSiteStart($id,$name){
  374 + $url = $this->BT_PANEL.$this->config("WebSiteStart");
  375 +
  376 + $p_data = $this->GetKeyData();
  377 + $p_data['id'] = $id;
  378 + $p_data['name'] = $name;
  379 + $result = $this->HttpPostCookie($url,$p_data);
  380 +
  381 + $data = json_decode($result,true);
  382 + return $data;
  383 + }
  384 +
  385 + /**
  386 + * 设置网站到期时间
  387 + * @param [type] $id 网站ID
  388 + * @param [type] $edate 网站到期时间 格式:2019-01-01,永久:0000-00-00
  389 + * @return mixed
  390 + */
  391 + public function WebSetEdate($id,$edate){
  392 + $url = $this->BT_PANEL.$this->config("WebSetEdate");
  393 +
  394 + $p_data = $this->GetKeyData();
  395 + $p_data['id'] = $id;
  396 + $p_data['edate'] = $edate;
  397 + $result = $this->HttpPostCookie($url,$p_data);
  398 +
  399 + $data = json_decode($result,true);
  400 + return $data;
  401 + }
  402 +
  403 + /**
  404 + * 修改网站备注
  405 + * @param [type] $id 网站ID
  406 + * @param [type] $ps 网站备注
  407 + */
  408 + public function WebSetPs($id,$ps){
  409 + $url = $this->BT_PANEL.$this->config("WebSetPs");
  410 +
  411 + $p_data = $this->GetKeyData();
  412 + $p_data['id'] = $id;
  413 + $p_data['ps'] = $ps;
  414 + $result = $this->HttpPostCookie($url,$p_data);
  415 +
  416 + $data = json_decode($result,true);
  417 + return $data;
  418 + }
  419 +
  420 + /**
  421 + * 获取网站备份列表
  422 + * @param [type] $id 网站ID
  423 + * @param string $page 当前分页
  424 + * @param string $limit 每页取出的数据行数
  425 + * @param string $type 备份类型 目前固定为0
  426 + * @param string $tojs 分页js回调若不传则构造 URI 分页连接 get_site_backup
  427 + */
  428 + public function WebBackupList($id,$page='1',$limit='5',$type='0',$tojs=''){
  429 + $url = $this->BT_PANEL.$this->config("WebBackupList");
  430 +
  431 + $p_data = $this->GetKeyData();
  432 + $p_data['p'] = $page;
  433 + $p_data['limit'] = $limit;
  434 + $p_data['type'] = $type;
  435 + $p_data['tojs'] = $tojs;
  436 + $p_data['search'] = $id;
  437 + $result = $this->HttpPostCookie($url,$p_data);
  438 +
  439 + $data = json_decode($result,true);
  440 + return $data;
  441 + }
  442 +
  443 + /**
  444 + * 创建网站备份
  445 + * @param [type] $id 网站ID
  446 + */
  447 + public function WebToBackup($id){
  448 + $url = $this->BT_PANEL.$this->config("WebToBackup");
  449 +
  450 + $p_data = $this->GetKeyData();
  451 + $p_data['id'] = $id;
  452 + $result = $this->HttpPostCookie($url,$p_data);
  453 +
  454 + $data = json_decode($result,true);
  455 + return $data;
  456 + }
  457 +
  458 + /**
  459 + * 删除网站备份
  460 + * @param [type] $id 网站备份ID
  461 + */
  462 + public function WebDelBackup($id){
  463 + $url = $this->BT_PANEL.$this->config("WebDelBackup");
  464 +
  465 + $p_data = $this->GetKeyData();
  466 + $p_data['id'] = $id;
  467 + $result = $this->HttpPostCookie($url,$p_data);
  468 +
  469 + $data = json_decode($result,true);
  470 + return $data;
  471 + }
  472 +
  473 + /**
  474 + * 删除数据库备份
  475 + * @param [type] $id 数据库备份ID
  476 + */
  477 + public function SQLDelBackup($id){
  478 + $url = $this->BT_PANEL.$this->config("SQLDelBackup");
  479 +
  480 + $p_data = $this->GetKeyData();
  481 + $p_data['id'] = $id;
  482 + $result = $this->HttpPostCookie($url,$p_data);
  483 +
  484 + $data = json_decode($result,true);
  485 + return $data;
  486 + }
  487 +
  488 + /**
  489 + * 备份数据库
  490 + * @param [type] $id 数据库列表ID
  491 + */
  492 + public function SQLToBackup($id){
  493 + $url = $this->BT_PANEL.$this->config("SQLToBackup");
  494 +
  495 + $p_data = $this->GetKeyData();
  496 + $p_data['id'] = $id;
  497 + $result = $this->HttpPostCookie($url,$p_data);
  498 +
  499 + $data = json_decode($result,true);
  500 + return $data;
  501 + }
  502 +
  503 + /**
  504 + * 获取网站域名列表
  505 + * @param [type] $id 网站ID
  506 + * @param boolean $list 固定传true
  507 + */
  508 + public function WebDoaminList($id,$list=true){
  509 + $url = $this->BT_PANEL.$this->config("WebDoaminList");
  510 +
  511 + $p_data = $this->GetKeyData();
  512 + $p_data['search'] = $id;
  513 + $p_data['list'] = $list;
  514 + $result = $this->HttpPostCookie($url,$p_data);
  515 +
  516 + $data = json_decode($result,true);
  517 + return $data;
  518 + }
  519 +
  520 + /**
  521 + * 获取网站列表
  522 + * @param string $search
  523 + * @param int $p
  524 + * @param int $limit
  525 + * @param int $type
  526 + * @return mixed
  527 + */
  528 + public function WebSiteList($search = '', $p = 1, $limit = 20, $type = 0){
  529 + $url = $this->BT_PANEL.$this->config("WebSiteList");
  530 +
  531 + $p_data = $this->GetKeyData();
  532 + $p_data['search'] = $search;
  533 + $p_data['p'] = $p;
  534 + $p_data['limit'] = $limit;
  535 + $p_data['type'] = $type;
  536 + $result = $this->HttpPostCookie($url,$p_data);
  537 +
  538 + $data = json_decode($result,true);
  539 + return $data;
  540 + }
  541 +
  542 + /**
  543 + * 添加域名
  544 + * @param [type] $id 网站ID
  545 + * @param [type] $webname 网站名称
  546 + * @param [type] $domain 要添加的域名:端口 80 端品不必构造端口,多个域名用换行符隔开
  547 + */
  548 + public function WebAddDomain($id,$webname,$domain){
  549 + $url = $this->BT_PANEL.$this->config("WebAddDomain");
  550 +
  551 + $p_data = $this->GetKeyData();
  552 + $p_data['id'] = $id;
  553 + $p_data['webname'] = $webname;
  554 + $p_data['domain'] = $domain;
  555 + $result = $this->HttpPostCookie($url,$p_data);
  556 +
  557 + $data = json_decode($result,true);
  558 + return $data;
  559 + }
  560 +
  561 + /**
  562 + * 删除网站域名
  563 + * @param [type] $id 网站ID
  564 + * @param [type] $webname 网站名
  565 + * @param [type] $domain 网站域名
  566 + * @param [type] $port 网站域名端口
  567 + */
  568 + public function WebDelDomain($id,$webname,$domain,$port){
  569 + $url = $this->BT_PANEL.$this->config("WebDelDomain");
  570 +
  571 + $p_data = $this->GetKeyData();
  572 + $p_data['id'] = $id;
  573 + $p_data['webname'] = $webname;
  574 + $p_data['domain'] = $domain;
  575 + $p_data['port'] = $port;
  576 + $result = $this->HttpPostCookie($url,$p_data);
  577 +
  578 + $data = json_decode($result,true);
  579 + return $data;
  580 + }
  581 +
  582 + /**
  583 + * 获取可选的预定义伪静态列表
  584 + * @param [type] $siteName 网站名
  585 + */
  586 + public function GetRewriteList($siteName){
  587 + $url = $this->BT_PANEL.$this->config("GetRewriteList");
  588 +
  589 + $p_data = $this->GetKeyData();
  590 + $p_data['siteName'] = $siteName;
  591 + $result = $this->HttpPostCookie($url,$p_data);
  592 +
  593 + $data = json_decode($result,true);
  594 + return $data;
  595 + }
  596 +
  597 + /**
  598 + * 获取预置伪静态规则内容(文件内容)
  599 + * @param [type] $path 规则名
  600 + * @param [type] $type 0->获取内置伪静态规则;1->获取当前站点伪静态规则
  601 + */
  602 + public function GetFileBody($path,$type=0){
  603 + $url = $this->BT_PANEL.$this->config("GetFileBody");
  604 + $p_data = $this->GetKeyData();
  605 +// $path_dir = $type?'vhost/rewrite':'rewrite/nginx';
  606 + if ($type == 2) {
  607 + $path_dir = 'vhost/nginx';
  608 + } elseif ($type == 1) {
  609 + $path_dir = 'vhost/rewrite';
  610 + } else {
  611 + $path_dir = 'rewrite/nginx';
  612 + }
  613 +
  614 + //获取当前站点伪静态规则
  615 + ///www/server/panel/vhost/rewrite/user_hvVBT_1.test.com.conf
  616 + //获取内置伪静态规则
  617 + ///www/server/panel/rewrite/nginx/EmpireCMS.conf
  618 + //保存伪静态规则到站点
  619 + ///www/server/panel/vhost/rewrite/user_hvVBT_1.test.com.conf
  620 + ///www/server/panel/rewrite/nginx/typecho.conf
  621 + $p_data['path'] = '/www/server/panel/'.$path_dir.'/'.$path.'.conf';
  622 + //var_dump($p_data['path']);
  623 + $result = $this->HttpPostCookie($url,$p_data);
  624 +
  625 + $data = json_decode($result,true);
  626 + return $data;
  627 + }
  628 +
  629 + /**
  630 + * 保存伪静态规则内容(保存文件内容)
  631 + * @param [type] $path 规则名
  632 + * @param [type] $data 规则内容
  633 + * @param string $encoding 规则编码强转utf-8
  634 + * @param number $type 0->系统默认路径;1->自定义全路径
  635 + */
  636 + public function SaveFileBody($path,$data,$encoding='utf-8',$type=0){
  637 + $url = $this->BT_PANEL.$this->config("SaveFileBody");
  638 + if($type){
  639 + $path_dir = $path;
  640 + }else{
  641 + $path_dir = '/www/server/panel/vhost/rewrite/'.$path.'.conf';
  642 + }
  643 + $p_data = $this->GetKeyData();
  644 + $p_data['path'] = $path_dir;
  645 + $p_data['data'] = $data;
  646 + $p_data['encoding'] = $encoding;
  647 + $result = $this->HttpPostCookie($url,$p_data);
  648 +
  649 + $data = json_decode($result,true);
  650 + return $data;
  651 + }
  652 +
  653 +
  654 +
  655 + /**
  656 + * 设置密码访问网站
  657 + * @param [type] $id 网站ID
  658 + * @param [type] $username 用户名
  659 + * @param [type] $password 密码
  660 + */
  661 + public function SetHasPwd($id,$username,$password){
  662 + $url = $this->BT_PANEL.$this->config("SetHasPwd");
  663 +
  664 + $p_data = $this->GetKeyData();
  665 + $p_data['id'] = $id;
  666 + $p_data['username'] = $username;
  667 + $p_data['password'] = $password;
  668 + $result = $this->HttpPostCookie($url,$p_data);
  669 +
  670 + $data = json_decode($result,true);
  671 + return $data;
  672 + }
  673 +
  674 + /**
  675 + * 关闭密码访问网站
  676 + * @param [type] $id 网站ID
  677 + */
  678 + public function CloseHasPwd($id){
  679 + $url = $this->BT_PANEL.$this->config("CloseHasPwd");
  680 +
  681 + $p_data = $this->GetKeyData();
  682 + $p_data['id'] = $id;
  683 + $result = $this->HttpPostCookie($url,$p_data);
  684 +
  685 + $data = json_decode($result,true);
  686 + return $data;
  687 + }
  688 +
  689 + /**
  690 + * 获取网站日志
  691 + * @param [type] $site 网站名
  692 + */
  693 + public function GetSiteLogs($site){
  694 + $url = $this->BT_PANEL.$this->config("GetSiteLogs");
  695 +
  696 + $p_data = $this->GetKeyData();
  697 + $p_data['siteName'] = $site;
  698 + $result = $this->HttpPostCookie($url,$p_data);
  699 +
  700 + $data = json_decode($result,true);
  701 + return $data;
  702 + }
  703 +
  704 + /**
  705 + * 获取网站盗链状态及规则信息
  706 + * @param [type] $id 网站ID
  707 + * @param [type] $site 网站名
  708 + */
  709 + public function GetSecurity($id,$site){
  710 + $url = $this->BT_PANEL.$this->config("GetSecurity");
  711 +
  712 + $p_data = $this->GetKeyData();
  713 + $p_data['id'] = $id;
  714 + $p_data['name'] = $site;
  715 + $result = $this->HttpPostCookie($url,$p_data);
  716 +
  717 + $data = json_decode($result,true);
  718 + return $data;
  719 + }
  720 +
  721 + /**
  722 + * 设置网站盗链状态及规则信息
  723 + * @param [type] $id 网站ID
  724 + * @param [type] $site 网站名
  725 + * @param [type] $fix URL后缀
  726 + * @param [type] $domains 许可域名
  727 + * @param [type] $status 状态
  728 + */
  729 + public function SetSecurity($id,$site,$fix,$domains,$status){
  730 + $url = $this->BT_PANEL.$this->config("SetSecurity");
  731 +
  732 + $p_data = $this->GetKeyData();
  733 + $p_data['id'] = $id;
  734 + $p_data['name'] = $site;
  735 + $p_data['fix'] = $fix;
  736 + $p_data['domains'] = $domains;
  737 + $p_data['status'] = $status;
  738 + $result = $this->HttpPostCookie($url,$p_data);
  739 +
  740 + $data = json_decode($result,true);
  741 + return $data;
  742 + }
  743 +
  744 + /**
  745 + * 获取网站三项配置开关(防跨站、日志、密码访问)
  746 + * @param [type] $id 网站ID
  747 + * @param [type] $path 网站运行目录
  748 + */
  749 + public function GetDirUserINI($id,$path){
  750 + $url = $this->BT_PANEL.$this->config("GetDirUserINI");
  751 +
  752 + $p_data = $this->GetKeyData();
  753 + $p_data['id'] = $id;
  754 + $p_data['path'] = $path;
  755 + $result = $this->HttpPostCookie($url,$p_data);
  756 +
  757 + $data = json_decode($result,true);
  758 + return $data;
  759 + }
  760 +
  761 + /**
  762 + * 开启强制HTTPS
  763 + * @param [type] $site 网站域名(纯域名)
  764 + */
  765 + public function HttpToHttps($site){
  766 + $url = $this->BT_PANEL.$this->config("HttpToHttps");
  767 +
  768 + $p_data = $this->GetKeyData();
  769 + $p_data['siteName'] = $site;
  770 + $result = $this->HttpPostCookie($url,$p_data);
  771 +
  772 + $data = json_decode($result,true);
  773 + return $data;
  774 + }
  775 +
  776 + /**
  777 + * 关闭强制HTTPS
  778 + * @param [type] $site 域名(纯域名)
  779 + */
  780 + public function CloseToHttps($site){
  781 + $url = $this->BT_PANEL.$this->config("CloseToHttps");
  782 +
  783 + $p_data = $this->GetKeyData();
  784 + $p_data['siteName'] = $site;
  785 + $result = $this->HttpPostCookie($url,$p_data);
  786 +
  787 + $data = json_decode($result,true);
  788 + return $data;
  789 + }
  790 +
  791 + /**
  792 + * 设置SSL域名证书
  793 + * @param [type] $type 类型
  794 + * @param [type] $site 网站名
  795 + * @param [type] $key 证书key
  796 + * @param [type] $csr 证书PEM
  797 + * @return mixed
  798 + */
  799 + public function SetSSL($type,$site,$key,$csr){
  800 + $url = $this->BT_PANEL.$this->config("SetSSL");
  801 + $p_data = $this->GetKeyData();
  802 + $p_data['type'] = $type;
  803 + $p_data['siteName'] = $site;
  804 + $p_data['key'] = $key;
  805 + $p_data['csr'] = $csr;
  806 + $result = $this->HttpPostCookie($url,$p_data);
  807 + return json_decode($result,true);
  808 + }
  809 +
  810 + /*
  811 + * 关闭宝塔日志
  812 + */
  813 + public function CloseLogsHandle(){
  814 + $url = $this->BT_PANEL.$this->config("CloseLogs");
  815 + $p_data = $this->GetKeyData();
  816 + $result = $this->HttpPostCookie($url,$p_data);
  817 + return json_decode($result,true);
  818 + }
  819 +
  820 + /**
  821 + * 关闭SSL
  822 + * @param [type] $updateOf 修改状态码
  823 + * @param [type] $site 域名(纯域名)
  824 + */
  825 + public function CloseSSLConf($updateOf,$site){
  826 + $url = $this->BT_PANEL.$this->config("CloseSSLConf");
  827 +
  828 + $p_data = $this->GetKeyData();
  829 + $p_data['updateOf'] = $updateOf;
  830 + $p_data['siteName'] = $site;
  831 + $result = $this->HttpPostCookie($url,$p_data);
  832 +
  833 + $data = json_decode($result,true);
  834 + return $data;
  835 + }
  836 +
  837 + /**
  838 + * 获取SSL状态及证书信息
  839 + * @param [type] $site 域名(纯域名)
  840 + */
  841 + public function GetSSL($site){
  842 + $url = $this->BT_PANEL.$this->config("GetSSL");
  843 +
  844 + $p_data = $this->GetKeyData();
  845 + $p_data['siteName'] = $site;
  846 + $result = $this->HttpPostCookie($url,$p_data);
  847 +
  848 + $data = json_decode($result,true);
  849 + return $data;
  850 + }
  851 +
  852 + /**
  853 + * 获取网站默认文件
  854 + * @param [type] $id 网站ID
  855 + */
  856 + public function WebGetIndex($id){
  857 + $url = $this->BT_PANEL.$this->config("WebGetIndex");
  858 +
  859 + $p_data = $this->GetKeyData();
  860 + $p_data['id'] = $id;
  861 + $result = $this->HttpPostCookie($url,$p_data);
  862 +
  863 + $data = json_decode($result,true);
  864 + return $data;
  865 + }
  866 +
  867 + /**
  868 + * 设置网站默认文件
  869 + * @param [type] $id 网站ID
  870 + * @param [type] $index 内容
  871 + */
  872 + public function WebSetIndex($id,$index){
  873 + $url = $this->BT_PANEL.$this->config("WebSetIndex");
  874 +
  875 + $p_data = $this->GetKeyData();
  876 + $p_data['id'] = $id;
  877 + $p_data['Index'] = $index;
  878 + $result = $this->HttpPostCookie($url,$p_data);
  879 +
  880 + $data = json_decode($result,true);
  881 + return $data;
  882 + }
  883 +
  884 + /**
  885 + * 获取网站流量限制信息
  886 + * @param [type] $id [description]
  887 + */
  888 + public function GetLimitNet($id){
  889 + $url = $this->BT_PANEL.$this->config("GetLimitNet");
  890 +
  891 + $p_data = $this->GetKeyData();
  892 + $p_data['id'] = $id;
  893 + $result = $this->HttpPostCookie($url,$p_data);
  894 +
  895 + $data = json_decode($result,true);
  896 + return $data;
  897 + }
  898 +
  899 + /**
  900 + * 设置网站流量限制信息
  901 + * @param [type] $id 网站ID
  902 + * @param [type] $perserver 并发限制
  903 + * @param [type] $perip 单IP限制
  904 + * @param [type] $limit_rate 流量限制
  905 + */
  906 + public function SetLimitNet($id,$perserver,$perip,$limit_rate){
  907 + $url = $this->BT_PANEL.$this->config("SetLimitNet");
  908 +
  909 + $p_data = $this->GetKeyData();
  910 + $p_data['id'] = $id;
  911 + $p_data['perserver'] = $perserver;
  912 + $p_data['perip'] = $perip;
  913 + $p_data['limit_rate'] = $limit_rate;
  914 + $result = $this->HttpPostCookie($url,$p_data);
  915 +
  916 + $data = json_decode($result,true);
  917 + return $data;
  918 + }
  919 +
  920 + /**
  921 + * 关闭网站流量限制
  922 + * @param [type] $id 网站ID
  923 + */
  924 + public function CloseLimitNet($id){
  925 + $url = $this->BT_PANEL.$this->config("CloseLimitNet");
  926 +
  927 + $p_data = $this->GetKeyData();
  928 + $p_data['id'] = $id;
  929 + $result = $this->HttpPostCookie($url,$p_data);
  930 +
  931 + $data = json_decode($result,true);
  932 + return $data;
  933 + }
  934 +
  935 + /**
  936 + * 获取网站301重定向信息
  937 + * @param [type] $site 网站名
  938 + */
  939 + public function Get301Status($site){
  940 + $url = $this->BT_PANEL.$this->config("Get301Status");
  941 +
  942 + $p_data = $this->GetKeyData();
  943 + $p_data['siteName'] = $site;
  944 + $result = $this->HttpPostCookie($url,$p_data);
  945 +
  946 + $data = json_decode($result,true);
  947 + return $data;
  948 + }
  949 +
  950 + /**
  951 + * 设置网站301重定向信息
  952 + * @param [type] $site 网站名
  953 + * @param [type] $toDomain 目标Url
  954 + * @param [type] $srcDomain 来自Url
  955 + * @param [type] $type 类型
  956 + */
  957 + public function Set301Status($site,$toDomain,$srcDomain,$type){
  958 + $url = $this->BT_PANEL.$this->config("Set301Status");
  959 +
  960 + $p_data = $this->GetKeyData();
  961 + $p_data['siteName'] = $site;
  962 + $p_data['toDomain'] = $toDomain;
  963 + $p_data['srcDomain'] = $srcDomain;
  964 + $p_data['type'] = $type;
  965 + $result = $this->HttpPostCookie($url,$p_data);
  966 +
  967 + $data = json_decode($result,true);
  968 + return $data;
  969 + }
  970 +
  971 + /**
  972 + * 获取网站反代信息及状态
  973 + * @param [type] $site [description]
  974 + */
  975 + public function GetProxyList($site){
  976 + $url = $this->BT_PANEL.$this->config("GetProxyList");
  977 +
  978 + $p_data = $this->GetKeyData();
  979 + $p_data['sitename'] = $site;
  980 + $result = $this->HttpPostCookie($url,$p_data);
  981 +
  982 + $data = json_decode($result,true);
  983 + return $data;
  984 + }
  985 +
  986 + /**
  987 + * 添加网站反代信息
  988 + * @param [type] $cache 是否缓存
  989 + * @param [type] $proxyname 代理名称
  990 + * @param [type] $cachetime 缓存时长 /小时
  991 + * @param [type] $proxydir 代理目录
  992 + * @param [type] $proxysite 反代URL
  993 + * @param [type] $todomain 目标域名
  994 + * @param [type] $advanced 高级功能:开启代理目录
  995 + * @param [type] $sitename 网站名
  996 + * @param [type] $subfilter 文本替换json格式[{"sub1":"百度","sub2":"白底"},{"sub1":"","sub2":""}]
  997 + * @param [type] $type 开启或关闭 0关;1开
  998 + */
  999 + public function CreateProxy($cache,$proxyname,$cachetime,$proxydir,$proxysite,$todomain,$advanced,$sitename,$subfilter,$type){
  1000 + $url = $this->BT_PANEL.$this->config("CreateProxy");
  1001 +
  1002 + $p_data = $this->GetKeyData();
  1003 + $p_data['cache'] = $cache;
  1004 + $p_data['proxyname'] = $proxyname;
  1005 + $p_data['cachetime'] = $cachetime;
  1006 + $p_data['proxydir'] = $proxydir;
  1007 + $p_data['proxysite'] = $proxysite;
  1008 + $p_data['todomain'] = $todomain;
  1009 + $p_data['advanced'] = $advanced;
  1010 + $p_data['sitename'] = $sitename;
  1011 + $p_data['subfilter'] = $subfilter;
  1012 + $p_data['type'] = $type;
  1013 + $result = $this->HttpPostCookie($url,$p_data);
  1014 +
  1015 + $data = json_decode($result,true);
  1016 + return $data;
  1017 + }
  1018 +
  1019 + /**
  1020 + * 添加网站反代信息
  1021 + * @param [type] $cache 是否缓存
  1022 + * @param [type] $proxyname 代理名称
  1023 + * @param [type] $cachetime 缓存时长 /小时
  1024 + * @param [type] $proxydir 代理目录
  1025 + * @param [type] $proxysite 反代URL
  1026 + * @param [type] $todomain 目标域名
  1027 + * @param [type] $advanced 高级功能:开启代理目录
  1028 + * @param [type] $sitename 网站名
  1029 + * @param [type] $subfilter 文本替换json格式[{"sub1":"百度","sub2":"白底"},{"sub1":"","sub2":""}]
  1030 + * @param [type] $type 开启或关闭 0关;1开
  1031 + */
  1032 + public function ModifyProxy($cache,$proxyname,$cachetime,$proxydir,$proxysite,$todomain,$advanced,$sitename,$subfilter,$type){
  1033 + $url = $this->BT_PANEL.$this->config("ModifyProxy");
  1034 +
  1035 + $p_data = $this->GetKeyData();
  1036 + $p_data['cache'] = $cache;
  1037 + $p_data['proxyname'] = $proxyname;
  1038 + $p_data['cachetime'] = $cachetime;
  1039 + $p_data['proxydir'] = $proxydir;
  1040 + $p_data['proxysite'] = $proxysite;
  1041 + $p_data['todomain'] = $todomain;
  1042 + $p_data['advanced'] = $advanced;
  1043 + $p_data['sitename'] = $sitename;
  1044 + $p_data['subfilter'] = $subfilter;
  1045 + $p_data['type'] = $type;
  1046 + $result = $this->HttpPostCookie($url,$p_data);
  1047 +
  1048 + $data = json_decode($result,true);
  1049 + return $data;
  1050 + }
  1051 +
  1052 + /**
  1053 + * 获取网站域名绑定二级目录信息
  1054 + * @param [type] $id 网站ID
  1055 + */
  1056 + public function GetDirBinding($id){
  1057 + $url = $this->BT_PANEL.$this->config("GetDirBinding");
  1058 +
  1059 + $p_data = $this->GetKeyData();
  1060 + $p_data['id'] = $id;
  1061 + $result = $this->HttpPostCookie($url,$p_data);
  1062 +
  1063 + $data = json_decode($result,true);
  1064 + return $data;
  1065 + }
  1066 +
  1067 + /**
  1068 + * 设置网站域名绑定二级目录
  1069 + * @param [type] $id 网站ID
  1070 + * @param [type] $domain 域名
  1071 + * @param [type] $dirName 目录
  1072 + */
  1073 + public function AddDirBinding($id,$domain,$dirName){
  1074 + $url = $this->BT_PANEL.$this->config("AddDirBinding");
  1075 +
  1076 + $p_data = $this->GetKeyData();
  1077 + $p_data['id'] = $id;
  1078 + $p_data['domain'] = $domain;
  1079 + $p_data['dirName'] = $dirName;
  1080 + $result = $this->HttpPostCookie($url,$p_data);
  1081 +
  1082 + $data = json_decode($result,true);
  1083 + return $data;
  1084 + }
  1085 +
  1086 + /**
  1087 + * 删除网站域名绑定二级目录
  1088 + * @param [type] $dirid 子目录ID
  1089 + */
  1090 + public function DelDirBinding($dirid){
  1091 + $url = $this->BT_PANEL.$this->config("DelDirBinding");
  1092 +
  1093 + $p_data = $this->GetKeyData();
  1094 + $p_data['id'] = $dirid;
  1095 + $result = $this->HttpPostCookie($url,$p_data);
  1096 +
  1097 + $data = json_decode($result,true);
  1098 + return $data;
  1099 + }
  1100 +
  1101 + /**
  1102 + * 获取网站子目录绑定伪静态信息
  1103 + * @param [type] $dirid 子目录绑定ID
  1104 + */
  1105 + public function GetDirRewrite($dirid,$type=0){
  1106 + $url = $this->BT_PANEL.$this->config("GetDirRewrite");
  1107 +
  1108 + $p_data = $this->GetKeyData();
  1109 + $p_data['id'] = $dirid;
  1110 + if($type){
  1111 + $p_data['add'] = 1;
  1112 + }
  1113 + $result = $this->HttpPostCookie($url,$p_data);
  1114 +
  1115 + $data = json_decode($result,true);
  1116 + return $data;
  1117 + }
  1118 +
  1119 + /**
  1120 + * 修改FTP账号密码
  1121 + * @param [type] $id FTPID
  1122 + * @param [type] $ftp_username 用户名
  1123 + * @param [type] $new_password 密码
  1124 + */
  1125 + public function SetUserPassword($id,$ftp_username,$new_password){
  1126 + $url = $this->BT_PANEL.$this->config("SetUserPassword");
  1127 +
  1128 + $p_data = $this->GetKeyData();
  1129 + $p_data['id'] = $id;
  1130 + $p_data['ftp_username'] = $ftp_username;
  1131 + $p_data['new_password'] = $new_password;
  1132 + $result = $this->HttpPostCookie($url,$p_data);
  1133 +
  1134 + $data = json_decode($result,true);
  1135 + return $data;
  1136 + }
  1137 +
  1138 + /**
  1139 + * 修改SQL账号密码
  1140 + * @param [type] $id SQLID
  1141 + * @param [type] $ftp_username 用户名
  1142 + * @param [type] $new_password 密码
  1143 + */
  1144 + public function ResDatabasePass($id,$name,$password){
  1145 + $url = $this->BT_PANEL.$this->config("ResDatabasePass");
  1146 +
  1147 + $p_data = $this->GetKeyData();
  1148 + $p_data['id'] = $id;
  1149 + $p_data['name'] = $name;
  1150 + $p_data['password'] = $password;
  1151 + $result = $this->HttpPostCookie($url,$p_data);
  1152 +
  1153 + $data = json_decode($result,true);
  1154 + return $data;
  1155 + }
  1156 +
  1157 + /**
  1158 + * 启用/禁用FTP
  1159 + * @param [type] $id FTPID
  1160 + * @param [type] $username 用户名
  1161 + * @param [type] $status 状态 0->关闭;1->开启
  1162 + */
  1163 + public function SetStatus($id,$username,$status){
  1164 + $url = $this->BT_PANEL.$this->config("SetStatus");
  1165 +
  1166 + $p_data = $this->GetKeyData();
  1167 + $p_data['id'] = $id;
  1168 + $p_data['username'] = $username;
  1169 + $p_data['status'] = $status;
  1170 + $result = $this->HttpPostCookie($url,$p_data);
  1171 +
  1172 + $data = json_decode($result,true);
  1173 + return $data;
  1174 + }
  1175 +
  1176 + /**
  1177 + * 宝塔一键部署列表
  1178 + * @param string $search 搜索关键词
  1179 + * @return [type] [description]
  1180 + */
  1181 + public function deployment($search=''){
  1182 + if($search){
  1183 + $url = $this->BT_PANEL.$this->config("deployment").'&search='.$search;
  1184 + }else{
  1185 + $url = $this->BT_PANEL.$this->config("deployment");
  1186 + }
  1187 +
  1188 + $p_data = $this->GetKeyData();
  1189 + $result = $this->HttpPostCookie($url,$p_data);
  1190 +
  1191 + $data = json_decode($result,true);
  1192 + return $data;
  1193 + }
  1194 +
  1195 + /**
  1196 + * 宝塔一键部署执行
  1197 + * @param [type] $dname 部署程序名
  1198 + * @param [type] $site_name 部署到网站名
  1199 + * @param [type] $php_version PHP版本
  1200 + */
  1201 + public function SetupPackage($dname,$site_name,$php_version){
  1202 + $url = $this->BT_PANEL.$this->config("SetupPackage");
  1203 +
  1204 + $p_data = $this->GetKeyData();
  1205 + $p_data['dname'] = $dname;
  1206 + $p_data['site_name'] = $site_name;
  1207 + $p_data['php_version'] = $php_version;
  1208 + $result = $this->HttpPostCookie($url,$p_data);
  1209 +
  1210 + $data = json_decode($result,true);
  1211 + return $data;
  1212 + }
  1213 +
  1214 + /**
  1215 + * 设置文件权限
  1216 + * @param $path
  1217 + * @param $user
  1218 + * @param $access
  1219 + * @param $all
  1220 + * @return mixed
  1221 + */
  1222 + public function setFileAccess($path, $user, $access, $all) {
  1223 + $url = $this->BT_PANEL.$this->config("SetFileAccess");
  1224 + $p_data = $this->GetKeyData();
  1225 + $p_data['user'] = $user;
  1226 + $p_data['access'] = $access;
  1227 + $p_data['all'] = $all;
  1228 + $p_data['filename'] = $path;
  1229 + $result = $this->HttpPostCookie($url,$p_data);
  1230 +
  1231 + $data = json_decode($result,true);
  1232 + return $data;
  1233 + }
  1234 +
  1235 + /**
  1236 + * 获取队列
  1237 + * @return mixed
  1238 + */
  1239 + public function getProcessList()
  1240 + {
  1241 + $url = $this->BT_PANEL.$this->config("GetProcessList");
  1242 + $p_data = $this->GetKeyData();
  1243 + $result = $this->HttpPostCookie($url,$p_data);
  1244 +
  1245 + $data = json_decode($result,true);
  1246 + return $data;
  1247 + }
  1248 +
  1249 + /**
  1250 + * 停止队列
  1251 + * @param $program
  1252 + * @param int $numprocs
  1253 + * @return mixed
  1254 + */
  1255 + public function stopProcess($program, $numprocs = 1)
  1256 + {
  1257 + $url = $this->BT_PANEL.$this->config("StopProcess");
  1258 + $p_data = $this->GetKeyData();
  1259 + $p_data['program'] = $program;
  1260 + $p_data['numprocs'] = $numprocs;
  1261 + $result = $this->HttpPostCookie($url,$p_data);
  1262 +
  1263 + $data = json_decode($result,true);
  1264 + return $data;
  1265 + }
  1266 +
  1267 + /**
  1268 + * 修改队列
  1269 + * @param $pjname
  1270 + * @param $level
  1271 + * @param $user
  1272 + * @param $command
  1273 + * @param $numprocs
  1274 + * @param $ps
  1275 + * @param $path
  1276 + * @return mixed
  1277 + * @author Akun
  1278 + * @date 2024/08/01 17:55
  1279 + */
  1280 + public function updateProcess($pjname,$level,$user,$command,$numprocs,$ps,$path)
  1281 + {
  1282 + $url = $this->BT_PANEL.$this->config("UpdateProcess");
  1283 + $p_data = $this->GetKeyData();
  1284 + $p_data['pjname'] = $pjname;
  1285 + $p_data['level'] = $level;
  1286 + $p_data['user'] = $user;
  1287 + $p_data['command'] = $command;
  1288 + $p_data['numprocs'] = $numprocs;
  1289 + $p_data['ps'] = $ps;
  1290 + $p_data['path'] = $path;
  1291 + $result = $this->HttpPostCookie($url,$p_data);
  1292 +
  1293 + $data = json_decode($result,true);
  1294 + return $data;
  1295 + }
  1296 +
  1297 + /**
  1298 + * 启动队列
  1299 + * @param $program
  1300 + * @param int $numprocs
  1301 + * @return mixed
  1302 + */
  1303 + public function startProcess($program, $numprocs = 1)
  1304 + {
  1305 + $url = $this->BT_PANEL.$this->config("StartProcess");
  1306 + $p_data = $this->GetKeyData();
  1307 + $p_data['program'] = $program;
  1308 + $p_data['numprocs'] = $numprocs;
  1309 + $result = $this->HttpPostCookie($url,$p_data);
  1310 +
  1311 + $data = json_decode($result,true);
  1312 + return $data;
  1313 + }
  1314 +
  1315 + /**
  1316 + * 设置文件权限
  1317 + * @param $path
  1318 + * @return mixed
  1319 + */
  1320 + public function DeleteFile($path) {
  1321 + $url = $this->BT_PANEL.$this->config("DeleteFile");
  1322 + $p_data = $this->GetKeyData();
  1323 + $p_data['path'] = $path;
  1324 + $result = $this->HttpPostCookie($url,$p_data);
  1325 +
  1326 + $data = json_decode($result,true);
  1327 + return $data;
  1328 + }
  1329 +
  1330 + /**
  1331 + * 更新网站目录
  1332 + * @param $site_id
  1333 + * @param $path
  1334 + * @return mixed
  1335 + */
  1336 + public function SetPath($site_id, $path)
  1337 + {
  1338 + $url = $this->BT_PANEL.$this->config("SetPath");
  1339 + $p_data = $this->GetKeyData();
  1340 + $p_data['id'] = $site_id;
  1341 + $p_data['path'] = $path;
  1342 + $result = $this->HttpPostCookie($url,$p_data);
  1343 + $data = json_decode($result,true);
  1344 + return $data;
  1345 + }
  1346 +
  1347 +
  1348 + /**
  1349 + * 更新运行目录
  1350 + * @param $site_id
  1351 + * @param $path
  1352 + * @return mixed
  1353 + */
  1354 + public function SetSiteRunPath($site_id, $path)
  1355 + {
  1356 + $url = $this->BT_PANEL.$this->config("SetSiteRunPath");
  1357 + $p_data = $this->GetKeyData();
  1358 + $p_data['id'] = $site_id;
  1359 + $p_data['runPath'] = $path;
  1360 + $result = $this->HttpPostCookie($url,$p_data);
  1361 + $data = json_decode($result,true);
  1362 + return $data;
  1363 + }
  1364 +
  1365 +
  1366 + /**
  1367 + * 构造带有签名的关联数组
  1368 + */
  1369 + public function GetKeyData(){
  1370 + $now_time = time();
  1371 + $p_data = array(
  1372 + 'request_token' => md5($now_time.''.md5($this->BT_KEY)),
  1373 + 'request_time' => $now_time
  1374 + );
  1375 + return $p_data;
  1376 + }
  1377 +
  1378 + /**
  1379 + * 发起POST请求
  1380 + * @param String $url 目标网填,带http://
  1381 + * @param Array|String $data 欲提交的数据
  1382 + * @return string
  1383 + */
  1384 + private function HttpPostCookie($url, $data,$timeout = 300)
  1385 + {
  1386 + //定义cookie保存位置
  1387 + $cookie_file='./'.md5($this->BT_PANEL).'.cookie';
  1388 + if(!file_exists($cookie_file)){
  1389 + $fp = fopen($cookie_file,'w+');
  1390 + fclose($fp);
  1391 + }
  1392 +
  1393 + $ch = curl_init();
  1394 + curl_setopt($ch, CURLOPT_URL, $url);
  1395 + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  1396 + curl_setopt($ch, CURLOPT_POST, 1);
  1397 + curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  1398 + curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
  1399 + curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
  1400 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  1401 + curl_setopt($ch, CURLOPT_HEADER, 0);
  1402 + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  1403 + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  1404 + $output = curl_exec($ch);
  1405 + curl_close($ch);
  1406 + return $output;
  1407 + }
  1408 +
  1409 + /**
  1410 + * 加载宝塔数据接口
  1411 + * @param [type] $str [description]
  1412 + * @return [type] [description]
  1413 + */
  1414 + private function config($str){
  1415 + $config = config("bt");
  1416 + //var_dump($config);
  1417 + return $config[$str];
  1418 + }
  1419 +}
  1420 +
  1421 +
  1422 +
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: zhl
  5 + * Date: 2023/09/18
  6 + * Time: 20:56
  7 + */
  8 +
  9 +namespace App\Repositories;
  10 +
  11 +use App\Repositories\Bt\Bt;
  12 +
  13 +/**
  14 + * Class BtRepository
  15 + * @package App\Repositories
  16 + */
  17 +class BtRepository
  18 +{
  19 + public $instance = [];
  20 +
  21 + /**
  22 + * 获取bt对象
  23 + * @param string $key
  24 + * @param string $panel
  25 + * @return Bt
  26 + */
  27 + public function getBtObject($key = '', $panel = '')
  28 + {
  29 + $key = $key ?: env('BT_KEY');
  30 + $panel = $panel ?: env('BT_PANEL');
  31 + $object_key = md5($key . $panel);
  32 + if (empty($this->instance[$object_key])) {
  33 + $bt = new Bt($panel, $key);
  34 + $this->instance[$object_key] = $bt;
  35 + }
  36 + return $this->instance[$object_key];
  37 + }
  38 +
  39 + /**
  40 + * 获取配置前的文件内容
  41 + * @param $domain
  42 + * @return string|string[]
  43 + */
  44 + public function getBeforeNginxConfStr($domain)
  45 + {
  46 + $bt = $this->getBtObject();
  47 + $conf = $bt->GetFileBody($domain, 2);
  48 +
  49 + //如果有变量标识,去掉变量标识
  50 + if (FALSE !== strpos($conf['data'], 'map $domain_prefix')) {
  51 + $conf['data'] = str_replace($this->domainPrefixConf(), '', $conf['data']);
  52 + //去掉自定义配置
  53 + $conf['data'] = str_replace($this->customConf($domain), 'root ' . public_path() . ';', $conf['data']);
  54 + }
  55 + return $conf['data'];
  56 + }
  57 +
  58 + /**
  59 + * 获取配置后的文件内容
  60 + * @param $domain
  61 + * @return mixed
  62 + */
  63 + public function getAfterNginxConfStr($domain)
  64 + {
  65 + $bt = $this->getBtObject();
  66 + $conf = $bt->GetFileBody($domain, 2);
  67 + // 如果没有变量, 添加变量识别
  68 + if (FALSE === strpos($conf['data'], 'map $domain_prefix')) {
  69 + $conf['data'] = $this->domainPrefixConf() . $conf['data'];
  70 + // 替换自定义配置
  71 + $conf['data'] = str_replace('root ' . public_path() . ';', $this->customConf($domain), $conf['data']);
  72 + }
  73 +
  74 + return $conf['data'];
  75 + }
  76 +
  77 +
  78 + /**
  79 + * 需要定制修改的配置
  80 + * @param $domain string
  81 + * @return string
  82 + */
  83 + public function customConf($domain): string
  84 + {
  85 + $domain_arr = explode('.', $domain);
  86 + if ($domain_arr[0] == 'www') {
  87 + $string = ' root ' . public_path() . '; # 设置根目录
  88 +
  89 + set $domain_prefix "";
  90 + if ($host ~* "^(?<domain_prefix>[^.]+)\.") {
  91 + set $domain_prefix $1;
  92 + }
  93 +
  94 + location / {
  95 + root ' . public_path() . '/' . $domain . '; # 设置根目录
  96 + if ($is_prefix_in_string = 1) {
  97 + root ' . public_path() . '/' . $domain . '/$domain_prefix;
  98 + }
  99 + try_files $uri $uri/ /404/index.html =404;
  100 + }
  101 +
  102 + location ~ ^/(api|search) {
  103 + root ' . public_path() . '; # 设置/api /search /.well-known的根目录
  104 + try_files $uri $uri/ /index.php?$query_string;
  105 + }
  106 +
  107 + location ~ ^/(well-known) {
  108 + root ' . public_path() . ';
  109 + try_files $uri $uri/ /404/index.html =404;
  110 + }
  111 + error_page 403 /404/index.html;';
  112 +
  113 + } else {
  114 + $string = ' root ' . public_path() . '; # 设置根目录
  115 +
  116 + set $domain_prefix "";
  117 + if ($host ~* "^(?<domain_prefix>[^.]+)\.") {
  118 + set $domain_prefix $1;
  119 + }
  120 +
  121 + if ($domain_prefix = ' . $domain_arr[0] . '){
  122 + set $is_prefix_in_string 0;
  123 + }
  124 +
  125 + location / {
  126 + root ' . public_path() . '/' . $domain . '; # 设置根目录
  127 + if ($is_prefix_in_string = 1) {
  128 + root ' . public_path() . '/' . $domain . '/$domain_prefix;
  129 + }
  130 + try_files $uri $uri/ /404/index.html =404;
  131 + }
  132 +
  133 + location ~ ^/(api|search) {
  134 + root ' . public_path() . '; # 设置/api /search /.well-known的根目录
  135 + try_files $uri $uri/ /index.php?$query_string;
  136 + }
  137 +
  138 + location ~ ^/(well-known) {
  139 + root ' . public_path() . ';
  140 + try_files $uri $uri/ /404/index.html =404;
  141 + }
  142 + error_page 403 /404/index.html;';
  143 +
  144 + }
  145 +
  146 + return $string;
  147 + }
  148 +
  149 + /**
  150 + * 配置变量
  151 + * @return string
  152 + */
  153 + public function domainPrefixConf()
  154 + {
  155 + return 'map $domain_prefix $is_prefix_in_string {
  156 + default 0; en 1; zh 1; fr 1; de 1; ko 1; ja 1; es 1; ar 1; pt 1; ru 1; af 1; sq 1;
  157 + am 1; hy 1; az 1; eu 1; be 1; bn 1; bs 1; bg 1; ca 1; ceb 1; zh-CN 1; zh-TW 1; co 1;
  158 + hr 1; cs 1; da 1; nl 1; eo 1; et 1; fi 1; fy 1; gl 1; ka 1; el 1; gu 1; ht 1; ha 1; haw 1;
  159 + iw 1; hi 1; hmn 1; hu 1; is 1; ig 1; id 1; ga 1; it 1; jw 1; kn 1; kk 1; km 1; rw 1;
  160 + ku 1; ky 1; lo 1; la 1; lv 1; lt 1; lb 1; mk 1; mg 1; ms 1; ml 1; mt 1; mi 1; mr 1; mn 1;
  161 + my 1; ne 1; no 1; ny 1; or 1; ps 1; fa 1; pl 1; pa 1; ro 1; sm 1; gd 1; sr 1; st 1; sn 1;
  162 + sd 1; si 1; sk 1; sl 1; so 1; su 1; sw 1; sv 1; tl 1; tg 1; ta 1; tt 1; te 1; th 1; tr 1;
  163 + tk 1; uk 1; ur 1; ug 1; uz 1; vi 1; cy 1; xh 1; yi 1; yo 1; zu 1;
  164 +}';
  165 + }
  166 +}