@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.
Files changed (42) hide show
  1. package/README.md +98 -0
  2. package/bin/smart-panel-service.js +1074 -0
  3. package/bin/smart-panel.js +43 -0
  4. package/dist/index.d.ts +6 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +6 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/installers/base.d.ts +78 -0
  9. package/dist/installers/base.d.ts.map +1 -0
  10. package/dist/installers/base.js +5 -0
  11. package/dist/installers/base.js.map +1 -0
  12. package/dist/installers/index.d.ts +8 -0
  13. package/dist/installers/index.d.ts.map +1 -0
  14. package/dist/installers/index.js +16 -0
  15. package/dist/installers/index.js.map +1 -0
  16. package/dist/installers/linux.d.ts +32 -0
  17. package/dist/installers/linux.d.ts.map +1 -0
  18. package/dist/installers/linux.js +406 -0
  19. package/dist/installers/linux.js.map +1 -0
  20. package/dist/utils/index.d.ts +5 -0
  21. package/dist/utils/index.d.ts.map +1 -0
  22. package/dist/utils/index.js +5 -0
  23. package/dist/utils/index.js.map +1 -0
  24. package/dist/utils/logger.d.ts +17 -0
  25. package/dist/utils/logger.d.ts.map +1 -0
  26. package/dist/utils/logger.js +55 -0
  27. package/dist/utils/logger.js.map +1 -0
  28. package/dist/utils/paths.d.ts +26 -0
  29. package/dist/utils/paths.d.ts.map +1 -0
  30. package/dist/utils/paths.js +57 -0
  31. package/dist/utils/paths.js.map +1 -0
  32. package/dist/utils/system.d.ts +87 -0
  33. package/dist/utils/system.d.ts.map +1 -0
  34. package/dist/utils/system.js +211 -0
  35. package/dist/utils/system.js.map +1 -0
  36. package/dist/utils/version.d.ts +11 -0
  37. package/dist/utils/version.d.ts.map +1 -0
  38. package/dist/utils/version.js +75 -0
  39. package/dist/utils/version.js.map +1 -0
  40. package/package.json +72 -0
  41. package/templates/environment.template +28 -0
  42. 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,5 @@
1
+ export * from './paths.js';
2
+ export * from './logger.js';
3
+ export * from './system.js';
4
+ export * from './version.js';
5
+ //# sourceMappingURL=index.js.map
@@ -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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"}