typescript-virtual-container 1.2.8 → 1.3.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/.vscode/settings.json +0 -1
- package/README.md +462 -44
- package/biome.json +7 -0
- package/dist/SSHMimic/exec.d.ts.map +1 -1
- package/dist/SSHMimic/executor.d.ts.map +1 -1
- package/dist/SSHMimic/executor.js +35 -21
- package/dist/SSHMimic/index.d.ts.map +1 -1
- package/dist/SSHMimic/index.js +20 -6
- package/dist/VirtualFileSystem/binaryPack.d.ts.map +1 -1
- package/dist/VirtualFileSystem/binaryPack.js +29 -6
- package/dist/VirtualFileSystem/index.d.ts.map +1 -1
- package/dist/VirtualFileSystem/index.js +36 -13
- package/dist/VirtualPackageManager/index.d.ts +202 -0
- package/dist/VirtualPackageManager/index.d.ts.map +1 -0
- package/dist/VirtualPackageManager/index.js +825 -0
- package/dist/VirtualShell/index.d.ts +93 -12
- package/dist/VirtualShell/index.d.ts.map +1 -1
- package/dist/VirtualShell/index.js +95 -13
- package/dist/VirtualShell/shell.d.ts.map +1 -1
- package/dist/VirtualShell/shell.js +3 -1
- package/dist/VirtualShell/shellParser.d.ts.map +1 -1
- package/dist/VirtualUserManager/index.d.ts +52 -20
- package/dist/VirtualUserManager/index.d.ts.map +1 -1
- package/dist/VirtualUserManager/index.js +54 -20
- package/dist/commands/adduser.d.ts +6 -0
- package/dist/commands/adduser.d.ts.map +1 -1
- package/dist/commands/adduser.js +6 -0
- package/dist/commands/alias.d.ts +9 -0
- package/dist/commands/alias.d.ts.map +1 -0
- package/dist/commands/alias.js +63 -0
- package/dist/commands/apt.d.ts +9 -0
- package/dist/commands/apt.d.ts.map +1 -0
- package/dist/commands/apt.js +205 -0
- package/dist/commands/awk.d.ts +11 -0
- package/dist/commands/awk.d.ts.map +1 -1
- package/dist/commands/awk.js +15 -2
- package/dist/commands/base64.d.ts +5 -0
- package/dist/commands/base64.d.ts.map +1 -1
- package/dist/commands/base64.js +9 -1
- package/dist/commands/cat.d.ts +5 -0
- package/dist/commands/cat.d.ts.map +1 -1
- package/dist/commands/cat.js +35 -8
- package/dist/commands/cd.d.ts +5 -0
- package/dist/commands/cd.d.ts.map +1 -1
- package/dist/commands/cd.js +5 -0
- package/dist/commands/chmod.d.ts +5 -0
- package/dist/commands/chmod.d.ts.map +1 -1
- package/dist/commands/chmod.js +57 -3
- package/dist/commands/command-helpers.d.ts +78 -4
- package/dist/commands/command-helpers.d.ts.map +1 -1
- package/dist/commands/command-helpers.js +78 -4
- package/dist/commands/cp.d.ts +5 -0
- package/dist/commands/cp.d.ts.map +1 -1
- package/dist/commands/cp.js +5 -0
- package/dist/commands/curl.d.ts +5 -0
- package/dist/commands/curl.d.ts.map +1 -1
- package/dist/commands/curl.js +106 -26
- package/dist/commands/cut.d.ts +5 -0
- package/dist/commands/cut.d.ts.map +1 -1
- package/dist/commands/cut.js +8 -1
- package/dist/commands/date.d.ts +5 -0
- package/dist/commands/date.d.ts.map +1 -1
- package/dist/commands/date.js +7 -1
- package/dist/commands/declare.d.ts +3 -0
- package/dist/commands/declare.d.ts.map +1 -0
- package/dist/commands/declare.js +39 -0
- package/dist/commands/diff.d.ts +5 -0
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +5 -0
- package/dist/commands/dpkg.d.ts +9 -0
- package/dist/commands/dpkg.d.ts.map +1 -0
- package/dist/commands/dpkg.js +161 -0
- package/dist/commands/du.d.ts.map +1 -1
- package/dist/commands/du.js +8 -2
- package/dist/commands/echo.d.ts +5 -0
- package/dist/commands/echo.d.ts.map +1 -1
- package/dist/commands/echo.js +33 -12
- package/dist/commands/env.d.ts +5 -0
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +11 -1
- package/dist/commands/exit.d.ts +5 -0
- package/dist/commands/exit.d.ts.map +1 -1
- package/dist/commands/exit.js +12 -2
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +3 -1
- package/dist/commands/find.d.ts +5 -0
- package/dist/commands/find.d.ts.map +1 -1
- package/dist/commands/find.js +5 -0
- package/dist/commands/free.d.ts +8 -0
- package/dist/commands/free.d.ts.map +1 -0
- package/dist/commands/free.js +43 -0
- package/dist/commands/grep.d.ts +5 -0
- package/dist/commands/grep.d.ts.map +1 -1
- package/dist/commands/grep.js +12 -2
- package/dist/commands/gzip.d.ts +5 -0
- package/dist/commands/gzip.d.ts.map +1 -1
- package/dist/commands/gzip.js +18 -2
- package/dist/commands/head.d.ts +5 -0
- package/dist/commands/head.d.ts.map +1 -1
- package/dist/commands/head.js +5 -0
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +98 -45
- package/dist/commands/helpers.d.ts +3 -0
- package/dist/commands/helpers.d.ts.map +1 -1
- package/dist/commands/helpers.js +3 -0
- package/dist/commands/history.d.ts +8 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +26 -0
- package/dist/commands/hostname.d.ts +5 -0
- package/dist/commands/hostname.d.ts.map +1 -1
- package/dist/commands/hostname.js +5 -0
- package/dist/commands/id.d.ts.map +1 -1
- package/dist/commands/id.js +4 -1
- package/dist/commands/index.d.ts +2 -10
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -231
- package/dist/commands/ls.d.ts.map +1 -1
- package/dist/commands/ls.js +6 -3
- package/dist/commands/lsb-release.d.ts +3 -0
- package/dist/commands/lsb-release.d.ts.map +1 -0
- package/dist/commands/lsb-release.js +56 -0
- package/dist/commands/man.d.ts +3 -0
- package/dist/commands/man.d.ts.map +1 -0
- package/dist/commands/man.js +155 -0
- package/dist/commands/nano.js +1 -1
- package/dist/commands/neofetch.d.ts.map +1 -1
- package/dist/commands/neofetch.js +6 -1
- package/dist/commands/node.d.ts +9 -0
- package/dist/commands/node.d.ts.map +1 -0
- package/dist/commands/node.js +316 -0
- package/dist/commands/npm.d.ts +19 -0
- package/dist/commands/npm.d.ts.map +1 -0
- package/dist/commands/npm.js +109 -0
- package/dist/commands/ping.d.ts.map +1 -1
- package/dist/commands/ping.js +7 -2
- package/dist/commands/printf.d.ts +3 -0
- package/dist/commands/printf.d.ts.map +1 -0
- package/dist/commands/printf.js +113 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +30 -6
- package/dist/commands/python.d.ts +30 -0
- package/dist/commands/python.d.ts.map +1 -0
- package/dist/commands/python.js +2058 -0
- package/dist/commands/read.d.ts +3 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +34 -0
- package/dist/commands/registry.d.ts +8 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +229 -0
- package/dist/commands/runtime.d.ts +6 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +280 -0
- package/dist/commands/sed.d.ts.map +1 -1
- package/dist/commands/sed.js +11 -3
- package/dist/commands/set.d.ts.map +1 -1
- package/dist/commands/set.js +9 -3
- package/dist/commands/sh.d.ts.map +1 -1
- package/dist/commands/sh.js +69 -30
- package/dist/commands/shift.d.ts +5 -0
- package/dist/commands/shift.d.ts.map +1 -0
- package/dist/commands/shift.js +52 -0
- package/dist/commands/sleep.d.ts.map +1 -1
- package/dist/commands/sort.d.ts.map +1 -1
- package/dist/commands/sort.js +4 -2
- package/dist/commands/source.d.ts +3 -0
- package/dist/commands/source.d.ts.map +1 -0
- package/dist/commands/source.js +34 -0
- package/dist/commands/sudo.js +1 -1
- package/dist/commands/tar.d.ts.map +1 -1
- package/dist/commands/tar.js +11 -3
- package/dist/commands/tee.d.ts.map +1 -1
- package/dist/commands/tee.js +8 -6
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +114 -0
- package/dist/commands/tr.d.ts.map +1 -1
- package/dist/commands/tr.js +3 -1
- package/dist/commands/true.d.ts +4 -0
- package/dist/commands/true.d.ts.map +1 -0
- package/dist/commands/true.js +14 -0
- package/dist/commands/type.d.ts +3 -0
- package/dist/commands/type.d.ts.map +1 -0
- package/dist/commands/type.js +34 -0
- package/dist/commands/uname.d.ts.map +1 -1
- package/dist/commands/uname.js +4 -1
- package/dist/commands/uniq.d.ts.map +1 -1
- package/dist/commands/uptime.d.ts +3 -0
- package/dist/commands/uptime.d.ts.map +1 -0
- package/dist/commands/uptime.js +43 -0
- package/dist/commands/wget.d.ts.map +1 -1
- package/dist/commands/wget.js +92 -96
- package/dist/commands/which.d.ts +3 -0
- package/dist/commands/which.d.ts.map +1 -0
- package/dist/commands/which.js +32 -0
- package/dist/commands/xargs.d.ts.map +1 -1
- package/dist/commands/xargs.js +1 -1
- package/dist/index.d.ts +15 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -8
- package/dist/modules/linuxRootfs.d.ts +41 -0
- package/dist/modules/linuxRootfs.d.ts.map +1 -0
- package/dist/modules/linuxRootfs.js +440 -0
- package/dist/modules/neofetch.d.ts.map +1 -1
- package/dist/modules/neofetch.js +1 -0
- package/dist/standalone-wo-sftp.d.ts +2 -0
- package/dist/standalone-wo-sftp.d.ts.map +1 -0
- package/dist/standalone-wo-sftp.js +30 -0
- package/dist/utils/expand.d.ts +50 -0
- package/dist/utils/expand.d.ts.map +1 -0
- package/dist/utils/expand.js +183 -0
- package/dist/utils/vfsDiff.d.ts +90 -0
- package/dist/utils/vfsDiff.d.ts.map +1 -0
- package/dist/utils/vfsDiff.js +177 -0
- package/package.json +3 -1
- package/src/SSHMimic/exec.ts +10 -1
- package/src/SSHMimic/executor.ts +105 -21
- package/src/SSHMimic/index.ts +49 -15
- package/src/VirtualFileSystem/binaryPack.ts +35 -8
- package/src/VirtualFileSystem/index.ts +78 -28
- package/src/VirtualPackageManager/index.ts +979 -0
- package/src/VirtualShell/index.ts +133 -14
- package/src/VirtualShell/shell.ts +23 -3
- package/src/VirtualShell/shellParser.ts +134 -36
- package/src/VirtualUserManager/index.ts +62 -22
- package/src/commands/adduser.ts +6 -0
- package/src/commands/alias.ts +64 -0
- package/src/commands/apt.ts +228 -0
- package/src/commands/awk.ts +20 -6
- package/src/commands/base64.ts +13 -2
- package/src/commands/cat.ts +40 -8
- package/src/commands/cd.ts +5 -0
- package/src/commands/chmod.ts +53 -3
- package/src/commands/command-helpers.ts +78 -4
- package/src/commands/cp.ts +5 -0
- package/src/commands/curl.ts +118 -33
- package/src/commands/cut.ts +8 -1
- package/src/commands/date.ts +7 -1
- package/src/commands/declare.ts +44 -0
- package/src/commands/diff.ts +17 -3
- package/src/commands/dpkg.ts +180 -0
- package/src/commands/du.ts +17 -5
- package/src/commands/echo.ts +41 -12
- package/src/commands/env.ts +11 -1
- package/src/commands/exit.ts +12 -2
- package/src/commands/export.ts +3 -1
- package/src/commands/find.ts +5 -0
- package/src/commands/free.ts +47 -0
- package/src/commands/grep.ts +12 -2
- package/src/commands/gzip.ts +28 -4
- package/src/commands/head.ts +5 -0
- package/src/commands/help.ts +121 -47
- package/src/commands/helpers.ts +8 -0
- package/src/commands/history.ts +34 -0
- package/src/commands/hostname.ts +5 -0
- package/src/commands/id.ts +4 -1
- package/src/commands/index.ts +9 -255
- package/src/commands/ls.ts +6 -3
- package/src/commands/lsb-release.ts +58 -0
- package/src/commands/man.ts +166 -0
- package/src/commands/nano.ts +1 -1
- package/src/commands/neofetch.ts +6 -1
- package/src/commands/node.ts +341 -0
- package/src/commands/npm.ts +132 -0
- package/src/commands/ping.ts +10 -3
- package/src/commands/printf.ts +112 -0
- package/src/commands/ps.ts +40 -6
- package/src/commands/python.ts +2229 -0
- package/src/commands/read.ts +41 -0
- package/src/commands/registry.ts +244 -0
- package/src/commands/runtime.ts +353 -0
- package/src/commands/sed.ts +27 -9
- package/src/commands/set.ts +9 -3
- package/src/commands/sh.ts +170 -44
- package/src/commands/shift.ts +53 -0
- package/src/commands/sleep.ts +2 -1
- package/src/commands/sort.ts +10 -6
- package/src/commands/source.ts +47 -0
- package/src/commands/sudo.ts +1 -1
- package/src/commands/tar.ts +28 -7
- package/src/commands/tee.ts +7 -1
- package/src/commands/test.ts +135 -0
- package/src/commands/tr.ts +3 -1
- package/src/commands/true.ts +17 -0
- package/src/commands/type.ts +43 -0
- package/src/commands/uname.ts +5 -1
- package/src/commands/uniq.ts +8 -2
- package/src/commands/uptime.ts +49 -0
- package/src/commands/wget.ts +105 -119
- package/src/commands/which.ts +37 -0
- package/src/commands/xargs.ts +11 -2
- package/src/index.ts +27 -18
- package/src/modules/linuxRootfs.ts +642 -0
- package/src/modules/neofetch.ts +1 -0
- package/src/standalone-wo-sftp.ts +38 -0
- package/src/utils/expand.ts +238 -0
- package/src/utils/vfsDiff.ts +275 -0
- package/standalone-wo-sftp.js +507 -0
- package/standalone-wo-sftp.js.map +7 -0
- package/standalone.js +486 -109
- package/standalone.js.map +4 -4
- package/tests/bun-test-shim.ts +9 -1
- package/tests/command-helpers.test.ts +1 -5
- package/tests/new-features.test.ts +1036 -0
- package/tests/parser-executor.test.ts +27 -27
- package/tests/sftp.test.ts +122 -42
- package/tests/users.test.ts +23 -5
- package/CHANGELOG.md +0 -150
package/biome.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AASpD,wBAAgB,OAAO,CACtB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GACjB,IAAI,
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AASpD,wBAAgB,OAAO,CACtB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GACjB,IAAI,CAgCN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EACX,QAAQ,EAER,MAAM,EACN,SAAS,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,QAAQ,GACX,OAAO,CAAC,aAAa,CAAC,CA8BxB;AAED,8CAA8C;AAC9C,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,QAAQ,GACX,OAAO,CAAC,aAAa,CAAC,CAoCxB;AAID,wBAAsB,eAAe,CACpC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC,aAAa,CAAC,CA4BxB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { runCommandDirect } from "../commands";
|
|
2
2
|
import { resolvePath } from "../commands/helpers";
|
|
3
3
|
// ── Script executor (handles &&/||/;) ────────────────────────────────────────
|
|
4
4
|
export async function executeScript(script, authUser, hostname, mode, cwd, shell, env) {
|
|
@@ -10,7 +10,9 @@ export async function executeScript(script, authUser, hostname, mode, cwd, shell
|
|
|
10
10
|
lastResult = await executePipeline(stmt.pipeline, authUser, hostname, mode, cwd, shell, env);
|
|
11
11
|
env.lastExitCode = lastResult.exitCode ?? 0;
|
|
12
12
|
// Propagate session-control signals
|
|
13
|
-
if (lastResult.closeSession ||
|
|
13
|
+
if (lastResult.closeSession ||
|
|
14
|
+
lastResult.switchUser ||
|
|
15
|
+
lastResult.nextCwd) {
|
|
14
16
|
break;
|
|
15
17
|
}
|
|
16
18
|
}
|
|
@@ -68,22 +70,26 @@ async function executeSingleCommandWithRedirections(cmd, authUser, hostname, mod
|
|
|
68
70
|
stdin = shell.vfs.readFile(inputPath);
|
|
69
71
|
}
|
|
70
72
|
catch {
|
|
71
|
-
return {
|
|
73
|
+
return {
|
|
74
|
+
stderr: `${cmd.inputFile}: No such file or directory`,
|
|
75
|
+
exitCode: 1,
|
|
76
|
+
};
|
|
72
77
|
}
|
|
73
78
|
}
|
|
74
|
-
const
|
|
75
|
-
const result = await runSingleCommand(rawInput, authUser, hostname, mode, cwd, shell, stdin, env);
|
|
79
|
+
const result = await runCommandDirect(cmd.name, cmd.args, authUser, hostname, mode, cwd, shell, stdin, env);
|
|
76
80
|
if (cmd.outputFile) {
|
|
77
81
|
const outputPath = resolvePath(cwd, cmd.outputFile);
|
|
78
82
|
const output = result.stdout || "";
|
|
79
83
|
try {
|
|
80
84
|
if (cmd.appendOutput) {
|
|
81
|
-
const existing = (() => {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
const existing = (() => {
|
|
86
|
+
try {
|
|
87
|
+
return shell.vfs.readFile(outputPath);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
})();
|
|
87
93
|
shell.writeFileAsUser(authUser, outputPath, existing + output);
|
|
88
94
|
}
|
|
89
95
|
else {
|
|
@@ -92,7 +98,11 @@ async function executeSingleCommandWithRedirections(cmd, authUser, hostname, mod
|
|
|
92
98
|
return { ...result, stdout: "" };
|
|
93
99
|
}
|
|
94
100
|
catch {
|
|
95
|
-
return {
|
|
101
|
+
return {
|
|
102
|
+
...result,
|
|
103
|
+
stderr: `Failed to write to ${cmd.outputFile}`,
|
|
104
|
+
exitCode: 1,
|
|
105
|
+
};
|
|
96
106
|
}
|
|
97
107
|
}
|
|
98
108
|
return result;
|
|
@@ -108,23 +118,27 @@ async function executePipelineChain(commands, authUser, hostname, mode, cwd, she
|
|
|
108
118
|
currentOutput = shell.vfs.readFile(inputPath);
|
|
109
119
|
}
|
|
110
120
|
catch {
|
|
111
|
-
return {
|
|
121
|
+
return {
|
|
122
|
+
stderr: `${cmd.inputFile}: No such file or directory`,
|
|
123
|
+
exitCode: 1,
|
|
124
|
+
};
|
|
112
125
|
}
|
|
113
126
|
}
|
|
114
|
-
const
|
|
115
|
-
const result = await runSingleCommand(rawInput, authUser, hostname, mode, cwd, shell, currentOutput, env);
|
|
127
|
+
const result = await runCommandDirect(cmd.name, cmd.args, authUser, hostname, mode, cwd, shell, currentOutput, env);
|
|
116
128
|
exitCode = result.exitCode ?? 0;
|
|
117
129
|
if (i === commands.length - 1 && cmd.outputFile) {
|
|
118
130
|
const outputPath = resolvePath(cwd, cmd.outputFile);
|
|
119
131
|
const output = result.stdout || "";
|
|
120
132
|
try {
|
|
121
133
|
if (cmd.appendOutput) {
|
|
122
|
-
const existing = (() => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
134
|
+
const existing = (() => {
|
|
135
|
+
try {
|
|
136
|
+
return shell.vfs.readFile(outputPath);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return "";
|
|
140
|
+
}
|
|
141
|
+
})();
|
|
128
142
|
shell.writeFileAsUser(authUser, outputPath, existing + output);
|
|
129
143
|
}
|
|
130
144
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA0B/C,cAAM,QAAS,SAAQ,YAAY;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,KAAK,CAAe;IAE5B,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAElE;;;;;;;;OAQG;gBACS,EACX,IAAI,EACJ,QAA0B,EAC1B,KAAkC,EAClC,eAAmB,EACnB,iBAA0B,GAC1B,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B;IAYD,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;IAcrB;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA0B/C,cAAM,QAAS,SAAQ,YAAY;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,KAAK,CAAe;IAE5B,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAElE;;;;;;;;OAQG;gBACS,EACX,IAAI,EACJ,QAA0B,EAC1B,KAAkC,EAClC,eAAmB,EACnB,iBAA0B,GAC1B,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B;IAYD,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;IAcrB;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IA6LrC;;OAEG;IACI,IAAI,IAAI,IAAI;IAUnB;;;OAGG;IACI,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGrC;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/SSHMimic/index.js
CHANGED
|
@@ -103,7 +103,11 @@ class SshMimic extends EventEmitter {
|
|
|
103
103
|
remoteAddress = ctx.ip ?? remoteAddress;
|
|
104
104
|
// Rate-limit check
|
|
105
105
|
if (this.isLockedOut(remoteAddress)) {
|
|
106
|
-
this.emit("auth:failure", {
|
|
106
|
+
this.emit("auth:failure", {
|
|
107
|
+
username: candidateUser,
|
|
108
|
+
remoteAddress,
|
|
109
|
+
reason: "lockout",
|
|
110
|
+
});
|
|
107
111
|
ctx.reject();
|
|
108
112
|
return;
|
|
109
113
|
}
|
|
@@ -123,7 +127,10 @@ class SshMimic extends EventEmitter {
|
|
|
123
127
|
ctx.password === "" ||
|
|
124
128
|
!shell.users.verifyPassword(candidateUser, ctx.password)) {
|
|
125
129
|
this.recordFailure(remoteAddress);
|
|
126
|
-
this.emit("auth:failure", {
|
|
130
|
+
this.emit("auth:failure", {
|
|
131
|
+
username: candidateUser,
|
|
132
|
+
remoteAddress,
|
|
133
|
+
});
|
|
127
134
|
ctx.reject();
|
|
128
135
|
return;
|
|
129
136
|
}
|
|
@@ -144,11 +151,14 @@ class SshMimic extends EventEmitter {
|
|
|
144
151
|
return;
|
|
145
152
|
}
|
|
146
153
|
const incomingKey = ctx.key;
|
|
147
|
-
const keyMatches = authorizedKeys.some((k) => k.algo === incomingKey.algo &&
|
|
148
|
-
k.data.equals(incomingKey.data));
|
|
154
|
+
const keyMatches = authorizedKeys.some((k) => k.algo === incomingKey.algo && k.data.equals(incomingKey.data));
|
|
149
155
|
if (!keyMatches) {
|
|
150
156
|
this.recordFailure(remoteAddress);
|
|
151
|
-
this.emit("auth:failure", {
|
|
157
|
+
this.emit("auth:failure", {
|
|
158
|
+
username: candidateUser,
|
|
159
|
+
remoteAddress,
|
|
160
|
+
method: "publickey",
|
|
161
|
+
});
|
|
152
162
|
ctx.reject();
|
|
153
163
|
return;
|
|
154
164
|
}
|
|
@@ -157,7 +167,11 @@ class SshMimic extends EventEmitter {
|
|
|
157
167
|
authUser = candidateUser;
|
|
158
168
|
sessionId = shell.users.registerSession(authUser, remoteAddress).id;
|
|
159
169
|
this.recordSuccess(remoteAddress);
|
|
160
|
-
this.emit("auth:success", {
|
|
170
|
+
this.emit("auth:success", {
|
|
171
|
+
username: authUser,
|
|
172
|
+
remoteAddress,
|
|
173
|
+
method: "publickey",
|
|
174
|
+
});
|
|
161
175
|
this.ensureHomeDir(authUser);
|
|
162
176
|
ctx.accept();
|
|
163
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binaryPack.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/binaryPack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"binaryPack.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/binaryPack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EACX,qBAAqB,EAGrB,MAAM,iBAAiB,CAAC;AA+EzB;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAM7D;AA0FD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAiB5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -37,7 +37,9 @@ const TYPE_DIR = 0x02;
|
|
|
37
37
|
// ── Encoder ───────────────────────────────────────────────────────────────────
|
|
38
38
|
class Encoder {
|
|
39
39
|
chunks = [];
|
|
40
|
-
write(buf) {
|
|
40
|
+
write(buf) {
|
|
41
|
+
this.chunks.push(buf);
|
|
42
|
+
}
|
|
41
43
|
writeUint8(n) {
|
|
42
44
|
const b = Buffer.allocUnsafe(1);
|
|
43
45
|
b.writeUInt8(n, 0);
|
|
@@ -67,7 +69,9 @@ class Encoder {
|
|
|
67
69
|
this.writeUint32(bytes.length);
|
|
68
70
|
this.chunks.push(bytes);
|
|
69
71
|
}
|
|
70
|
-
toBuffer() {
|
|
72
|
+
toBuffer() {
|
|
73
|
+
return Buffer.concat(this.chunks);
|
|
74
|
+
}
|
|
71
75
|
}
|
|
72
76
|
function encodeNode(enc, node) {
|
|
73
77
|
if (node.type === "file") {
|
|
@@ -111,7 +115,9 @@ class Decoder {
|
|
|
111
115
|
constructor(buf) {
|
|
112
116
|
this.buf = buf;
|
|
113
117
|
}
|
|
114
|
-
readUint8() {
|
|
118
|
+
readUint8() {
|
|
119
|
+
return this.buf.readUInt8(this.pos++);
|
|
120
|
+
}
|
|
115
121
|
readUint16() {
|
|
116
122
|
const v = this.buf.readUInt16LE(this.pos);
|
|
117
123
|
this.pos += 2;
|
|
@@ -139,7 +145,9 @@ class Decoder {
|
|
|
139
145
|
this.pos += len;
|
|
140
146
|
return b;
|
|
141
147
|
}
|
|
142
|
-
remaining() {
|
|
148
|
+
remaining() {
|
|
149
|
+
return this.buf.length - this.pos;
|
|
150
|
+
}
|
|
143
151
|
}
|
|
144
152
|
function decodeNode(dec) {
|
|
145
153
|
const type = dec.readUint8();
|
|
@@ -150,7 +158,15 @@ function decodeNode(dec) {
|
|
|
150
158
|
if (type === TYPE_FILE) {
|
|
151
159
|
const compressed = dec.readUint8() === 0x01;
|
|
152
160
|
const content = dec.readBytes();
|
|
153
|
-
return {
|
|
161
|
+
return {
|
|
162
|
+
type: "file",
|
|
163
|
+
name,
|
|
164
|
+
mode,
|
|
165
|
+
createdAt,
|
|
166
|
+
updatedAt,
|
|
167
|
+
compressed,
|
|
168
|
+
content,
|
|
169
|
+
};
|
|
154
170
|
}
|
|
155
171
|
if (type === TYPE_DIR) {
|
|
156
172
|
const count = dec.readUint32();
|
|
@@ -159,7 +175,14 @@ function decodeNode(dec) {
|
|
|
159
175
|
const child = decodeNode(dec);
|
|
160
176
|
children.set(child.name, child);
|
|
161
177
|
}
|
|
162
|
-
return {
|
|
178
|
+
return {
|
|
179
|
+
type: "directory",
|
|
180
|
+
name,
|
|
181
|
+
mode,
|
|
182
|
+
createdAt,
|
|
183
|
+
updatedAt,
|
|
184
|
+
children,
|
|
185
|
+
};
|
|
163
186
|
}
|
|
164
187
|
throw new Error(`[VFS binary] Unknown node type: 0x${type.toString(16)}`);
|
|
165
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW3C,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EAIX,gBAAgB,EAChB,MAAM,cAAc,CAAC;AAItB;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEjD,MAAM,WAAW,UAAU;IAC1B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,cAAM,iBAAkB,SAAQ,YAAY;IAC3C,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAEjC,OAAO,GAAE,UAAe;IAqBpC,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,cAAc;IAwBtB;;;;;;OAMG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -244,15 +244,24 @@ class VirtualFileSystem extends EventEmitter {
|
|
|
244
244
|
if (node.type === "file") {
|
|
245
245
|
const f = node;
|
|
246
246
|
return {
|
|
247
|
-
type: "file",
|
|
248
|
-
|
|
249
|
-
|
|
247
|
+
type: "file",
|
|
248
|
+
name,
|
|
249
|
+
path: normalized,
|
|
250
|
+
mode: f.mode,
|
|
251
|
+
createdAt: f.createdAt,
|
|
252
|
+
updatedAt: f.updatedAt,
|
|
253
|
+
compressed: f.compressed,
|
|
254
|
+
size: f.content.length,
|
|
250
255
|
};
|
|
251
256
|
}
|
|
252
257
|
const d = node;
|
|
253
258
|
return {
|
|
254
|
-
type: "directory",
|
|
255
|
-
|
|
259
|
+
type: "directory",
|
|
260
|
+
name,
|
|
261
|
+
path: normalized,
|
|
262
|
+
mode: d.mode,
|
|
263
|
+
createdAt: d.createdAt,
|
|
264
|
+
updatedAt: d.updatedAt,
|
|
256
265
|
childrenCount: d.children.size,
|
|
257
266
|
};
|
|
258
267
|
}
|
|
@@ -287,7 +296,8 @@ class VirtualFileSystem extends EventEmitter {
|
|
|
287
296
|
lines.push(`${connector}${name}`);
|
|
288
297
|
if (child.type === "directory") {
|
|
289
298
|
const sub = this.renderTreeLines(child, "")
|
|
290
|
-
.split("\n")
|
|
299
|
+
.split("\n")
|
|
300
|
+
.slice(1)
|
|
291
301
|
.map((l) => `${nextPrefix}${l}`);
|
|
292
302
|
lines.push(...sub);
|
|
293
303
|
}
|
|
@@ -342,14 +352,19 @@ class VirtualFileSystem extends EventEmitter {
|
|
|
342
352
|
: targetPath;
|
|
343
353
|
const { parent, name } = getParentDirectory(this.root, normalizedLink, true, (p) => this.mkdirRecursive(p, 0o755));
|
|
344
354
|
const symNode = {
|
|
345
|
-
type: "file",
|
|
355
|
+
type: "file",
|
|
356
|
+
name,
|
|
346
357
|
content: Buffer.from(normalizedTarget, "utf8"),
|
|
347
358
|
mode: 0o120777,
|
|
348
359
|
compressed: false,
|
|
349
|
-
createdAt: new Date(),
|
|
360
|
+
createdAt: new Date(),
|
|
361
|
+
updatedAt: new Date(),
|
|
350
362
|
};
|
|
351
363
|
parent.children.set(name, symNode);
|
|
352
|
-
this.emit("symlink:create", {
|
|
364
|
+
this.emit("symlink:create", {
|
|
365
|
+
link: normalizedLink,
|
|
366
|
+
target: normalizedTarget,
|
|
367
|
+
});
|
|
353
368
|
}
|
|
354
369
|
/** Returns true when the path is a symbolic link node. */
|
|
355
370
|
isSymlink(targetPath) {
|
|
@@ -437,7 +452,9 @@ class VirtualFileSystem extends EventEmitter {
|
|
|
437
452
|
: this.serializeDir(child));
|
|
438
453
|
}
|
|
439
454
|
return {
|
|
440
|
-
type: "directory",
|
|
455
|
+
type: "directory",
|
|
456
|
+
name: dir.name,
|
|
457
|
+
mode: dir.mode,
|
|
441
458
|
createdAt: dir.createdAt.toISOString(),
|
|
442
459
|
updatedAt: dir.updatedAt.toISOString(),
|
|
443
460
|
children,
|
|
@@ -445,7 +462,9 @@ class VirtualFileSystem extends EventEmitter {
|
|
|
445
462
|
}
|
|
446
463
|
serializeFile(file) {
|
|
447
464
|
return {
|
|
448
|
-
type: "file",
|
|
465
|
+
type: "file",
|
|
466
|
+
name: file.name,
|
|
467
|
+
mode: file.mode,
|
|
449
468
|
createdAt: file.createdAt.toISOString(),
|
|
450
469
|
updatedAt: file.updatedAt.toISOString(),
|
|
451
470
|
compressed: file.compressed,
|
|
@@ -480,7 +499,9 @@ class VirtualFileSystem extends EventEmitter {
|
|
|
480
499
|
}
|
|
481
500
|
deserializeDir(snap, name) {
|
|
482
501
|
const dir = {
|
|
483
|
-
type: "directory",
|
|
502
|
+
type: "directory",
|
|
503
|
+
name,
|
|
504
|
+
mode: snap.mode,
|
|
484
505
|
createdAt: new Date(snap.createdAt),
|
|
485
506
|
updatedAt: new Date(snap.updatedAt),
|
|
486
507
|
children: new Map(),
|
|
@@ -489,7 +510,9 @@ class VirtualFileSystem extends EventEmitter {
|
|
|
489
510
|
if (child.type === "file") {
|
|
490
511
|
const f = child;
|
|
491
512
|
dir.children.set(f.name, {
|
|
492
|
-
type: "file",
|
|
513
|
+
type: "file",
|
|
514
|
+
name: f.name,
|
|
515
|
+
mode: f.mode,
|
|
493
516
|
createdAt: new Date(f.createdAt),
|
|
494
517
|
updatedAt: new Date(f.updatedAt),
|
|
495
518
|
compressed: f.compressed,
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import type VirtualFileSystem from "../VirtualFileSystem";
|
|
2
|
+
import type { VirtualUserManager } from "../VirtualUserManager";
|
|
3
|
+
/**
|
|
4
|
+
* A single file entry written into the VFS when a package is installed.
|
|
5
|
+
*/
|
|
6
|
+
export interface PackageFile {
|
|
7
|
+
/** Absolute VFS destination path (e.g. `"/usr/bin/vim"`). */
|
|
8
|
+
path: string;
|
|
9
|
+
/** Text content to write. */
|
|
10
|
+
content: string;
|
|
11
|
+
/** POSIX mode bits (default `0o644`; use `0o755` for executables). */
|
|
12
|
+
mode?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Metadata and behaviour definition for a single package in the registry.
|
|
16
|
+
*
|
|
17
|
+
* Used both for the built-in registry entries and for consumer-supplied custom
|
|
18
|
+
* packages. `files` are written to the VFS on `install()`, and `onInstall` /
|
|
19
|
+
* `onRemove` hooks allow arbitrary VFS mutations.
|
|
20
|
+
*/
|
|
21
|
+
export interface PackageDefinition {
|
|
22
|
+
/** Package name — lowercase, no spaces (e.g. `"vim"`, `"build-essential"`). */
|
|
23
|
+
name: string;
|
|
24
|
+
/** Debian-style version string (e.g. `"2:9.0.1378-2"`). */
|
|
25
|
+
version: string;
|
|
26
|
+
/** CPU architecture label (default `"amd64"`). */
|
|
27
|
+
architecture?: string;
|
|
28
|
+
/** Maintainer name and email shown in `apt show` output. */
|
|
29
|
+
maintainer?: string;
|
|
30
|
+
/** Full package description. */
|
|
31
|
+
description: string;
|
|
32
|
+
/** Short one-line summary shown in `apt search` results. */
|
|
33
|
+
shortDesc?: string;
|
|
34
|
+
/** Installed disk usage in kilobytes (informational). */
|
|
35
|
+
installedSizeKb?: number;
|
|
36
|
+
/** Other package names that must be installed first (resolved recursively). */
|
|
37
|
+
depends?: string[];
|
|
38
|
+
/** Repository section (e.g. `"utils"`, `"net"`, `"editors"`, `"devel"`). */
|
|
39
|
+
section?: string;
|
|
40
|
+
/** Files to write into the VFS during installation. */
|
|
41
|
+
files?: PackageFile[];
|
|
42
|
+
/**
|
|
43
|
+
* Hook called after all files are written.
|
|
44
|
+
* Use to create directories, write config, or register shell commands.
|
|
45
|
+
*/
|
|
46
|
+
onInstall?: (vfs: VirtualFileSystem, users: VirtualUserManager) => void;
|
|
47
|
+
/** Hook called before VFS files are removed during uninstall. */
|
|
48
|
+
onRemove?: (vfs: VirtualFileSystem) => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Runtime record of an installed package, persisted to `/var/lib/dpkg/status`.
|
|
52
|
+
*/
|
|
53
|
+
export interface InstalledPackage {
|
|
54
|
+
/** Package name. */
|
|
55
|
+
name: string;
|
|
56
|
+
/** Installed version string. */
|
|
57
|
+
version: string;
|
|
58
|
+
/** CPU architecture. */
|
|
59
|
+
architecture: string;
|
|
60
|
+
/** Maintainer display string. */
|
|
61
|
+
maintainer: string;
|
|
62
|
+
/** Full description. */
|
|
63
|
+
description: string;
|
|
64
|
+
/** Repository section. */
|
|
65
|
+
section: string;
|
|
66
|
+
/** Installed disk usage in kilobytes. */
|
|
67
|
+
installedSizeKb: number;
|
|
68
|
+
/** ISO-8601 timestamp of when the package was installed. */
|
|
69
|
+
installedAt: string;
|
|
70
|
+
/** Absolute VFS paths written by this package (used by `dpkg -L`). */
|
|
71
|
+
files: string[];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Pure-TypeScript APT/dpkg package manager backed by a built-in registry.
|
|
75
|
+
*
|
|
76
|
+
* Accessed via `shell.packageManager` — not constructed directly.
|
|
77
|
+
*
|
|
78
|
+
* `install()` resolves dependencies recursively, writes declared files to the
|
|
79
|
+
* VFS, runs `onInstall` hooks, and persists state to `/var/lib/dpkg/status`.
|
|
80
|
+
* `remove()` reverses the process. All state survives VFS snapshot round-trips.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* const pm = shell.packageManager;
|
|
85
|
+
* pm.install(["vim", "git"]);
|
|
86
|
+
* console.log(pm.isInstalled("vim")); // true
|
|
87
|
+
* console.log(pm.installedCount()); // 2
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare class VirtualPackageManager {
|
|
91
|
+
private readonly vfs;
|
|
92
|
+
private readonly users;
|
|
93
|
+
private readonly installed;
|
|
94
|
+
private readonly registryPath;
|
|
95
|
+
private readonly logPath;
|
|
96
|
+
private readonly aptLogPath;
|
|
97
|
+
/**
|
|
98
|
+
* @param vfs Backing virtual filesystem for file I/O and dpkg status persistence.
|
|
99
|
+
* @param users User manager reference passed to `onInstall` hooks.
|
|
100
|
+
*/
|
|
101
|
+
constructor(vfs: VirtualFileSystem, users: VirtualUserManager);
|
|
102
|
+
/**
|
|
103
|
+
* Loads installed package state from `/var/lib/dpkg/status` in the VFS.
|
|
104
|
+
*
|
|
105
|
+
* Called automatically by `VirtualShell` after `bootstrapLinuxRootfs`.
|
|
106
|
+
* Safe to call again to reload state after a snapshot restore.
|
|
107
|
+
*/
|
|
108
|
+
load(): void;
|
|
109
|
+
/** Persist installed state to /var/lib/dpkg/status. */
|
|
110
|
+
private persist;
|
|
111
|
+
private parseFields;
|
|
112
|
+
private log;
|
|
113
|
+
private aptLog;
|
|
114
|
+
/**
|
|
115
|
+
* Looks up a package definition in the built-in registry by name.
|
|
116
|
+
*
|
|
117
|
+
* @param name Package name (case-insensitive).
|
|
118
|
+
* @returns The matching `PackageDefinition`, or `undefined` if not found.
|
|
119
|
+
*/
|
|
120
|
+
findInRegistry(name: string): PackageDefinition | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Returns all packages in the built-in registry, sorted alphabetically.
|
|
123
|
+
*
|
|
124
|
+
* @returns Array of `PackageDefinition` entries.
|
|
125
|
+
*/
|
|
126
|
+
listAvailable(): PackageDefinition[];
|
|
127
|
+
/**
|
|
128
|
+
* Returns all currently installed packages, sorted alphabetically.
|
|
129
|
+
*
|
|
130
|
+
* @returns Array of `InstalledPackage` records.
|
|
131
|
+
*/
|
|
132
|
+
listInstalled(): InstalledPackage[];
|
|
133
|
+
/**
|
|
134
|
+
* Returns `true` when the given package is currently installed.
|
|
135
|
+
*
|
|
136
|
+
* @param name Package name (case-insensitive).
|
|
137
|
+
*/
|
|
138
|
+
isInstalled(name: string): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Returns the total number of installed packages.
|
|
141
|
+
*
|
|
142
|
+
* Used by `neofetch` to populate the `Packages:` field.
|
|
143
|
+
*/
|
|
144
|
+
installedCount(): number;
|
|
145
|
+
/**
|
|
146
|
+
* Installs one or more packages from the registry.
|
|
147
|
+
*
|
|
148
|
+
* Dependencies listed in `PackageDefinition.depends` are resolved and
|
|
149
|
+
* installed automatically. Already-installed packages are skipped. Files
|
|
150
|
+
* declared in `PackageDefinition.files` are written to the VFS and
|
|
151
|
+
* `onInstall` hooks are called in dependency order.
|
|
152
|
+
*
|
|
153
|
+
* @param names Package names to install.
|
|
154
|
+
* @param opts Installation options.
|
|
155
|
+
* @param opts.quiet Suppress progress output lines when `true`.
|
|
156
|
+
* @returns Terminal-style `output` string and an APT-compatible `exitCode`
|
|
157
|
+
* (`0` on success, `100` when a package is not found).
|
|
158
|
+
*/
|
|
159
|
+
install(names: string[], opts?: {
|
|
160
|
+
quiet?: boolean;
|
|
161
|
+
}): {
|
|
162
|
+
output: string;
|
|
163
|
+
exitCode: number;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Removes one or more installed packages.
|
|
167
|
+
*
|
|
168
|
+
* Package files are deleted from the VFS. Config files (paths under
|
|
169
|
+
* `/etc/` or ending in `.conf`) are preserved unless `opts.purge` is set.
|
|
170
|
+
* The `onRemove` hook is called for each package.
|
|
171
|
+
*
|
|
172
|
+
* @param names Package names to remove.
|
|
173
|
+
* @param opts Removal options.
|
|
174
|
+
* @param opts.purge Also delete configuration files when `true`.
|
|
175
|
+
* @param opts.quiet Suppress progress output lines when `true`.
|
|
176
|
+
* @returns Terminal-style `output` string and exit code (`0` on success).
|
|
177
|
+
*/
|
|
178
|
+
remove(names: string[], opts?: {
|
|
179
|
+
purge?: boolean;
|
|
180
|
+
quiet?: boolean;
|
|
181
|
+
}): {
|
|
182
|
+
output: string;
|
|
183
|
+
exitCode: number;
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Searches the registry for packages whose name or description contains
|
|
187
|
+
* the given term (case-insensitive). Equivalent to `apt-cache search`.
|
|
188
|
+
*
|
|
189
|
+
* @param term Search string.
|
|
190
|
+
* @returns Matching `PackageDefinition` entries sorted alphabetically.
|
|
191
|
+
*/
|
|
192
|
+
search(term: string): PackageDefinition[];
|
|
193
|
+
/**
|
|
194
|
+
* Returns a dpkg-style metadata block for a package, including its
|
|
195
|
+
* install status. Equivalent to `apt-cache show` / `dpkg -s`.
|
|
196
|
+
*
|
|
197
|
+
* @param name Package name.
|
|
198
|
+
* @returns Multi-line metadata string, or `null` if not in the registry.
|
|
199
|
+
*/
|
|
200
|
+
show(name: string): string | null;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/VirtualPackageManager/index.ts"],"names":[],"mappings":"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"}
|