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,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
|
+
}
|