telegram-ssh-bot 2.0.0 → 2.3.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 +77 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +333 -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 +365 -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/dist/wizard/InstallationWizard.d.ts +32 -0
- package/dist/wizard/InstallationWizard.d.ts.map +1 -0
- package/dist/wizard/InstallationWizard.js +96 -0
- package/dist/wizard/InstallationWizard.js.map +1 -0
- package/dist/wizard/index.d.ts +10 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +8 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/prompts.d.ts +45 -0
- package/dist/wizard/prompts.d.ts.map +1 -0
- package/dist/wizard/prompts.js +194 -0
- package/dist/wizard/prompts.js.map +1 -0
- package/dist/wizard/validators.d.ts +50 -0
- package/dist/wizard/validators.d.ts.map +1 -0
- package/dist/wizard/validators.js +107 -0
- package/dist/wizard/validators.js.map +1 -0
- package/package.json +33 -5
- package/scripts/build.sh +20 -0
- package/scripts/postinstall.js +87 -0
- package/scripts/release.sh +22 -0
- package/scripts/setup-env.d.ts +28 -0
- package/scripts/setup-env.js +293 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Telegram SSH Bot - Entry Point
|
|
4
|
+
*
|
|
5
|
+
* A secure Telegram bot for managing SSH connections
|
|
6
|
+
*
|
|
7
|
+
* @version 2.3.0
|
|
8
|
+
*/
|
|
9
|
+
import { config as dotenvConfig } from "dotenv";
|
|
10
|
+
import { existsSync } from "fs";
|
|
11
|
+
import { getEnvFilePath } from "../scripts/setup-env.js";
|
|
12
|
+
import { ConfigReloader, loadConfig, validateOwnerIds, } from "./config/index.js";
|
|
13
|
+
import { Bot, ConnectionPool, SSHClient, ServerManager } from "./core/index.js";
|
|
14
|
+
import { HealthHandler } from "./handlers/HealthHandler.js";
|
|
15
|
+
import { AddServerHandler, CurrentServerHandler, ExitServerHandler, HelpHandler, ListServerHandler, RemoveServerHandler, SSHCommandHandler, SSHServerHandler, StartHandler, } from "./handlers/index.js";
|
|
16
|
+
import { AuthMiddleware, RateLimitMiddleware } from "./middleware/index.js";
|
|
17
|
+
import { BackupService, CryptoService, HealthService, LoggingService, MonitoringService, NotificationService, RateLimiter, ValidationService, } from "./services/index.js";
|
|
18
|
+
import { InstallationWizard, shouldRunWizard } from "./wizard/index.js";
|
|
19
|
+
/**
|
|
20
|
+
* Application class with enhanced graceful shutdown
|
|
21
|
+
*/
|
|
22
|
+
class Application {
|
|
23
|
+
config;
|
|
24
|
+
configReloader;
|
|
25
|
+
logger;
|
|
26
|
+
cryptoService;
|
|
27
|
+
validationService;
|
|
28
|
+
rateLimiter;
|
|
29
|
+
sshClient;
|
|
30
|
+
connectionPool;
|
|
31
|
+
serverManager;
|
|
32
|
+
bot;
|
|
33
|
+
healthService;
|
|
34
|
+
monitoringService;
|
|
35
|
+
backupService;
|
|
36
|
+
notificationService;
|
|
37
|
+
state = "idle";
|
|
38
|
+
startTime;
|
|
39
|
+
shutdownTimeout = null;
|
|
40
|
+
isShuttingDown = false;
|
|
41
|
+
constructor() {
|
|
42
|
+
this.startTime = new Date();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Initialize the application
|
|
46
|
+
*/
|
|
47
|
+
async initialize() {
|
|
48
|
+
if (this.state !== "idle") {
|
|
49
|
+
throw new Error(`Cannot initialize from state: ${this.state}`);
|
|
50
|
+
}
|
|
51
|
+
this.state = "initializing";
|
|
52
|
+
try {
|
|
53
|
+
// Load configuration
|
|
54
|
+
this.config = await loadConfig();
|
|
55
|
+
validateOwnerIds(this.config);
|
|
56
|
+
// Initialize config reloader for hot reload
|
|
57
|
+
this.configReloader = new ConfigReloader(this.config);
|
|
58
|
+
this.setupConfigReload();
|
|
59
|
+
// Initialize services
|
|
60
|
+
this.logger = new LoggingService(this.config.logging);
|
|
61
|
+
this.cryptoService = new CryptoService(this.config.security.encryptionKey);
|
|
62
|
+
this.validationService = new ValidationService({
|
|
63
|
+
allowedCommands: this.config.security.allowedCommands,
|
|
64
|
+
blockedCommands: this.config.security.blockedCommands,
|
|
65
|
+
});
|
|
66
|
+
this.rateLimiter = new RateLimiter(this.config.security.rateLimit);
|
|
67
|
+
this.rateLimiter.startAutoCleanup();
|
|
68
|
+
// Initialize health service
|
|
69
|
+
this.healthService = new HealthService({
|
|
70
|
+
version: "2.0.0",
|
|
71
|
+
startTime: this.startTime,
|
|
72
|
+
});
|
|
73
|
+
// Initialize notification service
|
|
74
|
+
this.notificationService = new NotificationService({
|
|
75
|
+
enabled: true,
|
|
76
|
+
notifyOnStartup: true,
|
|
77
|
+
notifyOnShutdown: true,
|
|
78
|
+
notifyOnErrors: true,
|
|
79
|
+
notifyOnSecurity: true,
|
|
80
|
+
adminChatId: this.config.telegram.chatId,
|
|
81
|
+
}, this.logger);
|
|
82
|
+
// Initialize backup service
|
|
83
|
+
this.backupService = new BackupService({
|
|
84
|
+
enabled: this.config.backup.enabled,
|
|
85
|
+
backupDir: "./backups",
|
|
86
|
+
maxBackups: this.config.backup.maxCount,
|
|
87
|
+
backupInterval: this.config.backup.intervalMs,
|
|
88
|
+
backupBeforeWrite: true,
|
|
89
|
+
}, this.logger);
|
|
90
|
+
await this.backupService.initialize();
|
|
91
|
+
// Initialize monitoring service
|
|
92
|
+
this.monitoringService = new MonitoringService({
|
|
93
|
+
enabled: this.config.monitoring.enabled,
|
|
94
|
+
checkInterval: this.config.monitoring.intervalMs,
|
|
95
|
+
timeout: 10000,
|
|
96
|
+
alertThreshold: 3,
|
|
97
|
+
cooldownPeriod: 300000,
|
|
98
|
+
}, this.logger);
|
|
99
|
+
this.setupMonitoring();
|
|
100
|
+
// Initialize core components
|
|
101
|
+
this.sshClient = new SSHClient({
|
|
102
|
+
connectionTimeout: this.config.ssh.connectionTimeout,
|
|
103
|
+
commandTimeout: this.config.ssh.commandTimeout,
|
|
104
|
+
});
|
|
105
|
+
// Initialize connection pool
|
|
106
|
+
this.connectionPool = new ConnectionPool({
|
|
107
|
+
maxConnections: this.config.ssh.maxConnections,
|
|
108
|
+
connectionTimeout: this.config.ssh.connectionTimeout,
|
|
109
|
+
commandTimeout: this.config.ssh.commandTimeout,
|
|
110
|
+
idleTimeout: 300000, // 5 minutes
|
|
111
|
+
healthCheckInterval: 60000, // 1 minute
|
|
112
|
+
maxHealthCheckFailures: 3,
|
|
113
|
+
}, this.logger);
|
|
114
|
+
await this.connectionPool.initialize();
|
|
115
|
+
this.serverManager = new ServerManager(this.config.storage.serversFile, this.cryptoService, this.logger);
|
|
116
|
+
// Initialize server manager
|
|
117
|
+
await this.serverManager.initialize();
|
|
118
|
+
// Initialize bot
|
|
119
|
+
this.bot = new Bot({
|
|
120
|
+
token: this.config.telegram.token,
|
|
121
|
+
ownerIds: this.config.telegram.ownerIds,
|
|
122
|
+
polling: this.config.telegram.polling,
|
|
123
|
+
}, this.logger);
|
|
124
|
+
// Set bot for notification service
|
|
125
|
+
this.notificationService.setBot(this.bot);
|
|
126
|
+
// Setup middleware
|
|
127
|
+
this.setupMiddleware();
|
|
128
|
+
// Register handlers
|
|
129
|
+
this.registerHandlers();
|
|
130
|
+
// Update health service
|
|
131
|
+
this.healthService.setBotHealth(true);
|
|
132
|
+
this.healthService.setStorageHealth(true);
|
|
133
|
+
this.state = "running";
|
|
134
|
+
this.logger.info("Application initialized", {
|
|
135
|
+
ownerCount: this.config.telegram.ownerIds.length,
|
|
136
|
+
serversFile: this.config.storage.serversFile,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
this.state = "idle";
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Setup configuration hot reload
|
|
146
|
+
*/
|
|
147
|
+
setupConfigReload() {
|
|
148
|
+
this.configReloader.on("reload", (event) => {
|
|
149
|
+
this.logger.info("Configuration reloaded", {
|
|
150
|
+
changedKeys: event.changedKeys,
|
|
151
|
+
});
|
|
152
|
+
this.notificationService.notifyConfigReloaded(true);
|
|
153
|
+
});
|
|
154
|
+
this.configReloader.on("error", (error) => {
|
|
155
|
+
this.logger.error("Configuration reload failed", error);
|
|
156
|
+
this.notificationService.notifyConfigReloaded(false);
|
|
157
|
+
});
|
|
158
|
+
this.configReloader.startWatching();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Setup monitoring service
|
|
162
|
+
*/
|
|
163
|
+
setupMonitoring() {
|
|
164
|
+
this.monitoringService.on("alert:triggered", (payload) => {
|
|
165
|
+
this.logger.warn("Monitoring alert triggered", {
|
|
166
|
+
serverId: payload.server.id,
|
|
167
|
+
status: payload.status,
|
|
168
|
+
});
|
|
169
|
+
this.notificationService.notifyConnectionLost(payload.server, payload.status.error);
|
|
170
|
+
});
|
|
171
|
+
this.monitoringService.on("server:recovered", (payload) => {
|
|
172
|
+
this.logger.info("Server recovered", {
|
|
173
|
+
serverId: payload.server.id,
|
|
174
|
+
});
|
|
175
|
+
this.notificationService.notifyConnectionRestored(payload.server);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Setup middleware stack
|
|
180
|
+
*/
|
|
181
|
+
setupMiddleware() {
|
|
182
|
+
// Auth middleware - only allow authorized users
|
|
183
|
+
const authMiddleware = new AuthMiddleware(this.config.telegram.ownerIds, this.logger);
|
|
184
|
+
this.bot.use(authMiddleware);
|
|
185
|
+
// Rate limiting middleware
|
|
186
|
+
const rateLimitMiddleware = new RateLimitMiddleware(this.rateLimiter);
|
|
187
|
+
this.bot.use(rateLimitMiddleware);
|
|
188
|
+
this.logger.debug("Middleware configured");
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Register command handlers
|
|
192
|
+
*/
|
|
193
|
+
registerHandlers() {
|
|
194
|
+
// Server management handlers
|
|
195
|
+
this.bot.registerCommand(new AddServerHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
196
|
+
this.bot.registerCommand(new RemoveServerHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
197
|
+
this.bot.registerCommand(new ListServerHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
198
|
+
this.bot.registerCommand(new SSHServerHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
199
|
+
this.bot.registerCommand(new ExitServerHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
200
|
+
this.bot.registerCommand(new CurrentServerHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
201
|
+
// SSH command handler (for non-command messages)
|
|
202
|
+
this.bot.registerCommand(new SSHCommandHandler(this.serverManager, this.sshClient, this.bot, this.logger, this.validationService));
|
|
203
|
+
// Help handlers
|
|
204
|
+
this.bot.registerCommand(new HelpHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
205
|
+
this.bot.registerCommand(new StartHandler(this.serverManager, this.sshClient, this.bot, this.logger));
|
|
206
|
+
// Health handler
|
|
207
|
+
this.bot.registerCommand(new HealthHandler(this.serverManager, this.sshClient, this.bot, this.logger, this.healthService));
|
|
208
|
+
this.logger.debug("Handlers registered");
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Start the application
|
|
212
|
+
*/
|
|
213
|
+
async start() {
|
|
214
|
+
if (this.state !== "running") {
|
|
215
|
+
throw new Error(`Cannot start from state: ${this.state}`);
|
|
216
|
+
}
|
|
217
|
+
await this.bot.start();
|
|
218
|
+
// Send startup notification
|
|
219
|
+
await this.notificationService.notifyStartup("2.0.0");
|
|
220
|
+
this.logger.info("Bot started successfully");
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Stop the application gracefully
|
|
224
|
+
*/
|
|
225
|
+
async stop(options) {
|
|
226
|
+
const opts = {
|
|
227
|
+
reason: options?.reason ?? "Manual shutdown",
|
|
228
|
+
timeout: options?.timeout ?? 30000, // 30 seconds default
|
|
229
|
+
notifyAdmin: options?.notifyAdmin ?? true,
|
|
230
|
+
};
|
|
231
|
+
if (this.isShuttingDown) {
|
|
232
|
+
this.logger.warn("Shutdown already in progress");
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
this.isShuttingDown = true;
|
|
236
|
+
this.state = "shutting_down";
|
|
237
|
+
this.logger.info("Starting graceful shutdown", { reason: opts.reason });
|
|
238
|
+
// Set timeout for forced shutdown
|
|
239
|
+
this.shutdownTimeout = setTimeout(() => {
|
|
240
|
+
this.logger.error("Graceful shutdown timeout exceeded, forcing exit");
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}, opts.timeout);
|
|
243
|
+
try {
|
|
244
|
+
// Notify admin about shutdown
|
|
245
|
+
if (opts.notifyAdmin) {
|
|
246
|
+
await this.notificationService.notifyShutdown(opts.reason);
|
|
247
|
+
}
|
|
248
|
+
// Stop accepting new requests
|
|
249
|
+
this.healthService.setBotHealth(false);
|
|
250
|
+
// Stop monitoring
|
|
251
|
+
this.monitoringService.stop();
|
|
252
|
+
// Stop rate limiter auto cleanup
|
|
253
|
+
this.rateLimiter.stopAutoCleanup();
|
|
254
|
+
// Stop config watcher
|
|
255
|
+
this.configReloader.stopWatching();
|
|
256
|
+
// Disconnect SSH client
|
|
257
|
+
if (this.sshClient.isConnected()) {
|
|
258
|
+
this.logger.info("Disconnecting SSH client");
|
|
259
|
+
await this.sshClient.disconnect();
|
|
260
|
+
}
|
|
261
|
+
// Drain connection pool
|
|
262
|
+
this.logger.info("Draining connection pool");
|
|
263
|
+
await this.connectionPool.drain();
|
|
264
|
+
// Stop backup service
|
|
265
|
+
this.backupService.stop();
|
|
266
|
+
// Stop bot
|
|
267
|
+
this.logger.info("Stopping bot");
|
|
268
|
+
await this.bot.stop();
|
|
269
|
+
// Clear shutdown timeout
|
|
270
|
+
if (this.shutdownTimeout) {
|
|
271
|
+
clearTimeout(this.shutdownTimeout);
|
|
272
|
+
this.shutdownTimeout = null;
|
|
273
|
+
}
|
|
274
|
+
this.state = "stopped";
|
|
275
|
+
this.logger.info("Application stopped gracefully");
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
this.logger.error("Error during shutdown", error);
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get application state
|
|
284
|
+
*/
|
|
285
|
+
getState() {
|
|
286
|
+
return this.state;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get health service
|
|
290
|
+
*/
|
|
291
|
+
getHealthService() {
|
|
292
|
+
return this.healthService;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Main entry point
|
|
297
|
+
*/
|
|
298
|
+
async function main() {
|
|
299
|
+
// Load .env file from config directory if it exists
|
|
300
|
+
const envPath = getEnvFilePath();
|
|
301
|
+
if (existsSync(envPath)) {
|
|
302
|
+
dotenvConfig({ path: envPath });
|
|
303
|
+
}
|
|
304
|
+
// Check if installation wizard should run
|
|
305
|
+
if (shouldRunWizard()) {
|
|
306
|
+
console.log("");
|
|
307
|
+
console.log("First-time setup detected. Launching installation wizard...");
|
|
308
|
+
const wizard = new InstallationWizard();
|
|
309
|
+
await wizard.run();
|
|
310
|
+
// Reload environment after wizard creates .env file
|
|
311
|
+
dotenvConfig({ path: envPath, override: true });
|
|
312
|
+
}
|
|
313
|
+
const app = new Application();
|
|
314
|
+
// Track if we're already shutting down
|
|
315
|
+
let isShuttingDown = false;
|
|
316
|
+
/**
|
|
317
|
+
* Handle shutdown signals gracefully
|
|
318
|
+
*/
|
|
319
|
+
const handleShutdown = async (signal) => {
|
|
320
|
+
if (isShuttingDown) {
|
|
321
|
+
console.log(`\nAlready shutting down, please wait...`);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
isShuttingDown = true;
|
|
325
|
+
console.log(`\nReceived ${signal}, initiating graceful shutdown...`);
|
|
326
|
+
try {
|
|
327
|
+
await app.stop({ reason: `Received ${signal}` });
|
|
328
|
+
process.exit(0);
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
console.error("Error during shutdown:", error);
|
|
332
|
+
process.exit(1);
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
// Register signal handlers
|
|
336
|
+
process.on("SIGINT", () => handleShutdown("SIGINT"));
|
|
337
|
+
process.on("SIGTERM", () => handleShutdown("SIGTERM"));
|
|
338
|
+
process.on("SIGHUP", () => handleShutdown("SIGHUP"));
|
|
339
|
+
// Handle uncaught exceptions
|
|
340
|
+
process.on("uncaughtException", async (error) => {
|
|
341
|
+
console.error("Uncaught exception:", error);
|
|
342
|
+
try {
|
|
343
|
+
await handleShutdown("uncaughtException");
|
|
344
|
+
}
|
|
345
|
+
catch (e) {
|
|
346
|
+
console.error("Error during shutdown:", e);
|
|
347
|
+
}
|
|
348
|
+
process.exit(1);
|
|
349
|
+
});
|
|
350
|
+
// Handle unhandled promise rejections
|
|
351
|
+
process.on("unhandledRejection", (reason, promise) => {
|
|
352
|
+
console.error("Unhandled rejection at:", promise, "reason:", reason);
|
|
353
|
+
});
|
|
354
|
+
try {
|
|
355
|
+
await app.initialize();
|
|
356
|
+
await app.start();
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
console.error("Failed to start application:", error);
|
|
360
|
+
process.exit(1);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Run the application
|
|
364
|
+
main();
|
|
365
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Middleware
|
|
3
|
+
* Validates that only authorized users can interact with the bot
|
|
4
|
+
*/
|
|
5
|
+
import { LoggingService } from "../services/LoggingService.js";
|
|
6
|
+
import type { IMiddleware, MiddlewareContext } from "../types/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Authorization middleware
|
|
9
|
+
*/
|
|
10
|
+
export declare class AuthMiddleware implements IMiddleware {
|
|
11
|
+
private readonly ownerIds;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
constructor(ownerIds: string[], logger: LoggingService);
|
|
14
|
+
execute(context: MiddlewareContext): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a user ID is authorized
|
|
17
|
+
*/
|
|
18
|
+
isAuthorized(userId: number): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Add an owner ID
|
|
21
|
+
*/
|
|
22
|
+
addOwner(userId: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Remove an owner ID
|
|
25
|
+
*/
|
|
26
|
+
removeOwner(userId: string): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=AuthMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/AuthMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc;IAKhD,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIrC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGlC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Middleware
|
|
3
|
+
* Validates that only authorized users can interact with the bot
|
|
4
|
+
*/
|
|
5
|
+
import { UnauthorizedError } from "../errors/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Authorization middleware
|
|
8
|
+
*/
|
|
9
|
+
export class AuthMiddleware {
|
|
10
|
+
ownerIds;
|
|
11
|
+
logger;
|
|
12
|
+
constructor(ownerIds, logger) {
|
|
13
|
+
this.ownerIds = new Set(ownerIds);
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
}
|
|
16
|
+
async execute(context) {
|
|
17
|
+
const userId = context.userId;
|
|
18
|
+
// Check if user is authorized
|
|
19
|
+
if (!this.ownerIds.has(String(userId))) {
|
|
20
|
+
this.logger.warn("Unauthorized access attempt", {
|
|
21
|
+
userId,
|
|
22
|
+
chatId: context.chatId,
|
|
23
|
+
text: context.text,
|
|
24
|
+
});
|
|
25
|
+
throw new UnauthorizedError(userId);
|
|
26
|
+
}
|
|
27
|
+
// User is authorized, continue
|
|
28
|
+
await context.next();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a user ID is authorized
|
|
32
|
+
*/
|
|
33
|
+
isAuthorized(userId) {
|
|
34
|
+
return this.ownerIds.has(String(userId));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Add an owner ID
|
|
38
|
+
*/
|
|
39
|
+
addOwner(userId) {
|
|
40
|
+
this.ownerIds.add(userId);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Remove an owner ID
|
|
44
|
+
*/
|
|
45
|
+
removeOwner(userId) {
|
|
46
|
+
this.ownerIds.delete(userId);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=AuthMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthMiddleware.js","sourceRoot":"","sources":["../../src/middleware/AuthMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,QAAQ,CAAc;IACtB,MAAM,CAAiB;IAExC,YAAY,QAAkB,EAAE,MAAsB;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA0B;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,8BAA8B;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC9C,MAAM;gBACN,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAC;YAEH,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAED,+BAA+B;QAC/B,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Middleware
|
|
3
|
+
* Limits the number of requests per user
|
|
4
|
+
*/
|
|
5
|
+
import { RateLimiter } from "../services/RateLimiter.js";
|
|
6
|
+
import type { IMiddleware, MiddlewareContext } from "../types/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Rate limiting middleware
|
|
9
|
+
*/
|
|
10
|
+
export declare class RateLimitMiddleware implements IMiddleware {
|
|
11
|
+
private readonly rateLimiter;
|
|
12
|
+
constructor(rateLimiter: RateLimiter);
|
|
13
|
+
execute(context: MiddlewareContext): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Get remaining requests for a chat
|
|
16
|
+
*/
|
|
17
|
+
getRemaining(chatId: number): number;
|
|
18
|
+
/**
|
|
19
|
+
* Reset rate limit for a chat
|
|
20
|
+
*/
|
|
21
|
+
reset(chatId: number): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=RateLimitMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/RateLimitMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,WAAW,EAAE,WAAW;IAI9B,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIpC;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAG5B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Middleware
|
|
3
|
+
* Limits the number of requests per user
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Rate limiting middleware
|
|
7
|
+
*/
|
|
8
|
+
export class RateLimitMiddleware {
|
|
9
|
+
rateLimiter;
|
|
10
|
+
constructor(rateLimiter) {
|
|
11
|
+
this.rateLimiter = rateLimiter;
|
|
12
|
+
}
|
|
13
|
+
async execute(context) {
|
|
14
|
+
// Use chat ID as identifier for rate limiting
|
|
15
|
+
const identifier = String(context.chatId);
|
|
16
|
+
// Check rate limit (throws if exceeded)
|
|
17
|
+
this.rateLimiter.checkLimit(identifier);
|
|
18
|
+
// Continue to next middleware/handler
|
|
19
|
+
await context.next();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get remaining requests for a chat
|
|
23
|
+
*/
|
|
24
|
+
getRemaining(chatId) {
|
|
25
|
+
return this.rateLimiter.getRemaining(String(chatId));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reset rate limit for a chat
|
|
29
|
+
*/
|
|
30
|
+
reset(chatId) {
|
|
31
|
+
this.rateLimiter.reset(String(chatId));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=RateLimitMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitMiddleware.js","sourceRoot":"","sources":["../../src/middleware/RateLimitMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACb,WAAW,CAAc;IAE1C,YAAY,WAAwB;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA0B;QACtC,8CAA8C;QAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1C,wCAAwC;QACxC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAExC,sCAAsC;QACtC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAc;QAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|