MCSManager/app.js

304 lines
9.0 KiB
JavaScript
Raw Normal View History

2018-02-13 15:07:06 +08:00
//运行时环境检测
try {
let versionNum = parseInt(process.version.replace(/v/igm, "").split(".")[0]);
2019-09-17 14:39:35 +08:00
//尽管我们建议最低版本为 v8 版本
if (versionNum < 8) {
2018-05-30 17:03:08 +08:00
console.log("[ WARN ] 您的 Node 运行环境版本似乎低于我们要求的版本.");
2019-09-17 14:39:35 +08:00
console.log("[ WARN ] 可能会出现未知情况,建议您更新 Node 版本 (>=8.0.0)");
2018-02-13 15:07:06 +08:00
}
} catch (err) {
//忽略任何版本检测导致的错误
}
2018-06-03 10:43:49 +08:00
//全局变量 MCSERVER
global.MCSERVER = {};
//测试时检测
MCSERVER.allError = 0;
//自动化部署测试
2018-05-30 13:19:40 +08:00
setTimeout(() => {
let arg2 = process.argv[2] || '';
if (arg2 == '--test') {
2018-06-03 10:43:49 +08:00
MCSERVER.infoLog("Test", "测试过程结束...");
if (MCSERVER.allError > 0) {
MCSERVER.infoLog("Test", "测试未通过!");
process.exit(500);
}
MCSERVER.infoLog("Test", "测试通过!");
2018-05-30 13:19:40 +08:00
process.exit(0);
}
}, 10000);
2018-04-29 20:19:06 +08:00
const fs = require('fs');
const fsex = require('fs-extra');
2018-02-24 16:00:15 +08:00
//全局仅限本地配置
2018-04-18 20:08:09 +08:00
MCSERVER.localProperty = {};
2018-04-29 20:19:06 +08:00
const tools = require('./core/tools');
//生成第一次配置文件
const INIT_CONFIG_PATH = './model/init_config/';
const PRO_CONFIG = './property.js';
if (!fs.existsSync(PRO_CONFIG))
tools.mCopyFileSync(INIT_CONFIG_PATH + 'property.js', PRO_CONFIG);
2018-02-24 16:00:15 +08:00
//加载配置
require('./property');
2017-11-13 12:26:31 +08:00
const express = require('express');
2018-04-18 10:47:57 +08:00
const session = require('express-session');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const querystring = require('querystring');
2018-02-24 14:32:25 +08:00
//gzip压缩
2018-04-18 10:47:57 +08:00
const compression = require('compression');
2017-11-13 12:26:31 +08:00
2018-06-02 09:49:09 +08:00
//各类层装载 与 初始化
2018-04-18 20:32:32 +08:00
const ServerModel = require('./model/ServerModel');
2017-11-13 12:26:31 +08:00
const UserModel = require('./model/UserModel');
const permission = require('./helper/Permission');
const response = require('./helper/Response');
2017-11-15 14:24:20 +08:00
const {
randomString
} = require('./core/User/CryptoMine');
2017-11-13 12:26:31 +08:00
const counter = require('./core/counter');
const DataModel = require('./core/DataModel');
const ftpServerInterface = require('./ftpd/ftpserver');
2018-04-21 14:15:20 +08:00
const tokenManger = require('./helper/TokenManager');
const nodeSchedule = require("node-schedule");
2018-06-02 09:49:09 +08:00
const Schedule = require('./helper/Schedule');
const RequestNews = require('./model/RequestNews');
2018-04-18 10:47:57 +08:00
2017-11-13 12:26:31 +08:00
//控制台颜色
const colors = require('colors');
colors.setTheme({
silly: 'rainbow',
input: 'grey',
verbose: 'cyan',
prompt: 'red',
info: 'green',
data: 'blue',
help: 'cyan',
warn: 'yellow',
debug: 'magenta',
error: 'red'
});
//logo输出
const LOGO_FILE_PATH = './core/logo.txt';
let data = fs.readFileSync(LOGO_FILE_PATH, 'utf-8');
console.log(data);
//全局数据中心 记录 CPU 内存
MCSERVER.dataCenter = {};
//装载log记录器
require('./core/log');
//全局登陆记录器
MCSERVER.login = {};
//全局 在线用户监视器
MCSERVER.onlineUser = {};
//全局 在线 Websocket 监视器
MCSERVER.allSockets = {};
//全局 数据内存记录器
MCSERVER.logCenter = {};
//PAGE 页面数据储存器
MCSERVER.PAGE = {};
2017-11-13 12:26:31 +08:00
//init
MCSERVER.logCenter.initLogData = (objStr, len, def = null) => {
let tmp = [];
2017-11-15 14:24:20 +08:00
for (let i = 0; i < len; i++) tmp.push(def);
2017-11-13 12:26:31 +08:00
MCSERVER.logCenter[objStr] = tmp;
}
2018-04-13 10:00:45 +08:00
2017-11-13 12:26:31 +08:00
//压入方法
MCSERVER.logCenter.pushLogData = (objStr, k, v) => {
MCSERVER.logCenter[objStr] = MCSERVER.logCenter[objStr].slice(1);
MCSERVER.logCenter[objStr].push({
'key': k,
'val': v
});
}
//exp 框架
var app = express();
//web Socket 框架
var expressWs = require('express-ws')(app);
//Cookie and Session 的基础功能
app.use(cookieParser());
2017-11-15 14:24:20 +08:00
app.use(bodyParser.urlencoded({
extended: false
}));
2017-11-13 12:26:31 +08:00
app.use(bodyParser.json());
2018-04-02 23:12:21 +08:00
var UUID = require('uuid');
2017-11-13 12:26:31 +08:00
app.use(session({
2018-04-02 23:12:21 +08:00
secret: UUID.v4(),
2018-04-20 10:18:29 +08:00
name: 'MCSM_SESSION_ID',
2017-11-15 14:24:20 +08:00
cookie: {
2018-04-21 10:55:23 +08:00
maxAge: MCSERVER.localProperty.session_max_age * 1000 * 60
2018-04-02 23:23:20 +08:00
},
2018-04-20 10:06:19 +08:00
resave: false,
2018-04-20 10:43:17 +08:00
saveUninitialized: false
2017-11-13 12:26:31 +08:00
}));
2018-02-24 14:32:25 +08:00
//使用 gzip 静态文本压缩,但是如果你使用反向代理或某 HTTP 服务自带的gzip请关闭它
2018-02-24 16:00:15 +08:00
if (MCSERVER.localProperty.is_gzip)
app.use(compression());
2018-02-24 14:32:25 +08:00
2017-11-13 12:26:31 +08:00
//基础根目录
app.use('/public', express.static('./public'));
2018-01-20 20:32:44 +08:00
2017-11-13 12:26:31 +08:00
// console 中间件挂载
app.use((req, res, next) => {
2018-04-20 10:04:22 +08:00
console.log('[', req.protocol.green, req.method.cyan, ']', req.originalUrl);
2018-02-24 16:00:15 +08:00
if (MCSERVER.localProperty.is_allow_csrf) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'GET, POST');
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
}
2017-11-13 12:26:31 +08:00
res.header('X-Frame-Options', 'DENY');
next();
});
//基础的根目录路由
app.get(['/login', '/l', '/', '/logined'], function (req, res) {
permission.needLogin(req, res, () => {
res.redirect('/public/#welcome');
}, () => {
2018-02-24 16:00:15 +08:00
res.redirect(MCSERVER.localProperty.login_url);
2017-11-13 12:26:31 +08:00
});
});
//自动装载所有路由
let routeList = fs.readdirSync('./route/');
for (let key in routeList) {
let name = routeList[key].replace('.js', '');
app.use('/' + name, require('./route/' + name));
}
process.on("uncaughtException", function (err) {
2018-06-03 10:43:49 +08:00
//是否出过错误,本变量用于自动化测试
MCSERVER.allError++;
2017-11-13 12:26:31 +08:00
//打印出错误
MCSERVER.error('UncaughtException 机制错误报告:', err);
});
2017-11-18 15:13:01 +08:00
//初始化目录结构环境
(function initializationRun() {
const USERS_PATH = './users/';
const SERVER_PATH = './server/';
const SERVER_PATH_CORE = './server/server_core/';
2018-06-02 21:00:21 +08:00
const SERVER_PATH_SCH = './server/schedule/';
2017-11-18 15:13:01 +08:00
const CENTEN_LOG_JSON_PATH = './core/info.json';
2018-04-29 20:00:54 +08:00
const PUBLIC_URL_PATH = './public/common/URL.js';
2018-06-15 21:04:22 +08:00
const RECORD_PARH = './server/record_tmp/'
2018-04-29 20:19:06 +08:00
2017-11-18 15:13:01 +08:00
try {
if (!fs.existsSync(USERS_PATH)) fs.mkdirSync(USERS_PATH);
2018-06-03 10:29:43 +08:00
if (!fs.existsSync(SERVER_PATH)) fs.mkdirSync(SERVER_PATH);
if (!fs.existsSync(SERVER_PATH_CORE)) fs.mkdirSync(SERVER_PATH_CORE);
if (!fs.existsSync(SERVER_PATH_SCH)) fs.mkdirSync(SERVER_PATH_SCH);
2018-06-15 21:04:22 +08:00
if (!fs.existsSync(RECORD_PARH)) fs.mkdirSync(RECORD_PARH);
2018-04-29 20:09:12 +08:00
2018-04-29 20:00:54 +08:00
// 生成不 git 同步的文件
if (!fs.existsSync(CENTEN_LOG_JSON_PATH))
2018-04-29 20:19:06 +08:00
tools.mCopyFileSync(INIT_CONFIG_PATH + 'info_reset.json', CENTEN_LOG_JSON_PATH);
2018-04-29 20:09:12 +08:00
if (!fs.existsSync(PUBLIC_URL_PATH))
2018-04-29 20:19:06 +08:00
tools.mCopyFileSync(INIT_CONFIG_PATH + 'INIT_URL.js', PUBLIC_URL_PATH);
2017-11-18 15:13:01 +08:00
} catch (err) {
MCSERVER.error('初始化文件环境失败,建议重启,请检查以下报错:', err);
2017-11-15 14:24:20 +08:00
}
2017-11-18 15:13:01 +08:00
})();
2017-11-15 14:24:20 +08:00
2018-04-13 10:00:45 +08:00
//开始对 Oneline File Manager 模块进行必要的初始化
2018-01-20 14:56:22 +08:00
MCSERVER.infoLog('Online_Fs', '初始化 Online_Fs 路由与中间件 ');
2018-01-20 20:32:44 +08:00
2018-01-20 14:56:22 +08:00
//必须先进行登陆 且 fs API 请求必须为 Ajax 请求,得以保证跨域阻止
2018-01-23 11:25:47 +08:00
app.use(['/fs/mkdir', '/fs/rm', '/fs/patse', '/fs/cp', '/fs/rename', '/fs/ls'], function (req, res, next) {
2018-01-20 14:56:22 +08:00
if (req.session.fsos && req.xhr) {
next();
2018-01-20 20:32:44 +08:00
return;
2018-01-20 14:56:22 +08:00
}
res.status(403).send('禁止访问:权限不足!您不能直接访问文件在线管理程序 API请通过正常流程');
});
2018-04-18 10:47:57 +08:00
2018-01-20 20:32:44 +08:00
//载入在线文件管理路由
app.use('/fs_auth', require('./onlinefs/controller/auth'));
app.use('/fs', require('./onlinefs/controller/function'));
2018-04-18 10:47:57 +08:00
//初始化模块
2017-11-19 11:23:11 +08:00
(function initializationProm() {
2017-11-13 12:26:31 +08:00
counter.init();
UserModel.userCenter().initUser();
MCSERVER.infoLog('Module', '初始化 UserManager Module ');
2018-04-18 20:32:32 +08:00
ServerModel.ServerManager().loadALLMinecraftServer();
2017-11-13 12:26:31 +08:00
MCSERVER.infoLog('Module', '初始化 ServerManager Module ');
2018-06-02 17:09:35 +08:00
Schedule.init();
2018-06-03 09:14:37 +08:00
MCSERVER.infoLog('Module', '初始化 Schedule Module');
2018-06-02 17:09:35 +08:00
var host = MCSERVER.localProperty.http_ip;
var port = MCSERVER.localProperty.http_port;
2017-11-13 12:26:31 +08:00
if (host == '::')
host = '127.0.0.1';
2018-04-18 10:47:57 +08:00
//App Http listen
app.listen(MCSERVER.localProperty.http_port, MCSERVER.localProperty.http_ip, () => {
2017-11-13 12:26:31 +08:00
2017-11-19 11:23:11 +08:00
MCSERVER.infoLog('HTTP', 'HTTP 模块监听: [ http://' + (host || '127.0.0.1'.yellow) + ':' + port + ' ]');
2017-11-13 12:26:31 +08:00
2017-11-19 11:23:11 +08:00
//现在执行 FTP 服务器启动过程
ftpServerInterface.initFTPdServerOptions({
host: MCSERVER.localProperty.ftp_ip || '127.0.0.1',
port: MCSERVER.localProperty.ftp_port,
2017-11-19 11:23:11 +08:00
tls: null
});
if (MCSERVER.localProperty.ftp_is_allow)
require('./ftpd/index'); //执行ftp逻辑
2018-05-30 13:15:13 +08:00
2018-08-09 14:46:09 +08:00
MCSERVER.infoLog('INFO', '配置文件: property.js 文件');
MCSERVER.infoLog('INFO', '文档参阅: https://github.com/suwings/mcsmanager');
if (MCSERVER.allError <= 0) {
MCSERVER.infoLog('INFO', '控制面板已经启动');
} else {
MCSERVER.infoLog('INFO', '控制面板启动异常');
}
2017-11-19 11:23:11 +08:00
});
2017-11-13 12:26:31 +08:00
2018-04-18 20:32:32 +08:00
2018-04-18 20:08:09 +08:00
})();
2018-04-18 20:32:32 +08:00
2018-08-09 09:55:59 +08:00
//用于捕捉前方所有路由都未经过的请求,则可为 404 页面
app.get('*', function (req, res) {
//404 页面
res.redirect('/public/template/404_page.html');
res.end();
})
2018-04-18 20:32:32 +08:00
//设置定时获取最新新闻动态
nodeSchedule.scheduleJob('59 59 23 * *', function () {
MCSERVER.infoLog('INFO', '自动更新新闻动态与最新消息');
RequestNews.requestNews();
});
//程序退出信号处理
require('./core/procexit');