mirror of
https://github.com/louislam/dockge.git
synced 2024-11-23 19:34:04 +00:00
Done
This commit is contained in:
parent
58fb332a59
commit
9f8589bb10
5 changed files with 62 additions and 27 deletions
|
@ -234,7 +234,7 @@ export class DockgeServer {
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
log.debug("terminal", "Terminal count: " + Terminal.getTerminalCount());
|
log.debug("terminal", "Terminal count: " + Terminal.getTerminalCount());
|
||||||
}, 10000);
|
}, 5000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,11 +298,11 @@ export class DockgeServer {
|
||||||
log.info("server", `Listening on ${this.config.port}`);
|
log.info("server", `Listening on ${this.config.port}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run every 5 seconds
|
// Run every 10 seconds
|
||||||
Cron("*/2 * * * * *", {
|
Cron("*/10 * * * * *", {
|
||||||
protect: true, // Enabled over-run protection.
|
protect: true, // Enabled over-run protection.
|
||||||
}, () => {
|
}, () => {
|
||||||
log.debug("server", "Cron job running");
|
//log.debug("server", "Cron job running");
|
||||||
this.sendStackList(true);
|
this.sendStackList(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -140,9 +140,26 @@ export class TerminalSocketHandler extends SocketHandler {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Close Terminal
|
// Leave Combined Terminal
|
||||||
socket.on("terminalClose", async (terminalName : unknown, callback : unknown) => {
|
socket.on("leaveCombinedTerminal", async (stackName : unknown, callback) => {
|
||||||
|
try {
|
||||||
|
checkLogin(socket);
|
||||||
|
|
||||||
|
log.debug("leaveCombinedTerminal", "Stack name: " + stackName);
|
||||||
|
|
||||||
|
if (typeof(stackName) !== "string") {
|
||||||
|
throw new ValidationError("Stack name must be a string.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const stack = Stack.getStack(server, stackName);
|
||||||
|
await stack.leaveCombinedTerminal(socket);
|
||||||
|
|
||||||
|
callback({
|
||||||
|
ok: true,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
callbackError(e, callback);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: Resize Terminal
|
// TODO: Resize Terminal
|
||||||
|
|
|
@ -298,7 +298,7 @@ export class Stack {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.debug("getStack", "Skip FS operations");
|
//log.debug("getStack", "Skip FS operations");
|
||||||
}
|
}
|
||||||
|
|
||||||
let stack : Stack;
|
let stack : Stack;
|
||||||
|
@ -374,12 +374,21 @@ export class Stack {
|
||||||
async joinCombinedTerminal(socket: DockgeSocket) {
|
async joinCombinedTerminal(socket: DockgeSocket) {
|
||||||
const terminalName = getCombinedTerminalName(this.name);
|
const terminalName = getCombinedTerminalName(this.name);
|
||||||
const terminal = Terminal.getOrCreateTerminal(this.server, terminalName, "docker", [ "compose", "logs", "-f", "--tail", "100" ], this.path);
|
const terminal = Terminal.getOrCreateTerminal(this.server, terminalName, "docker", [ "compose", "logs", "-f", "--tail", "100" ], this.path);
|
||||||
|
terminal.enableKeepAlive = true;
|
||||||
terminal.rows = COMBINED_TERMINAL_ROWS;
|
terminal.rows = COMBINED_TERMINAL_ROWS;
|
||||||
terminal.cols = COMBINED_TERMINAL_COLS;
|
terminal.cols = COMBINED_TERMINAL_COLS;
|
||||||
terminal.join(socket);
|
terminal.join(socket);
|
||||||
terminal.start();
|
terminal.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async leaveCombinedTerminal(socket: DockgeSocket) {
|
||||||
|
const terminalName = getCombinedTerminalName(this.name);
|
||||||
|
const terminal = Terminal.getTerminal(terminalName);
|
||||||
|
if (terminal) {
|
||||||
|
terminal.leave(socket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async joinContainerTerminal(socket: DockgeSocket, serviceName: string, shell : string = "sh", index: number = 0) {
|
async joinContainerTerminal(socket: DockgeSocket, serviceName: string, shell : string = "sh", index: number = 0) {
|
||||||
const terminalName = getContainerExecTerminalName(this.name, serviceName, index);
|
const terminalName = getContainerExecTerminalName(this.name, serviceName, index);
|
||||||
let terminal = Terminal.getTerminal(terminalName);
|
let terminal = Terminal.getTerminal(terminalName);
|
||||||
|
|
|
@ -46,25 +46,6 @@ export class Terminal {
|
||||||
this.cwd = cwd;
|
this.cwd = cwd;
|
||||||
|
|
||||||
Terminal.terminalMap.set(this.name, this);
|
Terminal.terminalMap.set(this.name, this);
|
||||||
|
|
||||||
if (this.enableKeepAlive) {
|
|
||||||
log.debug("Terminal", "Keep alive enabled for terminal " + this.name);
|
|
||||||
|
|
||||||
// Close if there is no clients
|
|
||||||
this.keepAliveInterval = setInterval(() => {
|
|
||||||
const clients = this.server.io.sockets.adapter.rooms.get(this.name);
|
|
||||||
const numClients = clients ? clients.size : 0;
|
|
||||||
|
|
||||||
if (numClients === 0) {
|
|
||||||
log.debug("Terminal", "Terminal " + this.name + " has no client, closing...");
|
|
||||||
this.close();
|
|
||||||
} else {
|
|
||||||
log.debug("Terminal", "Terminal " + this.name + " has " + numClients + " client(s)");
|
|
||||||
}
|
|
||||||
}, 60 * 1000);
|
|
||||||
} else {
|
|
||||||
log.debug("Terminal", "Keep alive disabled for terminal " + this.name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get rows() {
|
get rows() {
|
||||||
|
@ -102,6 +83,25 @@ export class Terminal {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.enableKeepAlive) {
|
||||||
|
log.debug("Terminal", "Keep alive enabled for terminal " + this.name);
|
||||||
|
|
||||||
|
// Close if there is no clients
|
||||||
|
this.keepAliveInterval = setInterval(() => {
|
||||||
|
const clients = this.server.io.sockets.adapter.rooms.get(this.name);
|
||||||
|
const numClients = clients ? clients.size : 0;
|
||||||
|
|
||||||
|
if (numClients === 0) {
|
||||||
|
log.debug("Terminal", "Terminal " + this.name + " has no client, closing...");
|
||||||
|
this.close();
|
||||||
|
} else {
|
||||||
|
log.debug("Terminal", "Terminal " + this.name + " has " + numClients + " client(s)");
|
||||||
|
}
|
||||||
|
}, 60 * 1000);
|
||||||
|
} else {
|
||||||
|
log.debug("Terminal", "Keep alive disabled for terminal " + this.name);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this._ptyProcess = pty.spawn(this.file, this.args, {
|
this._ptyProcess = pty.spawn(this.file, this.args, {
|
||||||
name: this.name,
|
name: this.name,
|
||||||
|
@ -122,6 +122,8 @@ export class Terminal {
|
||||||
this._ptyProcess.onExit(this.exit);
|
this._ptyProcess.onExit(this.exit);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error instanceof Error) {
|
if (error instanceof Error) {
|
||||||
|
clearInterval(this.keepAliveInterval);
|
||||||
|
|
||||||
log.error("Terminal", "Failed to start terminal: " + error.message);
|
log.error("Terminal", "Failed to start terminal: " + error.message);
|
||||||
const exitCode = Number(error.message.split(" ").pop());
|
const exitCode = Number(error.message.split(" ").pop());
|
||||||
this.exit({
|
this.exit({
|
||||||
|
@ -182,6 +184,7 @@ export class Terminal {
|
||||||
}
|
}
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
|
clearInterval(this.keepAliveInterval);
|
||||||
// Send Ctrl+C to the terminal
|
// Send Ctrl+C to the terminal
|
||||||
this.ptyProcess?.write("\x03");
|
this.ptyProcess?.write("\x03");
|
||||||
}
|
}
|
||||||
|
|
|
@ -319,6 +319,12 @@ export default {
|
||||||
},
|
},
|
||||||
deep: true,
|
deep: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
$route(to, from) {
|
||||||
|
// Leave Combined Terminal
|
||||||
|
console.debug("leaveCombinedTerminal", from.params.stackName);
|
||||||
|
this.$root.getSocket().emit("leaveCombinedTerminal", this.stack.name, () => {});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.isAdd) {
|
if (this.isAdd) {
|
||||||
|
@ -361,7 +367,7 @@ export default {
|
||||||
clearTimeout(serviceStatusTimeout);
|
clearTimeout(serviceStatusTimeout);
|
||||||
serviceStatusTimeout = setTimeout(async () => {
|
serviceStatusTimeout = setTimeout(async () => {
|
||||||
this.requestServiceStatus();
|
this.requestServiceStatus();
|
||||||
}, 2000);
|
}, 5000);
|
||||||
},
|
},
|
||||||
|
|
||||||
requestServiceStatus() {
|
requestServiceStatus() {
|
||||||
|
|
Loading…
Reference in a new issue