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.
Files changed (184) 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 +68 -0
  5. package/dist/config/index.d.ts.map +1 -0
  6. package/dist/config/index.js +315 -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 +348 -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/package.json +31 -5
  181. package/scripts/build.sh +20 -0
  182. package/scripts/postinstall.js +87 -0
  183. package/scripts/release.sh +22 -0
  184. package/scripts/setup-env.js +237 -0
@@ -0,0 +1,22 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ VERSION=$(node -p "require('./package.json').version")
5
+ echo "Creating release v${VERSION}..."
6
+
7
+ # Clean
8
+ rm -rf dist build
9
+
10
+ # Install dependencies
11
+ npm ci
12
+
13
+ # Build all targets
14
+ make release
15
+
16
+ # Create tarballs
17
+ cd build
18
+ tar -czvf telegram-ssh-bot-${VERSION}-linux-x64.tar.gz telegram-ssh-bot-linux
19
+ tar -czvf telegram-ssh-bot-${VERSION}-macos-x64.tar.gz telegram-ssh-bot-macos
20
+ zip telegram-ssh-bot-${VERSION}-win-x64.zip telegram-ssh-bot.exe
21
+
22
+ echo "Release packages created in build/"
@@ -0,0 +1,237 @@
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
+ * Main function to set up the environment
169
+ * @param {Object} options - Setup options
170
+ * @param {boolean} options.force - Force overwrite existing .env file
171
+ * @param {boolean} options.generateKey - Generate a new encryption key
172
+ * @param {boolean} options.silent - Suppress output messages
173
+ * @returns {Object} Result object with success status and messages
174
+ */
175
+ export function main(options = {}) {
176
+ const { force = false, generateKey = true, silent = false } = options;
177
+
178
+ const result = {
179
+ success: false,
180
+ created: false,
181
+ envPath: getEnvFilePath(),
182
+ configDir: getConfigDir(),
183
+ message: "",
184
+ };
185
+
186
+ try {
187
+ // Check if .env already exists
188
+ if (envFileExists() && !force) {
189
+ result.message = `.env file already exists at ${result.envPath}`;
190
+ result.success = true;
191
+ if (!silent) {
192
+ console.log(result.message);
193
+ }
194
+ return result;
195
+ }
196
+
197
+ // Ensure config directory exists
198
+ ensureConfigDir();
199
+
200
+ // Create the .env file
201
+ createEnvFile({ generateKey });
202
+ result.created = true;
203
+ result.success = true;
204
+ result.message = `Created .env file at ${result.envPath}`;
205
+
206
+ if (!silent) {
207
+ console.log("");
208
+ console.log("=".repeat(60));
209
+ console.log("Telegram SSH Bot - Configuration Setup");
210
+ console.log("=".repeat(60));
211
+ console.log(`Configuration file created at: ${result.envPath}`);
212
+ console.log("");
213
+ console.log(
214
+ "IMPORTANT: Please edit the .env file and fill in the required values:",
215
+ );
216
+ console.log(" - BOT_TOKEN: Your Telegram bot token");
217
+ console.log(" - BOT_CHAT_ID: Your Telegram chat ID");
218
+ console.log(" - BOT_OWNER_IDS: Comma-separated list of owner user IDs");
219
+ console.log("");
220
+ console.log("A secure ENCRYPTION_KEY has been generated for you.");
221
+ console.log("=".repeat(60));
222
+ }
223
+
224
+ return result;
225
+ } catch (error) {
226
+ result.message = `Error setting up .env file: ${error.message}`;
227
+ if (!silent) {
228
+ console.error(result.message);
229
+ }
230
+ return result;
231
+ }
232
+ }
233
+
234
+ // Run main if executed directly
235
+ if (import.meta.url === `file://${process.argv[1]}`) {
236
+ main();
237
+ }