admin['roleid'])) { $this->_admin_msg(0, dr_lang('需要超级管理员账号操作')); } if (!$this->cmf_license) { $this->cmf_license = [ 'id' => 10, 'license' => SYS_TIME, ]; } elseif (!$this->cmf_license['license']) { $this->cmf_license['license'] = SYS_TIME; } list($this->admin_url) = explode('?', FC_NOW_URL); $this->service_url = 'https://www.xunruicms.com/cloud.php?domain=' . dr_get_domain_name(ROOT_URL) . '&admin=' . urlencode($this->admin_url) .'&frame='.FRAME_NAME. '&version=' . $this->cmf_version['version'] . '&cms=' . $this->cmf_version['id'] . '&license=' . $this->cmf_license['license']; if ($this->cmf_license['cloud'] && IS_OEM_CMS) { if (trim($this->cmf_license['cloud'], '/') == trim(ROOT_URL, '/')) { $this->_admin_msg(0, '云端服务器域名不能与本站点相同'); } $this->service_url = $this->cmf_license['cloud'] . '/index.php?s=cloud&c=api&domain=' . dr_get_domain_name(ROOT_URL) . '&admin=' . urlencode($this->admin_url) . '&license=' . $this->cmf_license['license']; } $this->vs = 0; if (defined('IS_VERSION') && IS_VERSION) { // 版本控制 $this->vs = 1; $this->service_url.= '&vs=1'; } \Phpcmf\Service::V()->assign([ 'vs' => $this->vs, 'is_oem' => $this->cmf_license['oem'] ? 1 : 0, 'license' => $this->cmf_license, 'license_sn' => $this->cmf_license['license'], 'cms_version' => $this->cmf_version, 'cmf_version' => $this->cmf_version, ]); } // 服务工单 public function service() { $url = 'https://www.xunruicms.com/service.php?cms='.$this->cmf_version['id'].'&license='.$this->cmf_license['license']; if ($this->cmf_license['service']) { $url = $this->cmf_license['service']; } \Phpcmf\Service::V()->assign([ 'url' => $url, ]); \Phpcmf\Service::V()->display('cloud_online.html');exit; } // 我的 public function index() { $domain = dr_get_domain_name(ROOT_URL); $license_domain = 'https://www.xunruicms.com/license/domain/'.$domain; if ($this->cmf_license['domain']) { $license_domain = trim($this->cmf_license['domain'], '/').'/index.php?s=license&m=show&domain='.$domain; } \Phpcmf\Service::V()->assign([ 'menu' => \Phpcmf\Service::M('auth')->_admin_menu( [ '我的项目' => [\Phpcmf\Service::L('Router')->class.'/'.\Phpcmf\Service::L('Router')->method, 'fa fa-cog'], ] ), 'domain' => $domain, 'ip_address' => \Phpcmf\Service::L('input')->ip_address(), 'license_domain' => $license_domain, ]); \Phpcmf\Service::V()->display('cloud_index.html');exit; } // 插件应用 public function app() { $id = []; $local = \Phpcmf\Service::Apps(); foreach ($local as $dir => $path) { if (is_file(dr_get_app_dir($dir).'Config/App.php')) { $cfg = require dr_get_app_dir($dir).'Config/App.php'; if (($cfg['type'] != 'module' || $cfg['ftype'] == 'module') && is_file(dr_get_app_dir($dir).'Config/Version.php')) { $vsn = require dr_get_app_dir($dir).'Config/Version.php'; $vsn['id'] && $id[] = $vsn['id']; } } } \Phpcmf\Service::V()->assign([ 'url' => $this->service_url.'&action=app&catid=15&id='.implode(',', $id), ]); \Phpcmf\Service::V()->display('cloud_online.html');exit; } // 功能组件 public function func() { \Phpcmf\Service::V()->assign([ 'url' => $this->service_url.'&action=app&catid=16', ]); \Phpcmf\Service::V()->display('cloud_online.html');exit; } // 模板界面 public function template() { \Phpcmf\Service::V()->assign([ 'url' => $this->service_url.'&action=app&catid=14', ]); \Phpcmf\Service::V()->display('cloud_online.html');exit; } // 本地应用 public function local() { if (SITE_ID > 1) { $this->_admin_msg(0, dr_lang('请切换到[主站点]操作'));exit; } $data = []; $local = \Phpcmf\Service::Apps(); foreach ($local as $dir => $path) { if (is_file($path.'Config/App.php')) { $key = strtolower($dir); $cfg = require $path.'Config/App.php'; if (($cfg['type'] != 'module' || $cfg['ftype'] == 'module') && is_file($path.'Config/Version.php')) { $vsn = \Phpcmf\Service::R($path.'Config/Version.php'); $menu = []; $install = is_file($path.'install.lock'); if ($install && is_file($path.'Config/Menu.php')) { //$cfg['uri'] ? \Phpcmf\Service::M('auth')->_menu_link_url($cfg['uri'], '', [], true) : '' $m = require $path.'Config/Menu.php'; if ($m['admin']) { foreach ($m['admin'] as $m1) { if ($m1['left']) { foreach ($m1['left'] as $m2) { if ($m2['link']) { foreach ($m2['link'] as $m3) { if ($m3['uri']) { $menu[] = [ 'name' => $m3['name'], 'url' => \Phpcmf\Service::M('auth')->_menu_link_url($m3['uri'], '', [], true), ]; } } } } } } } } $data[$key] = [ 'id' => $vsn['id'], 'name' => $cfg['name'], 'type' => $cfg['type'], 'mtype' => $cfg['mtype'], 'ftype' => $cfg['ftype'], 'icon' => $cfg['icon'], 'author' => $cfg['author'], 'menu' => $menu, 'version' => $vsn['version'], 'vip' => \Phpcmf\Service::M('app')->is_pro($dir), 'install' => $install, ]; } } } $menu = [ '本地应用' => [\Phpcmf\Service::L('Router')->class.'/'.\Phpcmf\Service::L('Router')->method, 'fa fa-puzzle-piece'], 'help' => [574], ]; if (IS_DEV) { $menu['应用市场'] = [\Phpcmf\Service::L('Router')->class.'/app', 'fa fa-cloud']; } \Phpcmf\Service::V()->assign([ 'list' => $data, 'menu' => \Phpcmf\Service::M('auth')->_admin_menu($menu), 'dev_down_url' => $this->service_url.'&action=app&type=down&catid=15&', ]); \Phpcmf\Service::V()->display('cloud_app.html'); } // 安装程序 public function install() { $id = dr_safe_filename(\Phpcmf\Service::L('input')->get('id')); $dir = dr_safe_replace(\Phpcmf\Service::L('input')->get('dir')); $type = intval(\Phpcmf\Service::L('input')->get('type')); if (!is_file(dr_get_app_dir($dir).'Config/App.php')) { if (IS_DEV) { $this->_json(0, dr_lang('安装程序'.dr_get_app_dir($dir).'Config/App.php不存在')); } $this->_json(0, dr_lang('安装程序App.php不存在')); } // 开始安装 $rt = \Phpcmf\Service::M('App')->install($dir, $type); if (!$rt['code']) { $this->_json(0, $rt['msg']); } // 运行安装脚本 if (is_file(WRITEPATH.'cloud/run-'.$id.'.php')) { require WRITEPATH.'cloud/run-'.$id.'.php'; } // 判断public if (defined('IS_VERSION') && IS_VERSION) { } else { // 传统结构时复制目录到根目录去 $path = ROOTPATH.'public/'; if (is_dir($path)) { \Phpcmf\Service::L('file')->copy_dir($path, $path, ROOTPATH); dr_dir_delete($path, true); } } \Phpcmf\Service::M('cache')->sync_cache(''); $this->_json(1, dr_lang('安装成功,请刷新后台页面'), $rt['data']); } // 卸载程序 public function uninstall() { $dir = dr_safe_replace(\Phpcmf\Service::L('input')->get('dir')); if (!preg_match('/^[a-z_]+$/U', $dir)) { $this->_json(0, dr_lang('目录[%s]格式不正确', $dir)); } $path = dr_get_app_dir($dir); if (!is_dir($path)) { $this->_json(0, dr_lang('目录[%s]不存在', $path)); } $rt = \Phpcmf\Service::M('App')->uninstall($dir); $this->_json($rt['code'], $rt['msg']); } // 验证授权 public function login() { if (IS_POST) { $post = \Phpcmf\Service::L('input')->post('data'); $surl = $this->service_url.'&action=update_login&get_http=1&username='.$post['username'].'&password='.md5($post['password']); $json = dr_catcher_data($surl); if (!$json) { $this->_json(0, '本站:没有从服务端获取到数据,建议尝试离线方式'); } $rt = dr_string2array($json); if (!$rt) { $this->_json(0, '本站:从服务端获取到的数据不规范('.dr_strcut($json, 30).')'); } if (!$rt['code']) { $this->_json(0, '服务端:'.$rt['msg']); } if (dr_strlen($rt['data']) > 8) { $myfile = MYPATH.'Config/License.php'; if (is_file($myfile)) { // 存在就更新id if ($rt['data'] != $this->cmf_license['license']) { $this->cmf_license['license'] = $rt['data']; \Phpcmf\Service::L('Config')->file($myfile, '此文件是版本文件,每次下载安装包会自动生成,请勿修改', 32) ->to_require($this->cmf_license); } } else { $text = " '".$rt['data']."', 'name' => '迅睿开源版', 'url' => 'https://www.xunruicms.com', ]; "; if (!file_put_contents($myfile, $text)) { $this->_json(0, '本站:dayrui/My/目录无法写入文件,请给于777权限'); } } } $this->_json(1, $rt['msg'], $rt['data']); } \Phpcmf\Service::V()->display('cloud_login_ajax.html');exit; } // 下载程序 从服务端接收 function down_file() { \Phpcmf\Service::V()->assign([ 'ls' => intval($_GET['ls']), 'app_id' => 'app-'.dr_safe_replace($_GET['cid']), ]); \Phpcmf\Service::V()->display('cloud_down_file.html');exit; } // 安装模板 public function install_tpl() { $id = dr_safe_filename(\Phpcmf\Service::L('input')->get('id')); $dir = dr_safe_replace(\Phpcmf\Service::L('input')->get('dir')); if (!$dir) { $this->_json(0, dr_lang('缺少模板参数')); } \Phpcmf\Service::M('app')->install_tpl($dir, $id); $this->_json(1, dr_lang('当前站点模板安装成功,请访问前台预览')); } // 将下载程序安装到目录中 function install_app() { $id = dr_safe_filename($_GET['id']); $file = WRITEPATH.'cloud/'.$id.'.zip'; $cmspath = WRITEPATH.'cloud/'.$id.'/'; if (!is_file($file)) { $this->_json(0, '本站:文件还没有被下载'); } elseif (!class_exists('ZipArchive')) { $this->_json(0, '本站:php_zip扩展未开启,无法在线安装功能,建议尝试离线方式'); } $cache = \Phpcmf\Service::L('cache')->get_data('cloud-update-'.$id); if (!$cache) { $this->_json(0, '本站:授权验证缓存过期,请重试'); } // 解压目录 if (!\Phpcmf\Service::L('file')->unzip($file, $cmspath)) { $this->_json(0, '本站:文件解压失败'); } // 查询插件目录 $is_app = $is_module_app = $is_tpl = 0; if (is_file($cmspath.'Install.php') && strpos(file_get_contents($cmspath.'Install.php'), 'return') !== false) { $ins = require $cmspath.'Install.php'; if (isset($ins['type']) && $ins['type'] == 'app') { if ($ins['name'] && is_file($cmspath.'APPSPATH/'.ucfirst($ins['name']).'/Config/App.php')) { $cfg = require $cmspath.'APPSPATH/'.ucfirst($ins['name']).'/Config/App.php'; $is_app = $ins['name']; $is_module_app = $cfg['ftype'] == 'module' && $cfg['mtype'] == 0; } } elseif (isset($ins['type']) && $ins['type'] == 'tpl') { if ($ins['name']) { $is_tpl = $ins['name']; } } } // 安装之前的验证 if (is_file($cmspath.'Check.php')) { require $cmspath.'Check.php'; } if (is_file($cmspath.'Run.php')) { copy($cmspath.'Run.php',WRITEPATH.'cloud/run-'.$id.'.php'); } if (!$is_tpl && !$is_app && is_dir($cmspath.'APPSPATH/')) { $p = dr_dir_map($cmspath.'APPSPATH/', 1); foreach ($p as $name) { if (is_file($cmspath.'APPSPATH/'.$name.'/Config/App.php') && is_file($cmspath.'APPSPATH/'.$name.'/Config/Version.php')) { if (is_file($cmspath.'APPSPATH/'.$name.'/install.lock')) { unlink($cmspath.'APPSPATH/'.$name.'/install.lock'); } $is_app = strtolower($name); $cfg = require $cmspath.'APPSPATH/'.$name.'/Config/App.php'; $is_module_app = $cfg['ftype'] == 'module' && $cfg['mtype'] == 0; break; } if (is_file($cmspath.'APPSPATH/'.$name.'/Config/Before.php')) { $rt = require $cmspath.'APPSPATH/'.$name.'/Config/Before.php'; if (!$rt['code']) { $this->_json(0, $rt['msg']); } } } } // 判断本地目录是否有重名的 if ($is_app && is_dir(APPSPATH.ucfirst($is_app))) { $cf = dr_safe_filename($_GET['cf']); if ('ok' != $cf) { $app_name = ucfirst($is_app); $app_path = APPSPATH.$app_name; $msg = '
' .'

警告:插件文件夹已存在,需要您确认是否覆盖

' .'

本插件文件夹('.$app_name.')已经存在于本站:

' .'

'.$app_path.'

' .'

覆盖将替换本站现有文件,强烈建议提前备份后再操作!

' .'
' .'
' .'' .'' .'
'; $this->_json(1, $msg, ['confirm' => 1]); } } // 备份模板 \Phpcmf\Service::L('file')->zip( WRITEPATH.'backups/update/template/'.date('Y-m-d-H-i-s').'.zip', TPLPATH ); // 复制文件到程序 $is_ok = 0; if (is_dir($cmspath.'APPSPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'APPSPATH', APPSPATH); } /* if ($this->vs) { if (is_dir($cmspath.'WEBPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'WEBPATH', ROOTPATH.'public/'); } if (is_dir($cmspath.'ROOTPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'ROOTPATH', ROOTPATH.'public/'); } if (is_dir($cmspath.'CSSPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'CSSPATH/', ROOTPATH.'public/static/'); } } else {*/ if (is_dir($cmspath.'WEBPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'WEBPATH', ROOTPATH); } if (is_dir($cmspath.'ROOTPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'ROOTPATH', ROOTPATH); } if (is_dir($cmspath.'CSSPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'CSSPATH/', ROOTPATH.'static/'); } //} if (is_dir($cmspath.'TPLPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'TPLPATH', TPLPATH); } if (is_dir($cmspath.'WRITEPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'WRITEPATH', WRITEPATH); } if (is_dir($cmspath.'FCPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'FCPATH', FCPATH); } if (is_dir($cmspath.'MYPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'MYPATH', MYPATH); } if (is_dir($cmspath.'COREPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'COREPATH', COREPATH); } if (is_dir($cmspath.'CMSPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'CMSPATH', COREPATH); } if (is_dir($cmspath.'CONFIGPATH')) { $is_ok = 1; $this->_copy_dir($cmspath.'CONFIGPATH', CONFIGPATH); } // 开发者模式下保留目录 if (!IS_DEV) { unlink($file); dr_dir_delete($cmspath, 1); } if (!$is_ok) { $this->_json(0, '本站:当前下载的应用程序'.($is_app ? '('.$is_app.')' : '').'压缩包已损坏,请尝试离线下载安装'); } if ($is_app) { if ($id == 'app-xiazai_list' || $id == 'app-xiazailist') { $btn = ' 前往应用管理页面,安装多个应用插件'; $msg = $this->_install_done_msg('程序导入完成', '文件已成功导入本站,请前往应用管理页面继续安装插件。', $btn); } else { if ($is_module_app) { $btn = ''; $msg = $this->_install_done_msg('程序导入完成', '文件已成功导入本站,请点击下方按钮安装应用插件。', $btn); } else { $btn = ''; $msg = $this->_install_done_msg('程序导入完成', '文件已成功导入本站,请点击下方按钮安装应用插件。', $btn); } } } elseif ($is_tpl) { $btn = ''; $msg = $this->_install_done_msg('模板导入完成', '模板文件已成功导入本站,请点击下方按钮安装到当前站点。', $btn); } else { if ($this->cmf_license['oem']) { $msg = $this->_install_done_msg('程序导入完成', '文件已成功导入本站。'); } else { $btn = ' 请按本商品的使用教程来操作'; $msg = $this->_install_done_msg('程序导入完成', '文件已成功导入本站,请按使用教程继续操作。', $btn); } } $this->_json(1, $msg, ['complete' => 1]); } // 导入完成提示框 private function _install_done_msg($title, $desc, $btn_html = '') { $msg = '
' .'

'.$title.'

' .'

'.$desc.'

' .'
'; if ($btn_html) { $msg .= '
'.$btn_html.'
'; } return $msg; } // 判断备份目录是否有效 private function _is_backup_file($path) { if (is_dir($path)) { if ($dh = opendir($path)) { while (($file = readdir($dh)) !== false) { if (strpos($file, '.zip') !== false){ closedir($dh); return $path; } } closedir($dh); } } return ''; } // 程序升级 public function update() { $data = []; $data['phpcmf'] = $this->cmf_version; $data['phpcmf']['id'] = 'cms-1'; $data['phpcmf']['tname'] = $this->cmf_license['oem'] ? '系统' : '系统'; $data['phpcmf']['backup'] = $this->_is_backup_file(WRITEPATH.'backups/update/cms/'); $data['phpcmf']['backup_tpl'] = $this->_is_backup_file(WRITEPATH.'backups/update/template/'); $data['phpcmf']['backup_time'] = is_dir(WRITEPATH.'backups/update/cms/') ? dr_date(filemtime(WRITEPATH.'backups/update/cms/')) : ''; $data['cms'] = []; $local = dr_dir_map(APPSPATH, 1); foreach ($local as $dir) { if (is_file(APPSPATH.$dir.'/Config/App.php')) { $key = strtolower($dir); $cfg = require APPSPATH.$dir.'/Config/App.php'; if (($cfg['type'] != 'module' || $cfg['ftype'] == 'module') && is_file(APPSPATH.$dir.'/Config/Version.php')) { $vsn = \Phpcmf\Service::R(APPSPATH.$dir.'/Config/Version.php'); $path = WRITEPATH.'backups/update/'.$key.'/'; $vsn['id'] && $data[$key] = [ 'id' => $cfg['type'].'-'.$vsn['id'], 'name' => $cfg['name'], 'type' => $cfg['type'], 'tname' => $this->cmf_license['oem'] ? '应用' : '应用', 'version' => $vsn['version'], 'license' => $vsn['license'], 'vip' => \Phpcmf\Service::M('app')->is_pro($dir), 'updatetime' => $vsn['updatetime'], 'backup' => $this->_is_backup_file($path), 'backup_tpl' => $data['phpcmf']['backup_tpl'], 'backup_time' => is_dir($path) ? dr_date(filemtime($path)) : '', ]; } } } if (!dr_count($data['cms'])) { unset($data['cms']); } $menu = [ '版本升级' => [\Phpcmf\Service::L('Router')->class.'/'.\Phpcmf\Service::L('Router')->method, 'fa fa-refresh'], '文件对比' => [\Phpcmf\Service::L('Router')->class.'/bf', 'fa fa-code'], 'help' => [379], ]; if ($this->cmf_license['oem']) { unset($menu['文件对比']); } \Phpcmf\Service::V()->assign([ 'list' => $data, 'menu' => \Phpcmf\Service::M('auth')->_admin_menu($menu), 'cms_id' => $this->cmf_version['cms'], 'domain_id' => $this->cmf_license['id'], ]); \Phpcmf\Service::V()->display('cloud_update.html');exit; } // 检查服务器版本 public function check_version() { $cid = dr_safe_replace($_GET['id']); if ($cid == 'cms-1') { // 目录权限检查 $dir = [ WRITEPATH, ROOTPATH, APPSPATH, TPLPATH, FCPATH, MYPATH, ]; foreach ($dir as $t) { if (!dr_check_put_path($t)) { $this->_json(0, dr_lang('目录【%s】不可写', $t)); } } } $index = isset($_GET['isindex']) ? 1 : 0; $vid = dr_safe_replace($_GET['version']); $surl = $this->service_url.'&action=check_version&php='.PHP_VERSION .'&get_http=1&time='.strtotime((string)$this->cmf_version['downtime']) .'&id='.$cid.'&isindex='.$index.'&version=' .$vid.'&license='.$this->cmf_license['license']; if ($index) { // 首页检查附带部分插件 $surl.= '&extends='.dr_array2string($this->_get_app_version()); } $json = dr_catcher_data($surl); if (!$json) { $this->_json(0, '本站:没有从服务端获取到数据,检查本地环境是否支持远程下载功能'); } $rt = json_decode($json, true); $this->_json($rt['code'], $index ? dr_clearhtml($rt['msg']) : $rt['msg']); } // 执行更新程序的界面 public function todo_update() { \Phpcmf\Service::V()->assign([ 'ls' => dr_safe_replace($_GET['ls']), 'dir' => dr_safe_replace($_GET['dir']), 'is_bf' => intval($_GET['is_bf']), 'app_id' => dr_safe_replace($_GET['id']), ]); \Phpcmf\Service::V()->display('cloud_todo_update.html');exit; } // 备份本站文件 public function update_backup() { $dir = dr_safe_filename($_GET['dir']); if (!$dir) { $this->_json(0, '本站:没有选择任何升级程序'); } $is_bf = intval($_GET['is_bf']); if ($is_bf) { $this->_json(1, '你选择不备份直接升级程序'); } if ($dir == 'phpcmf') { // 主程序备份 $rt = \Phpcmf\Service::L('file')->zip( WRITEPATH.'backups/update/cms/'.date('Y-m-d-H-i-s').'.zip', FCPATH ); } else { $arr = explode(',', $dir); foreach ($arr as $dir) { if ($dir) { // 插件备份 $rt = \Phpcmf\Service::L('file')->zip( WRITEPATH.'backups/update/'.$dir.'/'.date('Y-m-d-H-i-s').'.zip', dr_get_app_dir($dir) ); } } } if ($rt) { $this->_json(0, '本站:文件备份失败('.$rt.')'); } // 备份模板 \Phpcmf\Service::L('file')->zip( WRITEPATH.'backups/update/template/'.date('Y-m-d-H-i-s').'.zip', TPLPATH ); $this->_json(1, '本站文件备份完成'); } // 服务器下载升级文件 public function update_file() { $id = dr_safe_replace($_GET['id']); if (!$id) { $this->_json(0, '本站:没有选择任何升级程序'); } $surl = $this->service_url.'&action=update_file&php='.PHP_VERSION.'&get_http=1&app_id='.$id.'&ls='.dr_safe_replace($_GET['ls']).'&is_update='.intval($_GET['is_update']); $json = dr_catcher_data($surl); if (!$json) { $this->_json(0, '本站:没有从服务端获取到数据,检查本地环境是否支持远程下载功能', $surl); } $data = dr_string2array($json); if (!$data) { CI_DEBUG && log_message('error', '服务端['.$surl.']返回数据异常:'.$json); $this->_json(0, '本站:服务端数据异常,请重新下载', $json); } elseif (!$data['code']) { $this->_json(0, $data['msg']); } elseif (!$data['data']['size']) { $this->_json(0, '本站:服务端文件总大小异常'); } elseif (!$data['data']['url']) { $this->_json(0, '本站:服务端文件下载地址异常'); } \Phpcmf\Service::L('cache')->set_data('cloud-update-'.$id, $data['data'], 3600); $this->_json(1, 'ok', $data['data']); } // 开始下载脚本 从服务端请求下载打包文件 public function update_file_down() { $id = dr_safe_replace($_GET['id']); $cache = \Phpcmf\Service::L('cache')->get_data('cloud-update-'.$id); if (!$cache) { $this->_json(0, '本站:授权验证缓存过期,请重试'); } elseif (!$cache['size']) { $this->_json(0, '本站:关键数据不存在,请重试'); } elseif (!function_exists('fsockopen')) { $this->_json(0, '本站:PHP环境不支持fsockopen,建议尝试离线方式'); } // 执行下载文件 $file = WRITEPATH.'cloud/'.$id.'.zip'; set_time_limit(0); touch($file); // 做些日志处理 if ($fp = fopen($cache['url'], "rb")) { if (!$download_fp = fopen($file, "wb")) { $this->_json(0, '本站:无法写入远程文件', $cache['url']); } while (!feof($fp)) { if (!is_file($file)) { // 如果临时文件被删除就取消下载 fclose($download_fp); $this->_json(0, '本站:临时文件被删除', $cache['url']); } fwrite($download_fp, fread($fp, 1024 * 8 ), 1024 * 8); } fclose($download_fp); fclose($fp); $this->_json(1, 'ok'); } else { unlink($file); $this->_json(0, '本站:fopen打开远程文件失败,建议尝试离线方式', $cache['url']); } } // 检测下载进度 public function update_file_check() { $id = dr_safe_replace($_GET['id']); $cache = \Phpcmf\Service::L('cache')->get_data('cloud-update-'.$id); if (!$cache) { $this->_json(0, '本站:授权验证缓存过期,请重试'); } elseif (!$cache['size']) { $this->_json(0, '本站:关键数据不存在,请重试'); } // 执行下载文件 $file = WRITEPATH.'cloud/'.$id.'.zip'; if (is_file($file)) { $now = max(1, filesize($file)); $jd = max(1, round($now / $cache['size'] * 100, 0)); // 进度百分百 $count = isset($_GET['is_count']) ? intval($_GET['is_count']) : 0; // 表示请求次数 if (($count > 3 && $jd > 98) || (isset($_GET['is_jd']) && $_GET['is_jd'] == $jd)) { $jd = 100; } $this->_json($jd, '

'); } else { $this->_json(0, '本站:文件下载失败,建议尝试离线方式'); } } // 升级程序 public function update_file_install() { $id = dr_safe_replace($_GET['id']); $cache = \Phpcmf\Service::L('cache')->get_data('cloud-update-'.$id); if (!$cache) { $this->_json(0, '本站:授权验证缓存过期,请重试'); } $file = WRITEPATH.'cloud/'.$id.'.zip'; if (!is_file($file)) { $this->_json(0, '本站:文件还没有被下载'); } // 解压目录 $cmspath = WRITEPATH.'cloud/'.$id.'/'; dr_dir_delete($cmspath, true); if (!\Phpcmf\Service::L('file')->unzip($file, $cmspath)) { $this->_json(0, '本站:文件解压失败'); } unlink($file); list($type) = explode('-', $id); if ($type == 'cms') { // cms // 缓存目录 if (is_dir($cmspath.'cache')) { $this->_copy_dir($cmspath.'cache', WRITEPATH); dr_dir_delete($cmspath.'cache', 1); } // APP目录 if (is_dir($cmspath.'dayrui/App')) { $this->_copy_dir($cmspath.'dayrui/App', APPSPATH); dr_dir_delete($cmspath.'dayrui/App', 1); } // MYAPP目录 if (is_dir($cmspath.'dayrui/My')) { $this->_copy_dir($cmspath.'dayrui/My', MYPATH); dr_dir_delete($cmspath.'dayrui/My', 1); } // FCPACH目录 if (is_dir($cmspath.'dayrui')) { $this->_copy_dir($cmspath.'dayrui', FCPATH); dr_dir_delete($cmspath.'dayrui', 1); } // public目录复制到主目录 if (is_dir($cmspath.'public')) { $this->_copy_dir($cmspath.'public', ROOTPATH); dr_dir_delete($cmspath.'public', 1); } $this->_copy_dir($cmspath, ROOTPATH); } else { // 插件部分 // 查询插件目录 if (is_dir($cmspath.'APPSPATH/')) { $p = dr_dir_map($cmspath.'APPSPATH/', 1); foreach ($p as $name) { if (is_file($cmspath.'APPSPATH/'.$name.'/Config/App.php')) { if (is_file($cmspath.'APPSPATH/'.$name.'/install.lock')) { unlink($cmspath.'APPSPATH/'.$name.'/install.lock'); } break; } } } // 复制文件到程序 if (is_dir($cmspath.'APPSPATH')) { $this->_copy_dir($cmspath.'APPSPATH', APPSPATH); } // 是否存在public目录 if (is_dir(ROOTPATH.'public/')) { if (is_dir($cmspath.'WEBPATH')) { $this->_copy_dir($cmspath.'WEBPATH', ROOTPATH.'public/'); } if (is_dir($cmspath.'ROOTPATH')) { $this->_copy_dir($cmspath.'ROOTPATH', ROOTPATH.'public/'); } if (is_dir($cmspath.'CSSPATH')) { $this->_copy_dir($cmspath.'CSSPATH/', ROOTPATH.'public/static/'); } } else { if (is_dir($cmspath.'WEBPATH')) { $this->_copy_dir($cmspath.'WEBPATH', ROOTPATH); } if (is_dir($cmspath.'ROOTPATH')) { $this->_copy_dir($cmspath.'ROOTPATH', ROOTPATH); } if (is_dir($cmspath.'CSSPATH')) { $this->_copy_dir($cmspath.'CSSPATH/', ROOTPATH.'static/'); } } /*升级不覆盖模板 if (is_dir($cmspath.'TPLPATH')) { $this->_copy_dir($cmspath.'TPLPATH', TPLPATH); }*/ if (is_dir($cmspath.'WRITEPATH')) { $this->_copy_dir($cmspath.'WRITEPATH', WRITEPATH); } if (is_dir($cmspath.'FCPATH')) { $this->_copy_dir($cmspath.'FCPATH', FCPATH); } if (is_dir($cmspath.'MYPATH')) { $this->_copy_dir($cmspath.'MYPATH', MYPATH); } if (is_dir($cmspath.'COREPATH')) { $this->_copy_dir($cmspath.'COREPATH', COREPATH); } if (is_dir($cmspath.'CMSPATH')) { $this->_copy_dir($cmspath.'CMSPATH', COREPATH); } if (is_dir($cmspath.'CONFIGPATH')) { $this->_copy_dir($cmspath.'CONFIGPATH', CONFIGPATH); } } dr_dir_delete($cmspath, 1); file_put_contents(WRITEPATH.'update.lock', SYS_TIME); $this->_json(1, '

'); } // 文件对比 public function bf() { if ($this->cmf_license['oem']) { $this->_admin_msg(0, '无法使用此功能'); } \Phpcmf\Service::V()->assign([ 'menu' => \Phpcmf\Service::M('auth')->_admin_menu( [ '文件对比' => [\Phpcmf\Service::L('Router')->class.'/'.\Phpcmf\Service::L('Router')->method, 'fa fa-code'], 'help' => [608], ] ), ]); \Phpcmf\Service::V()->display('cloud_bf.html');exit; } public function bf_count() { $surl = 'https://www.xunruicms.com/version.php?action=bf_count&domain=' .dr_get_domain_name(ROOT_URL).'&cms='.$this->version['id']. '&version='.$this->cmf_version['version'].'&time='.strtotime((string)$this->cmf_version['downtime']) .'&license='.$this->cmf_license['license']; $json = dr_catcher_data($surl); if (!$json) { $this->_json(0, '本站:没有从服务端获取到数据,检查本地环境是否支持远程下载功能'); } $data = dr_string2array($json); if (!$data) { CI_DEBUG && log_message('error', '迅睿云端返回数据异常:'.$json); $this->_json(0, '本站:服务端数据异常,请重新再试'); } elseif (!$data['code']) { $this->_json(0, $data['msg']); } \Phpcmf\Service::L('cache')->set_data('cloud-bf', $data['data'], 3600); $this->_json(dr_count($data['data']), $data['msg']); } public function bf_check() { $page = max(1, intval($_GET['page'])); $cache = \Phpcmf\Service::L('cache')->get_data('cloud-bf'); if (!$cache) { $this->_json(0, '本站:数据缓存不存在'); } $data = $cache[$page]; if ($data) { $html = ''; foreach ($data as $filename => $value) { if (strpos($filename, 'Version.php')) { continue; } if (strpos($filename, '/dayrui') === 0) { $cname = 'FCPATH'.substr($filename, 7); $ofile = FCPATH.substr($filename, 8); } else { $cname = 'WEBPATH'.$filename; $ofile = WEBPATH.substr($filename, 1); } if (CI_DEBUG) { $cname = $ofile; } $class = ''; if (!is_file($ofile)) { $ok = "不存在"; $class = 'p_error'; } elseif (md5_file($ofile) != $value) { $ok = "有变化"; $class = 'p_error'; } else { $ok = "正常"; } $html.= '

'; if ($class) { $html.= ''; } } $this->_json($page + 1, $html); } // 完成 \Phpcmf\Service::L('cache')->clear('cloud-bf'); $this->_json(100, ''); } // 删除app的提示信息 public function app_delete() { $dir = dr_safe_filename($_GET['dir']); if (!$dir) { $this->_json(0, dr_lang('目录不能为空')); } $path = dr_get_app_dir($dir); if (!is_file($path.'Config/App.php')) { $this->_json(0, dr_lang('目录%s不是一个有效的应用', $dir)); } if (is_file($path.'install.lock')) { $this->_json(0, dr_lang('应用%s需要卸载后才能删除', $dir)); } if (IS_POST) { dr_dir_delete($path, true); if (is_dir($path)) { $this->_json(0, dr_lang('目录未删除成功,建议手动删除该目录'), [ 'time' => -1 ]); } $this->_json(1, dr_lang('操作成功')); } $files = []; if (is_file($path.'Files.txt')) { $arr = explode(',', file_get_contents($path.'Files.txt')); if ($arr) { foreach ($arr as $t) { if (!$t) { continue; } if (IS_DEV) { $t = $this->_replace_path($t); } $files[] = $t; } } } \Phpcmf\Service::V()->assign([ 'dir' => $dir, 'path' => IS_DEV ? $path : dr_safe_replace_path($path), 'files' => $files, ]); \Phpcmf\Service::V()->display('cloud_app_delete.html');exit; } // app的文件列表 public function app_file() { $dir = dr_safe_filename($_GET['dir']); if (!$dir) { $this->_json(0, dr_lang('目录不能为空')); } $path = dr_get_app_dir($dir); $files = []; if (is_file($path.'Files.txt')) { $arr = explode(',', file_get_contents($path.'Files.txt')); if ($arr) { foreach ($arr as $t) { if (!$t) { continue; } if (IS_DEV) { $t = $this->_replace_path($t); } $files[] = $t; } } } else { $this->_json(0, dr_lang('没有找到相关文件')); } \Phpcmf\Service::V()->assign([ 'files' => $files, ]); \Phpcmf\Service::V()->display('cloud_app_file.html');exit; } // 服务器下载离线包 public function down_app() { $id = dr_safe_replace($_GET['id']); if (!$id) { $this->_msg(0, '没有选择需要下载的程序'); } $surl = $this->service_url.'&action=lx_admin&php='.PHP_VERSION.'&app_id='.$id.'&ls='.dr_safe_replace($_GET['ls']); dr_redirect($surl); } /////////////////////////////////////////////////// // 替换域名 private function _replace_path($t) { return str_replace( [ 'WRITEPATH/', 'ROOTPATH/', 'WEBPATH/', 'APPSPATH/', 'TPLPATH/', 'FCPATH/', 'COREPATH/', 'MYPATH/', 'CSSPATH/', ], [ WRITEPATH, ROOTPATH, WEBPATH, APPSPATH, TPLPATH, FCPATH, COREPATH, MYPATH, ROOTPATH.'static/', ], trim($t, '/') ); } // 复制目录 private function _copy_dir($src, $dst) { $dir = opendir($src); if (!is_dir($dst)) { @mkdir($dst); } $src = rtrim($src, '/'); $dst = rtrim($dst, '/'); while(false !== ( $file = readdir($dir)) ) { if (( $file != '.' ) && ( $file != '..' )) { if (is_dir($src . '/' . $file) ) { dr_mkdirs($dst . '/' . $file); $this->_copy_dir($src . '/' . $file, $dst . '/' . $file); continue; } else { dr_mkdirs(dirname($dst . '/' . $file)); $rt = copy($src . '/' . $file, $dst . '/' . $file); if (!$rt) { // 验证目标是不是空文件 if (filesize($src . '/' . $file) > 1) { $this->_error_msg($dst . '/' . $file, '移动失败,检查文件目录权限'); } } } } } closedir($dir); } // 版本日志 function log_show() { $url = 'https://www.xunruicms.com/version.php?id='.\Phpcmf\Service::L('input')->get('id', true).'&version='.\Phpcmf\Service::L('input')->get('version', true); \Phpcmf\Service::V()->assign([ 'url' => $url, ]); \Phpcmf\Service::V()->display('cloud_online.html');exit; } // 获取本地程序和应用的版本号 private function _get_app_version() { $data = []; $data['cms-1'] = $this->cmf_version['version']; $local = dr_dir_map(APPSPATH, 1); foreach ($local as $dir) { if (is_file(APPSPATH.$dir.'/Config/App.php') && is_file(APPSPATH.$dir.'/Config/Version.php')) { $cfg = require APPSPATH.$dir.'/Config/App.php'; if ($cfg['type'] != 'module') { $vsn = require APPSPATH.$dir.'/Config/Version.php'; $vsn['id'] && $data[$cfg['type'].'-'.$vsn['id']] = $vsn['version']; } } } return $data; } // 错误进度 private function _error_msg($filename, $msg) { $html = '

'; $this->_json(0, $html); } }