admin/app/common/services/systemUpgrade.php

892 lines
24 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\services;
use app\common\helpers\Cache;
use app\common\models\UniAccount;
use Illuminate\Filesystem\Filesystem;
use vierbergenlars\SemVer\version;
class systemUpgrade
{
public $update;
public $filesystem;
public $downloadUrl;
private $key;
private $secret;
public function __construct($key = '', $secret = '')
{
$this->key = $key;
$this->secret = $secret;
$this->update = new AutoUpdate();
$this->filesystem = app(Filesystem::class);
$this->downloadUrl = '';//https://downloads.cloudeapi.com';
}
/**
* 删除非法文件
*/
public function deleteFile()
{
//file-删除指定文件file-空 删除目录下所有文件
$files = [
[
'path' => base_path('config'),
'ext' => ['php'],
'file' => [
base_path('database/migrations/main-menu.php'),
base_path('database/migrations/notice-template.php'),
base_path('database/migrations/notice.php'),
base_path('database/migrations/observer.php'),
base_path('database/migrations/widget.php'),
]
],
[
'path' => base_path('database/migrations'),
'ext' => ['php'],
'file' => [
base_path('database/migrations/2018_10_18_150312_add_unique_to_yz_member_income.php')
]
],
[
'path' => base_path('plugins/store-cashier/migrations'),
'ext' => ['php'],
'file' => [
base_path('plugins/store-cashier/migrations/2018_11_26_174034_fix_address_store.php'),
base_path('plugins/store-cashier/migrations/2017_08_03_170658_create_ims_yz_cashier_goods_table.php')
]
],
[
'path' => base_path('plugins/supplier/migrations'),
'ext' => ['php'],
'file' => [
base_path('plugins/supplier/migrations/2018_11_26_155528_update_ims_yz_order_and_goods.php')
]
],
[
'path' => base_path(),
'file' => [
base_path('manifest.xml'),
base_path('map.json')
]
],
[
'path' => base_path('vendor/james-heinrich/getid3/demos'),
],
[
'path' => base_path('storage/app/auto-update/shop/vendor/james-heinrich/getid3/demos'),
]
];
foreach ($files as $rows) {
if (!is_dir($rows['path'])) {
continue;
}
$scan_file = $this->filesystem->files($rows['path']);
if (!empty($scan_file)) {
foreach ($scan_file as $item) {
if (!empty($rows['file'])) {
foreach ($rows['file'] as $val) {
if ($val == $item) {
@unlink($item);
}
}
} else {
$file_info = pathinfo($item);
if (!in_array($file_info['extension'], $rows['ext'])) {
@unlink($item);
}
}
}
}
}
}
/**
* 执行迁移文件
*/
public function runMigrate()
{
\Log::debug('----CLI----');
$plugins_dir = $this->update->getDirsByPath('plugins', $this->filesystem);
if (!empty($plugins_dir)) {
\Artisan::call('update:version', ['version' => $plugins_dir]);
}
}
/**
* 更新本地前/后端版本号
*
* @param $updateList
*/
public function setSystemVersion($updateList, $type = 1)
{
$version = $this->getFrontVersion($updateList);
$str = file_get_contents(base_path('config/') . 'front-version.php');
$str = preg_replace('/"[\d\.]+"/', '"' . $version . '"', $str);
switch ($type) {
case 1:
file_put_contents(base_path('config/') . 'front-version.php', $str);
break;
case 2:
file_put_contents(base_path('config/') . 'backend_version.php', $str);
break;
}
}
/**
* 获取授权系统前端版本号
*
* @param $updateList
* @return mixed
*/
public function getFrontVersion($updateList)
{
rsort($updateList);
$version = $updateList[0]['version'];
return $version;
}
/**
* 前端更新文件检测
*
* @param $key
* @param $secret
* @return array|null
*/
public function frontendUpgrad($key, $secret)
{
return [];
}
/**
* 验证php版本
*
* @param $php_version
* @return bool
*/
public function checkPHPVersion($php_version)
{
if (version::lt($php_version, PHP_VERSION)) {
return true;
}
return false;
}
/**
* 迁移数据库信息
*/
public function mvenv()
{
$database = config('database');
$databaseSet = $database['connections'][$database['default']];
$DB_HOST = $databaseSet['host'];
$DB_USERNAME = $databaseSet['username'];
$DB_PASSWORD = $databaseSet['password'];
$DB_PORT = $databaseSet['port'];
$DB_DATABASE = $databaseSet['database'];
$DB_PREFIX = $databaseSet['prefix'];
if (config('app.APP_Framework', false) == 'platform' && !empty($DB_HOST)) {
$str = '<?php
$config = array();
$config[\'db\'][\'master\'][\'host\'] = \'' . $DB_HOST . '\';
$config[\'db\'][\'master\'][\'username\'] = \'' . $DB_USERNAME . '\';
$config[\'db\'][\'master\'][\'password\'] = \'' . $DB_PASSWORD . '\';
$config[\'db\'][\'master\'][\'port\'] = \'' . $DB_PORT . '\';
$config[\'db\'][\'master\'][\'database\'] = \'' . $DB_DATABASE . '\';
$config[\'db\'][\'master\'][\'tablepre\'] = \'' . $DB_PREFIX . '\';
$config[\'db\'][\'slave_status\'] = false;
$config[\'db\'][\'slave\'][\'1\'][\'host\'] = \'\';
$config[\'db\'][\'slave\'][\'1\'][\'username\'] = \'\';
$config[\'db\'][\'slave\'][\'1\'][\'password\'] = \'\';
$config[\'db\'][\'slave\'][\'1\'][\'port\'] = \'\';
$config[\'db\'][\'slave\'][\'1\'][\'database\'] = \'\';
$config[\'db\'][\'slave\'][\'1\'][\'tablepre\'] = \'\';
';
$this->filesystem->put(base_path('database/config.php'), $str);
if (file_exists(base_path('database/config.php'))) {
$str = "APP_ENV=production
APP_KEY=base64:2q7s0Z714xS1L1WNN/8dsB69XDqOb4Qdptgh4X2ZtZU=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_Framework=platform
IS_WEB=/admin/shop
ROOT_PATH=''
EXTEND_DIR=''";
$this->filesystem->put(base_path('.env'), $str);
}
}
}
/**
* 下载venddor组件压缩包
*/
public function downloadVendorZip()
{
$url = $this->downloadUrl . $this->getSysUpgrade() . '.zip';
$tmp_path = base_path($this->getSysUpgrade() . '_' . date('Y-m-d') . '.zip');
if (file_exists($tmp_path)) {
return;
}
try {
Utils::download($url, $tmp_path);
\Log::debug('----vendor zip 下载ok----');
} catch (\Exception $e) {
\Log::debug('----vendor zip 下载失败----');
}
}
/**
* 解压vendor压缩包
*
* @return bool
*/
public function unVendorZip()
{
ini_set("memory_limit", "-1"); //不限制内存
ini_set('max_execution_time', '0');
$path = base_path($this->getSysUpgrade() . '_' . date('Y-m-d') . '.zip');
if (file_exists($path)) {
$zip = new \ZipArchive();
$res = $zip->open($path);
if ($res === true) {
try {
$zip->extractTo(base_path());
} catch (\Exception $e) {
$zip->close();
\Log::debug('----vendor zip 解压失败----');
return false;
}
} else {
$zip->close();
\Log::debug('----vendor zip 下载失败----');
return false;
}
$zip->close();
\Log::debug('----vendor zip 解压ok----');
return true;
}
}
/**
* 删除vendor压缩包
*/
public function delVendorZip()
{
$path = base_path($this->getSysUpgrade() . '_' . date('Y-m-d') . '.zip');
if (file_exists($path)) {
@unlink($path);
\Log::debug('----vendor zip 删除ok----');
}
}
/**
* 删除缓存配置文件
*/
public function delConfig()
{
$path = base_path('bootstrap/cache/config.php');
if (file_exists($path)) {
@unlink($path);
\Log::debug('----config 删除ok----');
}
}
/**
* 清理视图文件
*
* @param Filesystem|null $filesystem
*/
public function clearCache(Filesystem $filesystem = null)
{
\Log::debug('----View Cache Flush----');
if (is_null($filesystem)) {
$filesystem = app(Filesystem::class);
}
$allfiles = $filesystem->allFiles(storage_path('framework/views'));
foreach ($allfiles as $rows) {
@unlink($rows->getPathname());
}
}
/**
* 清理缓存
*/
public function createCache()
{
$request = request();
\Artisan::call('vendor:publish', ['--tag' => 'plugins', '--force' => true]);
\Artisan::call('config:cache');
\Cache::flush();
app()->instance('request', $request);
}
/**
* 下载vendor组件包重命名
*
* @param bool $res
*/
public function renameVendor($res = true)
{
\Log::debug('------renameVendor-------', [$res]);
if ($res) {
rename(base_path('vendor'), base_path('vendor_' . date('Y-m-d')));
} else {
rename(base_path('vendor_' . date('Y-m-d')), base_path('vendor'));
}
}
/**
* 删除本地vendor组件包
*
* @param $path
* @return bool
*/
public function delVendor($path)
{
\Log::debug('------delVendor-------');
if (is_dir($path)) {
$p = scandir($path);
if (count($p) > 2) {
foreach ($p as $val) {
if ($val != "." && $val != "..") {
if (is_dir($path . '/' . $val)) {
$this->delVendor($path . '/' . $val . '/');
} else {
unlink($path . '/' . $val);
}
}
}
}
}
return rmdir($path);
}
/**
* 设置更新的系统版本分支
*
* @param $ret
*/
public function setSysUpgrade($ret)
{
Cache::put('sys_upgrade', $ret['upgrade'], 60);
}
/**
* 获取系统版本分支
*
* @return mixed|string
*/
public function getSysUpgrade()
{
if (Cache::has('sys_upgrade')) {
return Cache::get('sys_upgrade');
}
return 'vendor';
}
/**
* 设置vendor压缩包是否下载成功
* @param $ret
*/
public function setVendorZip($ret)
{
Cache::put('sys_vendor_zip', $ret['is_vendor_zip'], 60);
}
/**
* 本地是否存在vendor压缩包
*
* @return false|mixed
*/
public function isVendorZip()
{
if (!$this->getComposerStatus()) {
return false;
}
if (Cache::has('sys_vendor_zip')) {
return Cache::get('sys_vendor_zip');
}
return false;
}
/**
* composer是否需要更新
*/
public function setComposerStatus()
{
Cache::put('sys_composer_status', 1, 60);
}
/**
* 获取composer状态
*
* @return false|mixed
*/
public function getComposerStatus()
{
if (Cache::has('sys_composer_status')) {
return Cache::get('sys_composer_status');
}
return false;
}
/**
* 检查vendor压缩包下载文件是否有效
*
* @return bool
*/
public function validateVendorZip()
{
$path = base_path($this->getSysUpgrade() . '_' . date('Y-m-d') . '.zip');
if (file_exists($path) && filesize($path) > 0) {
\Log::debug('--------validateVendorZip------');
return true;
}
\Log::debug('--------no validateVendorZip------');
return false;
}
/**
* 获取本地前端版本
*
* @return \Illuminate\Config\Repository|\Illuminate\Contracts\Foundation\Application|mixed
*/
public function getFrontendVersioin()
{
return config('front-version');
}
/**
* 获取本地后端版本
*
* @return \Illuminate\Config\Repository|\Illuminate\Contracts\Foundation\Application|mixed
*/
public function getBackendVersion()
{
return config('version');
}
/**
* 授权数据
*
* @param $autoUpdate
* @return mixed
*/
public function OriginData($autoUpdate)
{
$autoUpdate->setUpdateFile('system_check.json');
$res = $autoUpdate->remoteSystemVersion();
return $res;
}
/**
* 版本比较
*
* @param $autoUpdate
* @return array
*/
public function compareVersion($params)
{
$originBackendVersion = '未知';
$originFrontendVersion = '未知';
$hasUpgradeFile = 0;
if (isset($params->result)) {
$originBackendVersion = $params->result->backendVersion;
$originFrontendVersion = $params->result->frontendVersion;
}
$localFrontendVersion = $this->getFrontendVersioin();
$localBackendVersion = $this->getBackendVersion();
if (version::eq($localFrontendVersion, $originFrontendVersion)) {
$originFrontendVersion = '已经和本地版本一致';
}
if (version::eq($localBackendVersion, $originBackendVersion)) {
$originBackendVersion = '已经和本地版本一致';
}
if ($originBackendVersion == '已经和本地版本一致' && $originFrontendVersion == '已经和本地版本一致') {
$hasUpgradeFile = 1;
}
return [
'localBackendVersion' => $localBackendVersion,
'localFrontendVersion' => $localFrontendVersion,
'originBackendVersion' => $originBackendVersion,
'originFrontendVersion' => $originFrontendVersion,
'hasUpgradeFile' => $hasUpgradeFile
];
}
/**
* 域名信息
*
* @param $params
* @return array
*/
public function domainInfo($params)
{
$domainStatus = 0;
$currentDomain = rtrim(request()->getHost(), '/');
$originDomain = '未知';
if (isset($params->result)) {
$originDomain = $params->result->authDomain;
}
if (strpos($currentDomain, $originDomain) !== false) {
$domainStatus = 1;
}
switch ($domainStatus) {
case 0:
$domainStatusTxt = '不一致';
break;
case 1:
$domainStatusTxt = '已授权';
break;
default:
$domainStatusTxt = '未知';
}
return [
'originDomain' => $originDomain,
'domainStatus' => $domainStatus,
'domainStatusTxt' => $domainStatusTxt,
'currentDomain' => $currentDomain
];
}
/**
* 授权插件信息
*
* @param $params
* @return array
*/
public function originPlugins($params)
{
$originAuthPlugins = '未知';
$originAllPlugins = [];
$tmp_authPlugins = [];
$tmp_allPlugins = [];
$noAuthPlugins = []; //未授权插件
if (isset($params->result)) {
$originAuthPlugins = $params->result->authPlugins;
$originAllPlugins = $params->result->allPlugins;
}
foreach ($originAuthPlugins as $items) {
$tmp_authPlugins[] = $items->name;
}
foreach ($originAllPlugins as $rows) {
$tmp_allPlugins[] = $rows->name;
}
$noAuthPlugins = array_diff($tmp_allPlugins, $tmp_authPlugins);
if (is_array($originAuthPlugins)) {
$originAuthPlugins = count($originAuthPlugins);
}
return [
'originAuthPlugins' => $originAuthPlugins,
'noAuthPlugins' => $noAuthPlugins
];
}
/**
* 本地安装插件
*
* @return array
*/
public function localPlugins()
{
$localPlugins = [];
$resource = opendir(base_path('plugins'));
while ($file_name = @readdir($resource)) {
if ($file_name == '.' || $file_name == '..')
continue;
$plugin_path = base_path('plugins') . '/' . $file_name;
if (is_dir($plugin_path)) {
$localPlugins[] = $file_name;
}
}
closedir($resource);
return $localPlugins;
}
/**
* 插件信息
*
* @param $params
* @return array
*/
public function pluginsInfo($params)
{
//忽略
$filter_plugins = ['wechat'];
//未授权安装插件
$localNoAuthPlugins = [];
$originPlugins = $this->originPlugins($params);
$localPlugins = $this->localPlugins();
if (!empty($originPlugins['noAuthPlugins'])) {
$localNoAuthPlugins = array_intersect($originPlugins['noAuthPlugins'], $localPlugins);
$localNoAuthPlugins = array_diff($localNoAuthPlugins, $filter_plugins);
}
return [
'localInstallPlugins' => count($localPlugins),
'originAuthPlugins' => $originPlugins['originAuthPlugins'],
'localNoAuthPlugins' => count($localNoAuthPlugins),
'localNoAuthPluginsName' => $localNoAuthPlugins
];
}
/**
* 商城是否允许更新
*
* @param $domainInfo
* @param $pluginsInfo
* @return int[]
*/
public function systemStatus($domainInfo, $pluginsInfo)
{
$buttonStatus = 0; // 0-禁止更新;1-允许更新
if ($domainInfo['domainStatus'] == 1 && $pluginsInfo['localNoAuthPlugins'] == 0) {
$buttonStatus = 1;
}
return ['status' => $buttonStatus];
}
/**
* 系统版本检测
*
* @param $autoUpdate
* @return array|string[]
*/
public function systemCheck($autoUpdate)
{
$data = [
'local_backend_version' => '未知',
'local_frontend_version' => '未知',
'origin_backend_version' => '未知',
'origin_frontend_version' => '未知',
'origin_domain' => '未知',
'current_domain' => '未知',
'domain_status_txt' => '未知',
'origin_plugins_count' => '未知',
'local_plugins_count' => '未知',
'no_auth_plugins' => '未知',
'upgrade_status' => '未知',
'service_time' => '未知'
];
$res = $this->OriginData($autoUpdate);
$origin = json_decode($res);
if (!isset($origin->result)) {
return $data;
}
$ver = $this->compareVersion($origin);
$domainInfo = $this->domainInfo($origin);
$pluginsInfo = $this->pluginsInfo($origin);
$upgrade = $this->systemStatus($domainInfo, $pluginsInfo);
$data = [
'local_backend_version' => $ver['localBackendVersion'],
'local_frontend_version' => $ver['localFrontendVersion'],
'origin_backend_version' => $ver['originBackendVersion'],
'origin_frontend_version' => $ver['originFrontendVersion'],
'hasUpgradeFile' => $ver['hasUpgradeFile'],
'origin_domain' => $domainInfo['originDomain'],
'current_domain' => $domainInfo['currentDomain'],
'domain_status_txt' => $domainInfo['domainStatusTxt'],
'origin_plugins_count' => $pluginsInfo['originAuthPlugins'],
'local_plugins_count' => $pluginsInfo['localInstallPlugins'],
'no_auth_plugins' => $pluginsInfo['localNoAuthPlugins'],
'upgrade_status' => $upgrade['status'],
'service_time' => $origin->result->remainingTime
];
return $data;
}
/**
* 更新日志
*
* @param $autoUpdate
* @param $page
* @return mixed
*/
public function showLog($autoUpdate, $page)
{
$autoUpdate->setUpdateFile('show_log.json');
$res = $autoUpdate->showLog($page);
return $res;
}
/**
* 企业管理前端更新
*
* @return void
*/
public function business($version)
{
ini_set("memory_limit", "-1");
ini_set('max_execution_time', '0');
if (!file_exists(base_path('config/business_version.php')) || is_null($version)) {
return false;
}
//验证
if (version::lt(config('business_version'), $version) && $this->filesystem->isDirectory(base_path('plugins/business-pc'))) {
//下载
$path = base_path('business/business_font.zip');
if (!file_exists($path)) {
$url = $this->downloadUrl . '/company_backend/business_font.zip';
try {
Utils::download($url, $path);
\Log::debug('----business zip 下载ok----');
} catch (\Exception $e) {
\Log::debug('----business zip 下载失败----');
return;
}
}
//删除本地文件
if (file_exists($path)) {
$this->filesystem->deleteDirectory(base_path('business/business_font'));
\Log::debug('----business dir delete----');
}
//解压
if (file_exists($path)) {
$zip = new \ZipArchive();
$res = $zip->open($path);
if ($res === true) {
try {
$zip->extractTo(base_path('business'));
} catch (\Exception $e) {
$zip->close();
\Log::debug('----business zip 解压失败----');
return false;
}
} else {
$zip->close();
\Log::debug('----business zip 解压下载失败----');
return false;
}
$zip->close();
\Log::debug('----business zip 解压ok----');
}
//更新版本
$str = file_get_contents(base_path('config/') . 'business_version.php');
$str = preg_replace('/"[\d\.]+"/', '"' . $version . '"', $str);
file_put_contents(base_path('config/') . 'business_version.php', $str);
//删除压缩文件
if (file_exists($path)) {
@unlink($path);
\Log::debug('----business zip 删除ok----');
}
}
}
public function getPluginsInfo($autoUpdate)
{
$res = $this->OriginData($autoUpdate);
$origin = json_decode($res);
$pls = json_decode($this->OriginPlugin($autoUpdate));
$pluginsInfo = $this->pluginsInfo($origin);
$pluginsInfo['localNoAuthPluginsTitle'] = [];
if ($pluginsInfo['localNoAuthPlugins']) {
foreach ($pluginsInfo['localNoAuthPluginsName'] as $name) {
foreach ($pls->result->allPlugins as $rows) {
if ($name == $rows->name) {
$pluginsInfo['localNoAuthPluginsTitle'][] = $rows->title;
}
}
}
}
return $pluginsInfo;
}
public function OriginPlugin($autoUpdate)
{
$autoUpdate->setUpdateFile('origin_plugin.json');
$res = $autoUpdate->remoteSystemVersion();
return $res;
}
}