@fastybird/smart-panel 0.1.0-alpha.5
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/README.md +98 -0
- package/bin/smart-panel-service.js +1074 -0
- package/bin/smart-panel.js +43 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/installers/base.d.ts +78 -0
- package/dist/installers/base.d.ts.map +1 -0
- package/dist/installers/base.js +5 -0
- package/dist/installers/base.js.map +1 -0
- package/dist/installers/index.d.ts +8 -0
- package/dist/installers/index.d.ts.map +1 -0
- package/dist/installers/index.js +16 -0
- package/dist/installers/index.js.map +1 -0
- package/dist/installers/linux.d.ts +32 -0
- package/dist/installers/linux.d.ts.map +1 -0
- package/dist/installers/linux.js +406 -0
- package/dist/installers/linux.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +55 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +26 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +57 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/system.d.ts +87 -0
- package/dist/utils/system.d.ts.map +1 -0
- package/dist/utils/system.js +211 -0
- package/dist/utils/system.js.map +1 -0
- package/dist/utils/version.d.ts +11 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +75 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +72 -0
- package/templates/environment.template +28 -0
- package/templates/systemd/smart-panel.service +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI logging utilities with colored output
|
|
3
|
+
*/
|
|
4
|
+
export declare const logger: {
|
|
5
|
+
info: (message: string) => void;
|
|
6
|
+
success: (message: string) => void;
|
|
7
|
+
warning: (message: string) => void;
|
|
8
|
+
error: (message: string) => void;
|
|
9
|
+
step: (message: string) => void;
|
|
10
|
+
debug: (message: string) => void;
|
|
11
|
+
blank: () => void;
|
|
12
|
+
header: (title: string) => void;
|
|
13
|
+
list: (items: string[]) => void;
|
|
14
|
+
keyValue: (key: string, value: string) => void;
|
|
15
|
+
box: (title: string, content: string[]) => void;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,MAAM;oBACF,MAAM,KAAG,IAAI;uBAIV,MAAM,KAAG,IAAI;uBAIb,MAAM,KAAG,IAAI;qBAIf,MAAM,KAAG,IAAI;oBAId,MAAM,KAAG,IAAI;qBAIZ,MAAM,KAAG,IAAI;iBAMnB,IAAI;oBAIC,MAAM,KAAG,IAAI;kBAMf,MAAM,EAAE,KAAG,IAAI;oBAMb,MAAM,SAAS,MAAM,KAAG,IAAI;iBAI/B,MAAM,WAAW,MAAM,EAAE,KAAG,IAAI;CAa7C,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI logging utilities with colored output
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
export const logger = {
|
|
6
|
+
info: (message) => {
|
|
7
|
+
console.log(chalk.blue('ℹ'), message);
|
|
8
|
+
},
|
|
9
|
+
success: (message) => {
|
|
10
|
+
console.log(chalk.green('✓'), message);
|
|
11
|
+
},
|
|
12
|
+
warning: (message) => {
|
|
13
|
+
console.log(chalk.yellow('⚠'), message);
|
|
14
|
+
},
|
|
15
|
+
error: (message) => {
|
|
16
|
+
console.error(chalk.red('✗'), message);
|
|
17
|
+
},
|
|
18
|
+
step: (message) => {
|
|
19
|
+
console.log(chalk.cyan('→'), message);
|
|
20
|
+
},
|
|
21
|
+
debug: (message) => {
|
|
22
|
+
if (process.env.DEBUG) {
|
|
23
|
+
console.log(chalk.gray('⋯'), chalk.gray(message));
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
blank: () => {
|
|
27
|
+
console.log();
|
|
28
|
+
},
|
|
29
|
+
header: (title) => {
|
|
30
|
+
console.log();
|
|
31
|
+
console.log(chalk.bold.white(title));
|
|
32
|
+
console.log(chalk.gray('─'.repeat(title.length)));
|
|
33
|
+
},
|
|
34
|
+
list: (items) => {
|
|
35
|
+
items.forEach((item) => {
|
|
36
|
+
console.log(chalk.gray(' •'), item);
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
keyValue: (key, value) => {
|
|
40
|
+
console.log(chalk.gray(' •'), chalk.white(key + ':'), value);
|
|
41
|
+
},
|
|
42
|
+
box: (title, content) => {
|
|
43
|
+
const maxLength = Math.max(title.length, ...content.map((line) => line.length));
|
|
44
|
+
const border = '─'.repeat(maxLength + 2);
|
|
45
|
+
console.log();
|
|
46
|
+
console.log(chalk.gray('┌' + border + '┐'));
|
|
47
|
+
console.log(chalk.gray('│'), chalk.bold.white(title.padEnd(maxLength)), chalk.gray('│'));
|
|
48
|
+
console.log(chalk.gray('├' + border + '┤'));
|
|
49
|
+
content.forEach((line) => {
|
|
50
|
+
console.log(chalk.gray('│'), line.padEnd(maxLength), chalk.gray('│'));
|
|
51
|
+
});
|
|
52
|
+
console.log(chalk.gray('└' + border + '┘'));
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default paths for Smart Panel installation on Linux
|
|
3
|
+
*/
|
|
4
|
+
export declare const PACKAGE_ROOT: string;
|
|
5
|
+
export declare const DEFAULT_PATHS: {
|
|
6
|
+
readonly dataDir: "/var/lib/smart-panel";
|
|
7
|
+
readonly dbDir: "/var/lib/smart-panel/data";
|
|
8
|
+
readonly configDir: "/etc/smart-panel";
|
|
9
|
+
readonly envFile: "/etc/smart-panel/environment";
|
|
10
|
+
readonly systemdService: "/etc/systemd/system/smart-panel.service";
|
|
11
|
+
readonly logDir: "/var/log/smart-panel";
|
|
12
|
+
readonly pidFile: "/run/smart-panel/smart-panel.pid";
|
|
13
|
+
readonly userDataDir: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const TEMPLATE_PATHS: {
|
|
16
|
+
readonly systemdService: string;
|
|
17
|
+
readonly environment: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function getBackendPath(baseDir: string): string;
|
|
20
|
+
export declare function getAdminPath(baseDir: string): string;
|
|
21
|
+
export declare function getBackendMainPath(baseDir: string): string;
|
|
22
|
+
export declare function getBackendCliPath(baseDir: string): string;
|
|
23
|
+
export declare function getAdminDistPath(baseDir: string): string;
|
|
24
|
+
export declare function getTypeOrmCliPath(baseDir: string): string;
|
|
25
|
+
export declare function getDataSourcePath(baseDir: string): string;
|
|
26
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,eAAO,MAAM,YAAY,QAA8B,CAAC;AAGxD,eAAO,MAAM,aAAa;;;;;;;;;CAwBhB,CAAC;AAGX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAGX,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default paths for Smart Panel installation on Linux
|
|
3
|
+
*/
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { dirname, join, resolve } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
// Package root directory
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
export const PACKAGE_ROOT = resolve(__dirname, '../..');
|
|
11
|
+
// Default installation paths
|
|
12
|
+
export const DEFAULT_PATHS = {
|
|
13
|
+
// Data directory (database, config, etc.)
|
|
14
|
+
dataDir: '/var/lib/smart-panel',
|
|
15
|
+
// Database directory
|
|
16
|
+
dbDir: '/var/lib/smart-panel/data',
|
|
17
|
+
// Configuration directory
|
|
18
|
+
configDir: '/etc/smart-panel',
|
|
19
|
+
// Environment file
|
|
20
|
+
envFile: '/etc/smart-panel/environment',
|
|
21
|
+
// Systemd service file
|
|
22
|
+
systemdService: '/etc/systemd/system/smart-panel.service',
|
|
23
|
+
// Log directory (when not using journald)
|
|
24
|
+
logDir: '/var/log/smart-panel',
|
|
25
|
+
// PID file
|
|
26
|
+
pidFile: '/run/smart-panel/smart-panel.pid',
|
|
27
|
+
// User home directory for user-level installation
|
|
28
|
+
userDataDir: join(homedir(), '.smart-panel'),
|
|
29
|
+
};
|
|
30
|
+
// Template paths within the package
|
|
31
|
+
export const TEMPLATE_PATHS = {
|
|
32
|
+
systemdService: join(PACKAGE_ROOT, 'templates', 'systemd', 'smart-panel.service'),
|
|
33
|
+
environment: join(PACKAGE_ROOT, 'templates', 'environment.template'),
|
|
34
|
+
};
|
|
35
|
+
// Paths to backend and admin within node_modules
|
|
36
|
+
export function getBackendPath(baseDir) {
|
|
37
|
+
return join(baseDir, 'node_modules', '@fastybird', 'smart-panel-backend');
|
|
38
|
+
}
|
|
39
|
+
export function getAdminPath(baseDir) {
|
|
40
|
+
return join(baseDir, 'node_modules', '@fastybird', 'smart-panel-admin');
|
|
41
|
+
}
|
|
42
|
+
export function getBackendMainPath(baseDir) {
|
|
43
|
+
return join(getBackendPath(baseDir), 'dist', 'main.js');
|
|
44
|
+
}
|
|
45
|
+
export function getBackendCliPath(baseDir) {
|
|
46
|
+
return join(getBackendPath(baseDir), 'dist', 'cli.js');
|
|
47
|
+
}
|
|
48
|
+
export function getAdminDistPath(baseDir) {
|
|
49
|
+
return join(getAdminPath(baseDir), 'dist');
|
|
50
|
+
}
|
|
51
|
+
export function getTypeOrmCliPath(baseDir) {
|
|
52
|
+
return join(baseDir, 'node_modules', 'typeorm', 'cli.js');
|
|
53
|
+
}
|
|
54
|
+
export function getDataSourcePath(baseDir) {
|
|
55
|
+
return join(getBackendPath(baseDir), 'dist', 'dataSource.js');
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,yBAAyB;AACzB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,0CAA0C;IAC1C,OAAO,EAAE,sBAAsB;IAE/B,qBAAqB;IACrB,KAAK,EAAE,2BAA2B;IAElC,0BAA0B;IAC1B,SAAS,EAAE,kBAAkB;IAE7B,mBAAmB;IACnB,OAAO,EAAE,8BAA8B;IAEvC,uBAAuB;IACvB,cAAc,EAAE,yCAAyC;IAEzD,0CAA0C;IAC1C,MAAM,EAAE,sBAAsB;IAE9B,WAAW;IACX,OAAO,EAAE,kCAAkC;IAE3C,kDAAkD;IAClD,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC;CACnC,CAAC;AAEX,oCAAoC;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,CAAC;IACjF,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,sBAAsB,CAAC;CAC3D,CAAC;AAEX,iDAAiD;AACjD,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,qBAAqB,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IACjD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System utilities for user management and permissions
|
|
3
|
+
*/
|
|
4
|
+
import { type SpawnOptions } from 'node:child_process';
|
|
5
|
+
/**
|
|
6
|
+
* Check if running as root
|
|
7
|
+
*/
|
|
8
|
+
export declare function isRoot(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a system user exists
|
|
11
|
+
*/
|
|
12
|
+
export declare function userExists(username: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Create a system user for the service
|
|
15
|
+
*/
|
|
16
|
+
export declare function createSystemUser(username: string, homeDir: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Delete a system user
|
|
19
|
+
*/
|
|
20
|
+
export declare function deleteSystemUser(username: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Create a directory with proper ownership
|
|
23
|
+
*/
|
|
24
|
+
export declare function createDirectory(path: string, owner?: string, mode?: number): void;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a file is readable
|
|
27
|
+
*/
|
|
28
|
+
export declare function isReadable(path: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a file is writable
|
|
31
|
+
*/
|
|
32
|
+
export declare function isWritable(path: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Write a file with proper permissions
|
|
35
|
+
*/
|
|
36
|
+
export declare function writeFile(path: string, content: string, mode?: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Read a file safely
|
|
39
|
+
*/
|
|
40
|
+
export declare function readFile(path: string): string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Set file ownership
|
|
43
|
+
*/
|
|
44
|
+
export declare function setOwnership(path: string, owner: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Check if a command exists
|
|
47
|
+
*/
|
|
48
|
+
export declare function commandExists(command: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Execute a command and return output
|
|
51
|
+
*/
|
|
52
|
+
export declare function exec(command: string, options?: {
|
|
53
|
+
cwd?: string;
|
|
54
|
+
silent?: boolean;
|
|
55
|
+
}): string;
|
|
56
|
+
/**
|
|
57
|
+
* Execute a command with live output
|
|
58
|
+
*/
|
|
59
|
+
export declare function execLive(command: string, args: string[], options?: SpawnOptions): Promise<number>;
|
|
60
|
+
/**
|
|
61
|
+
* Get the Node.js executable path
|
|
62
|
+
*/
|
|
63
|
+
export declare function getNodePath(): string;
|
|
64
|
+
/**
|
|
65
|
+
* Check if systemd is available
|
|
66
|
+
*/
|
|
67
|
+
export declare function hasSystemd(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get system architecture
|
|
70
|
+
*/
|
|
71
|
+
export declare function getArch(): string;
|
|
72
|
+
/**
|
|
73
|
+
* Get Linux distribution info
|
|
74
|
+
*/
|
|
75
|
+
export declare function getDistroInfo(): {
|
|
76
|
+
name: string;
|
|
77
|
+
version: string;
|
|
78
|
+
} | null;
|
|
79
|
+
/**
|
|
80
|
+
* Make a file executable
|
|
81
|
+
*/
|
|
82
|
+
export declare function makeExecutable(path: string): void;
|
|
83
|
+
/**
|
|
84
|
+
* Generate a cryptographically secure random string
|
|
85
|
+
*/
|
|
86
|
+
export declare function generateSecret(length?: number): string;
|
|
87
|
+
//# sourceMappingURL=system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/utils/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKtF;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAQ,GAAG,IAAI,CAQhF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,SAAQ,GAAG,IAAI,CAM3E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOtD;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAM1F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAejG;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAYhC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoBxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,SAAK,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System utilities for user management and permissions
|
|
3
|
+
*/
|
|
4
|
+
import { execSync, execFileSync, spawn } from 'node:child_process';
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import { accessSync, constants, existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';
|
|
7
|
+
import { dirname } from 'node:path';
|
|
8
|
+
/**
|
|
9
|
+
* Check if running as root
|
|
10
|
+
*/
|
|
11
|
+
export function isRoot() {
|
|
12
|
+
return process.getuid?.() === 0;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if a system user exists
|
|
16
|
+
*/
|
|
17
|
+
export function userExists(username) {
|
|
18
|
+
try {
|
|
19
|
+
execFileSync('id', [username], { stdio: 'ignore' });
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a system user for the service
|
|
28
|
+
*/
|
|
29
|
+
export function createSystemUser(username, homeDir) {
|
|
30
|
+
if (userExists(username)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Create system user with no login shell
|
|
34
|
+
execFileSync('useradd', ['--system', '--user-group', '--home-dir', homeDir, '--shell', '/usr/sbin/nologin', username], {
|
|
35
|
+
stdio: 'inherit',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Delete a system user
|
|
40
|
+
*/
|
|
41
|
+
export function deleteSystemUser(username) {
|
|
42
|
+
if (!userExists(username)) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
execFileSync('userdel', [username], { stdio: 'inherit' });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a directory with proper ownership
|
|
49
|
+
*/
|
|
50
|
+
export function createDirectory(path, owner, mode = 0o755) {
|
|
51
|
+
if (!existsSync(path)) {
|
|
52
|
+
mkdirSync(path, { recursive: true, mode });
|
|
53
|
+
}
|
|
54
|
+
if (owner) {
|
|
55
|
+
execFileSync('chown', ['-R', `${owner}:${owner}`, path], { stdio: 'ignore' });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a file is readable
|
|
60
|
+
*/
|
|
61
|
+
export function isReadable(path) {
|
|
62
|
+
try {
|
|
63
|
+
accessSync(path, constants.R_OK);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if a file is writable
|
|
72
|
+
*/
|
|
73
|
+
export function isWritable(path) {
|
|
74
|
+
try {
|
|
75
|
+
accessSync(path, constants.W_OK);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Write a file with proper permissions
|
|
84
|
+
*/
|
|
85
|
+
export function writeFile(path, content, mode = 0o644) {
|
|
86
|
+
const dir = dirname(path);
|
|
87
|
+
if (!existsSync(dir)) {
|
|
88
|
+
mkdirSync(dir, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
writeFileSync(path, content, { mode });
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Read a file safely
|
|
94
|
+
*/
|
|
95
|
+
export function readFile(path) {
|
|
96
|
+
try {
|
|
97
|
+
return readFileSync(path, 'utf-8');
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Set file ownership
|
|
105
|
+
*/
|
|
106
|
+
export function setOwnership(path, owner) {
|
|
107
|
+
execFileSync('chown', ['-R', `${owner}:${owner}`, path], { stdio: 'ignore' });
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if a command exists
|
|
111
|
+
*/
|
|
112
|
+
export function commandExists(command) {
|
|
113
|
+
try {
|
|
114
|
+
execFileSync('which', [command], { stdio: 'ignore' });
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Execute a command and return output
|
|
123
|
+
*/
|
|
124
|
+
export function exec(command, options) {
|
|
125
|
+
return execSync(command, {
|
|
126
|
+
cwd: options?.cwd,
|
|
127
|
+
stdio: options?.silent ? 'pipe' : 'inherit',
|
|
128
|
+
encoding: 'utf-8',
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Execute a command with live output
|
|
133
|
+
*/
|
|
134
|
+
export function execLive(command, args, options) {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
const child = spawn(command, args, {
|
|
137
|
+
stdio: 'inherit',
|
|
138
|
+
...options,
|
|
139
|
+
});
|
|
140
|
+
child.on('close', (code) => {
|
|
141
|
+
resolve(code ?? 0);
|
|
142
|
+
});
|
|
143
|
+
child.on('error', (err) => {
|
|
144
|
+
reject(err);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get the Node.js executable path
|
|
150
|
+
*/
|
|
151
|
+
export function getNodePath() {
|
|
152
|
+
return process.execPath;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if systemd is available
|
|
156
|
+
*/
|
|
157
|
+
export function hasSystemd() {
|
|
158
|
+
return existsSync('/run/systemd/system');
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get system architecture
|
|
162
|
+
*/
|
|
163
|
+
export function getArch() {
|
|
164
|
+
const arch = process.arch;
|
|
165
|
+
switch (arch) {
|
|
166
|
+
case 'arm':
|
|
167
|
+
return 'armv7';
|
|
168
|
+
case 'arm64':
|
|
169
|
+
return 'arm64';
|
|
170
|
+
case 'x64':
|
|
171
|
+
return 'x64';
|
|
172
|
+
default:
|
|
173
|
+
return arch;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get Linux distribution info
|
|
178
|
+
*/
|
|
179
|
+
export function getDistroInfo() {
|
|
180
|
+
try {
|
|
181
|
+
const osRelease = readFileSync('/etc/os-release', 'utf-8');
|
|
182
|
+
const lines = osRelease.split('\n');
|
|
183
|
+
const info = {};
|
|
184
|
+
for (const line of lines) {
|
|
185
|
+
const [key, ...valueParts] = line.split('=');
|
|
186
|
+
if (key && valueParts.length > 0) {
|
|
187
|
+
info[key] = valueParts.join('=').replace(/"/g, '');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
name: info['ID'] || 'unknown',
|
|
192
|
+
version: info['VERSION_ID'] || 'unknown',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Make a file executable
|
|
201
|
+
*/
|
|
202
|
+
export function makeExecutable(path) {
|
|
203
|
+
chmodSync(path, 0o755);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Generate a cryptographically secure random string
|
|
207
|
+
*/
|
|
208
|
+
export function generateSecret(length = 64) {
|
|
209
|
+
return randomBytes(length).toString('base64url').slice(0, length);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/utils/system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two semver version strings.
|
|
3
|
+
* Returns -1 if a < b, 0 if a === b, 1 if a > b.
|
|
4
|
+
*
|
|
5
|
+
* NOTE: The core comparison logic is shared with apps/backend/src/common/utils/semver.ts.
|
|
6
|
+
* The backend copy additionally exports getUpdateType and comparePrereleaseIdentifiers
|
|
7
|
+
* which are only needed there. If you change the comparison logic here, update the
|
|
8
|
+
* backend copy as well.
|
|
9
|
+
*/
|
|
10
|
+
export declare function compareSemver(a: string, b: string): number;
|
|
11
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA8B1D"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two semver version strings.
|
|
3
|
+
* Returns -1 if a < b, 0 if a === b, 1 if a > b.
|
|
4
|
+
*
|
|
5
|
+
* NOTE: The core comparison logic is shared with apps/backend/src/common/utils/semver.ts.
|
|
6
|
+
* The backend copy additionally exports getUpdateType and comparePrereleaseIdentifiers
|
|
7
|
+
* which are only needed there. If you change the comparison logic here, update the
|
|
8
|
+
* backend copy as well.
|
|
9
|
+
*/
|
|
10
|
+
export function compareSemver(a, b) {
|
|
11
|
+
const parseVersion = (v) => {
|
|
12
|
+
const cleaned = v.replace(/^v/, '');
|
|
13
|
+
const [base, ...prereleaseParts] = cleaned.split('-');
|
|
14
|
+
const parts = base.split('.').map(Number);
|
|
15
|
+
const prerelease = prereleaseParts.length > 0 ? prereleaseParts.join('-') : null;
|
|
16
|
+
return { parts, prerelease };
|
|
17
|
+
};
|
|
18
|
+
const aParsed = parseVersion(a);
|
|
19
|
+
const bParsed = parseVersion(b);
|
|
20
|
+
for (let i = 0; i < 3; i++) {
|
|
21
|
+
const av = aParsed.parts[i] || 0;
|
|
22
|
+
const bv = bParsed.parts[i] || 0;
|
|
23
|
+
if (av < bv)
|
|
24
|
+
return -1;
|
|
25
|
+
if (av > bv)
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
// Pre-release version has lower precedence than the release version
|
|
29
|
+
if (aParsed.prerelease && !bParsed.prerelease)
|
|
30
|
+
return -1;
|
|
31
|
+
if (!aParsed.prerelease && bParsed.prerelease)
|
|
32
|
+
return 1;
|
|
33
|
+
if (aParsed.prerelease && bParsed.prerelease) {
|
|
34
|
+
return comparePrereleaseIdentifiers(aParsed.prerelease, bParsed.prerelease);
|
|
35
|
+
}
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
function comparePrereleaseIdentifiers(current, latest) {
|
|
39
|
+
const currentParts = current.split('.');
|
|
40
|
+
const latestParts = latest.split('.');
|
|
41
|
+
const maxLength = Math.max(currentParts.length, latestParts.length);
|
|
42
|
+
for (let i = 0; i < maxLength; i++) {
|
|
43
|
+
// Fewer identifiers = lower precedence (per semver spec)
|
|
44
|
+
if (i >= currentParts.length)
|
|
45
|
+
return -1;
|
|
46
|
+
if (i >= latestParts.length)
|
|
47
|
+
return 1;
|
|
48
|
+
const cPart = currentParts[i];
|
|
49
|
+
const lPart = latestParts[i];
|
|
50
|
+
const cNum = Number(cPart);
|
|
51
|
+
const lNum = Number(lPart);
|
|
52
|
+
const cIsNum = !isNaN(cNum);
|
|
53
|
+
const lIsNum = !isNaN(lNum);
|
|
54
|
+
// Numeric identifiers have lower precedence than string identifiers
|
|
55
|
+
if (cIsNum && !lIsNum)
|
|
56
|
+
return -1;
|
|
57
|
+
if (!cIsNum && lIsNum)
|
|
58
|
+
return 1;
|
|
59
|
+
if (cIsNum && lIsNum) {
|
|
60
|
+
if (cNum < lNum)
|
|
61
|
+
return -1;
|
|
62
|
+
if (cNum > lNum)
|
|
63
|
+
return 1;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Both are strings - compare lexically
|
|
67
|
+
if (cPart < lPart)
|
|
68
|
+
return -1;
|
|
69
|
+
if (cPart > lPart)
|
|
70
|
+
return 1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
|