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.
think-library/src/service/bt/ApiService.php

461 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | ThinkLibrary 6.0 for ThinkPhP 6.0
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 [ https://www.dtapp.net ]
// +----------------------------------------------------------------------
// | 官方网站: https://gitee.com/liguangchun/ThinkLibrary
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | gitee 仓库地址 https://gitee.com/liguangchun/ThinkLibrary
// | github 仓库地址 https://github.com/GC0202/ThinkLibrary
// | Packagist 地址 https://packagist.org/packages/liguangchun/think-library
// +----------------------------------------------------------------------
namespace DtApp\ThinkLibrary\service\bt;
use DtApp\ThinkLibrary\exception\DtaException;
use DtApp\ThinkLibrary\facade\Files;
use DtApp\ThinkLibrary\Service;
use DtApp\ThinkLibrary\service\curl\BtService;
/**
* 宝塔Api
* https://www.bt.cn/
* Class ApiService
* @package DtApp\ThinkLibrary\service\bt
*/
class ApiService extends Service
{
/**
* @var string
*/
private $url = '';
/**
* @var int
*/
private $page = 1;
/**
* @var int
*/
private $limit = 15;
/**
* @var string
*/
private $order = 'id desc';
/**
* @var array
*/
private $where = [];
/**
* @var
*/
private $contents, $backtrack, $key, $panel;
/**
* @param string $key
* @return $this
*/
public function key(string $key): self
{
$this->key = $key;
return $this;
}
/**
* @param string $panel
* @return $this
*/
public function panel(string $panel)
{
$this->panel = $panel;
return $this;
}
/**
* 获取配置信息
* @return $this
*/
private function getConfig(): self
{
$this->key = config('dtapp.bt.key');
$this->panel = config('dtapp.bt.panel');
return $this;
}
/**
* 获取监控信息
* @param string $type 类型 GetCpuIo = CPU信息/内存 GetDiskIo = 磁盘IO GetNetWorkIo = 网络IO
* @param int $start_time 开始时间
* @param int $end_time 结束时间
* @return mixed
*/
public function getCpuIoInfo($type = 'GetCpuIo', $start_time = 0, $end_time = 0)
{
if (empty($start_time)) {
$start_time = strtotime(date('Y-m-d'));
}
if (empty($end_time)) {
$end_time = time();
}
$this->url = "/ajax?action={$type}&start={$start_time}&end={$end_time}";
return $this;
}
/**
* 获取网站列表
* @return mixed
*/
public function getSites()
{
$this->url = "crontab?action=GetDataList";
$this->where['type'] = 'sites';
return $this;
}
/**
* 获取数据库列表
* @return mixed
*/
public function getDatabases()
{
$this->url = 'data?action=getData';
$this->where['tojs'] = 'database.get_list';
$this->where['table'] = 'databases';
$this->where['limit'] = $this->limit;
$this->where['p'] = $this->page;
$this->where['order'] = $this->order;
return $this;
}
/**
* 获取防火墙
* @return mixed
*/
public function getFirewalls()
{
$this->url = 'data?action=getData';
$this->where['tojs'] = 'firewall.get_list';
$this->where['table'] = 'firewall';
$this->where['limit'] = $this->limit;
$this->where['p'] = $this->page;
$this->where['order'] = $this->order;
return $this;
}
/**
* 获取面板日志
* @return mixed
*/
public function getLogs()
{
$this->url = 'data?action=getData';
$this->where['tojs'] = 'firewall.get_log_list';
$this->where['table'] = 'logs';
$this->where['limit'] = $this->limit;
$this->where['p'] = $this->page;
$this->where['order'] = $this->order;
return $this;
}
/**
* 获取消息通道
* @return mixed
*/
public function getNews()
{
$this->url = 'config?action=get_settings';
return $this;
}
/**
* 获取网站列表
* @return mixed
*/
public function getCronTabs()
{
$this->url = 'data?action=getData';
$this->where['tojs'] = 'site.get_list';
$this->where['table'] = 'sites';
$this->where['limit'] = $this->limit;
$this->where['p'] = $this->page;
$this->where['order'] = $this->order;
return $this;
}
/**
* 获取网站分类
* @return mixed
*/
public function getTypes()
{
$this->url = 'site?action=get_site_types';
return $this;
}
/**
* 获取软件列表
* @return mixed
*/
public function getSoFts()
{
$this->url = 'plugin?action=get_soft_list';
$this->where['p'] = $this->page;
$this->where['tojs'] = 'soft.get_list';
return $this;
}
/**
* 获取硬盘信息
* @return mixed
*/
public function getDiskInfo()
{
$this->url = 'system?action=GetDiskInfo';
return $this;
}
/**
* 获取信息系统
* @return mixed
*/
public function getSystemTotal()
{
$this->url = 'system?action=GetSystemTotal';
return $this;
}
/**
* 获取用户信息
* @return mixed
*/
public function getUserInfo()
{
$this->url = 'ssl?action=GetUserInfo';
return $this;
}
/**
* 获取网络信息
* @return mixed
*/
public function getNetWork()
{
$this->url = 'system?action=GetNetWork';
return $this;
}
/**
* 获取插件信息
* @return mixed
*/
public function getPlugin()
{
$this->url = 'plugin?action=get_index_list';
return $this;
}
/**
* 获取软件信息
* @return mixed
*/
public function getSoft()
{
$this->url = 'plugin?action=get_soft_list';
return $this;
}
/**
* 获取更新信息
* @return mixed
*/
public function getUpdatePanel()
{
$this->url = 'ajax?action=UpdatePanel';
return $this;
}
/**
* 当前页码
* @param int $is
* @return $this
*/
public function page(int $is = 1): self
{
$this->page = $is;
return $this;
}
/**
* 返回数量
* @param int $is
* @return $this
*/
public function limit(int $is = 15): self
{
$this->limit = $is;
return $this;
}
/**
* 排序
* @param string $ss
* @return $this
*/
public function order(string $ss = 'id desc'): self
{
$this->order = $ss;
return $this;
}
/**
* 查询条件
* @param array $array
* @return ApiService
*/
public function where($array = []): ApiService
{
$this->where = $array;
return $this;
}
/**
* 获取数据和总数
* @return $this
*/
private function getDataWithOrderOpt(): self
{
$this->backtrack['data'] = $this->contents['data'];
$this->backtrack['orderOpt'] = $this->contents['orderOpt'];
return $this;
}
/**
* 获取数据和总数
* @return $this
*/
private function getDataWithCount(): self
{
if (empty($this->contents['data'])) {
$this->contents['data'] = [];
}
if (!is_array($this->contents['data'])) {
$this->contents['data'] = [];
}
$this->backtrack['data'] = $this->contents;
if (empty($this->contents['page'])) {
$this->contents['page'] = 0;
}
$this->backtrack['count'] = $this->getCountData($this->contents['page']);
return $this;
}
/**
* 获取数据
* @return $this
*/
private function getData()
{
$this->backtrack['data'] = $this->contents;
return $this;
}
/**
* 发起网络请求
* @return $this
* @throws DtaException
*/
private function getHttp(): self
{
//请求面板接口
$this->contents = $this->HttpPostCookie($this->url, $this->where);
return $this;
}
/**
* 返回Array
* @return array|mixed
* @throws DtaException
*/
public function toArray()
{
$this->getHttp();
if ($this->where['type'] === 'sites') {
$this->getDataWithOrderOpt();
} else {
$this->getDataWithCount();
}
if (empty($this->backtrack)) {
return [];
}
if (is_array($this->backtrack)) {
return $this->backtrack;
}
return json_decode($this->backtrack, true);
}
/**
* 发起POST请求
* @param string $url 网址
* @param array $data 数据
* @param bool $is_json 是否返回Json格式
* @return bool|mixed|string
* @throws DtaException
*/
protected function HttpPostCookie(string $url, array $data = [], bool $is_json = true)
{
if (empty($this->panel)) {
$this->getConfig();
}
if (empty($this->panel)) {
throw new DtaException('请检查panel参数');
}
//定义cookie保存位置
$file = app()->getRootPath() . 'runtime/dtapp/bt/cookie/';
$cookie_file = $file . md5($this->panel) . '.cookie';
if (empty(Files::judgeContents($file)) && !mkdir($file, 0777, true) && !is_dir($file)) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', $file));
}
if (!file_exists($cookie_file)) {
$fp = fopen($cookie_file, 'wb+');
fclose($fp);
}
if (empty($this->key)) {
$this->getConfig();
}
if (empty($this->key)) {
throw new DtaException('请检查key参数');
}
return BtService::instance()
->panel($this->panel)
->key($this->key)
->url($url)
->cookie($cookie_file)
->data($data)
->toArray($is_json);
}
/**
* 获取总数
* @param string $str
* @return false|int|string
*/
protected function getCountData(string $str)
{
$start = strpos($str, "");
$end = strpos($str, "条数据");
$count = substr($str, $start + 3, $end - $start - 3);
if (empty($count)) {
return 0;
}
return $count;
}
}