mirror of
https://github.com/whyour/qinglong.git
synced 2025-05-22 22:36:06 +08:00
220 lines
6.4 KiB
TypeScript
220 lines
6.4 KiB
TypeScript
import DependenceService from '../services/dependence';
|
|
import { exec } from 'child_process';
|
|
import { Container } from 'typedi';
|
|
import { Crontab, CrontabModel, CrontabStatus } from '../data/cron';
|
|
import CronService from '../services/cron';
|
|
import EnvService from '../services/env';
|
|
import { DependenceModel, DependenceStatus } from '../data/dependence';
|
|
import { Op } from 'sequelize';
|
|
import config from '../config';
|
|
import { CrontabViewModel, CronViewType } from '../data/cronView';
|
|
import { initPosition } from '../data/env';
|
|
import { AuthDataType, SystemModel } from '../data/system';
|
|
import SystemService from '../services/system';
|
|
import UserService from '../services/user';
|
|
import { writeFile, readFile } from 'fs/promises';
|
|
import { createRandomString, safeJSONParse } from '../config/util';
|
|
import OpenService from '../services/open';
|
|
import { shareStore } from '../shared/store';
|
|
import Logger from './logger';
|
|
import { AppModel } from '../data/open';
|
|
|
|
export default async () => {
|
|
const cronService = Container.get(CronService);
|
|
const envService = Container.get(EnvService);
|
|
const dependenceService = Container.get(DependenceService);
|
|
const systemService = Container.get(SystemService);
|
|
const userService = Container.get(UserService);
|
|
const openService = Container.get(OpenService);
|
|
|
|
// 初始化增加系统配置
|
|
let systemApp = (
|
|
await AppModel.findOne({
|
|
where: { name: 'system' },
|
|
})
|
|
)?.get({ plain: true });
|
|
if (!systemApp) {
|
|
systemApp = await AppModel.create({
|
|
name: 'system',
|
|
scopes: ['crons', 'system'],
|
|
client_id: createRandomString(12, 12),
|
|
client_secret: createRandomString(24, 24),
|
|
});
|
|
}
|
|
const [systemConfig] = await SystemModel.findOrCreate({
|
|
where: { type: AuthDataType.systemConfig },
|
|
});
|
|
await SystemModel.findOrCreate({
|
|
where: { type: AuthDataType.notification },
|
|
});
|
|
const [authConfig] = await SystemModel.findOrCreate({
|
|
where: { type: AuthDataType.authConfig },
|
|
});
|
|
if (!authConfig?.info) {
|
|
let authInfo = {
|
|
username: 'admin',
|
|
password: 'admin',
|
|
};
|
|
try {
|
|
const content = await readFile(config.authConfigFile, 'utf8');
|
|
authInfo = safeJSONParse(content);
|
|
} catch (error) {
|
|
Logger.warn('Failed to read auth config file, using default credentials');
|
|
}
|
|
await SystemModel.upsert({
|
|
id: authConfig?.id,
|
|
info: authInfo,
|
|
type: AuthDataType.authConfig,
|
|
});
|
|
}
|
|
|
|
const installDependencies = async () => {
|
|
const docs = await DependenceModel.findAll({
|
|
where: {},
|
|
order: [
|
|
['type', 'DESC'],
|
|
['createdAt', 'DESC'],
|
|
],
|
|
raw: true,
|
|
});
|
|
|
|
await DependenceModel.update(
|
|
{ status: DependenceStatus.queued, log: [] },
|
|
{ where: { id: docs.map((x) => x.id!) } },
|
|
);
|
|
|
|
setTimeout(async () => {
|
|
await dependenceService.installDependenceOneByOne(docs);
|
|
|
|
require('./bootAfter').default();
|
|
}, 5000);
|
|
};
|
|
|
|
// 初始化更新 linux/python/nodejs 镜像源配置
|
|
if (systemConfig.info?.pythonMirror) {
|
|
systemService.updatePythonMirror({
|
|
pythonMirror: systemConfig.info?.pythonMirror,
|
|
});
|
|
}
|
|
if (systemConfig.info?.linuxMirror) {
|
|
systemService.updateLinuxMirror(
|
|
{
|
|
linuxMirror: systemConfig.info?.linuxMirror,
|
|
},
|
|
undefined,
|
|
() => installDependencies(),
|
|
);
|
|
} else {
|
|
installDependencies();
|
|
}
|
|
if (systemConfig.info?.nodeMirror) {
|
|
systemService.updateNodeMirror({
|
|
nodeMirror: systemConfig.info?.nodeMirror,
|
|
});
|
|
}
|
|
|
|
// 初始化新增默认全部任务视图
|
|
CrontabViewModel.findAll({
|
|
where: { type: CronViewType.系统, name: '全部任务' },
|
|
raw: true,
|
|
}).then((docs) => {
|
|
if (docs.length === 0) {
|
|
CrontabViewModel.create({
|
|
name: '全部任务',
|
|
type: CronViewType.系统,
|
|
position: initPosition / 2,
|
|
});
|
|
}
|
|
});
|
|
|
|
// 初始化更新所有任务状态为空闲
|
|
await CrontabModel.update({ status: CrontabStatus.idle }, { where: {} });
|
|
|
|
// 初始化时执行一次所有的 ql repo 任务
|
|
CrontabModel.findAll({
|
|
where: {
|
|
isDisabled: { [Op.ne]: 1 },
|
|
command: {
|
|
[Op.or]: [{ [Op.like]: `%ql repo%` }, { [Op.like]: `%ql raw%` }],
|
|
},
|
|
},
|
|
}).then((docs) => {
|
|
for (let i = 0; i < docs.length; i++) {
|
|
const doc = docs[i];
|
|
if (doc) {
|
|
exec(doc.command);
|
|
}
|
|
}
|
|
});
|
|
|
|
// 更新2.11.3以前的脚本路径
|
|
CrontabModel.findAll({
|
|
where: {
|
|
command: {
|
|
[Op.or]: [
|
|
{ [Op.like]: `%\/${config.rootPath}\/scripts\/%` },
|
|
{ [Op.like]: `%\/${config.rootPath}\/config\/%` },
|
|
{ [Op.like]: `%\/${config.rootPath}\/log\/%` },
|
|
{ [Op.like]: `%\/${config.rootPath}\/db\/%` },
|
|
],
|
|
},
|
|
},
|
|
}).then(async (docs) => {
|
|
for (let i = 0; i < docs.length; i++) {
|
|
const doc = docs[i];
|
|
if (doc) {
|
|
if (doc.command.includes(`${config.rootPath}/scripts/`)) {
|
|
await CrontabModel.update(
|
|
{ command: doc.command.replace(`${config.rootPath}/scripts/`, '') },
|
|
{ where: { id: doc.id } },
|
|
);
|
|
}
|
|
if (doc.command.includes(`${config.rootPath}/log/`)) {
|
|
await CrontabModel.update(
|
|
{
|
|
command: `${config.dataPath}/log/${doc.command.replace(
|
|
`${config.rootPath}/log/`,
|
|
'',
|
|
)}`,
|
|
},
|
|
{ where: { id: doc.id } },
|
|
);
|
|
}
|
|
if (doc.command.includes(`${config.rootPath}/config/`)) {
|
|
await CrontabModel.update(
|
|
{
|
|
command: `${config.dataPath}/config/${doc.command.replace(
|
|
`${config.rootPath}/config/`,
|
|
'',
|
|
)}`,
|
|
},
|
|
{ where: { id: doc.id } },
|
|
);
|
|
}
|
|
if (doc.command.includes(`${config.rootPath}/db/`)) {
|
|
await CrontabModel.update(
|
|
{
|
|
command: `${config.dataPath}/db/${doc.command.replace(
|
|
`${config.rootPath}/db/`,
|
|
'',
|
|
)}`,
|
|
},
|
|
{ where: { id: doc.id } },
|
|
);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// 初始化保存一次ck和定时任务数据
|
|
await cronService.autosave_crontab();
|
|
await envService.set_envs();
|
|
|
|
const authInfo = await userService.getAuthInfo();
|
|
const apps = await openService.findApps();
|
|
await shareStore.updateAuthInfo(authInfo);
|
|
if (apps?.length) {
|
|
await shareStore.updateApps(apps);
|
|
}
|
|
};
|