discos 1.1.6 → 2.0.1
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/.github/PRIVACY_POLICY.md +3 -1
- package/.github/TERMS_OF_SERVICE.md +1 -0
- package/README.md +2 -2
- package/dist/common.d.ts +57 -36
- package/dist/common.d.ts.map +1 -1
- package/dist/common.js +88 -39
- package/dist/common.js.map +1 -1
- package/dist/{config.d.ts → config/config.d.ts} +2 -1
- package/dist/config/config.d.ts.map +1 -0
- package/dist/{config.js → config/config.js} +1 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/validateDb.d.ts +3 -0
- package/dist/config/validateDb.d.ts.map +1 -0
- package/dist/{tools → config}/validateDb.js +16 -15
- package/dist/config/validateDb.js.map +1 -0
- package/dist/config/validateDotenv.d.ts +2 -0
- package/dist/config/validateDotenv.d.ts.map +1 -0
- package/dist/{tools → config}/validateDotenv.js +30 -20
- package/dist/config/validateDotenv.js.map +1 -0
- package/dist/{tools → exec}/backend.d.ts +4 -3
- package/dist/exec/backend.d.ts.map +1 -0
- package/dist/exec/backend.js +131 -0
- package/dist/exec/backend.js.map +1 -0
- package/dist/exec/terminal-manager.d.ts +9 -0
- package/dist/exec/terminal-manager.d.ts.map +1 -0
- package/dist/exec/terminal-manager.js +112 -0
- package/dist/exec/terminal-manager.js.map +1 -0
- package/dist/exec/username.d.ts +5 -0
- package/dist/exec/username.d.ts.map +1 -0
- package/dist/exec/username.js +31 -0
- package/dist/exec/username.js.map +1 -0
- package/dist/interfaces/queues.d.ts.map +1 -0
- package/dist/{types → interfaces}/queues.js.map +1 -1
- package/dist/logging/logger.d.ts +4 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +22 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/models/user.d.ts +14 -0
- package/dist/models/user.d.ts.map +1 -0
- package/dist/models/user.js +61 -0
- package/dist/models/user.js.map +1 -0
- package/dist/modules/admin.d.ts +1 -1
- package/dist/modules/admin.d.ts.map +1 -1
- package/dist/modules/admin.js +56 -31
- package/dist/modules/admin.js.map +1 -1
- package/dist/modules/clear.d.ts.map +1 -1
- package/dist/modules/clear.js +7 -8
- package/dist/modules/clear.js.map +1 -1
- package/dist/modules/command.d.ts +1 -1
- package/dist/modules/command.d.ts.map +1 -1
- package/dist/modules/command.js +5 -5
- package/dist/modules/command.js.map +1 -1
- package/dist/modules/debug.d.ts +1 -1
- package/dist/modules/debug.d.ts.map +1 -1
- package/dist/modules/debug.js +3 -2
- package/dist/modules/debug.js.map +1 -1
- package/dist/modules/file.d.ts +3 -2
- package/dist/modules/file.d.ts.map +1 -1
- package/dist/modules/file.js +36 -13
- package/dist/modules/file.js.map +1 -1
- package/dist/modules/watch.d.ts +1 -1
- package/dist/modules/watch.d.ts.map +1 -1
- package/dist/modules/watch.js +4 -3
- package/dist/modules/watch.js.map +1 -1
- package/dist/security/ipcServer.d.ts +4 -0
- package/dist/security/ipcServer.d.ts.map +1 -0
- package/dist/{tools → security}/ipcServer.js +6 -5
- package/dist/security/ipcServer.js.map +1 -0
- package/dist/{tools → security}/queue-utils.d.ts +2 -1
- package/dist/security/queue-utils.d.ts.map +1 -0
- package/dist/{tools → security}/queue-utils.js +4 -1
- package/dist/security/queue-utils.js.map +1 -0
- package/dist/shared/consts.d.ts +6 -0
- package/dist/shared/consts.d.ts.map +1 -1
- package/dist/shared/consts.js +7 -1
- package/dist/shared/consts.js.map +1 -1
- package/dist/shared/interfaces.d.ts +1 -0
- package/dist/shared/interfaces.d.ts.map +1 -1
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/slash-commands.d.ts +1 -1
- package/dist/slash-commands.d.ts.map +1 -1
- package/dist/slash-commands.js +17 -10
- package/dist/slash-commands.js.map +1 -1
- package/dist/startup.d.ts +1 -1
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +57 -37
- package/dist/startup.js.map +1 -1
- package/package.json +19 -16
- package/setup/install.sh +45 -132
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/tools/backend.d.ts.map +0 -1
- package/dist/tools/backend.js +0 -166
- package/dist/tools/backend.js.map +0 -1
- package/dist/tools/ipcServer.d.ts +0 -4
- package/dist/tools/ipcServer.d.ts.map +0 -1
- package/dist/tools/ipcServer.js.map +0 -1
- package/dist/tools/queue-utils.d.ts.map +0 -1
- package/dist/tools/queue-utils.js.map +0 -1
- package/dist/tools/validateDb.d.ts +0 -3
- package/dist/tools/validateDb.d.ts.map +0 -1
- package/dist/tools/validateDb.js.map +0 -1
- package/dist/tools/validateDotenv.d.ts +0 -2
- package/dist/tools/validateDotenv.d.ts.map +0 -1
- package/dist/tools/validateDotenv.js.map +0 -1
- package/dist/types/queues.d.ts.map +0 -1
- /package/dist/{types → interfaces}/queues.d.ts +0 -0
- /package/dist/{types → interfaces}/queues.js +0 -0
package/dist/startup.js
CHANGED
|
@@ -1,46 +1,53 @@
|
|
|
1
1
|
import { Client, GatewayIntentBits, Events } from 'discord.js';
|
|
2
|
-
import { validateDotenv } from './
|
|
3
|
-
import { validateDb } from './
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
2
|
+
import { validateDotenv } from './config/validateDotenv.js';
|
|
3
|
+
import { validateDb } from './config/validateDb.js';
|
|
4
|
+
import { Config } from './config/config.js';
|
|
5
|
+
import { startIPCServer } from './security/ipcServer.js';
|
|
6
|
+
import * as queueUtils from './security/queue-utils.js';
|
|
7
|
+
import { ping } from './exec/backend.js';
|
|
8
|
+
import { discordUsername } from './exec/username.js';
|
|
9
|
+
import { destroyTerminalForUser, initTerminalsFromConfig } from './exec/terminal-manager.js';
|
|
10
|
+
import logger from './logging/logger.js';
|
|
8
11
|
import * as COMMON from './common.js';
|
|
9
12
|
import { registerSlashCommands } from './slash-commands.js';
|
|
10
13
|
import { execCommand } from './modules/command.js';
|
|
11
14
|
import { clearHistory } from './modules/clear.js';
|
|
12
|
-
import { read, write, absPath, pathAutocomplete } from './modules/file.js';
|
|
15
|
+
import { read, write, absPath, pathAutocomplete, cwdPath } from './modules/file.js';
|
|
13
16
|
import { watch } from './modules/watch.js';
|
|
14
17
|
import { debug } from './modules/debug.js';
|
|
15
18
|
import { handleAdmin, localUserAutocomplete } from './modules/admin.js';
|
|
16
|
-
import { fileURLToPath } from 'url';
|
|
17
|
-
|
|
19
|
+
import { fileURLToPath } from 'node:url';
|
|
20
|
+
import dns from 'node:dns';
|
|
21
|
+
dns.setDefaultResultOrder('ipv4first');
|
|
22
|
+
dns.setServers(['1.1.1.1', '8.8.8.8', '1.0.0.1', '8.8.4.4']);
|
|
23
|
+
export async function startDiscOS() {
|
|
18
24
|
if (process.platform !== 'linux') {
|
|
19
|
-
|
|
25
|
+
logger.error(COMMON.PLATFORM_ERR);
|
|
20
26
|
process.exit(1);
|
|
21
27
|
}
|
|
22
|
-
if (!validateDotenv()) {
|
|
28
|
+
if (!(await validateDotenv())) {
|
|
23
29
|
process.exit(1);
|
|
24
30
|
}
|
|
25
31
|
const queues = {
|
|
26
32
|
validationQueue: [],
|
|
27
33
|
duplicateQueue: [],
|
|
28
34
|
};
|
|
29
|
-
if (!validateDb(queues))
|
|
35
|
+
if (!validateDb(queues))
|
|
30
36
|
process.exit(1);
|
|
31
|
-
|
|
37
|
+
if (Config.standalone)
|
|
38
|
+
await initTerminalsFromConfig(queues);
|
|
39
|
+
if (process.env.PTY_TEST_MODE)
|
|
40
|
+
logger.warn(COMMON.PTY_TEST_MODE_WARN);
|
|
32
41
|
Config.ipcServer = Config.standalone ? null : startIPCServer(queues);
|
|
33
42
|
const client = new Client({
|
|
34
43
|
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent],
|
|
35
44
|
});
|
|
36
|
-
if (!Config.standalone)
|
|
45
|
+
if (!Config.standalone)
|
|
37
46
|
void ping();
|
|
38
|
-
}
|
|
39
47
|
client.on(Events.InteractionCreate, async (interaction) => {
|
|
40
48
|
if (interaction.isAutocomplete()) {
|
|
41
49
|
const subcommand = interaction.options.getSubcommand();
|
|
42
|
-
if (
|
|
43
|
-
(subcommand === COMMON.READ || subcommand === COMMON.WRITE)) {
|
|
50
|
+
if (interaction.commandName === COMMON.DCOS && (subcommand === COMMON.READ || subcommand === COMMON.WRITE)) {
|
|
44
51
|
return pathAutocomplete(interaction, queues);
|
|
45
52
|
}
|
|
46
53
|
else if ((interaction.commandName === COMMON.DCOS || interaction.commandName === COMMON.ADMOS) && subcommand === COMMON.USER_MGMT) {
|
|
@@ -63,15 +70,9 @@ export function startDiscOS() {
|
|
|
63
70
|
await interaction.reply({ content: COMMON.USER_ERR, flags: 64 });
|
|
64
71
|
return;
|
|
65
72
|
}
|
|
66
|
-
if (queues.duplicateQueue.length >= Number(Config.cmdQueueMaxSize)) {
|
|
67
|
-
await interaction.reply({ content: COMMON.DISCOS_OVERLOADED, flags: 64 });
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
73
|
const subcommand = interaction.options.getSubcommand();
|
|
71
74
|
const userId = interaction.user.id;
|
|
72
|
-
const username = interaction
|
|
73
|
-
? (interaction.member.nickname ?? interaction.user.username)
|
|
74
|
-
: (interaction.user.displayName ?? interaction.user.username);
|
|
75
|
+
const username = discordUsername(interaction);
|
|
75
76
|
const isAdminUser = Config.adminUsers.includes(userId);
|
|
76
77
|
if (Config.lockdown && !isAdminUser) {
|
|
77
78
|
await interaction.reply({ content: COMMON.LOCKDOWN_ERR, flags: 64 });
|
|
@@ -79,15 +80,20 @@ export function startDiscOS() {
|
|
|
79
80
|
}
|
|
80
81
|
if (interaction.commandName === COMMON.ADMOS) {
|
|
81
82
|
if (!isAdminUser) {
|
|
82
|
-
await interaction.reply({
|
|
83
|
-
content: COMMON.DISCOS_NON_ADMIN,
|
|
84
|
-
flags: 64,
|
|
85
|
-
});
|
|
83
|
+
await interaction.reply({ content: COMMON.DISCOS_NON_ADMIN, flags: 64 });
|
|
86
84
|
return;
|
|
87
85
|
}
|
|
88
86
|
await handleAdmin(interaction, subcommand, username, queues, client);
|
|
89
87
|
return;
|
|
90
88
|
}
|
|
89
|
+
if (queueUtils.countUserCommandsInQueue(queues.duplicateQueue, interaction.user.id) >= Config.userRateLimit) {
|
|
90
|
+
await interaction.reply({ content: COMMON.USER_RATE_LIMIT, flags: 64 });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (queues.duplicateQueue.length >= Number(Config.cmdQueueMaxSize)) {
|
|
94
|
+
await interaction.reply({ content: COMMON.DISCOS_OVERLOADED, flags: 64 });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
91
97
|
let queuedCmd = '';
|
|
92
98
|
const hideReply = interaction.options.getBoolean(COMMON.HIDE, false) ?? COMMON.DEFAULT_HIDDEN;
|
|
93
99
|
let lookback = COMMON.DEFAULT_LOOKBACK;
|
|
@@ -98,7 +104,7 @@ export function startDiscOS() {
|
|
|
98
104
|
let sendSuccessMsg = COMMON.DEFAULT_DEBUG_VERBOSE;
|
|
99
105
|
switch (subcommand) {
|
|
100
106
|
case COMMON.EXEC: {
|
|
101
|
-
const linuxCmd = interaction.options.getString(COMMON.CMD,
|
|
107
|
+
const linuxCmd = interaction.options.getString(COMMON.CMD, false)?.trim() || '';
|
|
102
108
|
queuedCmd = linuxCmd;
|
|
103
109
|
break;
|
|
104
110
|
}
|
|
@@ -115,7 +121,7 @@ export function startDiscOS() {
|
|
|
115
121
|
}
|
|
116
122
|
case COMMON.WRITE: {
|
|
117
123
|
file = interaction.options.getAttachment(COMMON.FILE, true);
|
|
118
|
-
path = await absPath(interaction.options.getString(COMMON.PATH, false) ?? file.name, userId, queues);
|
|
124
|
+
path = await absPath(file.name, interaction.options.getString(COMMON.PATH, false) ?? (await cwdPath(file.name, userId, queues)), userId, queues);
|
|
119
125
|
queuedCmd = `dcos write to ${path}`;
|
|
120
126
|
break;
|
|
121
127
|
}
|
|
@@ -123,23 +129,26 @@ export function startDiscOS() {
|
|
|
123
129
|
path = interaction.options.getString(COMMON.TARGET, true);
|
|
124
130
|
interval = interaction.options.getInteger(COMMON.INTERVAL, false) ?? interval;
|
|
125
131
|
repeat = interaction.options.getInteger(COMMON.REPEAT, false) ?? repeat;
|
|
126
|
-
queuedCmd = `dcos watch ${
|
|
132
|
+
queuedCmd = `dcos watch ${userId}`;
|
|
127
133
|
break;
|
|
128
134
|
}
|
|
129
135
|
case COMMON.DEBUG: {
|
|
130
136
|
queuedCmd = 'dcos debug';
|
|
131
137
|
break;
|
|
132
138
|
}
|
|
139
|
+
case COMMON.RESET: {
|
|
140
|
+
queuedCmd = 'dcos reset';
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
133
143
|
case COMMON.HELP: {
|
|
134
144
|
queuedCmd = 'dcos help';
|
|
135
145
|
break;
|
|
136
146
|
}
|
|
137
147
|
}
|
|
138
|
-
|
|
148
|
+
const payload = { user: userId, username: discordUsername(interaction), cmd: queuedCmd };
|
|
149
|
+
if (await queueUtils.handleDuplicate(interaction, username, queues.duplicateQueue, payload))
|
|
139
150
|
return;
|
|
140
|
-
}
|
|
141
151
|
await interaction.deferReply({ flags: hideReply ? 64 : undefined });
|
|
142
|
-
const payload = { user: userId, cmd: queuedCmd };
|
|
143
152
|
queueUtils.addToAll(queues, payload);
|
|
144
153
|
try {
|
|
145
154
|
switch (subcommand) {
|
|
@@ -167,6 +176,11 @@ export function startDiscOS() {
|
|
|
167
176
|
await debug(interaction, username, userId, queues, client);
|
|
168
177
|
break;
|
|
169
178
|
}
|
|
179
|
+
case COMMON.RESET: {
|
|
180
|
+
destroyTerminalForUser(interaction.user.id);
|
|
181
|
+
await interaction.editReply({ content: COMMON.PTY_RESET_SUCCESS });
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
170
184
|
case COMMON.HELP: {
|
|
171
185
|
await interaction.editReply({ content: COMMON.HELP_USER });
|
|
172
186
|
break;
|
|
@@ -181,12 +195,18 @@ export function startDiscOS() {
|
|
|
181
195
|
}
|
|
182
196
|
});
|
|
183
197
|
void client.login(process.env.BOT_TOKEN).catch((err) => {
|
|
184
|
-
|
|
198
|
+
logger.error(COMMON.DISCOS_CONN_FAIL, err);
|
|
185
199
|
process.exit(1);
|
|
186
200
|
});
|
|
201
|
+
client.on(Events.Error, (err) => {
|
|
202
|
+
logger.error(COMMON.DISCOS_CLIENT_ERR, err);
|
|
203
|
+
});
|
|
187
204
|
}
|
|
188
205
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
189
|
-
registerSlashCommands();
|
|
190
|
-
startDiscOS()
|
|
206
|
+
await registerSlashCommands();
|
|
207
|
+
startDiscOS().catch(() => {
|
|
208
|
+
logger.error(COMMON.DISCOS_STARTUP_ERR);
|
|
209
|
+
process.exit(1);
|
|
210
|
+
});
|
|
191
211
|
}
|
|
192
212
|
//# sourceMappingURL=startup.js.map
|
package/dist/startup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "discos",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"build": "rm -f tsconfig.tsbuildinfo && npx tsc -b",
|
|
8
|
+
"build": "npm run lint && rm -f tsconfig.tsbuildinfo && npx tsc -b",
|
|
9
9
|
"setup": "node dist/slash-commands.js",
|
|
10
10
|
"start": "node dist/startup.js",
|
|
11
11
|
"docker:build": "docker build -t discos:latest .",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"pack": "rm -rf dist && rm -f tsconfig.tsbuildinfo && npm run build && npm pack",
|
|
20
20
|
"format": "prettier --write \"**/*.{ts,json,md}\" --log-level silent",
|
|
21
21
|
"lint": "eslint . --ext .ts --cache",
|
|
22
|
-
"
|
|
22
|
+
"safe": "git config core.hooksPath .husky",
|
|
23
23
|
"unsafe": "git config --unset core.hooksPath",
|
|
24
24
|
"test": "echo \"No tests specified.\" && exit 0"
|
|
25
25
|
},
|
|
@@ -54,26 +54,29 @@
|
|
|
54
54
|
"node": ">=20.0.0"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"axios": "^1.
|
|
58
|
-
"discord.js": "^14.
|
|
59
|
-
"dotenv": "^17.2.
|
|
60
|
-
"file-type": "^21.
|
|
61
|
-
"
|
|
57
|
+
"axios": "^1.13.2",
|
|
58
|
+
"discord.js": "^14.25.1",
|
|
59
|
+
"dotenv": "^17.2.3",
|
|
60
|
+
"file-type": "^21.1.1",
|
|
61
|
+
"node-pty": "^1.1.0-beta43",
|
|
62
|
+
"shell-escape": "^0.2.0",
|
|
63
|
+
"strip-ansi": "^7.1.2",
|
|
64
|
+
"winston": "^3.19.0"
|
|
62
65
|
},
|
|
63
66
|
"devDependencies": {
|
|
64
|
-
"@eslint/js": "^9.
|
|
65
|
-
"@types/node": "^
|
|
67
|
+
"@eslint/js": "^9.39.2",
|
|
68
|
+
"@types/node": "^25.0.3",
|
|
66
69
|
"@types/shell-escape": "^0.2.3",
|
|
67
|
-
"eslint": "^9.
|
|
70
|
+
"eslint": "^9.39.2",
|
|
68
71
|
"eslint-config-prettier": "^10.1.8",
|
|
69
72
|
"eslint-plugin-node": "^11.1.0",
|
|
70
|
-
"eslint-plugin-prettier": "^5.5.
|
|
73
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
71
74
|
"husky": "^9.1.7",
|
|
72
|
-
"jiti": "^2.
|
|
73
|
-
"prettier": "^3.
|
|
75
|
+
"jiti": "^2.6.1",
|
|
76
|
+
"prettier": "^3.7.4",
|
|
74
77
|
"ts-node": "^10.9.2",
|
|
75
|
-
"typescript": "^5.
|
|
76
|
-
"typescript-eslint": "^8.
|
|
78
|
+
"typescript": "^5.9.3",
|
|
79
|
+
"typescript-eslint": "^8.50.0"
|
|
77
80
|
},
|
|
78
81
|
"files": [
|
|
79
82
|
"dist",
|
package/setup/install.sh
CHANGED
|
@@ -69,9 +69,9 @@ echo -e "\nInstalling dependencies..."
|
|
|
69
69
|
# Install deps for this script
|
|
70
70
|
need sed
|
|
71
71
|
need awk
|
|
72
|
-
need grep
|
|
72
|
+
need grep # DiscOS deps as well
|
|
73
73
|
need git
|
|
74
|
-
need curl
|
|
74
|
+
need curl # DiscOS deps as well
|
|
75
75
|
need tee
|
|
76
76
|
need tail
|
|
77
77
|
|
|
@@ -81,7 +81,6 @@ need base64
|
|
|
81
81
|
need dos2unix
|
|
82
82
|
need realpath
|
|
83
83
|
need head
|
|
84
|
-
need grep # installed as script deps as well
|
|
85
84
|
|
|
86
85
|
echo -e "All dependencies installed."
|
|
87
86
|
|
|
@@ -90,7 +89,7 @@ echo -e "All dependencies installed."
|
|
|
90
89
|
echo -e "\nCloning DiscOS repository into a temporary directory..."
|
|
91
90
|
|
|
92
91
|
TEMP_DIR=$(mktemp -d)
|
|
93
|
-
chmod
|
|
92
|
+
chmod 770 "$TEMP_DIR" # only root should access the temp dir
|
|
94
93
|
|
|
95
94
|
if ! git clone --branch main --single-branch --depth 1 https://github.com/BrNi05/DiscOS.git "$TEMP_DIR" &>/dev/null; then
|
|
96
95
|
echo "Failed to clone DiscOS repository."
|
|
@@ -104,7 +103,7 @@ cd "$TEMP_DIR" || (echo "Failed to enter temp directory." && exit 1)
|
|
|
104
103
|
setup_dotenv() {
|
|
105
104
|
local OPERATOR="$1"
|
|
106
105
|
|
|
107
|
-
echo -e "\nSetting up .env file..."
|
|
106
|
+
echo -e "\n\nSetting up .env file..."
|
|
108
107
|
|
|
109
108
|
read -rp "If not already, set up your bot. Refer to the docs: https://github.com/BrNi05/DiscOS/wiki/03.-Creating-your-bot. Press any key to continue..."
|
|
110
109
|
|
|
@@ -133,9 +132,9 @@ setup_dotenv() {
|
|
|
133
132
|
|
|
134
133
|
if [ "$OPERATOR" = "write" ]; then
|
|
135
134
|
# Copy .env from CWD to discos home
|
|
136
|
-
cp "$DOTENV" "$
|
|
137
|
-
chown
|
|
138
|
-
chmod 660 "$
|
|
135
|
+
cp "$DOTENV" "$DISCOS_DIR/.env"
|
|
136
|
+
chown root:root "$DISCOS_DIR/.env"
|
|
137
|
+
chmod 660 "$DISCOS_DIR/.env"
|
|
139
138
|
elif [ "$OPERATOR" = "disp" ]; then
|
|
140
139
|
echo -e "\nGenerated .env content:\n"
|
|
141
140
|
cat "$DOTENV"
|
|
@@ -158,7 +157,7 @@ setup_dotenv() {
|
|
|
158
157
|
setup_db() {
|
|
159
158
|
local OPERATOR="$1"
|
|
160
159
|
|
|
161
|
-
echo -e "\nCreating the initial database..."
|
|
160
|
+
echo -e "\n\nCreating the initial database..."
|
|
162
161
|
|
|
163
162
|
echo -e "You will be added as a DiscOS admin.\n"
|
|
164
163
|
|
|
@@ -166,6 +165,10 @@ setup_db() {
|
|
|
166
165
|
read -rp "Enter the local username that you want to use as the given Discord user: " LOCAL_USERNAME
|
|
167
166
|
read -rp "Enter a single channel ID which DiscOS has already joined: " CHANNEL_ID
|
|
168
167
|
|
|
168
|
+
# Disable standalone mode by default for Docker releases
|
|
169
|
+
echo -e "\nIf you plan to run DiscOS in a Docker container in EB mode, modify the DB, so that the container is started in standalone mode!"
|
|
170
|
+
echo "Otherwise, if the prevoiusly set local user does not exist, DiscOS will fail to start."
|
|
171
|
+
|
|
169
172
|
DB="$TEMP_DIR/setup/db.json"
|
|
170
173
|
|
|
171
174
|
sed -i "s/DC_UID/$DISCORD_UID/g" "$DB"
|
|
@@ -174,9 +177,9 @@ setup_db() {
|
|
|
174
177
|
|
|
175
178
|
if [ "$OPERATOR" = "write" ]; then
|
|
176
179
|
# Copy db.json from CWD to discos home
|
|
177
|
-
cp "$DB" "$
|
|
178
|
-
chown
|
|
179
|
-
chmod 660 "$
|
|
180
|
+
cp "$DB" "$DISCOS_DIR/db.json"
|
|
181
|
+
chown root:root "$DISCOS_DIR/db.json"
|
|
182
|
+
chmod 660 "$DISCOS_DIR/db.json"
|
|
180
183
|
elif [ "$OPERATOR" = "disp" ]; then
|
|
181
184
|
echo -e "\nManually create the db.json file where needed."
|
|
182
185
|
echo -e "Generated db.json content:\n"
|
|
@@ -207,55 +210,11 @@ setup_db() {
|
|
|
207
210
|
}
|
|
208
211
|
|
|
209
212
|
|
|
210
|
-
############### Node.js LTS updater ###############
|
|
211
|
-
setup_node_updater() {
|
|
212
|
-
echo -e "\nAn updater script will be installed and a Systemd service will be created to keep Node.js up to date."
|
|
213
|
-
echo "NOTE: old Node.js versions will NOTE be removed automatically."
|
|
214
|
-
|
|
215
|
-
SCRIPT_PATH='/usr/local/bin/update-node.sh'
|
|
216
|
-
printf '%s\n' '#!/bin/bash' \
|
|
217
|
-
'export NVM_DIR="$HOME/.nvm"' \
|
|
218
|
-
'[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"' \
|
|
219
|
-
'' \
|
|
220
|
-
'nvm install --lts' > "$SCRIPT_PATH"
|
|
221
|
-
|
|
222
|
-
chown discos:discos "$SCRIPT_PATH"
|
|
223
|
-
chmod 770 "$SCRIPT_PATH"
|
|
224
|
-
|
|
225
|
-
printf '%s\n' \
|
|
226
|
-
'[Unit]' \
|
|
227
|
-
'Description=Update Node.js LTS for discos user' \
|
|
228
|
-
'' \
|
|
229
|
-
'[Service]' \
|
|
230
|
-
'Type=oneshot' \
|
|
231
|
-
'User=discos' \
|
|
232
|
-
"ExecStart=$SCRIPT_PATH" \
|
|
233
|
-
> /etc/systemd/system/discos-node-updater.service
|
|
234
|
-
|
|
235
|
-
printf '%s\n' \
|
|
236
|
-
'[Unit]' \
|
|
237
|
-
'Description=Run Node.js LTS update daily' \
|
|
238
|
-
'' \
|
|
239
|
-
'[Timer]' \
|
|
240
|
-
'OnCalendar=daily' \
|
|
241
|
-
'Persistent=true' \
|
|
242
|
-
'' \
|
|
243
|
-
'[Install]' \
|
|
244
|
-
'WantedBy=timers.target' \
|
|
245
|
-
> /etc/systemd/system/discos-node-updater.timer
|
|
246
|
-
|
|
247
|
-
systemctl daemon-reload
|
|
248
|
-
systemctl enable --now discos-node-updater.timer
|
|
249
|
-
|
|
250
|
-
echo -e "Node.js updater script and service installed."
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
|
|
254
213
|
############### Compose setup ###############
|
|
255
214
|
setup_compose() {
|
|
256
215
|
echo -e "\nSetting up compose file...\n"
|
|
257
216
|
|
|
258
|
-
echo "The latest DiscOS image will be used.
|
|
217
|
+
echo "The latest DiscOS image will be used. In case of an update, be sure to manually pull the new image."
|
|
259
218
|
|
|
260
219
|
read -rp "Container name (default DiscOS): " CONTAINER_NAME
|
|
261
220
|
sed -i "s/SERVICE_NAME/${CONTAINER_NAME:-DiscOS}/g" "$COMPOSE_FILE"
|
|
@@ -271,71 +230,35 @@ setup_compose() {
|
|
|
271
230
|
}
|
|
272
231
|
|
|
273
232
|
|
|
274
|
-
############### cmdex setup ###############
|
|
275
|
-
|
|
276
|
-
setup_cmdex() {
|
|
277
|
-
echo -e "\nSetting up command executor..."
|
|
278
|
-
|
|
279
|
-
echo -e "\nYou can specify one user that is allowed to use command executor. This is the user as which your external backend (if used) or parent process (if npm install) will run."
|
|
280
|
-
read -rp "Enter the local username (default: root): " CMD_USER
|
|
281
|
-
CMD_USER=${CMD_USER:-root}
|
|
282
|
-
echo
|
|
283
|
-
|
|
284
|
-
cp "$TEMP_DIR/src/.sh/cmd-executor.sh" "/usr/local/bin/cmdex.sh"
|
|
285
|
-
chown discos:"$CMD_USER" "/usr/local/bin/cmdex.sh" || chown discos:discos "/usr/local/bin/cmdex.sh" || chown root:root "/usr/local/bin/cmdex.sh"
|
|
286
|
-
chmod 770 "/usr/local/bin/cmdex.sh"
|
|
287
|
-
ln -s "/usr/local/bin/cmdex.sh" "/usr/local/bin/cmdex" >/dev/null 2>&1 || echo "Symlink for cmdex already exists."
|
|
288
|
-
|
|
289
|
-
# Sudoers change
|
|
290
|
-
echo "discos ALL=(ALL) NOPASSWD: /usr/local/bin/cmdex.sh, /usr/local/bin/cmdex" | tee /etc/sudoers.d/cmdex >/dev/null
|
|
291
|
-
chmod 440 /etc/sudoers.d/cmdex
|
|
292
|
-
|
|
293
|
-
if [[ "$CMD_USER" != "root" && $(id -u "$CMD_USER" >/dev/null 2>&1; echo $?) -eq 0 ]]; then
|
|
294
|
-
echo "$CMD_USER ALL=(ALL) NOPASSWD: /usr/local/bin/cmdex.sh, /usr/local/bin/cmdex" | tee /etc/sudoers.d/cmdex-user-"$CMD_USER" >/dev/null
|
|
295
|
-
chmod 440 /etc/sudoers.d/cmdex-user-"$CMD_USER"
|
|
296
|
-
fi
|
|
297
|
-
|
|
298
|
-
echo -e "Command executor setup completed."
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
|
|
302
233
|
############### Systemd release ###############
|
|
303
234
|
install_systemd() {
|
|
304
235
|
echo -e "\nStarting Systemd release installation..."
|
|
305
236
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
fi
|
|
310
|
-
|
|
311
|
-
DISCOS_HOME=$(getent passwd discos | cut -d: -f6)
|
|
312
|
-
|
|
313
|
-
DISCOS_DIR="$DISCOS_HOME/DiscOS"
|
|
237
|
+
DISCOS_DIR="/opt/DiscOS"
|
|
238
|
+
echo "DiscOS will be installed to: $DISCOS_DIR"
|
|
239
|
+
mkdir -p "$DISCOS_DIR"
|
|
314
240
|
|
|
315
241
|
if [[ "$1" != "update" ]]; then
|
|
316
242
|
echo -e "\nSetting up Node.js..."
|
|
317
243
|
read -rp "Do you have a global / user-scoped Node.js install (y/n)? " NODE_ANSWER
|
|
318
244
|
if [[ "$NODE_ANSWER" = "y" || "$NODE_ANSWER" = "Y" ]]; then
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
' >/dev/null 2>&1; then
|
|
245
|
+
export NVM_DIR="$HOME/.nvm"
|
|
246
|
+
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
|
|
247
|
+
|
|
248
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
324
249
|
echo "ERROR: Node.js not found."
|
|
325
250
|
exit 1
|
|
326
251
|
fi
|
|
327
252
|
else
|
|
328
253
|
echo -e "\nInstalling Node.js via nvm..."
|
|
329
|
-
|
|
254
|
+
|
|
330
255
|
export NVM_DIR="$HOME/.nvm"
|
|
331
256
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
|
332
257
|
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
|
|
333
258
|
nvm install --lts
|
|
334
259
|
nvm use --lts
|
|
335
|
-
'
|
|
336
260
|
|
|
337
|
-
echo -e "Node.js installed."
|
|
338
|
-
setup_node_updater
|
|
261
|
+
echo -e "Node.js installed. Version: $(node -v). Make sure to update it regularly for security and performance improvements!"
|
|
339
262
|
fi
|
|
340
263
|
|
|
341
264
|
# .env setup
|
|
@@ -344,48 +267,44 @@ install_systemd() {
|
|
|
344
267
|
# DB setup
|
|
345
268
|
setup_db "write"
|
|
346
269
|
|
|
347
|
-
#
|
|
348
|
-
|
|
270
|
+
# Set up ownership and permissions
|
|
271
|
+
chown -R root:root "$DISCOS_DIR"
|
|
272
|
+
chmod -R 770 "$DISCOS_DIR"
|
|
273
|
+
|
|
274
|
+
read -rp "Press any key to continue with DiscOS installation..."
|
|
349
275
|
else
|
|
350
276
|
# Stop the service for before the update process
|
|
351
|
-
systemctl stop discos.service || echo "DiscOS service could not be stopped."
|
|
277
|
+
(systemctl stop discos.service && echo "DiscOS service stopped.") || echo "DiscOS service could not be stopped."
|
|
352
278
|
fi
|
|
353
279
|
|
|
354
280
|
# Compile DiscOS
|
|
355
281
|
echo -e "\nCompiling DiscOS..."
|
|
356
|
-
DISCOS_DIR="$DISCOS_HOME"
|
|
357
|
-
|
|
358
|
-
sudo -u discos bash -euo pipefail -c "
|
|
359
|
-
TEMP_DIR=\"$TEMP_DIR\"
|
|
360
|
-
DISCOS_DIR=\"$DISCOS_DIR\"
|
|
361
282
|
|
|
362
283
|
# Source nvm
|
|
363
|
-
export NVM_DIR
|
|
364
|
-
[ -s
|
|
284
|
+
export NVM_DIR="$HOME/.nvm"
|
|
285
|
+
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
|
365
286
|
|
|
366
287
|
# Build in the temp dir
|
|
367
|
-
cd
|
|
368
|
-
echo
|
|
288
|
+
cd "$TEMP_DIR" || { echo 'Failed to enter temp download directory.'; exit 1; }
|
|
289
|
+
echo "CWD: $TEMP_DIR"
|
|
369
290
|
echo 'Installing dependencies...'
|
|
370
|
-
npm ci --
|
|
291
|
+
npm ci --omit=optional --silent
|
|
371
292
|
npm run build
|
|
372
293
|
|
|
373
294
|
# Copy dist and install only prod deps
|
|
374
|
-
mkdir -p
|
|
375
|
-
rm -rf
|
|
376
|
-
cp -r
|
|
377
|
-
cp
|
|
378
|
-
cp
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
cd \"\$DISCOS_DIR\" || { echo 'Failed to enter DiscOS directory.'; exit 1; }
|
|
295
|
+
mkdir -p "$DISCOS_DIR"
|
|
296
|
+
rm -rf "$DISCOS_DIR/dist"
|
|
297
|
+
cp -r "$TEMP_DIR/dist" "$DISCOS_DIR"
|
|
298
|
+
cp "$TEMP_DIR/package.json" "$DISCOS_DIR"
|
|
299
|
+
cp "$TEMP_DIR/package-lock.json" "$DISCOS_DIR"
|
|
300
|
+
|
|
301
|
+
cd "$DISCOS_DIR" || { echo 'Failed to enter DiscOS directory.'; exit 1; }
|
|
382
302
|
npm ci --silent --omit=dev --omit=optional
|
|
383
303
|
|
|
384
304
|
# Remove package.json and package-lock.json
|
|
385
305
|
rm -f package*.json
|
|
386
|
-
"
|
|
387
306
|
|
|
388
|
-
echo -e "
|
|
307
|
+
echo -e "DiscOS compiled successfully."
|
|
389
308
|
|
|
390
309
|
if [[ "$1" != "update" ]]; then
|
|
391
310
|
# Systemd service and timer setup
|
|
@@ -433,7 +352,7 @@ install_npm() {
|
|
|
433
352
|
if [[ "$IN_DOCKER" = "y" || "$IN_DOCKER" = "Y" ]]; then
|
|
434
353
|
COMPOSE_FILE="$TEMP_DIR/setup/docker-compose.yaml"
|
|
435
354
|
setup_compose
|
|
436
|
-
echo -e "Compose file will be displayed below. Now rewrite it according to your needs but make sure mounts and env var settings are kept.\n"
|
|
355
|
+
echo -e "Compose file will be displayed below. Now, rewrite it according to your needs but make sure mounts and env var settings are kept.\n"
|
|
437
356
|
cat "$COMPOSE_FILE"
|
|
438
357
|
echo
|
|
439
358
|
else
|
|
@@ -450,9 +369,6 @@ install_npm() {
|
|
|
450
369
|
read -rp "Press any key to continue with database generation. It will only be displayed, copy it where needed."
|
|
451
370
|
setup_db "disp"
|
|
452
371
|
|
|
453
|
-
# Command executor setup
|
|
454
|
-
setup_cmdex
|
|
455
|
-
|
|
456
372
|
echo -e "\nnpm release installation process completed."
|
|
457
373
|
}
|
|
458
374
|
|
|
@@ -496,9 +412,6 @@ install_docker() {
|
|
|
496
412
|
read -rp "Press any key to continue with database generation. It will be located in the compose file dir."
|
|
497
413
|
setup_db "$COMPOSE_PATH"
|
|
498
414
|
|
|
499
|
-
# Command executor setup
|
|
500
|
-
setup_cmdex
|
|
501
|
-
|
|
502
415
|
echo -e "\nDocker release installation process completed."
|
|
503
416
|
}
|
|
504
417
|
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAElC,eAAO,MAAM,MAAM,EAAE;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CAgBnB,CAAC"}
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAef;IACF,eAAe,EAAE,CAAC;IAClB,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,CAAC;IACd,eAAe,EAAE,EAAE;IACnB,SAAS,EAAE,EAAE;IACb,kBAAkB,EAAE,IAAI;IACxB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,EAAE;IACd,eAAe,EAAE,EAAE;IACnB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,KAAK;IACjB,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;CAChB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/tools/backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGpF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAS7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAoHzD,wBAAsB,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAe3G;AAED,wBAAsB,GAAG,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAgBlF;AAGD,wBAAsB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CA4B5C;AAGD,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtG"}
|