forked from extern/dockge
Compare commits
3 Commits
master
...
improvemen
Author | SHA1 | Date | |
---|---|---|---|
|
55bed44a53 | ||
|
e1dcbdc317 | ||
|
291d9671d8 |
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
@ -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",
|
||||||
|
Loading…
Reference in New Issue
Block a user