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.
Files changed (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -22
  3. package/deploy/.env.example +86 -0
  4. package/dist/config/index.d.ts +77 -0
  5. package/dist/config/index.d.ts.map +1 -0
  6. package/dist/config/index.js +333 -0
  7. package/dist/config/index.js.map +1 -0
  8. package/dist/config/schema.d.ts +6 -0
  9. package/dist/config/schema.d.ts.map +1 -0
  10. package/dist/config/schema.js +50 -0
  11. package/dist/config/schema.js.map +1 -0
  12. package/dist/core/Bot.d.ts +91 -0
  13. package/dist/core/Bot.d.ts.map +1 -0
  14. package/dist/core/Bot.js +263 -0
  15. package/dist/core/Bot.js.map +1 -0
  16. package/dist/core/ConnectionPool.d.ts +125 -0
  17. package/dist/core/ConnectionPool.d.ts.map +1 -0
  18. package/dist/core/ConnectionPool.js +397 -0
  19. package/dist/core/ConnectionPool.js.map +1 -0
  20. package/dist/core/SSHClient.d.ts +112 -0
  21. package/dist/core/SSHClient.d.ts.map +1 -0
  22. package/dist/core/SSHClient.js +367 -0
  23. package/dist/core/SSHClient.js.map +1 -0
  24. package/dist/core/ServerManager.d.ts +80 -0
  25. package/dist/core/ServerManager.d.ts.map +1 -0
  26. package/dist/core/ServerManager.js +207 -0
  27. package/dist/core/ServerManager.js.map +1 -0
  28. package/dist/core/index.d.ts +8 -0
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +8 -0
  31. package/dist/core/index.js.map +1 -0
  32. package/dist/errors/AuthError.d.ts +30 -0
  33. package/dist/errors/AuthError.d.ts.map +1 -0
  34. package/dist/errors/AuthError.js +35 -0
  35. package/dist/errors/AuthError.js.map +1 -0
  36. package/dist/errors/BaseError.d.ts +17 -0
  37. package/dist/errors/BaseError.d.ts.map +1 -0
  38. package/dist/errors/BaseError.js +34 -0
  39. package/dist/errors/BaseError.js.map +1 -0
  40. package/dist/errors/ConfigurationError.d.ts +24 -0
  41. package/dist/errors/ConfigurationError.d.ts.map +1 -0
  42. package/dist/errors/ConfigurationError.js +24 -0
  43. package/dist/errors/ConfigurationError.js.map +1 -0
  44. package/dist/errors/PoolError.d.ts +21 -0
  45. package/dist/errors/PoolError.d.ts.map +1 -0
  46. package/dist/errors/PoolError.js +30 -0
  47. package/dist/errors/PoolError.js.map +1 -0
  48. package/dist/errors/SSHError.d.ts +24 -0
  49. package/dist/errors/SSHError.d.ts.map +1 -0
  50. package/dist/errors/SSHError.js +38 -0
  51. package/dist/errors/SSHError.js.map +1 -0
  52. package/dist/errors/StorageError.d.ts +24 -0
  53. package/dist/errors/StorageError.d.ts.map +1 -0
  54. package/dist/errors/StorageError.js +35 -0
  55. package/dist/errors/StorageError.js.map +1 -0
  56. package/dist/errors/ValidationError.d.ts +29 -0
  57. package/dist/errors/ValidationError.d.ts.map +1 -0
  58. package/dist/errors/ValidationError.js +35 -0
  59. package/dist/errors/ValidationError.js.map +1 -0
  60. package/dist/errors/index.d.ts +11 -0
  61. package/dist/errors/index.d.ts.map +1 -0
  62. package/dist/errors/index.js +18 -0
  63. package/dist/errors/index.js.map +1 -0
  64. package/dist/handlers/BaseHandler.d.ts +50 -0
  65. package/dist/handlers/BaseHandler.d.ts.map +1 -0
  66. package/dist/handlers/BaseHandler.js +87 -0
  67. package/dist/handlers/BaseHandler.js.map +1 -0
  68. package/dist/handlers/CommandHandler.d.ts +23 -0
  69. package/dist/handlers/CommandHandler.d.ts.map +1 -0
  70. package/dist/handlers/CommandHandler.js +99 -0
  71. package/dist/handlers/CommandHandler.js.map +1 -0
  72. package/dist/handlers/HealthHandler.d.ts +25 -0
  73. package/dist/handlers/HealthHandler.d.ts.map +1 -0
  74. package/dist/handlers/HealthHandler.js +51 -0
  75. package/dist/handlers/HealthHandler.js.map +1 -0
  76. package/dist/handlers/HelpHandler.d.ts +32 -0
  77. package/dist/handlers/HelpHandler.d.ts.map +1 -0
  78. package/dist/handlers/HelpHandler.js +76 -0
  79. package/dist/handlers/HelpHandler.js.map +1 -0
  80. package/dist/handlers/ServerHandler.d.ts +72 -0
  81. package/dist/handlers/ServerHandler.d.ts.map +1 -0
  82. package/dist/handlers/ServerHandler.js +272 -0
  83. package/dist/handlers/ServerHandler.js.map +1 -0
  84. package/dist/handlers/index.d.ts +9 -0
  85. package/dist/handlers/index.d.ts.map +1 -0
  86. package/dist/handlers/index.js +9 -0
  87. package/dist/handlers/index.js.map +1 -0
  88. package/dist/index.d.ts +10 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +365 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/middleware/AuthMiddleware.d.ts +28 -0
  93. package/dist/middleware/AuthMiddleware.d.ts.map +1 -0
  94. package/dist/middleware/AuthMiddleware.js +49 -0
  95. package/dist/middleware/AuthMiddleware.js.map +1 -0
  96. package/dist/middleware/RateLimitMiddleware.d.ts +23 -0
  97. package/dist/middleware/RateLimitMiddleware.d.ts.map +1 -0
  98. package/dist/middleware/RateLimitMiddleware.js +34 -0
  99. package/dist/middleware/RateLimitMiddleware.js.map +1 -0
  100. package/dist/middleware/index.d.ts +6 -0
  101. package/dist/middleware/index.d.ts.map +1 -0
  102. package/dist/middleware/index.js +6 -0
  103. package/dist/middleware/index.js.map +1 -0
  104. package/dist/services/BackupService.d.ts +119 -0
  105. package/dist/services/BackupService.d.ts.map +1 -0
  106. package/dist/services/BackupService.js +313 -0
  107. package/dist/services/BackupService.js.map +1 -0
  108. package/dist/services/CryptoService.d.ts +37 -0
  109. package/dist/services/CryptoService.d.ts.map +1 -0
  110. package/dist/services/CryptoService.js +108 -0
  111. package/dist/services/CryptoService.js.map +1 -0
  112. package/dist/services/HealthService.d.ts +126 -0
  113. package/dist/services/HealthService.d.ts.map +1 -0
  114. package/dist/services/HealthService.js +213 -0
  115. package/dist/services/HealthService.js.map +1 -0
  116. package/dist/services/LoggingService.d.ts +115 -0
  117. package/dist/services/LoggingService.d.ts.map +1 -0
  118. package/dist/services/LoggingService.js +334 -0
  119. package/dist/services/LoggingService.js.map +1 -0
  120. package/dist/services/MonitoringService.d.ts +119 -0
  121. package/dist/services/MonitoringService.d.ts.map +1 -0
  122. package/dist/services/MonitoringService.js +267 -0
  123. package/dist/services/MonitoringService.js.map +1 -0
  124. package/dist/services/NotificationService.d.ts +132 -0
  125. package/dist/services/NotificationService.d.ts.map +1 -0
  126. package/dist/services/NotificationService.js +297 -0
  127. package/dist/services/NotificationService.js.map +1 -0
  128. package/dist/services/RateLimiter.d.ts +51 -0
  129. package/dist/services/RateLimiter.d.ts.map +1 -0
  130. package/dist/services/RateLimiter.js +141 -0
  131. package/dist/services/RateLimiter.js.map +1 -0
  132. package/dist/services/ValidationService.d.ts +49 -0
  133. package/dist/services/ValidationService.d.ts.map +1 -0
  134. package/dist/services/ValidationService.js +158 -0
  135. package/dist/services/ValidationService.js.map +1 -0
  136. package/dist/services/index.d.ts +12 -0
  137. package/dist/services/index.d.ts.map +1 -0
  138. package/dist/services/index.js +12 -0
  139. package/dist/services/index.js.map +1 -0
  140. package/dist/types/Bot.d.ts +63 -0
  141. package/dist/types/Bot.d.ts.map +1 -0
  142. package/dist/types/Bot.js +5 -0
  143. package/dist/types/Bot.js.map +1 -0
  144. package/dist/types/Config.d.ts +57 -0
  145. package/dist/types/Config.d.ts.map +1 -0
  146. package/dist/types/Config.js +5 -0
  147. package/dist/types/Config.js.map +1 -0
  148. package/dist/types/Errors.d.ts +37 -0
  149. package/dist/types/Errors.d.ts.map +1 -0
  150. package/dist/types/Errors.js +34 -0
  151. package/dist/types/Errors.js.map +1 -0
  152. package/dist/types/SSH.d.ts +56 -0
  153. package/dist/types/SSH.d.ts.map +1 -0
  154. package/dist/types/SSH.js +6 -0
  155. package/dist/types/SSH.js.map +1 -0
  156. package/dist/types/Server.d.ts +39 -0
  157. package/dist/types/Server.d.ts.map +1 -0
  158. package/dist/types/Server.js +5 -0
  159. package/dist/types/Server.js.map +1 -0
  160. package/dist/types/index.d.ts +10 -0
  161. package/dist/types/index.d.ts.map +1 -0
  162. package/dist/types/index.js +6 -0
  163. package/dist/types/index.js.map +1 -0
  164. package/dist/utils/commandUtils.d.ts +25 -0
  165. package/dist/utils/commandUtils.d.ts.map +1 -0
  166. package/dist/utils/commandUtils.js +94 -0
  167. package/dist/utils/commandUtils.js.map +1 -0
  168. package/dist/utils/fileUtils.d.ts +40 -0
  169. package/dist/utils/fileUtils.d.ts.map +1 -0
  170. package/dist/utils/fileUtils.js +114 -0
  171. package/dist/utils/fileUtils.js.map +1 -0
  172. package/dist/utils/index.d.ts +7 -0
  173. package/dist/utils/index.d.ts.map +1 -0
  174. package/dist/utils/index.js +7 -0
  175. package/dist/utils/index.js.map +1 -0
  176. package/dist/utils/pathUtils.d.ts +40 -0
  177. package/dist/utils/pathUtils.d.ts.map +1 -0
  178. package/dist/utils/pathUtils.js +140 -0
  179. package/dist/utils/pathUtils.js.map +1 -0
  180. package/dist/wizard/InstallationWizard.d.ts +32 -0
  181. package/dist/wizard/InstallationWizard.d.ts.map +1 -0
  182. package/dist/wizard/InstallationWizard.js +96 -0
  183. package/dist/wizard/InstallationWizard.js.map +1 -0
  184. package/dist/wizard/index.d.ts +10 -0
  185. package/dist/wizard/index.d.ts.map +1 -0
  186. package/dist/wizard/index.js +8 -0
  187. package/dist/wizard/index.js.map +1 -0
  188. package/dist/wizard/prompts.d.ts +45 -0
  189. package/dist/wizard/prompts.d.ts.map +1 -0
  190. package/dist/wizard/prompts.js +194 -0
  191. package/dist/wizard/prompts.js.map +1 -0
  192. package/dist/wizard/validators.d.ts +50 -0
  193. package/dist/wizard/validators.d.ts.map +1 -0
  194. package/dist/wizard/validators.js +107 -0
  195. package/dist/wizard/validators.js.map +1 -0
  196. package/package.json +33 -5
  197. package/scripts/build.sh +20 -0
  198. package/scripts/postinstall.js +87 -0
  199. package/scripts/release.sh +22 -0
  200. package/scripts/setup-env.d.ts +28 -0
  201. package/scripts/setup-env.js +293 -0
@@ -0,0 +1,293 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Shared utility for setting up the .env configuration file
4
+ * Used by both install.sh and postinstall.js
5
+ */
6
+
7
+ import { randomBytes } from "crypto";
8
+ import {
9
+ copyFileSync,
10
+ existsSync,
11
+ mkdirSync,
12
+ readFileSync,
13
+ writeFileSync,
14
+ } from "fs";
15
+ import { homedir } from "os";
16
+ import { join } from "path";
17
+
18
+ /**
19
+ * Get the configuration directory path
20
+ * @returns {string} The configuration directory path
21
+ */
22
+ export function getConfigDir() {
23
+ return join(homedir(), ".config", "telegram-ssh-bot");
24
+ }
25
+
26
+ /**
27
+ * Get the .env file path
28
+ * @returns {string} The .env file path
29
+ */
30
+ export function getEnvFilePath() {
31
+ return join(getConfigDir(), ".env");
32
+ }
33
+
34
+ /**
35
+ * Get the .env.example file path
36
+ * This file can be in different locations depending on the installation method
37
+ * @returns {string|null} The .env.example file path or null if not found
38
+ */
39
+ export function getEnvExamplePath() {
40
+ const possiblePaths = [
41
+ // For npm/pnpm global install
42
+ join(
43
+ new URL(".", import.meta.url).pathname,
44
+ "..",
45
+ "deploy",
46
+ ".env.example",
47
+ ),
48
+ // For binary installation (running from project root)
49
+ join(process.cwd(), "deploy", ".env.example"),
50
+ // For development
51
+ join(
52
+ new URL(".", import.meta.url).pathname,
53
+ "..",
54
+ "..",
55
+ "deploy",
56
+ ".env.example",
57
+ ),
58
+ ];
59
+
60
+ for (const path of possiblePaths) {
61
+ if (existsSync(path)) {
62
+ return path;
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+
68
+ /**
69
+ * Ensure the configuration directory exists
70
+ * @returns {string} The configuration directory path
71
+ */
72
+ export function ensureConfigDir() {
73
+ const configDir = getConfigDir();
74
+ if (!existsSync(configDir)) {
75
+ mkdirSync(configDir, { recursive: true });
76
+ console.log(`Created configuration directory: ${configDir}`);
77
+ }
78
+ return configDir;
79
+ }
80
+
81
+ /**
82
+ * Generate a secure random encryption key
83
+ * Generates a 64-character hex string (32 bytes)
84
+ * @returns {string} The generated encryption key
85
+ */
86
+ export function generateEncryptionKey() {
87
+ return randomBytes(32).toString("hex");
88
+ }
89
+
90
+ /**
91
+ * Check if the .env file already exists
92
+ * @returns {boolean} True if the file exists
93
+ */
94
+ export function envFileExists() {
95
+ return existsSync(getEnvFilePath());
96
+ }
97
+
98
+ /**
99
+ * Create the .env file from the template
100
+ * @param {Object} options - Options for creating the .env file
101
+ * @param {boolean} options.generateKey - Whether to generate a new encryption key
102
+ * @returns {boolean} True if the file was created successfully
103
+ */
104
+ export function createEnvFile(options = { generateKey: true }) {
105
+ const envPath = getEnvFilePath();
106
+ const examplePath = getEnvExamplePath();
107
+
108
+ if (!examplePath) {
109
+ console.warn(
110
+ "Warning: .env.example not found. Creating minimal .env file.",
111
+ );
112
+ const encryptionKey = options.generateKey ? generateEncryptionKey() : "";
113
+ const minimalEnv = `# Telegram Bot Configuration
114
+ BOT_TOKEN=your_telegram_bot_token_here
115
+ BOT_CHAT_ID=your_chat_id_here
116
+ BOT_OWNER_IDS=123456789,987654321
117
+
118
+ # Security
119
+ ENCRYPTION_KEY=${encryptionKey}
120
+
121
+ # SSH Configuration
122
+ SSH_DEFAULT_PORT=22
123
+ SSH_CONNECTION_TIMEOUT=30000
124
+ SSH_COMMAND_TIMEOUT=30000
125
+ SSH_DEFAULT_PRIVATE_KEY_PATH=
126
+
127
+ # Rate Limiting
128
+ RATE_LIMIT_WINDOW_MS=60000
129
+ RATE_LIMIT_MAX_REQUESTS=100
130
+
131
+ # Backup
132
+ BACKUP_ENABLED=true
133
+ BACKUP_INTERVAL_MS=3600000
134
+ BACKUP_MAX_COUNT=10
135
+
136
+ # Monitoring
137
+ MONITORING_ENABLED=true
138
+ MONITORING_INTERVAL_MS=300000
139
+ `;
140
+ writeFileSync(envPath, minimalEnv);
141
+ console.log(`Created minimal .env file at: ${envPath}`);
142
+ return true;
143
+ }
144
+
145
+ // Copy the example file
146
+ copyFileSync(examplePath, envPath);
147
+ console.log(`Created .env file from template at: ${envPath}`);
148
+
149
+ // Generate and set encryption key if requested
150
+ if (options.generateKey) {
151
+ const encryptionKey = generateEncryptionKey();
152
+ let envContent = readFileSync(envPath, "utf-8");
153
+
154
+ // Replace the ENCRYPTION_KEY line with the generated key
155
+ envContent = envContent.replace(
156
+ /^ENCRYPTION_KEY=.*$/m,
157
+ `ENCRYPTION_KEY=${encryptionKey}`,
158
+ );
159
+
160
+ writeFileSync(envPath, envContent);
161
+ console.log("Generated secure encryption key");
162
+ }
163
+
164
+ return true;
165
+ }
166
+
167
+ /**
168
+ * Write a .env file with specific values
169
+ * Used by the installation wizard
170
+ * @param {Object} values - Configuration values
171
+ * @param {string} values.botToken - Telegram bot token
172
+ * @param {string} values.botChatId - Telegram chat ID
173
+ * @param {string[]} values.botOwnerIds - Array of owner IDs
174
+ * @param {string} values.encryptionKey - Encryption key (64 hex chars)
175
+ * @returns {boolean} True if the file was written successfully
176
+ */
177
+ export function writeEnvFile(values) {
178
+ const { botToken, botChatId, botOwnerIds, encryptionKey } = values;
179
+
180
+ // Ensure config directory exists
181
+ ensureConfigDir();
182
+
183
+ const envPath = getEnvFilePath();
184
+
185
+ // Build .env content
186
+ const envContent = `# Telegram Bot Configuration
187
+ BOT_TOKEN=${botToken}
188
+ BOT_CHAT_ID=${botChatId}
189
+ BOT_OWNER_IDS=${botOwnerIds.join(",")}
190
+
191
+ # Security
192
+ ENCRYPTION_KEY=${encryptionKey}
193
+
194
+ # SSH Configuration
195
+ SSH_DEFAULT_PORT=22
196
+ SSH_CONNECTION_TIMEOUT=30000
197
+ SSH_COMMAND_TIMEOUT=30000
198
+ SSH_DEFAULT_PRIVATE_KEY_PATH=
199
+
200
+ # Rate Limiting
201
+ RATE_LIMIT_ENABLED=true
202
+ RATE_LIMIT_WINDOW_MS=60000
203
+ RATE_LIMIT_MAX_REQUESTS=100
204
+
205
+ # Backup
206
+ BACKUP_ENABLED=true
207
+ BACKUP_INTERVAL_MS=3600000
208
+ BACKUP_MAX_COUNT=10
209
+
210
+ # Monitoring
211
+ MONITORING_ENABLED=true
212
+ MONITORING_INTERVAL_MS=300000
213
+
214
+ # Logging
215
+ LOG_LEVEL=info
216
+ LOG_FORMAT=json
217
+ `;
218
+
219
+ writeFileSync(envPath, envContent);
220
+ return true;
221
+ }
222
+
223
+ /**
224
+ * Main function to set up the environment
225
+ * @param {Object} options - Setup options
226
+ * @param {boolean} options.force - Force overwrite existing .env file
227
+ * @param {boolean} options.generateKey - Generate a new encryption key
228
+ * @param {boolean} options.silent - Suppress output messages
229
+ * @returns {Object} Result object with success status and messages
230
+ */
231
+ export function main(options = {}) {
232
+ const { force = false, generateKey = true, silent = false } = options;
233
+
234
+ const result = {
235
+ success: false,
236
+ created: false,
237
+ envPath: getEnvFilePath(),
238
+ configDir: getConfigDir(),
239
+ message: "",
240
+ };
241
+
242
+ try {
243
+ // Check if .env already exists
244
+ if (envFileExists() && !force) {
245
+ result.message = `.env file already exists at ${result.envPath}`;
246
+ result.success = true;
247
+ if (!silent) {
248
+ console.log(result.message);
249
+ }
250
+ return result;
251
+ }
252
+
253
+ // Ensure config directory exists
254
+ ensureConfigDir();
255
+
256
+ // Create the .env file
257
+ createEnvFile({ generateKey });
258
+ result.created = true;
259
+ result.success = true;
260
+ result.message = `Created .env file at ${result.envPath}`;
261
+
262
+ if (!silent) {
263
+ console.log("");
264
+ console.log("=".repeat(60));
265
+ console.log("Telegram SSH Bot - Configuration Setup");
266
+ console.log("=".repeat(60));
267
+ console.log(`Configuration file created at: ${result.envPath}`);
268
+ console.log("");
269
+ console.log(
270
+ "IMPORTANT: Please edit the .env file and fill in the required values:",
271
+ );
272
+ console.log(" - BOT_TOKEN: Your Telegram bot token");
273
+ console.log(" - BOT_CHAT_ID: Your Telegram chat ID");
274
+ console.log(" - BOT_OWNER_IDS: Comma-separated list of owner user IDs");
275
+ console.log("");
276
+ console.log("A secure ENCRYPTION_KEY has been generated for you.");
277
+ console.log("=".repeat(60));
278
+ }
279
+
280
+ return result;
281
+ } catch (error) {
282
+ result.message = `Error setting up .env file: ${error.message}`;
283
+ if (!silent) {
284
+ console.error(result.message);
285
+ }
286
+ return result;
287
+ }
288
+ }
289
+
290
+ // Run main if executed directly
291
+ if (import.meta.url === `file://${process.argv[1]}`) {
292
+ main();
293
+ }