mirror of
https://github.com/whyour/qinglong.git
synced 2025-05-22 22:36:06 +08:00
修复 QLAPI 修复环境变量 remarks,esm 依赖查不到
This commit is contained in:
parent
2370923a75
commit
124e01e93a
|
@ -385,6 +385,7 @@ export default (app: Router) => {
|
||||||
retries: Joi.number().optional(),
|
retries: Joi.number().optional(),
|
||||||
twoFactorActivated: Joi.boolean().optional(),
|
twoFactorActivated: Joi.boolean().optional(),
|
||||||
password: Joi.string().optional(),
|
password: Joi.string().optional(),
|
||||||
|
username: Joi.string().optional(),
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
async (req: Request, res: Response, next: NextFunction) => {
|
async (req: Request, res: Response, next: NextFunction) => {
|
||||||
|
|
|
@ -39,13 +39,6 @@ export const getEnvs = async (
|
||||||
callback: sendUnaryData<EnvsResponse>,
|
callback: sendUnaryData<EnvsResponse>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
if (!call.request.searchValue) {
|
|
||||||
return callback(null, {
|
|
||||||
code: 400,
|
|
||||||
data: [],
|
|
||||||
message: 'searchValue is required',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
const data = await envService.envs(call.request.searchValue);
|
const data = await envService.envs(call.request.searchValue);
|
||||||
callback(null, {
|
callback(null, {
|
||||||
|
@ -79,9 +72,17 @@ export const updateEnv = async (
|
||||||
callback: sendUnaryData<EnvResponse>,
|
callback: sendUnaryData<EnvResponse>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
|
if (!call.request.env?.id) {
|
||||||
|
return callback(null, {
|
||||||
|
code: 400,
|
||||||
|
data: undefined,
|
||||||
|
message: 'id parameter is required',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
const data = await envService.update(
|
const data = await envService.update(
|
||||||
pick(call.request.env, ['id', 'name', 'value', 'remark']) as EnvItem,
|
pick(call.request.env, ['id', 'name', 'value', 'remarks']) as EnvItem,
|
||||||
);
|
);
|
||||||
callback(null, { code: 200, data });
|
callback(null, { code: 200, data });
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
|
@ -94,6 +95,13 @@ export const deleteEnvs = async (
|
||||||
callback: sendUnaryData<Response>,
|
callback: sendUnaryData<Response>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
|
if (!call.request.ids || call.request.ids.length === 0) {
|
||||||
|
return callback(null, {
|
||||||
|
code: 400,
|
||||||
|
message: 'ids parameter is required',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
await envService.remove(call.request.ids);
|
await envService.remove(call.request.ids);
|
||||||
callback(null, { code: 200 });
|
callback(null, { code: 200 });
|
||||||
|
@ -107,6 +115,14 @@ export const moveEnv = async (
|
||||||
callback: sendUnaryData<EnvResponse>,
|
callback: sendUnaryData<EnvResponse>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
|
if (!call.request.id) {
|
||||||
|
return callback(null, {
|
||||||
|
code: 400,
|
||||||
|
data: undefined,
|
||||||
|
message: 'id parameter is required',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
const data = await envService.move(call.request.id, {
|
const data = await envService.move(call.request.id, {
|
||||||
fromIndex: call.request.fromIndex,
|
fromIndex: call.request.fromIndex,
|
||||||
|
@ -123,6 +139,13 @@ export const disableEnvs = async (
|
||||||
callback: sendUnaryData<Response>,
|
callback: sendUnaryData<Response>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
|
if (!call.request.ids || call.request.ids.length === 0) {
|
||||||
|
return callback(null, {
|
||||||
|
code: 400,
|
||||||
|
message: 'ids parameter is required',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
await envService.disabled(call.request.ids);
|
await envService.disabled(call.request.ids);
|
||||||
callback(null, { code: 200 });
|
callback(null, { code: 200 });
|
||||||
|
@ -136,6 +159,13 @@ export const enableEnvs = async (
|
||||||
callback: sendUnaryData<Response>,
|
callback: sendUnaryData<Response>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
|
if (!call.request.ids || call.request.ids.length === 0) {
|
||||||
|
return callback(null, {
|
||||||
|
code: 400,
|
||||||
|
message: 'ids parameter is required',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
await envService.enabled(call.request.ids);
|
await envService.enabled(call.request.ids);
|
||||||
callback(null, { code: 200 });
|
callback(null, { code: 200 });
|
||||||
|
@ -149,6 +179,13 @@ export const updateEnvNames = async (
|
||||||
callback: sendUnaryData<Response>,
|
callback: sendUnaryData<Response>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
|
if (!call.request.ids || call.request.ids.length === 0) {
|
||||||
|
return callback(null, {
|
||||||
|
code: 400,
|
||||||
|
message: 'ids parameter is required',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
await envService.updateNames({
|
await envService.updateNames({
|
||||||
ids: call.request.ids,
|
ids: call.request.ids,
|
||||||
|
@ -165,6 +202,14 @@ export const getEnvById = async (
|
||||||
callback: sendUnaryData<EnvResponse>,
|
callback: sendUnaryData<EnvResponse>,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
|
if (!call.request.id) {
|
||||||
|
return callback(null, {
|
||||||
|
code: 400,
|
||||||
|
data: undefined,
|
||||||
|
message: 'id parameter is required',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const envService = Container.get(EnvService);
|
const envService = Container.get(EnvService);
|
||||||
const data = await envService.getDb({ id: call.request.id });
|
const data = await envService.getDb({ id: call.request.id });
|
||||||
callback(null, {
|
callback(null, {
|
||||||
|
|
|
@ -38,25 +38,48 @@ function run() {
|
||||||
|
|
||||||
const splitStr = '__sitecustomize__';
|
const splitStr = '__sitecustomize__';
|
||||||
const fileName = process.argv[1].replace(`${dir_scripts}/`, '');
|
const fileName = process.argv[1].replace(`${dir_scripts}/`, '');
|
||||||
let command = `bash -c "source ${file_task_before} ${fileName}`;
|
const tempFile = `/tmp/env_${process.pid}.json`;
|
||||||
|
|
||||||
|
const commands = [
|
||||||
|
`source ${file_task_before} ${fileName}`,
|
||||||
|
task_before ? `eval '${task_before.replace(/'/g, "'\\''")}'` : null,
|
||||||
|
`echo -e '${splitStr}'`,
|
||||||
|
`node -e "require('fs').writeFileSync('${tempFile}', JSON.stringify(process.env))"`,
|
||||||
|
].filter(Boolean);
|
||||||
|
|
||||||
if (task_before) {
|
if (task_before) {
|
||||||
const escapeTaskBefore = task_before
|
|
||||||
.replace(/"/g, '\\"')
|
|
||||||
.replace(/\$/g, '\\$');
|
|
||||||
command = `${command} && eval '${escapeTaskBefore}'`;
|
|
||||||
console.log('执行前置命令\n');
|
console.log('执行前置命令\n');
|
||||||
}
|
}
|
||||||
const res = execSync(
|
|
||||||
`${command} && echo -e '${splitStr}' && node -p 'JSON.stringify(process.env)'"`,
|
const res = execSync(commands.join(' && '), {
|
||||||
{
|
|
||||||
encoding: 'utf-8',
|
encoding: 'utf-8',
|
||||||
},
|
maxBuffer: 50 * 1024 * 1024,
|
||||||
);
|
shell: '/bin/bash',
|
||||||
const [output, envStr] = res.split(splitStr);
|
});
|
||||||
const newEnvObject = JSON.parse(envStr.trim());
|
|
||||||
|
const [output] = res.split(splitStr);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const envStr = require('fs').readFileSync(tempFile, 'utf-8');
|
||||||
|
const newEnvObject = JSON.parse(envStr);
|
||||||
|
if (typeof newEnvObject === 'object' && newEnvObject !== null) {
|
||||||
for (const key in newEnvObject) {
|
for (const key in newEnvObject) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(newEnvObject, key)) {
|
||||||
process.env[key] = newEnvObject[key];
|
process.env[key] = newEnvObject[key];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require('fs').unlinkSync(tempFile);
|
||||||
|
} catch (jsonError) {
|
||||||
|
console.log(
|
||||||
|
'\ue926 Failed to parse environment variables:',
|
||||||
|
jsonError.message,
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
require('fs').unlinkSync(tempFile);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
if (output) {
|
if (output) {
|
||||||
console.log(output);
|
console.log(output);
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,35 +43,57 @@ def run():
|
||||||
|
|
||||||
split_str = "__sitecustomize__"
|
split_str = "__sitecustomize__"
|
||||||
file_name = sys.argv[0].replace(f"{os.getenv('dir_scripts')}/", "")
|
file_name = sys.argv[0].replace(f"{os.getenv('dir_scripts')}/", "")
|
||||||
command = f'bash -c "source {os.getenv("file_task_before")} {file_name}'
|
|
||||||
task_before = os.getenv("task_before")
|
|
||||||
|
|
||||||
|
# 创建临时文件路径
|
||||||
|
temp_file = f"/tmp/env_{os.getpid()}.json"
|
||||||
|
|
||||||
|
# 构建命令数组
|
||||||
|
commands = [
|
||||||
|
f'source {os.getenv("file_task_before")} {file_name}'
|
||||||
|
]
|
||||||
|
|
||||||
|
task_before = os.getenv("task_before")
|
||||||
if task_before:
|
if task_before:
|
||||||
escape_task_before = task_before.replace('"', '\\"').replace("$", "\\$")
|
escaped_task_before = task_before.replace("'", "'\\''")
|
||||||
command += f" && eval '{escape_task_before}'"
|
commands.append(f"eval '{escaped_task_before}'")
|
||||||
print("执行前置命令\n")
|
print("执行前置命令\n")
|
||||||
|
|
||||||
prev_pythonpath = os.getenv("PREV_PYTHONPATH", "")
|
commands.append(f"echo -e '{split_str}'")
|
||||||
python_command = (
|
|
||||||
"python3 -c 'import os, json; print(json.dumps(dict(os.environ)))'"
|
# 修改 Python 命令,使用单行并正确处理引号
|
||||||
)
|
python_cmd = f"python3 -c 'import os,json; f=open(\\\"{temp_file}\\\",\\\"w\\\"); json.dump(dict(os.environ),f); f.close()'"
|
||||||
command += f" && echo -e '{split_str}' && {python_command}\""
|
commands.append(python_cmd)
|
||||||
|
|
||||||
|
command = " && ".join(cmd for cmd in commands if cmd)
|
||||||
|
command = f'bash -c "{command}"'
|
||||||
|
|
||||||
res = subprocess.check_output(command, shell=True, encoding="utf-8")
|
res = subprocess.check_output(command, shell=True, encoding="utf-8")
|
||||||
output, env_str = res.split(split_str)
|
output = res.split(split_str)[0]
|
||||||
|
|
||||||
env_json = json.loads(env_str.strip())
|
try:
|
||||||
|
with open(temp_file, 'r') as f:
|
||||||
|
env_json = json.loads(f.read())
|
||||||
|
|
||||||
for key, value in env_json.items():
|
for key, value in env_json.items():
|
||||||
os.environ[key] = value
|
os.environ[key] = value
|
||||||
|
|
||||||
|
os.unlink(temp_file)
|
||||||
|
except Exception as json_error:
|
||||||
|
print(f"\ue926 Failed to parse environment variables: {json_error}")
|
||||||
|
try:
|
||||||
|
os.unlink(temp_file)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
if len(output) > 0:
|
if len(output) > 0:
|
||||||
print(output)
|
print(output)
|
||||||
if task_before:
|
if task_before:
|
||||||
print("执行前置命令结束")
|
print("执行前置命令结束\n")
|
||||||
|
|
||||||
except subprocess.CalledProcessError as error:
|
except subprocess.CalledProcessError as error:
|
||||||
print(f"run task before error: {error}")
|
print(f"\ue926 run task before error: {error}")
|
||||||
|
if task_before:
|
||||||
|
print("执行前置命令结束\n")
|
||||||
except OSError as error:
|
except OSError as error:
|
||||||
error_message = str(error)
|
error_message = str(error)
|
||||||
if "Argument list too long" not in error_message:
|
if "Argument list too long" not in error_message:
|
||||||
|
@ -81,9 +103,11 @@ def run():
|
||||||
"\ue926 The environment variable is too large. It is recommended to use task_before.py instead of task_before.sh\n"
|
"\ue926 The environment variable is too large. It is recommended to use task_before.py instead of task_before.sh\n"
|
||||||
)
|
)
|
||||||
if task_before:
|
if task_before:
|
||||||
print("执行前置命令结束")
|
print("执行前置命令结束\n")
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f"run task before error: {error}")
|
print(f"\ue926 run task before error: {error}")
|
||||||
|
if task_before:
|
||||||
|
print("执行前置命令结束\n")
|
||||||
|
|
||||||
import task_before
|
import task_before
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,17 @@ original_name=(
|
||||||
)
|
)
|
||||||
|
|
||||||
init_env() {
|
init_env() {
|
||||||
export NODE_PATH=/usr/local/bin:/usr/local/pnpm-global/5/node_modules:/usr/local/lib/node_modules:/root/.local/share/pnpm/global/5/node_modules
|
local pnpm_global_path=$(pnpm root -g 2>/dev/null)
|
||||||
|
export NODE_PATH="/usr/local/bin:/usr/local/lib/node_modules${pnpm_global_path:+:${pnpm_global_path}}"
|
||||||
|
|
||||||
|
# 如果存在 pnpm 全局路径,创建软链接
|
||||||
|
if [[ -n "$pnpm_global_path" ]]; then
|
||||||
|
# 确保目标目录存在
|
||||||
|
mkdir -p "${dir_root}/node_modules"
|
||||||
|
# 链接全局模块到项目的 node_modules
|
||||||
|
ln -sf "${pnpm_global_path}/"* "${dir_root}/node_modules/" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
export PYTHONUNBUFFERED=1
|
export PYTHONUNBUFFERED=1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -212,7 +212,7 @@ run_extra_shell() {
|
||||||
|
|
||||||
## 脚本用法
|
## 脚本用法
|
||||||
usage() {
|
usage() {
|
||||||
echo -e "ql命令使用方法:"
|
echo -e "$cmd_update 命令使用方法:"
|
||||||
echo -e "1. $cmd_update update # 更新并重启青龙"
|
echo -e "1. $cmd_update update # 更新并重启青龙"
|
||||||
echo -e "2. $cmd_update extra # 运行自定义脚本"
|
echo -e "2. $cmd_update extra # 运行自定义脚本"
|
||||||
echo -e "3. $cmd_update raw <fileurl> # 更新单个脚本文件"
|
echo -e "3. $cmd_update raw <fileurl> # 更新单个脚本文件"
|
||||||
|
@ -222,6 +222,8 @@ usage() {
|
||||||
echo -e "7. $cmd_update check # 检测青龙环境并修复"
|
echo -e "7. $cmd_update check # 检测青龙环境并修复"
|
||||||
echo -e "8. $cmd_update resetlet # 重置登录错误次数"
|
echo -e "8. $cmd_update resetlet # 重置登录错误次数"
|
||||||
echo -e "9. $cmd_update resettfa # 禁用两步登录"
|
echo -e "9. $cmd_update resettfa # 禁用两步登录"
|
||||||
|
echo -e "10. $cmd_update resetpwd # 修改登录密码"
|
||||||
|
echo -e "11. $cmd_update resetname # 修改登录用户名"
|
||||||
}
|
}
|
||||||
|
|
||||||
reload_qinglong() {
|
reload_qinglong() {
|
||||||
|
@ -546,6 +548,9 @@ main() {
|
||||||
resetpwd)
|
resetpwd)
|
||||||
eval update_auth_config "\\\"password\\\":\\\"$p2\\\"" "重置密码" $cmd
|
eval update_auth_config "\\\"password\\\":\\\"$p2\\\"" "重置密码" $cmd
|
||||||
;;
|
;;
|
||||||
|
resetname)
|
||||||
|
eval update_auth_config "\\\"username\\\":\\\"$p2\\\"" "重置用户名" $cmd
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
eval echo -e "命令输入错误...\\\n" $cmd
|
eval echo -e "命令输入错误...\\\n" $cmd
|
||||||
eval usage $cmd
|
eval usage $cmd
|
||||||
|
|
Loading…
Reference in New Issue
Block a user