Compare commits

...

3 Commits

Author SHA1 Message Date
Louis Lam
55bed44a53 Skip debug log at the beginning 2023-11-21 18:47:50 +08:00
Louis Lam
e1dcbdc317 Add inspect to dev:backend 2023-11-21 16:55:23 +08:00
Louis Lam
291d9671d8 Improvements 2023-11-21 16:47:01 +08:00
5 changed files with 82 additions and 49 deletions

View File

@ -103,6 +103,10 @@ class Logger {
* @param level Log level. One of INFO, WARN, ERROR, DEBUG or can be customized. * @param level Log level. One of INFO, WARN, ERROR, DEBUG or can be customized.
*/ */
log(module: string, msg: unknown, level: string) { log(module: string, msg: unknown, level: string) {
if (level === "DEBUG" && !isDev) {
return;
}
if (this.hideLog[level] && this.hideLog[level].includes(module.toLowerCase())) { if (this.hideLog[level] && this.hideLog[level].includes(module.toLowerCase())) {
return; return;
} }

View File

@ -196,7 +196,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName, true);
const serviceStatusList = Object.fromEntries(await stack.getServiceStatusList()); const serviceStatusList = Object.fromEntries(await stack.getServiceStatusList());
callback({ callback({
ok: true, ok: true,

View File

@ -31,11 +31,12 @@ export class Stack {
protected static managedStackList: Map<string, Stack> = new Map(); protected static managedStackList: Map<string, Stack> = new Map();
constructor(server : DockgeServer, name : string, composeYAML? : string) { constructor(server : DockgeServer, name : string, composeYAML? : string, skipFSOperations = false) {
this.name = name; this.name = name;
this.server = server; this.server = server;
this._composeYAML = composeYAML; this._composeYAML = composeYAML;
if (!skipFSOperations) {
// Check if compose file name is different from compose.yaml // Check if compose file name is different from compose.yaml
const supportedFileNames = [ "compose.yaml", "compose.yml", "docker-compose.yml", "docker-compose.yaml" ]; const supportedFileNames = [ "compose.yaml", "compose.yml", "docker-compose.yml", "docker-compose.yaml" ];
for (const filename of supportedFileNames) { for (const filename of supportedFileNames) {
@ -45,6 +46,7 @@ export class Stack {
} }
} }
} }
}
toJSON() : object { toJSON() : object {
let obj = this.toSimpleJSON(); let obj = this.toSimpleJSON();
@ -281,12 +283,13 @@ export class Stack {
} }
} }
static getStack(server: DockgeServer, stackName: string) : Stack { static getStack(server: DockgeServer, stackName: string, skipFSOperations = false) : Stack {
let dir = path.join(server.stacksDir, stackName); let dir = path.join(server.stacksDir, stackName);
if (!skipFSOperations) {
if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) { if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
// Maybe it is a stack managed by docker compose directly // Maybe it is a stack managed by docker compose directly
let stackList = this.getStackList(server); let stackList = this.getStackList(server, true);
let stack = stackList.get(stackName); let stack = stackList.get(stackName);
if (stack) { if (stack) {
@ -296,8 +299,18 @@ export class Stack {
throw new ValidationError("Stack not found"); throw new ValidationError("Stack not found");
} }
} }
} else {
log.debug("getStack", "Skip FS operations");
}
let stack : Stack;
if (!skipFSOperations) {
stack = new Stack(server, stackName);
} else {
stack = new Stack(server, stackName, undefined, true);
}
let stack = new Stack(server, stackName);
stack._status = UNKNOWN; stack._status = UNKNOWN;
stack._configFilePath = path.resolve(dir); stack._configFilePath = path.resolve(dir);
return stack; return stack;
@ -377,11 +390,11 @@ export class Stack {
async getServiceStatusList() { async getServiceStatusList() {
let statusList = new Map<string, number>(); let statusList = new Map<string, number>();
let res = childProcess.execSync("docker compose ps --format json", { let res = childProcess.spawnSync("docker", [ "compose", "ps", "--format", "json" ], {
cwd: this.path, cwd: this.path,
}); });
let lines = res.toString().split("\n"); let lines = res.stdout.toString().split("\n");
for (let line of lines) { for (let line of lines) {
try { try {

View File

@ -80,6 +80,7 @@ export class Terminal {
return; return;
} }
try {
this._ptyProcess = pty.spawn(this.file, this.args, { this._ptyProcess = pty.spawn(this.file, this.args, {
name: this.name, name: this.name,
cwd: this.cwd, cwd: this.cwd,
@ -96,7 +97,23 @@ export class Terminal {
}); });
// On Exit // On Exit
this._ptyProcess.onExit((res) => { this._ptyProcess.onExit(this.exit);
} catch (error) {
if (error instanceof Error) {
log.error("Terminal", "Failed to start terminal: " + error.message);
const exitCode = Number(error.message.split(" ").pop());
this.exit({
exitCode,
});
}
}
}
/**
* Exit event handler
* @param res
*/
protected exit = (res : {exitCode: number, signal?: number | undefined}) => {
this.server.io.to(this.name).emit("terminalExit", this.name, res.exitCode); this.server.io.to(this.name).emit("terminalExit", this.name, res.exitCode);
// Remove room // Remove room
@ -108,8 +125,7 @@ export class Terminal {
if (this.callback) { if (this.callback) {
this.callback(res.exitCode); this.callback(res.exitCode);
} }
}); };
}
public onExit(callback : (exitCode : number) => void) { public onExit(callback : (exitCode : number) => void) {
this.callback = callback; this.callback = callback;

View File

@ -7,7 +7,7 @@
"lint": "eslint \"**/*.{ts,vue}\"", "lint": "eslint \"**/*.{ts,vue}\"",
"check-ts": "tsc --noEmit", "check-ts": "tsc --noEmit",
"start": "tsx ./backend/index.ts", "start": "tsx ./backend/index.ts",
"dev:backend": "cross-env NODE_ENV=development tsx watch ./backend/index.ts", "dev:backend": "cross-env NODE_ENV=development tsx watch --inspect ./backend/index.ts",
"dev:frontend": "cross-env NODE_ENV=development vite --host --config ./frontend/vite.config.ts", "dev:frontend": "cross-env NODE_ENV=development vite --host --config ./frontend/vite.config.ts",
"release-final": "tsx ./extra/test-docker.ts && tsx extra/update-version.ts && pnpm run build:frontend && npm run build:docker", "release-final": "tsx ./extra/test-docker.ts && tsx extra/update-version.ts && pnpm run build:frontend && npm run build:docker",
"build:frontend": "vite build --config ./frontend/vite.config.ts", "build:frontend": "vite build --config ./frontend/vite.config.ts",