zan-proxy
Version:
165 lines (151 loc) • 5.18 kB
JavaScript
#!/usr/bin/env node
const fs = require("fs");
const jsonfile = require("jsonfile");
const path = require("path");
const os = require("os");
const proxyDataDir = path.join(os.homedir(), '.front-end-proxy');
/**
* 初始化脚本
* @param force
*/
function resetData(force = false) {
createDir(proxyDataDir);
createDir(path.join(proxyDataDir, "certificate"));
createDir(path.join(proxyDataDir, "certificate/root"));
createDir(path.join(proxyDataDir, "host"));
createDir(path.join(proxyDataDir, "rule"));
createDir(path.join(proxyDataDir, "breakpoint"));
createDir(path.join(proxyDataDir, "mock-data"));
createDir(path.join(proxyDataDir, "mock-list"));
createDir(path.join(proxyDataDir, "profile"));
createDir(path.join(proxyDataDir, "filter"));
createDir(path.join(proxyDataDir, "traffic"));
resetFile(path.join(proxyDataDir, "clientIpUserMap.json"), {}, force);
resetFile(path.join(proxyDataDir, "configure.json"), {}, force);
const rootTargetDir = path.join(proxyDataDir, "certificate/root");
["zproxy.crt.pem", "zproxy.key.pem"].forEach((f) => {
fs
.createReadStream(path.join(__dirname, "../certificate", f))
.pipe(fs.createWriteStream(path.join(rootTargetDir, f)));
});
}
function resetFile(filePath, data, force) {
if (!force && fs.existsSync(filePath)) {
return;
}
jsonfile.writeFileSync(filePath, data);
}
function createDir(dirPath) {
const exists = fs.existsSync(dirPath);
if (!exists) {
fs.mkdirSync(dirPath);
}
}
const oldDir = path.join(proxyDataDir, "../.zanmock-proxy");
function restoreFromOld() {
if (!fs.existsSync(oldDir)) {
return;
}
restoreHost();
restoreRule();
restoreProfile();
}
function restoreHost() {
const oldHostDir = path.join(oldDir, "local/host");
const syncFlag = path.join(oldHostDir, ".sync_already");
if (fs.existsSync(syncFlag)) {
return;
}
const newHostDir = path.join(proxyDataDir, "host");
const oldHostFiles = fs
.readdirSync(oldHostDir)
.filter((f) => f.endsWith(".json"));
oldHostFiles.forEach((fileName) => {
const newFilePath = path.join(newHostDir, `root_${fileName}`);
if (fs.existsSync(newFilePath)) {
return;
}
const readStream = fs.createReadStream(path.join(oldHostDir, fileName));
const writeStream = fs.createWriteStream(newFilePath);
readStream.pipe(writeStream);
});
fs.writeFileSync(syncFlag, "true");
}
function restoreRule() {
const oldRuleDir = path.join(oldDir, "local/rule");
const syncFlag = path.join(oldRuleDir, ".sync_already");
if (fs.existsSync(syncFlag)) {
return syncFlag;
}
const newRuleDir = path.join(proxyDataDir, "rule");
const oldRuleFiles = fs
.readdirSync(oldRuleDir)
.filter((f) => f.endsWith(".json"));
oldRuleFiles.forEach((ruleFile) => {
const newRuleFilePath = path.join(newRuleDir, `root_${ruleFile}`);
if (fs.existsSync(newRuleFilePath)) {
return;
}
const oldRuleFilePath = path.join(oldRuleDir, ruleFile);
const fileContent = fs.readFileSync(oldRuleFilePath, {encoding: "utf-8"});
const oldRuleFile = JSON.parse(fileContent);
const newRuleFile = convertRuleFile(oldRuleFile);
fs.writeFileSync(newRuleFilePath, JSON.stringify(newRuleFile), {encoding: "utf-8"});
});
fs.writeFileSync(syncFlag, "true");
}
function convertRuleFile(oldRuleFile) {
const newRuleFile = Object.assign({}, oldRuleFile);
newRuleFile.content = newRuleFile
.content
.filter((rule) => {
return rule.action && rule.action.type === "redirect"; // 其他action暂时不支持
})
.map(convertRule);
return newRuleFile;
}
function convertRule(oldRule) {
const newRule = Object.assign({}, oldRule);
newRule.actionList = [convertAction(oldRule.action)];
return newRule;
}
function convertAction(oldAction) {
const newAction = Object.assign({}, oldAction);
newAction.data = Object.assign({}, {
callbackName: "",
cookieKey: "",
cookieValue: "",
dataId: "",
headerKey: "",
headerValue: "",
modifyRequestScript: "",
modifyResponseScript: "",
modifyResponseType: "",
target: "",
}, oldAction.data);
return newAction;
}
function restoreProfile() {
const oldFile = path.join(oldDir, "local/conf.json");
if (!fs.existsSync(oldFile)) {
return;
}
const oldConf = JSON.parse(fs.readFileSync(oldFile, {encoding: "utf-8"}));
const newConf = {
enableFilter: false,
enableHost: true,
enableRule: true,
projectPath: oldConf.responderParams || {},
};
const newFile = path.join(proxyDataDir, "profile/root.json");
if (fs.existsSync(newFile)) {
return;
}
fs.writeFileSync(newFile, JSON.stringify(newConf), {encoding: "utf-8"});
}
(() => {
console.log("开始初始化数据...");
resetData();
restoreFromOld();
console.log("初始化完成!");
})();