telegram-ssh-bot 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +103 -22
- package/deploy/.env.example +86 -0
- package/dist/config/index.d.ts +68 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +315 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +6 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +50 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/Bot.d.ts +91 -0
- package/dist/core/Bot.d.ts.map +1 -0
- package/dist/core/Bot.js +263 -0
- package/dist/core/Bot.js.map +1 -0
- package/dist/core/ConnectionPool.d.ts +125 -0
- package/dist/core/ConnectionPool.d.ts.map +1 -0
- package/dist/core/ConnectionPool.js +397 -0
- package/dist/core/ConnectionPool.js.map +1 -0
- package/dist/core/SSHClient.d.ts +112 -0
- package/dist/core/SSHClient.d.ts.map +1 -0
- package/dist/core/SSHClient.js +367 -0
- package/dist/core/SSHClient.js.map +1 -0
- package/dist/core/ServerManager.d.ts +80 -0
- package/dist/core/ServerManager.d.ts.map +1 -0
- package/dist/core/ServerManager.js +207 -0
- package/dist/core/ServerManager.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/errors/AuthError.d.ts +30 -0
- package/dist/errors/AuthError.d.ts.map +1 -0
- package/dist/errors/AuthError.js +35 -0
- package/dist/errors/AuthError.js.map +1 -0
- package/dist/errors/BaseError.d.ts +17 -0
- package/dist/errors/BaseError.d.ts.map +1 -0
- package/dist/errors/BaseError.js +34 -0
- package/dist/errors/BaseError.js.map +1 -0
- package/dist/errors/ConfigurationError.d.ts +24 -0
- package/dist/errors/ConfigurationError.d.ts.map +1 -0
- package/dist/errors/ConfigurationError.js +24 -0
- package/dist/errors/ConfigurationError.js.map +1 -0
- package/dist/errors/PoolError.d.ts +21 -0
- package/dist/errors/PoolError.d.ts.map +1 -0
- package/dist/errors/PoolError.js +30 -0
- package/dist/errors/PoolError.js.map +1 -0
- package/dist/errors/SSHError.d.ts +24 -0
- package/dist/errors/SSHError.d.ts.map +1 -0
- package/dist/errors/SSHError.js +38 -0
- package/dist/errors/SSHError.js.map +1 -0
- package/dist/errors/StorageError.d.ts +24 -0
- package/dist/errors/StorageError.d.ts.map +1 -0
- package/dist/errors/StorageError.js +35 -0
- package/dist/errors/StorageError.js.map +1 -0
- package/dist/errors/ValidationError.d.ts +29 -0
- package/dist/errors/ValidationError.d.ts.map +1 -0
- package/dist/errors/ValidationError.js +35 -0
- package/dist/errors/ValidationError.js.map +1 -0
- package/dist/errors/index.d.ts +11 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/handlers/BaseHandler.d.ts +50 -0
- package/dist/handlers/BaseHandler.d.ts.map +1 -0
- package/dist/handlers/BaseHandler.js +87 -0
- package/dist/handlers/BaseHandler.js.map +1 -0
- package/dist/handlers/CommandHandler.d.ts +23 -0
- package/dist/handlers/CommandHandler.d.ts.map +1 -0
- package/dist/handlers/CommandHandler.js +99 -0
- package/dist/handlers/CommandHandler.js.map +1 -0
- package/dist/handlers/HealthHandler.d.ts +25 -0
- package/dist/handlers/HealthHandler.d.ts.map +1 -0
- package/dist/handlers/HealthHandler.js +51 -0
- package/dist/handlers/HealthHandler.js.map +1 -0
- package/dist/handlers/HelpHandler.d.ts +32 -0
- package/dist/handlers/HelpHandler.d.ts.map +1 -0
- package/dist/handlers/HelpHandler.js +76 -0
- package/dist/handlers/HelpHandler.js.map +1 -0
- package/dist/handlers/ServerHandler.d.ts +72 -0
- package/dist/handlers/ServerHandler.d.ts.map +1 -0
- package/dist/handlers/ServerHandler.js +272 -0
- package/dist/handlers/ServerHandler.js.map +1 -0
- package/dist/handlers/index.d.ts +9 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +9 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +348 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/AuthMiddleware.d.ts +28 -0
- package/dist/middleware/AuthMiddleware.d.ts.map +1 -0
- package/dist/middleware/AuthMiddleware.js +49 -0
- package/dist/middleware/AuthMiddleware.js.map +1 -0
- package/dist/middleware/RateLimitMiddleware.d.ts +23 -0
- package/dist/middleware/RateLimitMiddleware.d.ts.map +1 -0
- package/dist/middleware/RateLimitMiddleware.js +34 -0
- package/dist/middleware/RateLimitMiddleware.js.map +1 -0
- package/dist/middleware/index.d.ts +6 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +6 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/services/BackupService.d.ts +119 -0
- package/dist/services/BackupService.d.ts.map +1 -0
- package/dist/services/BackupService.js +313 -0
- package/dist/services/BackupService.js.map +1 -0
- package/dist/services/CryptoService.d.ts +37 -0
- package/dist/services/CryptoService.d.ts.map +1 -0
- package/dist/services/CryptoService.js +108 -0
- package/dist/services/CryptoService.js.map +1 -0
- package/dist/services/HealthService.d.ts +126 -0
- package/dist/services/HealthService.d.ts.map +1 -0
- package/dist/services/HealthService.js +213 -0
- package/dist/services/HealthService.js.map +1 -0
- package/dist/services/LoggingService.d.ts +115 -0
- package/dist/services/LoggingService.d.ts.map +1 -0
- package/dist/services/LoggingService.js +334 -0
- package/dist/services/LoggingService.js.map +1 -0
- package/dist/services/MonitoringService.d.ts +119 -0
- package/dist/services/MonitoringService.d.ts.map +1 -0
- package/dist/services/MonitoringService.js +267 -0
- package/dist/services/MonitoringService.js.map +1 -0
- package/dist/services/NotificationService.d.ts +132 -0
- package/dist/services/NotificationService.d.ts.map +1 -0
- package/dist/services/NotificationService.js +297 -0
- package/dist/services/NotificationService.js.map +1 -0
- package/dist/services/RateLimiter.d.ts +51 -0
- package/dist/services/RateLimiter.d.ts.map +1 -0
- package/dist/services/RateLimiter.js +141 -0
- package/dist/services/RateLimiter.js.map +1 -0
- package/dist/services/ValidationService.d.ts +49 -0
- package/dist/services/ValidationService.d.ts.map +1 -0
- package/dist/services/ValidationService.js +158 -0
- package/dist/services/ValidationService.js.map +1 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +12 -0
- package/dist/services/index.js.map +1 -0
- package/dist/types/Bot.d.ts +63 -0
- package/dist/types/Bot.d.ts.map +1 -0
- package/dist/types/Bot.js +5 -0
- package/dist/types/Bot.js.map +1 -0
- package/dist/types/Config.d.ts +57 -0
- package/dist/types/Config.d.ts.map +1 -0
- package/dist/types/Config.js +5 -0
- package/dist/types/Config.js.map +1 -0
- package/dist/types/Errors.d.ts +37 -0
- package/dist/types/Errors.d.ts.map +1 -0
- package/dist/types/Errors.js +34 -0
- package/dist/types/Errors.js.map +1 -0
- package/dist/types/SSH.d.ts +56 -0
- package/dist/types/SSH.d.ts.map +1 -0
- package/dist/types/SSH.js +6 -0
- package/dist/types/SSH.js.map +1 -0
- package/dist/types/Server.d.ts +39 -0
- package/dist/types/Server.d.ts.map +1 -0
- package/dist/types/Server.js +5 -0
- package/dist/types/Server.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/commandUtils.d.ts +25 -0
- package/dist/utils/commandUtils.d.ts.map +1 -0
- package/dist/utils/commandUtils.js +94 -0
- package/dist/utils/commandUtils.js.map +1 -0
- package/dist/utils/fileUtils.d.ts +40 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +114 -0
- package/dist/utils/fileUtils.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pathUtils.d.ts +40 -0
- package/dist/utils/pathUtils.d.ts.map +1 -0
- package/dist/utils/pathUtils.js +140 -0
- package/dist/utils/pathUtils.js.map +1 -0
- package/package.json +31 -5
- package/scripts/build.sh +20 -0
- package/scripts/postinstall.js +87 -0
- package/scripts/release.sh +22 -0
- package/scripts/setup-env.js +237 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Command Handler
|
|
3
|
+
* Provides common functionality for all command handlers
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Base command handler with common functionality
|
|
7
|
+
*/
|
|
8
|
+
export class BaseHandler {
|
|
9
|
+
serverManager;
|
|
10
|
+
sshClient;
|
|
11
|
+
bot;
|
|
12
|
+
logger;
|
|
13
|
+
constructor(serverManager, sshClient, bot, logger) {
|
|
14
|
+
this.serverManager = serverManager;
|
|
15
|
+
this.sshClient = sshClient;
|
|
16
|
+
this.bot = bot;
|
|
17
|
+
this.logger = logger;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Send a message to the chat
|
|
21
|
+
*/
|
|
22
|
+
async send(chatId, message) {
|
|
23
|
+
await this.bot.sendMessage(chatId, message);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Send a markdown message to the chat
|
|
27
|
+
*/
|
|
28
|
+
async sendMarkdown(chatId, message) {
|
|
29
|
+
await this.bot.sendMessage(chatId, message, { parseMode: "Markdown" });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get current server or send error message
|
|
33
|
+
*/
|
|
34
|
+
getCurrentServerOrError(chatId) {
|
|
35
|
+
const current = this.serverManager.getCurrent();
|
|
36
|
+
if (!current) {
|
|
37
|
+
this.send(chatId, "❌ No server connected. Use /ssh <index> to connect first.");
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return current;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if SSH is connected or send error message
|
|
44
|
+
*/
|
|
45
|
+
checkConnectionOrError(chatId) {
|
|
46
|
+
if (!this.sshClient.isConnected()) {
|
|
47
|
+
this.send(chatId, "❌ Not connected to SSH server. Use /ssh <index> to connect.");
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Format server list for display
|
|
54
|
+
*/
|
|
55
|
+
formatServerList(servers) {
|
|
56
|
+
if (servers.length === 0) {
|
|
57
|
+
return "📋 No servers configured.\n\nUse /add to add a server.";
|
|
58
|
+
}
|
|
59
|
+
const current = this.serverManager.getCurrent();
|
|
60
|
+
const lines = ["📋 *Configured Servers:*\n"];
|
|
61
|
+
servers.forEach((server, index) => {
|
|
62
|
+
const isCurrent = current?.id === server.id;
|
|
63
|
+
const marker = isCurrent ? "✓ " : " ";
|
|
64
|
+
const note = server.note ? ` (${server.note})` : "";
|
|
65
|
+
lines.push(`${marker}${index + 1}. \`${server.username}@${server.host}:${server.port}\`${note}`);
|
|
66
|
+
});
|
|
67
|
+
lines.push("\n_use /ssh <index> to connect_");
|
|
68
|
+
return lines.join("\n");
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Format server info for display
|
|
72
|
+
*/
|
|
73
|
+
formatServerInfo(server) {
|
|
74
|
+
const lines = [
|
|
75
|
+
`🖥️ *Server Info*`,
|
|
76
|
+
`• Host: \`${server.host}\``,
|
|
77
|
+
`• Port: \`${server.port}\``,
|
|
78
|
+
`• User: \`${server.username}\``,
|
|
79
|
+
`• Auth: \`${server.auth.type}\``,
|
|
80
|
+
];
|
|
81
|
+
if (server.note) {
|
|
82
|
+
lines.push(`• Note: ${server.note}`);
|
|
83
|
+
}
|
|
84
|
+
return lines.join("\n");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=BaseHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseHandler.js","sourceRoot":"","sources":["../../src/handlers/BaseHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Handler
|
|
3
|
+
* Handles SSH command execution
|
|
4
|
+
*/
|
|
5
|
+
import { ServerManager } from "../core/ServerManager.js";
|
|
6
|
+
import { SSHClient } from "../core/SSHClient.js";
|
|
7
|
+
import { LoggingService } from "../services/LoggingService.js";
|
|
8
|
+
import { ValidationService } from "../services/ValidationService.js";
|
|
9
|
+
import type { CommandContext } from "../types/index.js";
|
|
10
|
+
import { IBot } from "../types/index.js";
|
|
11
|
+
import { BaseHandler } from "./BaseHandler.js";
|
|
12
|
+
/**
|
|
13
|
+
* Handler for SSH command execution (non-command messages when connected)
|
|
14
|
+
*/
|
|
15
|
+
export declare class SSHCommandHandler extends BaseHandler {
|
|
16
|
+
readonly name = "_message";
|
|
17
|
+
readonly description = "Execute SSH commands";
|
|
18
|
+
readonly pattern: RegExp;
|
|
19
|
+
private readonly validationService;
|
|
20
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService, validationService: ValidationService);
|
|
21
|
+
execute(context: CommandContext): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=CommandHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/CommandHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,0BAA0B;IAC9C,QAAQ,CAAC,OAAO,SAAQ;IAExB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAGpD,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc,EACtB,iBAAiB,EAAE,iBAAiB;IAMhC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAuGtD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Handler
|
|
3
|
+
* Handles SSH command execution
|
|
4
|
+
*/
|
|
5
|
+
import { ConnectionFailedError, ConnectionTimeoutError, DisconnectedError, } from "../errors/index.js";
|
|
6
|
+
import { BaseHandler } from "./BaseHandler.js";
|
|
7
|
+
/**
|
|
8
|
+
* Handler for SSH command execution (non-command messages when connected)
|
|
9
|
+
*/
|
|
10
|
+
export class SSHCommandHandler extends BaseHandler {
|
|
11
|
+
name = "_message";
|
|
12
|
+
description = "Execute SSH commands";
|
|
13
|
+
pattern = /.*/;
|
|
14
|
+
validationService;
|
|
15
|
+
constructor(serverManager, sshClient, bot, logger, validationService) {
|
|
16
|
+
super(serverManager, sshClient, bot, logger);
|
|
17
|
+
this.validationService = validationService;
|
|
18
|
+
}
|
|
19
|
+
async execute(context) {
|
|
20
|
+
const command = context.args.trim();
|
|
21
|
+
if (!command) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Check connection
|
|
25
|
+
if (!this.sshClient.isConnected()) {
|
|
26
|
+
await this.send(context.chatId, "❌ Not connected to any server.\nUse /ssh <index> to connect first.");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Validate and sanitize command
|
|
30
|
+
const validation = this.validationService.validateCommand(command);
|
|
31
|
+
if (!validation.valid) {
|
|
32
|
+
await this.send(context.chatId, `❌ ${validation.error}`);
|
|
33
|
+
this.logger.warn("Blocked unsafe command", {
|
|
34
|
+
command,
|
|
35
|
+
reason: validation.error,
|
|
36
|
+
chatId: context.chatId,
|
|
37
|
+
});
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!validation.data) {
|
|
41
|
+
throw new Error("Validation data is missing");
|
|
42
|
+
}
|
|
43
|
+
const sanitizedCommand = validation.data;
|
|
44
|
+
this.logger.info("Executing SSH command", {
|
|
45
|
+
command: sanitizedCommand.sanitized,
|
|
46
|
+
chatId: context.chatId,
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
const result = await this.sshClient.execute(sanitizedCommand.sanitized);
|
|
50
|
+
// Format output
|
|
51
|
+
let output = "";
|
|
52
|
+
if (result.stdout) {
|
|
53
|
+
output += result.stdout;
|
|
54
|
+
}
|
|
55
|
+
if (result.stderr) {
|
|
56
|
+
output += `\n⚠️ stderr:\n${result.stderr}`;
|
|
57
|
+
}
|
|
58
|
+
// Truncate if too long
|
|
59
|
+
if (output.length > 4000) {
|
|
60
|
+
output = output.substring(0, 4000) + "\n... (output truncated)";
|
|
61
|
+
}
|
|
62
|
+
if (output.trim()) {
|
|
63
|
+
await this.send(context.chatId, `\`\`\`\n${output}\n\`\`\``);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await this.send(context.chatId, "✅ Command executed (no output)");
|
|
67
|
+
}
|
|
68
|
+
// Log if non-zero exit code
|
|
69
|
+
if (result.exitCode !== 0 && result.exitCode !== null) {
|
|
70
|
+
this.logger.warn("Command exited with non-zero code", {
|
|
71
|
+
command: sanitizedCommand.sanitized,
|
|
72
|
+
exitCode: result.exitCode,
|
|
73
|
+
chatId: context.chatId,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (error instanceof DisconnectedError) {
|
|
79
|
+
await this.send(context.chatId, "❌ Connection lost. Please reconnect with /ssh <index>");
|
|
80
|
+
this.serverManager.clearCurrent();
|
|
81
|
+
}
|
|
82
|
+
else if (error instanceof ConnectionTimeoutError) {
|
|
83
|
+
await this.send(context.chatId, "❌ Connection timed out. The server may be unreachable.");
|
|
84
|
+
}
|
|
85
|
+
else if (error instanceof ConnectionFailedError) {
|
|
86
|
+
await this.send(context.chatId, "❌ Connection failed. Please check the server status and try again.");
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const message = error instanceof Error ? error.message : "Command execution failed";
|
|
90
|
+
await this.send(context.chatId, `❌ ${message}`);
|
|
91
|
+
}
|
|
92
|
+
this.logger.error("SSH command failed", error instanceof Error ? error : new Error(String(error)), {
|
|
93
|
+
command: sanitizedCommand.sanitized,
|
|
94
|
+
chatId: context.chatId,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=CommandHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandHandler.js","sourceRoot":"","sources":["../../src/handlers/CommandHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IACvC,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAAG,sBAAsB,CAAC;IACrC,OAAO,GAAG,IAAI,CAAC;IAEP,iBAAiB,CAAoB;IAEtD,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB,EACtB,iBAAoC;QAEpC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,oEAAoE,CACrE,CAAC;YACF,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBACzC,OAAO;gBACP,MAAM,EAAE,UAAU,CAAC,KAAK;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACxC,OAAO,EAAE,gBAAgB,CAAC,SAAS;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAExE,gBAAgB;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;YAC1B,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,CAAC;YAED,uBAAuB;YACvB,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBACzB,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,0BAA0B,CAAC;YAClE,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,UAAU,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;YACpE,CAAC;YAED,4BAA4B;YAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;oBACpD,OAAO,EAAE,gBAAgB,CAAC,SAAS;oBACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;gBACvC,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,uDAAuD,CACxD,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;YACpC,CAAC;iBAAM,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBACnD,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,wDAAwD,CACzD,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;gBAClD,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,oEAAoE,CACrE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;gBACtE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,oBAAoB,EACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACzD;gBACE,OAAO,EAAE,gBAAgB,CAAC,SAAS;gBACnC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Handler
|
|
3
|
+
* Handles /health command to show system health status
|
|
4
|
+
*/
|
|
5
|
+
import { ServerManager } from "../core/ServerManager.js";
|
|
6
|
+
import { SSHClient } from "../core/SSHClient.js";
|
|
7
|
+
import { HealthService } from "../services/HealthService.js";
|
|
8
|
+
import { LoggingService } from "../services/LoggingService.js";
|
|
9
|
+
import type { CommandContext, IBot, ICommandHandler } from "../types/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Handler for /health command - show system health status
|
|
12
|
+
*/
|
|
13
|
+
export declare class HealthHandler implements ICommandHandler {
|
|
14
|
+
readonly name = "health";
|
|
15
|
+
readonly description = "Show system health status";
|
|
16
|
+
readonly pattern: RegExp;
|
|
17
|
+
private readonly serverManager;
|
|
18
|
+
private readonly sshClient;
|
|
19
|
+
private readonly bot;
|
|
20
|
+
private readonly logger;
|
|
21
|
+
private readonly healthService;
|
|
22
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService, healthService: HealthService);
|
|
23
|
+
execute(context: CommandContext): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=HealthHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HealthHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/HealthHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE/E;;GAEG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,+BAA+B;IACnD,QAAQ,CAAC,OAAO,SAAe;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAO;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAG5C,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,aAAa;IASxB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BtD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Handler
|
|
3
|
+
* Handles /health command to show system health status
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Handler for /health command - show system health status
|
|
7
|
+
*/
|
|
8
|
+
export class HealthHandler {
|
|
9
|
+
name = "health";
|
|
10
|
+
description = "Show system health status";
|
|
11
|
+
pattern = /^\/health/;
|
|
12
|
+
serverManager;
|
|
13
|
+
sshClient;
|
|
14
|
+
bot;
|
|
15
|
+
logger;
|
|
16
|
+
healthService;
|
|
17
|
+
constructor(serverManager, sshClient, bot, logger, healthService) {
|
|
18
|
+
this.serverManager = serverManager;
|
|
19
|
+
this.sshClient = sshClient;
|
|
20
|
+
this.bot = bot;
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
this.healthService = healthService;
|
|
23
|
+
}
|
|
24
|
+
async execute(context) {
|
|
25
|
+
try {
|
|
26
|
+
// Update health service with current metrics
|
|
27
|
+
const servers = await this.serverManager.list();
|
|
28
|
+
this.healthService.setTotalServers(servers.length);
|
|
29
|
+
this.healthService.setActiveConnections(this.sshClient.isConnected() ? 1 : 0);
|
|
30
|
+
this.healthService.setStorageHealth(true);
|
|
31
|
+
this.healthService.setBotHealth(true);
|
|
32
|
+
// Get formatted health report
|
|
33
|
+
const report = this.healthService.getFormattedHealthReport();
|
|
34
|
+
await this.bot.sendMessage(context.chatId, report, {
|
|
35
|
+
parseMode: "Markdown",
|
|
36
|
+
});
|
|
37
|
+
this.logger.debug("Health status requested", {
|
|
38
|
+
chatId: context.chatId,
|
|
39
|
+
...this.healthService.getLogContext(),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const message = error instanceof Error ? error.message : "Failed to get health status";
|
|
44
|
+
await this.bot.sendMessage(context.chatId, `❌ ${message}`);
|
|
45
|
+
this.logger.error("Failed to get health status", error, {
|
|
46
|
+
chatId: context.chatId,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=HealthHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HealthHandler.js","sourceRoot":"","sources":["../../src/handlers/HealthHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,2BAA2B,CAAC;IAC1C,OAAO,GAAG,WAAW,CAAC;IAEd,aAAa,CAAgB;IAC7B,SAAS,CAAY;IACrB,GAAG,CAAO;IACV,MAAM,CAAiB;IACvB,aAAa,CAAgB;IAE9C,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB,EACtB,aAA4B;QAE5B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,oBAAoB,CACrC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrC,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAEtC,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;YAE7D,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;gBACjD,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBAC3C,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YACzE,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAc,EAAE;gBAC/D,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help Handler
|
|
3
|
+
* Handles /help and /start commands
|
|
4
|
+
*/
|
|
5
|
+
import { BaseHandler } from './BaseHandler.js';
|
|
6
|
+
import type { CommandContext } from '../types/index.js';
|
|
7
|
+
import { ServerManager } from '../core/ServerManager.js';
|
|
8
|
+
import { SSHClient } from '../core/SSHClient.js';
|
|
9
|
+
import { LoggingService } from '../services/LoggingService.js';
|
|
10
|
+
import { IBot } from '../types/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Handler for /help command
|
|
13
|
+
*/
|
|
14
|
+
export declare class HelpHandler extends BaseHandler {
|
|
15
|
+
readonly name = "help";
|
|
16
|
+
readonly description = "Show help message";
|
|
17
|
+
readonly pattern: RegExp;
|
|
18
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
19
|
+
execute(context: CommandContext): Promise<void>;
|
|
20
|
+
private getHelpMessage;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Handler for /start command
|
|
24
|
+
*/
|
|
25
|
+
export declare class StartHandler extends BaseHandler {
|
|
26
|
+
readonly name = "start";
|
|
27
|
+
readonly description = "Start the bot";
|
|
28
|
+
readonly pattern: RegExp;
|
|
29
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
30
|
+
execute(context: CommandContext): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=HelpHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelpHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/HelpHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,uBAAuB;IAC3C,QAAQ,CAAC,OAAO,SAAa;gBAG3B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,OAAO,CAAC,cAAc;CA+BvB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,mBAAmB;IACvC,QAAQ,CAAC,OAAO,SAAc;gBAG5B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAetD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help Handler
|
|
3
|
+
* Handles /help and /start commands
|
|
4
|
+
*/
|
|
5
|
+
import { BaseHandler } from './BaseHandler.js';
|
|
6
|
+
/**
|
|
7
|
+
* Handler for /help command
|
|
8
|
+
*/
|
|
9
|
+
export class HelpHandler extends BaseHandler {
|
|
10
|
+
name = 'help';
|
|
11
|
+
description = 'Show help message';
|
|
12
|
+
pattern = /^\/help/;
|
|
13
|
+
constructor(serverManager, sshClient, bot, logger) {
|
|
14
|
+
super(serverManager, sshClient, bot, logger);
|
|
15
|
+
}
|
|
16
|
+
async execute(context) {
|
|
17
|
+
const message = this.getHelpMessage();
|
|
18
|
+
await this.sendMarkdown(context.chatId, message);
|
|
19
|
+
}
|
|
20
|
+
getHelpMessage() {
|
|
21
|
+
return `🤖 *Telegram SSH Bot*
|
|
22
|
+
|
|
23
|
+
*Available Commands:*
|
|
24
|
+
|
|
25
|
+
📋 *Server Management:*
|
|
26
|
+
• /add <host> <user> [pass] [port] [note] - Add server
|
|
27
|
+
• /rm <index> - Remove server
|
|
28
|
+
• /list - List all servers
|
|
29
|
+
• /current - Show current server
|
|
30
|
+
|
|
31
|
+
🔌 *SSH Connection:*
|
|
32
|
+
• /ssh <index> - Connect to server
|
|
33
|
+
• /exit - Disconnect from server
|
|
34
|
+
|
|
35
|
+
❓ *Help:*
|
|
36
|
+
• /help - Show this message
|
|
37
|
+
• /start - Start the bot
|
|
38
|
+
|
|
39
|
+
*Usage:*
|
|
40
|
+
1. Add a server with /add
|
|
41
|
+
2. Connect with /ssh <index>
|
|
42
|
+
3. Send any command to execute on server
|
|
43
|
+
4. Use /exit to disconnect
|
|
44
|
+
|
|
45
|
+
⚠️ *Security Notes:*
|
|
46
|
+
• Only authorized users can use this bot
|
|
47
|
+
• Commands are sanitized for safety
|
|
48
|
+
• Credentials are encrypted at rest
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Handler for /start command
|
|
54
|
+
*/
|
|
55
|
+
export class StartHandler extends BaseHandler {
|
|
56
|
+
name = 'start';
|
|
57
|
+
description = 'Start the bot';
|
|
58
|
+
pattern = /^\/start/;
|
|
59
|
+
constructor(serverManager, sshClient, bot, logger) {
|
|
60
|
+
super(serverManager, sshClient, bot, logger);
|
|
61
|
+
}
|
|
62
|
+
async execute(context) {
|
|
63
|
+
const message = `🤖 *Welcome to Telegram SSH Bot!*
|
|
64
|
+
|
|
65
|
+
This bot allows you to manage and connect to SSH servers directly from Telegram.
|
|
66
|
+
|
|
67
|
+
Use /help to see available commands.
|
|
68
|
+
`;
|
|
69
|
+
await this.sendMarkdown(context.chatId, message);
|
|
70
|
+
this.logger.info('Bot started for user', {
|
|
71
|
+
userId: context.userId,
|
|
72
|
+
chatId: context.chatId
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=HelpHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelpHandler.js","sourceRoot":"","sources":["../../src/handlers/HelpHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAO/C;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,WAAW;IACjC,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,mBAAmB,CAAC;IAClC,OAAO,GAAG,SAAS,CAAC;IAE7B,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB;QAEtB,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc;QACpB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BV,CAAC;IACA,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,WAAW;IAClC,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,eAAe,CAAC;IAC9B,OAAO,GAAG,UAAU,CAAC;IAE9B,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB;QAEtB,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,OAAO,GAAG;;;;;CAKnB,CAAC;QAEE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACvC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Handler
|
|
3
|
+
* Handles server management commands: /add, /rm, /list, /ssh, /exit, /current
|
|
4
|
+
*/
|
|
5
|
+
import { ServerManager } from "../core/ServerManager.js";
|
|
6
|
+
import { SSHClient } from "../core/SSHClient.js";
|
|
7
|
+
import { LoggingService } from "../services/LoggingService.js";
|
|
8
|
+
import type { CommandContext } from "../types/index.js";
|
|
9
|
+
import { IBot } from "../types/index.js";
|
|
10
|
+
import { BaseHandler } from "./BaseHandler.js";
|
|
11
|
+
/**
|
|
12
|
+
* Handler for /add command - add a new server
|
|
13
|
+
*/
|
|
14
|
+
export declare class AddServerHandler extends BaseHandler {
|
|
15
|
+
readonly name = "add";
|
|
16
|
+
readonly description = "Add a new server configuration";
|
|
17
|
+
readonly pattern: RegExp;
|
|
18
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
19
|
+
execute(context: CommandContext): Promise<void>;
|
|
20
|
+
private parseArgs;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Handler for /rm command - remove a server
|
|
24
|
+
*/
|
|
25
|
+
export declare class RemoveServerHandler extends BaseHandler {
|
|
26
|
+
readonly name = "rm";
|
|
27
|
+
readonly description = "Remove a server by index";
|
|
28
|
+
readonly pattern: RegExp;
|
|
29
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
30
|
+
execute(context: CommandContext): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Handler for /list command - list all servers
|
|
34
|
+
*/
|
|
35
|
+
export declare class ListServerHandler extends BaseHandler {
|
|
36
|
+
readonly name = "list";
|
|
37
|
+
readonly description = "List all configured servers";
|
|
38
|
+
readonly pattern: RegExp;
|
|
39
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
40
|
+
execute(context: CommandContext): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Handler for /ssh command - connect to a server
|
|
44
|
+
*/
|
|
45
|
+
export declare class SSHServerHandler extends BaseHandler {
|
|
46
|
+
readonly name = "ssh";
|
|
47
|
+
readonly description = "Connect to a server by index";
|
|
48
|
+
readonly pattern: RegExp;
|
|
49
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
50
|
+
execute(context: CommandContext): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Handler for /exit command - disconnect from current server
|
|
54
|
+
*/
|
|
55
|
+
export declare class ExitServerHandler extends BaseHandler {
|
|
56
|
+
readonly name = "exit";
|
|
57
|
+
readonly description = "Disconnect from current SSH session";
|
|
58
|
+
readonly pattern: RegExp;
|
|
59
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
60
|
+
execute(context: CommandContext): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Handler for /current command - show current server
|
|
64
|
+
*/
|
|
65
|
+
export declare class CurrentServerHandler extends BaseHandler {
|
|
66
|
+
readonly name = "current";
|
|
67
|
+
readonly description = "Show current connected server";
|
|
68
|
+
readonly pattern: RegExp;
|
|
69
|
+
constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
|
|
70
|
+
execute(context: CommandContext): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=ServerHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ServerHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,oCAAoC;IACxD,QAAQ,CAAC,OAAO,SAAY;gBAG1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DrD,OAAO,CAAC,SAAS;CAyBlB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,WAAW,8BAA8B;IAClD,QAAQ,CAAC,OAAO,SAAW;gBAGzB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAoDtD;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,iCAAiC;IACrD,QAAQ,CAAC,OAAO,SAAa;gBAG3B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKtD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,kCAAkC;IACtD,QAAQ,CAAC,OAAO,SAAY;gBAG1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAsGtD;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,yCAAyC;IAC7D,QAAQ,CAAC,OAAO,SAAa;gBAG3B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBtD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,OAAO,SAAgB;gBAG9B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBtD"}
|