typescript-virtual-container 1.5.3 → 1.5.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 +44 -532
- package/dist/.tsbuildinfo +1 -0
- package/dist/SSHMimic/executor.js +23 -5
- package/dist/VirtualPackageManager/index.js +10 -0
- package/dist/VirtualShell/shell.js +158 -11
- package/dist/commands/basename.d.ts +13 -0
- package/dist/commands/basename.js +45 -0
- package/dist/commands/bc.d.ts +2 -0
- package/dist/commands/bc.js +28 -0
- package/dist/commands/file.d.ts +8 -0
- package/dist/commands/file.js +57 -0
- package/dist/commands/fun.d.ts +32 -0
- package/dist/commands/fun.js +172 -0
- package/dist/commands/ip.d.ts +7 -0
- package/dist/commands/ip.js +52 -0
- package/dist/commands/jobs.d.ts +4 -0
- package/dist/commands/jobs.js +27 -0
- package/dist/commands/last.d.ts +13 -0
- package/dist/commands/last.js +68 -0
- package/dist/commands/manuals-bundle.js +598 -6
- package/dist/commands/registry.js +30 -2
- package/dist/commands/runtime.js +24 -3
- package/dist/commands/set.js +20 -0
- package/dist/commands/sh.js +74 -1
- package/dist/commands/tput.d.ts +13 -0
- package/dist/commands/tput.js +76 -0
- package/dist/commands/w.d.ts +7 -0
- package/dist/commands/w.js +38 -0
- package/dist/utils/expand.d.ts +12 -0
- package/dist/utils/expand.js +87 -1
- package/package.json +9 -3
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -50
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -31
- package/.github/dependabot.yml +0 -27
- package/.github/pull_request_template.md +0 -21
- package/.github/workflows/create-pull-request.yml +0 -85
- package/.github/workflows/publish.yml +0 -25
- package/.github/workflows/test-battery.yml +0 -102
- package/.vscode/settings.json +0 -20
- package/CODE_OF_CONDUCT.md +0 -39
- package/CONTRIBUTING.md +0 -59
- package/HONEYPOT.md +0 -358
- package/SECURITY.md +0 -33
- package/benchmark-results.txt +0 -40
- package/benchmark-virtualshell.ts +0 -88
- package/biome.json +0 -37
- package/build.js +0 -22
- package/builds/fortune-nyx-v1.5.3-directbash-k6.1.0.mjs +0 -1764
- package/builds/fortune-nyx-v1.5.3-ssh-nosftp.js +0 -1764
- package/builds/fortune-nyx-v1.5.3-ssh.cjs +0 -1765
- package/builds/fortune-nyx-v1.5.3-web.min.js +0 -17036
- package/bun.lock +0 -244
- package/docs/.nojekyll +0 -1
- package/docs/app.js +0 -1751
- package/docs/assets/hierarchy.js +0 -1
- package/docs/assets/highlight.css +0 -162
- package/docs/assets/icons.js +0 -18
- package/docs/assets/icons.svg +0 -1
- package/docs/assets/main.js +0 -60
- package/docs/assets/navigation.js +0 -1
- package/docs/assets/search.js +0 -1
- package/docs/assets/style.css +0 -1633
- package/docs/classes/HoneyPot.html +0 -31
- package/docs/classes/IdleManager.html +0 -162
- package/docs/classes/SshClient.html +0 -66
- package/docs/classes/VirtualFileSystem.html +0 -279
- package/docs/classes/VirtualPackageManager.html +0 -63
- package/docs/classes/VirtualSftpServer.html +0 -169
- package/docs/classes/VirtualShell.html +0 -285
- package/docs/classes/VirtualSshServer.html +0 -182
- package/docs/classes/VirtualUserManager.html +0 -276
- package/docs/demo.html +0 -82
- package/docs/functions/assertDiff.html +0 -6
- package/docs/functions/diffSnapshots.html +0 -7
- package/docs/functions/formatDiff.html +0 -6
- package/docs/functions/getArg.html +0 -13
- package/docs/functions/getFlag.html +0 -15
- package/docs/functions/ifFlag.html +0 -11
- package/docs/hierarchy.html +0 -1
- package/docs/index.html +0 -1869
- package/docs/interfaces/AuditLogEntry.html +0 -6
- package/docs/interfaces/CommandContext.html +0 -22
- package/docs/interfaces/CommandResult.html +0 -26
- package/docs/interfaces/ExecStream.html +0 -11
- package/docs/interfaces/HoneyPotStats.html +0 -16
- package/docs/interfaces/IdleManagerOptions.html +0 -7
- package/docs/interfaces/InstalledPackage.html +0 -20
- package/docs/interfaces/NanoEditorSession.html +0 -8
- package/docs/interfaces/PackageDefinition.html +0 -30
- package/docs/interfaces/PackageFile.html +0 -8
- package/docs/interfaces/PasswordChallenge.html +0 -16
- package/docs/interfaces/RemoveOptions.html +0 -4
- package/docs/interfaces/ShellEnv.html +0 -6
- package/docs/interfaces/ShellModule.html +0 -14
- package/docs/interfaces/ShellProperties.html +0 -14
- package/docs/interfaces/ShellStream.html +0 -11
- package/docs/interfaces/SudoChallenge.html +0 -24
- package/docs/interfaces/VfsBaseNode.html +0 -12
- package/docs/interfaces/VfsDiff.html +0 -10
- package/docs/interfaces/VfsDiffEntry.html +0 -6
- package/docs/interfaces/VfsDiffModified.html +0 -10
- package/docs/interfaces/VfsDirectoryNode.html +0 -15
- package/docs/interfaces/VfsFileNode.html +0 -17
- package/docs/interfaces/VfsOptions.html +0 -26
- package/docs/interfaces/VfsSnapshot.html +0 -3
- package/docs/interfaces/VfsSnapshotBaseNode.html +0 -8
- package/docs/interfaces/VfsSnapshotDirectoryNode.html +0 -10
- package/docs/interfaces/VfsSnapshotFileNode.html +0 -12
- package/docs/interfaces/VirtualActiveSession.html +0 -12
- package/docs/interfaces/VirtualSftpServerOptions.html +0 -7
- package/docs/interfaces/VirtualShellVfsLike.html +0 -15
- package/docs/interfaces/VirtualShellVfsOptions.html +0 -3
- package/docs/interfaces/WriteFileOptions.html +0 -6
- package/docs/media/LICENSE +0 -21
- package/docs/modules.html +0 -1
- package/docs/types/ArgParseOptions.html +0 -4
- package/docs/types/CommandMode.html +0 -2
- package/docs/types/CommandOutcome.html +0 -2
- package/docs/types/IdleState.html +0 -1
- package/docs/types/VfsNodeStats.html +0 -2
- package/docs/types/VfsNodeType.html +0 -2
- package/docs/types/VfsPersistenceMode.html +0 -5
- package/docs/types/VfsSnapshotNode.html +0 -2
- package/examples/README.md +0 -288
- package/examples/app.js +0 -1751
- package/examples/app.ts +0 -299
- package/examples/build.js +0 -27
- package/examples/demo.html +0 -33
- package/examples/honeypot-audit.ts +0 -180
- package/examples/honeypot-export.ts +0 -253
- package/examples/honeypot-quickstart.ts +0 -110
- package/examples/index.html +0 -82
- package/examples/server.js +0 -55
- package/polyfills/buffer.js +0 -117
- package/polyfills/node_child_process/index.js +0 -2
- package/polyfills/node_crypto/index.js +0 -167
- package/polyfills/node_events/index.js +0 -9
- package/polyfills/node_fs/index.js +0 -202
- package/polyfills/node_fs/promises.js +0 -4
- package/polyfills/node_os/index.js +0 -9
- package/polyfills/node_path/index.js +0 -28
- package/polyfills/node_vm/index.js +0 -7
- package/polyfills/node_zlib/index.js +0 -3
- package/polyfills/process.js +0 -14
- package/polyfills/ssh2/index.js +0 -75
- package/scripts/build-all.mjs +0 -226
- package/scripts/build-names.mjs +0 -43
- package/scripts/generate-manuals-bundle.mjs +0 -49
- package/scripts/postinstall.js +0 -42
- package/scripts/publish-package.sh +0 -70
- package/src/Honeypot/index.ts +0 -457
- package/src/SSHClient/index.ts +0 -270
- package/src/SSHMimic/exec.ts +0 -49
- package/src/SSHMimic/executor.ts +0 -251
- package/src/SSHMimic/hostKey.ts +0 -21
- package/src/SSHMimic/index.ts +0 -337
- package/src/SSHMimic/loginBanner.ts +0 -36
- package/src/SSHMimic/loginFormat.ts +0 -10
- package/src/SSHMimic/prompt.ts +0 -14
- package/src/SSHMimic/sftp.ts +0 -883
- package/src/VirtualFileSystem/binaryPack.ts +0 -258
- package/src/VirtualFileSystem/index.ts +0 -1193
- package/src/VirtualFileSystem/internalTypes.ts +0 -43
- package/src/VirtualFileSystem/journal.ts +0 -171
- package/src/VirtualFileSystem/path.ts +0 -74
- package/src/VirtualPackageManager/index.ts +0 -996
- package/src/VirtualShell/idleManager.ts +0 -137
- package/src/VirtualShell/index.ts +0 -475
- package/src/VirtualShell/shell.ts +0 -700
- package/src/VirtualShell/shellParser.ts +0 -285
- package/src/VirtualUserManager/index.ts +0 -758
- package/src/bun.d.ts +0 -1
- package/src/commands/adduser.ts +0 -103
- package/src/commands/alias.ts +0 -69
- package/src/commands/apt.ts +0 -233
- package/src/commands/awk.ts +0 -168
- package/src/commands/base64.ts +0 -29
- package/src/commands/cat.ts +0 -52
- package/src/commands/cd.ts +0 -25
- package/src/commands/chmod.ts +0 -85
- package/src/commands/clear.ts +0 -15
- package/src/commands/command-helpers.ts +0 -286
- package/src/commands/cp.ts +0 -83
- package/src/commands/curl.ts +0 -147
- package/src/commands/cut.ts +0 -36
- package/src/commands/date.ts +0 -30
- package/src/commands/declare.ts +0 -49
- package/src/commands/deluser.ts +0 -98
- package/src/commands/df.ts +0 -23
- package/src/commands/diff.ts +0 -43
- package/src/commands/dpkg.ts +0 -180
- package/src/commands/du.ts +0 -56
- package/src/commands/echo.ts +0 -58
- package/src/commands/env.ts +0 -23
- package/src/commands/exit.ts +0 -18
- package/src/commands/export.ts +0 -34
- package/src/commands/find.ts +0 -68
- package/src/commands/free.ts +0 -47
- package/src/commands/grep.ts +0 -116
- package/src/commands/groups.ts +0 -19
- package/src/commands/gzip.ts +0 -88
- package/src/commands/head.ts +0 -52
- package/src/commands/help.ts +0 -152
- package/src/commands/helpers.ts +0 -234
- package/src/commands/history.ts +0 -34
- package/src/commands/hostname.ts +0 -14
- package/src/commands/htop.ts +0 -20
- package/src/commands/id.ts +0 -19
- package/src/commands/index.ts +0 -9
- package/src/commands/kill.ts +0 -19
- package/src/commands/ln.ts +0 -71
- package/src/commands/ls.ts +0 -243
- package/src/commands/lsb-release.ts +0 -63
- package/src/commands/man.ts +0 -31
- package/src/commands/manuals/adduser.txt +0 -11
- package/src/commands/manuals/apt-cache.txt +0 -12
- package/src/commands/manuals/apt.txt +0 -20
- package/src/commands/manuals/awk.txt +0 -13
- package/src/commands/manuals/cat.txt +0 -14
- package/src/commands/manuals/cd.txt +0 -16
- package/src/commands/manuals/chmod.txt +0 -16
- package/src/commands/manuals/clear.txt +0 -10
- package/src/commands/manuals/cp.txt +0 -10
- package/src/commands/manuals/curl.txt +0 -20
- package/src/commands/manuals/date.txt +0 -14
- package/src/commands/manuals/declare.txt +0 -12
- package/src/commands/manuals/deluser.txt +0 -10
- package/src/commands/manuals/df.txt +0 -10
- package/src/commands/manuals/dpkg-query.txt +0 -11
- package/src/commands/manuals/dpkg.txt +0 -14
- package/src/commands/manuals/du.txt +0 -11
- package/src/commands/manuals/echo.txt +0 -11
- package/src/commands/manuals/false.txt +0 -10
- package/src/commands/manuals/find.txt +0 -11
- package/src/commands/manuals/free.txt +0 -12
- package/src/commands/manuals/grep.txt +0 -13
- package/src/commands/manuals/groups.txt +0 -10
- package/src/commands/manuals/gzip.txt +0 -11
- package/src/commands/manuals/head.txt +0 -10
- package/src/commands/manuals/help.txt +0 -11
- package/src/commands/manuals/history.txt +0 -11
- package/src/commands/manuals/hostname.txt +0 -10
- package/src/commands/manuals/id.txt +0 -10
- package/src/commands/manuals/kill.txt +0 -13
- package/src/commands/manuals/ls.txt +0 -20
- package/src/commands/manuals/lsb_release.txt +0 -14
- package/src/commands/manuals/mkdir.txt +0 -10
- package/src/commands/manuals/mv.txt +0 -10
- package/src/commands/manuals/nano.txt +0 -11
- package/src/commands/manuals/neofetch.txt +0 -10
- package/src/commands/manuals/node.txt +0 -13
- package/src/commands/manuals/npm.txt +0 -13
- package/src/commands/manuals/npx.txt +0 -13
- package/src/commands/manuals/passwd.txt +0 -11
- package/src/commands/manuals/ping.txt +0 -10
- package/src/commands/manuals/printf.txt +0 -11
- package/src/commands/manuals/ps.txt +0 -10
- package/src/commands/manuals/pwd.txt +0 -10
- package/src/commands/manuals/python3.txt +0 -13
- package/src/commands/manuals/readlink.txt +0 -10
- package/src/commands/manuals/return.txt +0 -10
- package/src/commands/manuals/rm.txt +0 -10
- package/src/commands/manuals/sed.txt +0 -11
- package/src/commands/manuals/set.txt +0 -11
- package/src/commands/manuals/shift.txt +0 -10
- package/src/commands/manuals/sleep.txt +0 -10
- package/src/commands/manuals/sort.txt +0 -12
- package/src/commands/manuals/source.txt +0 -11
- package/src/commands/manuals/ssh.txt +0 -11
- package/src/commands/manuals/stat.txt +0 -10
- package/src/commands/manuals/su.txt +0 -13
- package/src/commands/manuals/sudo.txt +0 -11
- package/src/commands/manuals/tail.txt +0 -10
- package/src/commands/manuals/tar.txt +0 -19
- package/src/commands/manuals/tee.txt +0 -10
- package/src/commands/manuals/test.txt +0 -11
- package/src/commands/manuals/touch.txt +0 -11
- package/src/commands/manuals/tr.txt +0 -10
- package/src/commands/manuals/trap.txt +0 -10
- package/src/commands/manuals/true.txt +0 -10
- package/src/commands/manuals/type.txt +0 -10
- package/src/commands/manuals/uname.txt +0 -12
- package/src/commands/manuals/uniq.txt +0 -12
- package/src/commands/manuals/unset.txt +0 -10
- package/src/commands/manuals/uptime.txt +0 -11
- package/src/commands/manuals/wc.txt +0 -12
- package/src/commands/manuals/wget.txt +0 -12
- package/src/commands/manuals/which.txt +0 -10
- package/src/commands/manuals/whoami.txt +0 -10
- package/src/commands/manuals/xargs.txt +0 -10
- package/src/commands/manuals-bundle.ts +0 -898
- package/src/commands/mkdir.ts +0 -31
- package/src/commands/mv.ts +0 -50
- package/src/commands/nano.ts +0 -38
- package/src/commands/neofetch.ts +0 -53
- package/src/commands/node.ts +0 -341
- package/src/commands/npm.ts +0 -132
- package/src/commands/passwd.ts +0 -50
- package/src/commands/ping.ts +0 -32
- package/src/commands/printf.ts +0 -129
- package/src/commands/ps.ts +0 -58
- package/src/commands/pwd.ts +0 -9
- package/src/commands/python.ts +0 -2229
- package/src/commands/read.ts +0 -46
- package/src/commands/registry.ts +0 -249
- package/src/commands/rm.ts +0 -42
- package/src/commands/runtime.ts +0 -421
- package/src/commands/sed.ts +0 -68
- package/src/commands/seq.ts +0 -43
- package/src/commands/set.ts +0 -29
- package/src/commands/sh.ts +0 -467
- package/src/commands/shift.ts +0 -63
- package/src/commands/sleep.ts +0 -20
- package/src/commands/sort.ts +0 -46
- package/src/commands/source.ts +0 -52
- package/src/commands/stat.ts +0 -61
- package/src/commands/su.ts +0 -72
- package/src/commands/sudo.ts +0 -76
- package/src/commands/tail.ts +0 -53
- package/src/commands/tar.ts +0 -102
- package/src/commands/tee.ts +0 -36
- package/src/commands/test.ts +0 -137
- package/src/commands/touch.ts +0 -28
- package/src/commands/tr.ts +0 -70
- package/src/commands/tree.ts +0 -20
- package/src/commands/true.ts +0 -27
- package/src/commands/type.ts +0 -48
- package/src/commands/uname.ts +0 -29
- package/src/commands/uniq.ts +0 -39
- package/src/commands/unset.ts +0 -17
- package/src/commands/uptime.ts +0 -54
- package/src/commands/wc.ts +0 -55
- package/src/commands/wget.ts +0 -148
- package/src/commands/which.ts +0 -37
- package/src/commands/who.ts +0 -25
- package/src/commands/whoami.ts +0 -14
- package/src/commands/xargs.ts +0 -31
- package/src/index.ts +0 -67
- package/src/modules/linuxRootfs.ts +0 -1961
- package/src/modules/neofetch.ts +0 -358
- package/src/modules/shellInteractive.ts +0 -57
- package/src/modules/shellRuntime.ts +0 -76
- package/src/self-standalone.ts +0 -542
- package/src/standalone-wo-sftp.ts +0 -38
- package/src/standalone.ts +0 -72
- package/src/types/commands.ts +0 -146
- package/src/types/pipeline.ts +0 -52
- package/src/types/streams.ts +0 -32
- package/src/types/tar-stream.d.ts +0 -38
- package/src/types/vfs.ts +0 -98
- package/src/utils/expand.ts +0 -491
- package/src/utils/perfLogger.ts +0 -72
- package/src/utils/tokenize.ts +0 -98
- package/src/utils/vfsDiff.ts +0 -275
- package/tests/command-helpers.test.ts +0 -116
- package/tests/commands-admin-net.test.ts +0 -441
- package/tests/commands-advanced.test.ts +0 -456
- package/tests/commands-core.test.ts +0 -562
- package/tests/commands-missing.test.ts +0 -570
- package/tests/commands-specific-units.test.ts +0 -327
- package/tests/commands-text-sys.test.ts +0 -445
- package/tests/expand.test.ts +0 -170
- package/tests/helpers.test.ts +0 -97
- package/tests/new-features.test.ts +0 -1036
- package/tests/parser-executor.test.ts +0 -37
- package/tests/sftp.test.ts +0 -323
- package/tests/ssh-exec.test.ts +0 -45
- package/tests/test-helper.ts +0 -79
- package/tests/users.test.ts +0 -86
- package/tsconfig.json +0 -49
- package/typedoc.json +0 -47
|
@@ -1,996 +0,0 @@
|
|
|
1
|
-
import type VirtualFileSystem from "../VirtualFileSystem";
|
|
2
|
-
import type { VirtualUserManager } from "../VirtualUserManager";
|
|
3
|
-
|
|
4
|
-
// ─── types ────────────────────────────────────────────────────────────────────
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* A single file entry written into the VFS when a package is installed.
|
|
8
|
-
*/
|
|
9
|
-
export interface PackageFile {
|
|
10
|
-
/** Absolute VFS destination path (e.g. `"/usr/bin/vim"`). */
|
|
11
|
-
path: string;
|
|
12
|
-
/** Text content to write. */
|
|
13
|
-
content: string;
|
|
14
|
-
/** POSIX mode bits (default `0o644`; use `0o755` for executables). */
|
|
15
|
-
mode?: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Metadata and behaviour definition for a single package in the registry.
|
|
20
|
-
*
|
|
21
|
-
* Used both for the built-in registry entries and for consumer-supplied custom
|
|
22
|
-
* packages. `files` are written to the VFS on `install()`, and `onInstall` /
|
|
23
|
-
* `onRemove` hooks allow arbitrary VFS mutations.
|
|
24
|
-
*/
|
|
25
|
-
export interface PackageDefinition {
|
|
26
|
-
/** Package name — lowercase, no spaces (e.g. `"vim"`, `"build-essential"`). */
|
|
27
|
-
name: string;
|
|
28
|
-
/** Debian-style version string (e.g. `"2:9.0.1378-2"`). */
|
|
29
|
-
version: string;
|
|
30
|
-
/** CPU architecture label (default `"amd64"`). */
|
|
31
|
-
architecture?: string;
|
|
32
|
-
/** Maintainer name and email shown in `apt show` output. */
|
|
33
|
-
maintainer?: string;
|
|
34
|
-
/** Full package description. */
|
|
35
|
-
description: string;
|
|
36
|
-
/** Short one-line summary shown in `apt search` results. */
|
|
37
|
-
shortDesc?: string;
|
|
38
|
-
/** Installed disk usage in kilobytes (informational). */
|
|
39
|
-
installedSizeKb?: number;
|
|
40
|
-
/** Other package names that must be installed first (resolved recursively). */
|
|
41
|
-
depends?: string[];
|
|
42
|
-
/** Repository section (e.g. `"utils"`, `"net"`, `"editors"`, `"devel"`). */
|
|
43
|
-
section?: string;
|
|
44
|
-
/** Files to write into the VFS during installation. */
|
|
45
|
-
files?: PackageFile[];
|
|
46
|
-
/**
|
|
47
|
-
* Hook called after all files are written.
|
|
48
|
-
* Use to create directories, write config, or register shell commands.
|
|
49
|
-
*/
|
|
50
|
-
onInstall?: (vfs: VirtualFileSystem, users: VirtualUserManager) => void;
|
|
51
|
-
/** Hook called before VFS files are removed during uninstall. */
|
|
52
|
-
onRemove?: (vfs: VirtualFileSystem) => void;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Runtime record of an installed package, persisted to `/var/lib/dpkg/status`.
|
|
57
|
-
*/
|
|
58
|
-
export interface InstalledPackage {
|
|
59
|
-
/** Package name. */
|
|
60
|
-
name: string;
|
|
61
|
-
/** Installed version string. */
|
|
62
|
-
version: string;
|
|
63
|
-
/** CPU architecture. */
|
|
64
|
-
architecture: string;
|
|
65
|
-
/** Maintainer display string. */
|
|
66
|
-
maintainer: string;
|
|
67
|
-
/** Full description. */
|
|
68
|
-
description: string;
|
|
69
|
-
/** Repository section. */
|
|
70
|
-
section: string;
|
|
71
|
-
/** Installed disk usage in kilobytes. */
|
|
72
|
-
installedSizeKb: number;
|
|
73
|
-
/** ISO-8601 timestamp of when the package was installed. */
|
|
74
|
-
installedAt: string;
|
|
75
|
-
/** Absolute VFS paths written by this package (used by `dpkg -L`). */
|
|
76
|
-
files: string[];
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// ─── built-in package registry ───────────────────────────────────────────────
|
|
80
|
-
|
|
81
|
-
const PACKAGE_REGISTRY: PackageDefinition[] = [
|
|
82
|
-
{
|
|
83
|
-
name: "vim",
|
|
84
|
-
version: "2:9.0.1378-2",
|
|
85
|
-
section: "editors",
|
|
86
|
-
description: "Vi IMproved - enhanced vi editor",
|
|
87
|
-
shortDesc: "Vi IMproved",
|
|
88
|
-
installedSizeKb: 3812,
|
|
89
|
-
files: [
|
|
90
|
-
{
|
|
91
|
-
path: "/usr/share/doc/vim/README",
|
|
92
|
-
content: "Vim editor — virtual package.\n",
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
name: "git",
|
|
98
|
-
version: "1:2.39.2-1",
|
|
99
|
-
section: "vcs",
|
|
100
|
-
description: "Fast, scalable, distributed revision control system",
|
|
101
|
-
shortDesc: "fast distributed version control system",
|
|
102
|
-
installedSizeKb: 11240,
|
|
103
|
-
files: [
|
|
104
|
-
{
|
|
105
|
-
path: "/usr/bin/git",
|
|
106
|
-
content: "#!/bin/sh\necho 'git: virtual stub — no host access'\n",
|
|
107
|
-
mode: 0o755,
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
path: "/usr/share/doc/git/README.Debian",
|
|
111
|
-
content: "Git virtual package for Fortune GNU/Linux.\n",
|
|
112
|
-
},
|
|
113
|
-
],
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
name: "python3",
|
|
117
|
-
version: "3.11.2-1+b1",
|
|
118
|
-
section: "python",
|
|
119
|
-
description: "Interactive high-level object-oriented language (version 3)",
|
|
120
|
-
shortDesc: "interactive high-level object-oriented language",
|
|
121
|
-
installedSizeKb: 512,
|
|
122
|
-
depends: ["python3-minimal"],
|
|
123
|
-
files: [
|
|
124
|
-
{
|
|
125
|
-
path: "/usr/bin/python3",
|
|
126
|
-
content: "#!/bin/sh\necho 'Python 3.11.2 (virtual)'\n",
|
|
127
|
-
mode: 0o755,
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
path: "/usr/bin/python3.11",
|
|
131
|
-
content: "#!/bin/sh\nexec builtin python3 \"$@\"\n",
|
|
132
|
-
mode: 0o755,
|
|
133
|
-
},
|
|
134
|
-
{ path: "/usr/lib/python3.11/.keep", content: "" },
|
|
135
|
-
],
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
name: "python3-minimal",
|
|
139
|
-
version: "3.11.2-1+b1",
|
|
140
|
-
section: "python",
|
|
141
|
-
description: "Minimal subset of the Python language (version 3)",
|
|
142
|
-
shortDesc: "minimal subset of Python language",
|
|
143
|
-
installedSizeKb: 196,
|
|
144
|
-
files: [{ path: "/usr/lib/python3-minimal/.keep", content: "" }],
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
name: "nodejs",
|
|
148
|
-
version: "18.19.0+dfsg-6",
|
|
149
|
-
section: "javascript",
|
|
150
|
-
description: "Evented I/O for V8 javascript - runtime executable",
|
|
151
|
-
shortDesc: "Node.js JavaScript runtime",
|
|
152
|
-
installedSizeKb: 15360,
|
|
153
|
-
files: [
|
|
154
|
-
{
|
|
155
|
-
path: "/usr/bin/node",
|
|
156
|
-
content: "#!/bin/sh\necho 'node v18.19.0 (virtual)'\n",
|
|
157
|
-
mode: 0o755,
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
path: "/usr/bin/nodejs",
|
|
161
|
-
content: "#!/bin/sh\nexec builtin node \"$@\"\n",
|
|
162
|
-
mode: 0o755,
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
path: "/usr/share/doc/nodejs/README",
|
|
166
|
-
content: "Node.js virtual package.\n",
|
|
167
|
-
},
|
|
168
|
-
],
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
name: "npm",
|
|
172
|
-
version: "9.2.0~ds1-2",
|
|
173
|
-
section: "javascript",
|
|
174
|
-
description: "package manager for Node.js",
|
|
175
|
-
shortDesc: "package manager for Node.js",
|
|
176
|
-
installedSizeKb: 9814,
|
|
177
|
-
depends: ["nodejs"],
|
|
178
|
-
files: [
|
|
179
|
-
{
|
|
180
|
-
path: "/usr/bin/npm",
|
|
181
|
-
content: '#!/bin/sh\nexec builtin npm "$@"\n',
|
|
182
|
-
mode: 0o755,
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
path: "/usr/bin/npx",
|
|
186
|
-
content: '#!/bin/sh\nexec builtin npx "$@"\n',
|
|
187
|
-
mode: 0o755,
|
|
188
|
-
},
|
|
189
|
-
],
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
name: "curl",
|
|
193
|
-
version: "7.88.1-10+deb12u5",
|
|
194
|
-
section: "web",
|
|
195
|
-
description: "command line tool for transferring data with URL syntax",
|
|
196
|
-
shortDesc: "command line tool for transferring data",
|
|
197
|
-
installedSizeKb: 368,
|
|
198
|
-
files: [
|
|
199
|
-
{
|
|
200
|
-
path: "/usr/bin/curl",
|
|
201
|
-
content: '#!/bin/sh\nexec builtin curl "$@"\n',
|
|
202
|
-
mode: 0o755,
|
|
203
|
-
},
|
|
204
|
-
],
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
name: "wget",
|
|
208
|
-
version: "1.21.3-1+b2",
|
|
209
|
-
section: "web",
|
|
210
|
-
description: "Retrieves files from the web",
|
|
211
|
-
shortDesc: "retrieves files from the web",
|
|
212
|
-
installedSizeKb: 952,
|
|
213
|
-
files: [
|
|
214
|
-
{
|
|
215
|
-
path: "/usr/bin/wget",
|
|
216
|
-
content: '#!/bin/sh\nexec builtin wget "$@"\n',
|
|
217
|
-
mode: 0o755,
|
|
218
|
-
},
|
|
219
|
-
],
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
name: "htop",
|
|
223
|
-
version: "3.2.2-2",
|
|
224
|
-
section: "utils",
|
|
225
|
-
description: "interactive processes viewer",
|
|
226
|
-
shortDesc: "interactive process viewer",
|
|
227
|
-
installedSizeKb: 412,
|
|
228
|
-
files: [
|
|
229
|
-
{
|
|
230
|
-
path: "/usr/bin/htop",
|
|
231
|
-
content: "#!/bin/sh\nexec builtin htop\n",
|
|
232
|
-
mode: 0o755,
|
|
233
|
-
},
|
|
234
|
-
],
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
name: "openssh-client",
|
|
238
|
-
version: "1:9.2p1-2+deb12u2",
|
|
239
|
-
section: "net",
|
|
240
|
-
description: "Secure Shell (SSH) client",
|
|
241
|
-
shortDesc: "secure shell (SSH) client",
|
|
242
|
-
installedSizeKb: 4540,
|
|
243
|
-
files: [
|
|
244
|
-
{
|
|
245
|
-
path: "/usr/bin/ssh",
|
|
246
|
-
content: "#!/bin/sh\necho 'ssh: virtual stub'\n",
|
|
247
|
-
mode: 0o755,
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
path: "/usr/bin/ssh-keygen",
|
|
251
|
-
content: "#!/bin/sh\necho 'ssh-keygen: virtual stub'\n",
|
|
252
|
-
mode: 0o755,
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
path: "/etc/ssh/ssh_config",
|
|
256
|
-
content: "Host *\n StrictHostKeyChecking ask\n",
|
|
257
|
-
},
|
|
258
|
-
],
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
name: "openssh-server",
|
|
262
|
-
version: "1:9.2p1-2+deb12u2",
|
|
263
|
-
section: "net",
|
|
264
|
-
description: "Secure Shell server (sshd)",
|
|
265
|
-
shortDesc: "secure shell server",
|
|
266
|
-
installedSizeKb: 1732,
|
|
267
|
-
depends: ["openssh-client"],
|
|
268
|
-
files: [
|
|
269
|
-
{
|
|
270
|
-
path: "/usr/sbin/sshd",
|
|
271
|
-
content: "#!/bin/sh\necho 'sshd: virtual — server already running'\n",
|
|
272
|
-
mode: 0o755,
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
path: "/etc/ssh/sshd_config",
|
|
276
|
-
content: "Port 22\nPermitRootLogin yes\nPasswordAuthentication yes\n",
|
|
277
|
-
},
|
|
278
|
-
],
|
|
279
|
-
},
|
|
280
|
-
{
|
|
281
|
-
name: "net-tools",
|
|
282
|
-
version: "2.10-0.1",
|
|
283
|
-
section: "net",
|
|
284
|
-
description: "NET-3 networking toolkit (ifconfig, netstat, route)",
|
|
285
|
-
shortDesc: "networking toolkit",
|
|
286
|
-
installedSizeKb: 988,
|
|
287
|
-
files: [
|
|
288
|
-
{
|
|
289
|
-
path: "/usr/bin/ifconfig",
|
|
290
|
-
content:
|
|
291
|
-
"#!/bin/sh\necho 'eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500'\necho ' inet 10.0.0.2 netmask 255.255.255.0 broadcast 10.0.0.255'\necho ' ether 02:42:0a:00:00:02 txqueuelen 0 (Ethernet)'\n",
|
|
292
|
-
mode: 0o755,
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
path: "/usr/bin/netstat",
|
|
296
|
-
content:
|
|
297
|
-
"#!/bin/sh\necho 'Active Internet connections (only servers)'\necho 'Proto Recv-Q Send-Q Local Address Foreign Address State'\n",
|
|
298
|
-
mode: 0o755,
|
|
299
|
-
},
|
|
300
|
-
{
|
|
301
|
-
path: "/usr/bin/route",
|
|
302
|
-
content:
|
|
303
|
-
"#!/bin/sh\necho 'Kernel IP routing table'\necho 'Destination Gateway Genmask Flags Metric Ref Use Iface'\necho '0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 eth0'\n",
|
|
304
|
-
mode: 0o755,
|
|
305
|
-
},
|
|
306
|
-
],
|
|
307
|
-
},
|
|
308
|
-
{
|
|
309
|
-
name: "iputils-ping",
|
|
310
|
-
version: "3:20221126-1",
|
|
311
|
-
section: "net",
|
|
312
|
-
description: "Tools to test the reachability of network hosts",
|
|
313
|
-
shortDesc: "test reachability of network hosts",
|
|
314
|
-
installedSizeKb: 164,
|
|
315
|
-
files: [
|
|
316
|
-
{
|
|
317
|
-
path: "/usr/bin/ping",
|
|
318
|
-
content: '#!/bin/sh\nexec builtin ping "$@"\n',
|
|
319
|
-
mode: 0o755,
|
|
320
|
-
},
|
|
321
|
-
],
|
|
322
|
-
},
|
|
323
|
-
{
|
|
324
|
-
name: "jq",
|
|
325
|
-
version: "1.6-2.1",
|
|
326
|
-
section: "utils",
|
|
327
|
-
description: "Lightweight and flexible command-line JSON processor",
|
|
328
|
-
shortDesc: "command-line JSON processor",
|
|
329
|
-
installedSizeKb: 296,
|
|
330
|
-
files: [
|
|
331
|
-
{
|
|
332
|
-
path: "/usr/bin/jq",
|
|
333
|
-
content: "#!/bin/sh\necho 'jq: virtual stub — pipe JSON here'\n",
|
|
334
|
-
mode: 0o755,
|
|
335
|
-
},
|
|
336
|
-
],
|
|
337
|
-
},
|
|
338
|
-
{
|
|
339
|
-
name: "build-essential",
|
|
340
|
-
version: "12.9",
|
|
341
|
-
section: "devel",
|
|
342
|
-
description: "Informational list of build-essential packages",
|
|
343
|
-
shortDesc: "build-essential meta-package",
|
|
344
|
-
installedSizeKb: 12,
|
|
345
|
-
depends: ["gcc", "g++", "make"],
|
|
346
|
-
files: [
|
|
347
|
-
{
|
|
348
|
-
path: "/usr/share/doc/build-essential/README",
|
|
349
|
-
content: "Build-essential virtual meta-package.\n",
|
|
350
|
-
},
|
|
351
|
-
],
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
name: "gcc",
|
|
355
|
-
version: "4:12.2.0-3",
|
|
356
|
-
section: "devel",
|
|
357
|
-
description: "GNU C compiler",
|
|
358
|
-
shortDesc: "GNU C compiler",
|
|
359
|
-
installedSizeKb: 24448,
|
|
360
|
-
files: [
|
|
361
|
-
{
|
|
362
|
-
path: "/usr/bin/gcc",
|
|
363
|
-
content: "#!/bin/sh\necho 'gcc (Fortune GNU/Linux) 12.2.0 (virtual)'\n",
|
|
364
|
-
mode: 0o755,
|
|
365
|
-
},
|
|
366
|
-
{
|
|
367
|
-
path: "/usr/bin/gcc-12",
|
|
368
|
-
content: "#!/bin/sh\necho 'gcc (Fortune GNU/Linux) 12.2.0 (virtual)'\n",
|
|
369
|
-
mode: 0o755,
|
|
370
|
-
},
|
|
371
|
-
],
|
|
372
|
-
},
|
|
373
|
-
{
|
|
374
|
-
name: "g++",
|
|
375
|
-
version: "4:12.2.0-3",
|
|
376
|
-
section: "devel",
|
|
377
|
-
description: "GNU C++ compiler",
|
|
378
|
-
shortDesc: "GNU C++ compiler",
|
|
379
|
-
installedSizeKb: 1024,
|
|
380
|
-
depends: ["gcc"],
|
|
381
|
-
files: [
|
|
382
|
-
{
|
|
383
|
-
path: "/usr/bin/g++",
|
|
384
|
-
content: "#!/bin/sh\necho 'g++ (Fortune GNU/Linux) 12.2.0 (virtual)'\n",
|
|
385
|
-
mode: 0o755,
|
|
386
|
-
},
|
|
387
|
-
],
|
|
388
|
-
},
|
|
389
|
-
{
|
|
390
|
-
name: "make",
|
|
391
|
-
version: "4.3-4.1",
|
|
392
|
-
section: "devel",
|
|
393
|
-
description: "Utility for directing compilation",
|
|
394
|
-
shortDesc: "build utility",
|
|
395
|
-
installedSizeKb: 504,
|
|
396
|
-
files: [
|
|
397
|
-
{
|
|
398
|
-
path: "/usr/bin/make",
|
|
399
|
-
content:
|
|
400
|
-
"#!/bin/sh\necho 'make: *** No targets specified and no makefile found. Stop.'\nexit 2\n",
|
|
401
|
-
mode: 0o755,
|
|
402
|
-
},
|
|
403
|
-
],
|
|
404
|
-
},
|
|
405
|
-
{
|
|
406
|
-
name: "less",
|
|
407
|
-
version: "590-2",
|
|
408
|
-
section: "text",
|
|
409
|
-
description: "Pager program similar to more",
|
|
410
|
-
shortDesc: "pager program",
|
|
411
|
-
installedSizeKb: 328,
|
|
412
|
-
files: [
|
|
413
|
-
{ path: "/usr/bin/less", content: '#!/bin/sh\ncat "$@"\n', mode: 0o755 },
|
|
414
|
-
],
|
|
415
|
-
},
|
|
416
|
-
{
|
|
417
|
-
name: "unzip",
|
|
418
|
-
version: "6.0-28",
|
|
419
|
-
section: "utils",
|
|
420
|
-
description: "De-archiver for .zip files",
|
|
421
|
-
shortDesc: "de-archiver for .zip files",
|
|
422
|
-
installedSizeKb: 464,
|
|
423
|
-
files: [
|
|
424
|
-
{
|
|
425
|
-
path: "/usr/bin/unzip",
|
|
426
|
-
content: "#!/bin/sh\necho 'unzip: virtual stub'\n",
|
|
427
|
-
mode: 0o755,
|
|
428
|
-
},
|
|
429
|
-
],
|
|
430
|
-
},
|
|
431
|
-
{
|
|
432
|
-
name: "rsync",
|
|
433
|
-
version: "3.2.7-1",
|
|
434
|
-
section: "net",
|
|
435
|
-
description: "Fast, versatile, remote (and local) file-copying tool",
|
|
436
|
-
shortDesc: "fast remote file copy program",
|
|
437
|
-
installedSizeKb: 716,
|
|
438
|
-
files: [
|
|
439
|
-
{
|
|
440
|
-
path: "/usr/bin/rsync",
|
|
441
|
-
content: "#!/bin/sh\necho 'rsync: virtual stub'\n",
|
|
442
|
-
mode: 0o755,
|
|
443
|
-
},
|
|
444
|
-
],
|
|
445
|
-
},
|
|
446
|
-
{
|
|
447
|
-
name: "tmux",
|
|
448
|
-
version: "3.3a-3",
|
|
449
|
-
section: "utils",
|
|
450
|
-
description: "Terminal multiplexer",
|
|
451
|
-
shortDesc: "terminal multiplexer",
|
|
452
|
-
installedSizeKb: 812,
|
|
453
|
-
files: [
|
|
454
|
-
{
|
|
455
|
-
path: "/usr/bin/tmux",
|
|
456
|
-
content:
|
|
457
|
-
"#!/bin/sh\necho 'tmux: terminal multiplexer (virtual stub)'\n",
|
|
458
|
-
mode: 0o755,
|
|
459
|
-
},
|
|
460
|
-
],
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
name: "tree",
|
|
464
|
-
version: "2.1.0-1",
|
|
465
|
-
section: "utils",
|
|
466
|
-
description: "Displays an indented directory tree, in color",
|
|
467
|
-
shortDesc: "list files in tree format",
|
|
468
|
-
installedSizeKb: 108,
|
|
469
|
-
files: [
|
|
470
|
-
{
|
|
471
|
-
path: "/usr/bin/tree",
|
|
472
|
-
content: '#!/bin/sh\nexec builtin tree "$@"\n',
|
|
473
|
-
mode: 0o755,
|
|
474
|
-
},
|
|
475
|
-
],
|
|
476
|
-
},
|
|
477
|
-
{
|
|
478
|
-
name: "ca-certificates",
|
|
479
|
-
version: "20230311",
|
|
480
|
-
section: "misc",
|
|
481
|
-
description: "Common CA certificates",
|
|
482
|
-
shortDesc: "common CA certificates",
|
|
483
|
-
installedSizeKb: 388,
|
|
484
|
-
files: [
|
|
485
|
-
{ path: "/etc/ssl/certs/.keep", content: "" },
|
|
486
|
-
{ path: "/etc/ssl/private/.keep", content: "" },
|
|
487
|
-
{ path: "/usr/share/ca-certificates/.keep", content: "" },
|
|
488
|
-
],
|
|
489
|
-
onInstall: (vfs) => {
|
|
490
|
-
if (!vfs.exists("/etc/ssl")) vfs.mkdir("/etc/ssl", 0o755);
|
|
491
|
-
if (!vfs.exists("/etc/ssl/certs")) vfs.mkdir("/etc/ssl/certs", 0o755);
|
|
492
|
-
},
|
|
493
|
-
},
|
|
494
|
-
{
|
|
495
|
-
name: "locales",
|
|
496
|
-
version: "2.36-9+deb12u3",
|
|
497
|
-
section: "localization",
|
|
498
|
-
description: "GNU C Library: National Language (locale) data",
|
|
499
|
-
shortDesc: "locale data",
|
|
500
|
-
installedSizeKb: 16484,
|
|
501
|
-
files: [
|
|
502
|
-
{ path: "/etc/locale.gen", content: "en_US.UTF-8 UTF-8\n" },
|
|
503
|
-
{
|
|
504
|
-
path: "/etc/default/locale",
|
|
505
|
-
content: "LANG=en_US.UTF-8\nLANGUAGE=en_US:en\n",
|
|
506
|
-
},
|
|
507
|
-
],
|
|
508
|
-
},
|
|
509
|
-
{
|
|
510
|
-
name: "sudo",
|
|
511
|
-
version: "1.9.13p3-1+deb12u1",
|
|
512
|
-
section: "admin",
|
|
513
|
-
description: "Provide limited super user privileges to specific users",
|
|
514
|
-
shortDesc: "super user privilege execution",
|
|
515
|
-
installedSizeKb: 2304,
|
|
516
|
-
files: [
|
|
517
|
-
{
|
|
518
|
-
path: "/usr/bin/sudo",
|
|
519
|
-
content: '#!/bin/sh\nexec builtin sudo "$@"\n',
|
|
520
|
-
mode: 0o755,
|
|
521
|
-
},
|
|
522
|
-
{
|
|
523
|
-
path: "/etc/sudoers",
|
|
524
|
-
content: "root ALL=(ALL:ALL) ALL\n%sudo ALL=(ALL:ALL) ALL\n",
|
|
525
|
-
},
|
|
526
|
-
],
|
|
527
|
-
},
|
|
528
|
-
{
|
|
529
|
-
name: "systemd",
|
|
530
|
-
version: "252.22-1~deb12u1",
|
|
531
|
-
section: "admin",
|
|
532
|
-
description: "System and service manager",
|
|
533
|
-
shortDesc: "system and service manager",
|
|
534
|
-
installedSizeKb: 26624,
|
|
535
|
-
files: [
|
|
536
|
-
{
|
|
537
|
-
path: "/usr/bin/systemctl",
|
|
538
|
-
content:
|
|
539
|
-
"#!/bin/sh\necho 'systemd is not running in this virtual container.'\nexit 1\n",
|
|
540
|
-
mode: 0o755,
|
|
541
|
-
},
|
|
542
|
-
{
|
|
543
|
-
path: "/usr/bin/journalctl",
|
|
544
|
-
content: "#!/bin/sh\necho 'journalctl: virtual stub'\n",
|
|
545
|
-
mode: 0o755,
|
|
546
|
-
},
|
|
547
|
-
],
|
|
548
|
-
},{
|
|
549
|
-
name: "gzip",
|
|
550
|
-
version: "1.12-2",
|
|
551
|
-
section: "utils",
|
|
552
|
-
description: "GNU compression utility",
|
|
553
|
-
shortDesc: "compression utility",
|
|
554
|
-
installedSizeKb: 128,
|
|
555
|
-
files: [
|
|
556
|
-
{
|
|
557
|
-
path: "/usr/bin/gzip",
|
|
558
|
-
content: "#!/bin/sh\necho 'gzip: virtual stub'\n",
|
|
559
|
-
mode: 0o755,
|
|
560
|
-
},
|
|
561
|
-
]
|
|
562
|
-
}, {
|
|
563
|
-
name: "neofetch",
|
|
564
|
-
version: "7.1.0-1",
|
|
565
|
-
section: "utils",
|
|
566
|
-
description: "A command-line system information tool written in bash 3.2+",
|
|
567
|
-
shortDesc: "command-line system information tool",
|
|
568
|
-
installedSizeKb: 256,
|
|
569
|
-
files: [
|
|
570
|
-
{
|
|
571
|
-
path: "/usr/bin/neofetch",
|
|
572
|
-
content: "#!/bin/sh\necho 'neofetch: virtual stub'\n",
|
|
573
|
-
mode: 0o755,
|
|
574
|
-
},
|
|
575
|
-
],
|
|
576
|
-
}
|
|
577
|
-
];
|
|
578
|
-
|
|
579
|
-
/**
|
|
580
|
-
* Pure-TypeScript APT/dpkg package manager backed by a built-in registry.
|
|
581
|
-
*
|
|
582
|
-
* Accessed via `shell.packageManager` — not constructed directly.
|
|
583
|
-
*
|
|
584
|
-
* `install()` resolves dependencies recursively, writes declared files to the
|
|
585
|
-
* VFS, runs `onInstall` hooks, and persists state to `/var/lib/dpkg/status`.
|
|
586
|
-
* `remove()` reverses the process. All state survives VFS snapshot round-trips.
|
|
587
|
-
*
|
|
588
|
-
* @example
|
|
589
|
-
* ```ts
|
|
590
|
-
* const pm = shell.packageManager;
|
|
591
|
-
* pm.install(["vim", "git"]);
|
|
592
|
-
* console.log(pm.isInstalled("vim")); // true
|
|
593
|
-
* console.log(pm.installedCount()); // 2
|
|
594
|
-
* ```
|
|
595
|
-
*/
|
|
596
|
-
export class VirtualPackageManager {
|
|
597
|
-
private readonly installed = new Map<string, InstalledPackage>();
|
|
598
|
-
private readonly registryPath = "/var/lib/dpkg/status";
|
|
599
|
-
private readonly logPath = "/var/log/dpkg.log";
|
|
600
|
-
private readonly aptLogPath = "/var/log/apt/history.log";
|
|
601
|
-
|
|
602
|
-
/**
|
|
603
|
-
* @param vfs Backing virtual filesystem for file I/O and dpkg status persistence.
|
|
604
|
-
* @param users User manager reference passed to `onInstall` hooks.
|
|
605
|
-
*/
|
|
606
|
-
constructor(
|
|
607
|
-
private readonly vfs: VirtualFileSystem,
|
|
608
|
-
private readonly users: VirtualUserManager,
|
|
609
|
-
) {}
|
|
610
|
-
|
|
611
|
-
/**
|
|
612
|
-
* Loads installed package state from `/var/lib/dpkg/status` in the VFS.
|
|
613
|
-
*
|
|
614
|
-
* Called automatically by `VirtualShell` after `bootstrapLinuxRootfs`.
|
|
615
|
-
* Safe to call again to reload state after a snapshot restore.
|
|
616
|
-
*/
|
|
617
|
-
public load(): void {
|
|
618
|
-
if (!this.vfs.exists(this.registryPath)) return;
|
|
619
|
-
const status = this.vfs.readFile(this.registryPath);
|
|
620
|
-
if (!status.trim()) return;
|
|
621
|
-
|
|
622
|
-
const blocks = status.split(/\n\n+/);
|
|
623
|
-
for (const block of blocks) {
|
|
624
|
-
if (!block.trim()) continue;
|
|
625
|
-
const fields = this.parseFields(block);
|
|
626
|
-
const name = fields.Package;
|
|
627
|
-
if (!name) continue;
|
|
628
|
-
this.installed.set(name, {
|
|
629
|
-
name,
|
|
630
|
-
version: fields.Version ?? "unknown",
|
|
631
|
-
architecture: fields.Architecture ?? "amd64",
|
|
632
|
-
maintainer: fields.Maintainer ?? "Fortune Maintainers",
|
|
633
|
-
description: fields.Description ?? "",
|
|
634
|
-
section: fields.Section ?? "misc",
|
|
635
|
-
installedSizeKb: Number(fields["Installed-Size"] ?? 0),
|
|
636
|
-
installedAt: fields["X-Installed-At"] ?? new Date().toISOString(),
|
|
637
|
-
files: (fields["X-Files"] ?? "").split("|").filter(Boolean),
|
|
638
|
-
});
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
/** Persist installed state to /var/lib/dpkg/status. */
|
|
643
|
-
private persist(): void {
|
|
644
|
-
const blocks: string[] = [];
|
|
645
|
-
for (const pkg of this.installed.values()) {
|
|
646
|
-
blocks.push(
|
|
647
|
-
[
|
|
648
|
-
`Package: ${pkg.name}`,
|
|
649
|
-
`Status: install ok installed`,
|
|
650
|
-
`Priority: optional`,
|
|
651
|
-
`Section: ${pkg.section}`,
|
|
652
|
-
`Installed-Size: ${pkg.installedSizeKb}`,
|
|
653
|
-
`Maintainer: ${pkg.maintainer}`,
|
|
654
|
-
`Architecture: ${pkg.architecture}`,
|
|
655
|
-
`Version: ${pkg.version}`,
|
|
656
|
-
`Description: ${pkg.description}`,
|
|
657
|
-
`X-Installed-At: ${pkg.installedAt}`,
|
|
658
|
-
`X-Files: ${pkg.files.join("|")}`,
|
|
659
|
-
].join("\n"),
|
|
660
|
-
);
|
|
661
|
-
}
|
|
662
|
-
this.vfs.writeFile(this.registryPath, `${blocks.join("\n\n")}\n`);
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
private parseFields(block: string): Record<string, string> {
|
|
666
|
-
const result: Record<string, string> = {};
|
|
667
|
-
for (const line of block.split("\n")) {
|
|
668
|
-
const idx = line.indexOf(": ");
|
|
669
|
-
if (idx === -1) continue;
|
|
670
|
-
result[line.slice(0, idx)] = line.slice(idx + 2);
|
|
671
|
-
}
|
|
672
|
-
return result;
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
private log(msg: string): void {
|
|
676
|
-
const ts = new Date().toISOString().replace("T", " ").slice(0, 19);
|
|
677
|
-
const line = `${ts} ${msg}\n`;
|
|
678
|
-
const existing = this.vfs.exists(this.logPath)
|
|
679
|
-
? this.vfs.readFile(this.logPath)
|
|
680
|
-
: "";
|
|
681
|
-
this.vfs.writeFile(this.logPath, existing + line);
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
private aptLog(action: string, pkgs: string[]): void {
|
|
685
|
-
const ts = new Date().toISOString();
|
|
686
|
-
const existing = this.vfs.exists(this.aptLogPath)
|
|
687
|
-
? this.vfs.readFile(this.aptLogPath)
|
|
688
|
-
: "";
|
|
689
|
-
const entry = [
|
|
690
|
-
`Start-Date: ${ts}`,
|
|
691
|
-
`Commandline: apt-get ${action} ${pkgs.join(" ")}`,
|
|
692
|
-
`${action === "install" ? "Install" : "Remove"}: ${pkgs.join(", ")}`,
|
|
693
|
-
`End-Date: ${ts}`,
|
|
694
|
-
"",
|
|
695
|
-
].join("\n");
|
|
696
|
-
this.vfs.writeFile(this.aptLogPath, existing + entry);
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
/**
|
|
700
|
-
* Looks up a package definition in the built-in registry by name.
|
|
701
|
-
*
|
|
702
|
-
* @param name Package name (case-insensitive).
|
|
703
|
-
* @returns The matching `PackageDefinition`, or `undefined` if not found.
|
|
704
|
-
*/
|
|
705
|
-
public findInRegistry(name: string): PackageDefinition | undefined {
|
|
706
|
-
return PACKAGE_REGISTRY.find(
|
|
707
|
-
(p) => p.name.toLowerCase() === name.toLowerCase(),
|
|
708
|
-
);
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
/**
|
|
712
|
-
* Returns all packages in the built-in registry, sorted alphabetically.
|
|
713
|
-
*
|
|
714
|
-
* @returns Array of `PackageDefinition` entries.
|
|
715
|
-
*/
|
|
716
|
-
public listAvailable(): PackageDefinition[] {
|
|
717
|
-
return [...PACKAGE_REGISTRY].sort((a, b) => a.name.localeCompare(b.name));
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
/**
|
|
721
|
-
* Returns all currently installed packages, sorted alphabetically.
|
|
722
|
-
*
|
|
723
|
-
* @returns Array of `InstalledPackage` records.
|
|
724
|
-
*/
|
|
725
|
-
public listInstalled(): InstalledPackage[] {
|
|
726
|
-
return [...this.installed.values()].sort((a, b) =>
|
|
727
|
-
a.name.localeCompare(b.name),
|
|
728
|
-
);
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
/**
|
|
732
|
-
* Returns `true` when the given package is currently installed.
|
|
733
|
-
*
|
|
734
|
-
* @param name Package name (case-insensitive).
|
|
735
|
-
*/
|
|
736
|
-
public isInstalled(name: string): boolean {
|
|
737
|
-
return this.installed.has(name.toLowerCase());
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
/**
|
|
741
|
-
* Returns the total number of installed packages.
|
|
742
|
-
*
|
|
743
|
-
* Used by `neofetch` to populate the `Packages:` field.
|
|
744
|
-
*/
|
|
745
|
-
public installedCount(): number {
|
|
746
|
-
return this.installed.size;
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
/**
|
|
750
|
-
* Installs one or more packages from the registry.
|
|
751
|
-
*
|
|
752
|
-
* Dependencies listed in `PackageDefinition.depends` are resolved and
|
|
753
|
-
* installed automatically. Already-installed packages are skipped. Files
|
|
754
|
-
* declared in `PackageDefinition.files` are written to the VFS and
|
|
755
|
-
* `onInstall` hooks are called in dependency order.
|
|
756
|
-
*
|
|
757
|
-
* @param names Package names to install.
|
|
758
|
-
* @param opts Installation options.
|
|
759
|
-
* @param opts.quiet Suppress progress output lines when `true`.
|
|
760
|
-
* @returns Terminal-style `output` string and an APT-compatible `exitCode`
|
|
761
|
-
* (`0` on success, `100` when a package is not found).
|
|
762
|
-
*/
|
|
763
|
-
public install(
|
|
764
|
-
names: string[],
|
|
765
|
-
opts: { quiet?: boolean } = {},
|
|
766
|
-
): { output: string; exitCode: number } {
|
|
767
|
-
const lines: string[] = [];
|
|
768
|
-
const toInstall: PackageDefinition[] = [];
|
|
769
|
-
const notFound: string[] = [];
|
|
770
|
-
|
|
771
|
-
// Resolve + deduplicate including deps
|
|
772
|
-
const resolve = (name: string, seen = new Set<string>()): void => {
|
|
773
|
-
if (seen.has(name)) return;
|
|
774
|
-
seen.add(name);
|
|
775
|
-
if (this.isInstalled(name)) return;
|
|
776
|
-
const def = this.findInRegistry(name);
|
|
777
|
-
if (!def) {
|
|
778
|
-
notFound.push(name);
|
|
779
|
-
return;
|
|
780
|
-
}
|
|
781
|
-
for (const dep of def.depends ?? []) resolve(dep, seen);
|
|
782
|
-
if (!toInstall.find((p) => p.name === def.name)) {
|
|
783
|
-
toInstall.push(def);
|
|
784
|
-
}
|
|
785
|
-
};
|
|
786
|
-
|
|
787
|
-
for (const n of names) resolve(n);
|
|
788
|
-
|
|
789
|
-
if (notFound.length > 0) {
|
|
790
|
-
return {
|
|
791
|
-
output: `E: Unable to locate package ${notFound.join(", ")}`,
|
|
792
|
-
exitCode: 100,
|
|
793
|
-
};
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
if (toInstall.length === 0) {
|
|
797
|
-
return {
|
|
798
|
-
output: names
|
|
799
|
-
.map((n) => `${n} is already the newest version.`)
|
|
800
|
-
.join("\n"),
|
|
801
|
-
exitCode: 0,
|
|
802
|
-
};
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
const totalKb = toInstall.reduce(
|
|
806
|
-
(acc, p) => acc + (p.installedSizeKb ?? 0),
|
|
807
|
-
0,
|
|
808
|
-
);
|
|
809
|
-
|
|
810
|
-
if (!opts.quiet) {
|
|
811
|
-
lines.push(
|
|
812
|
-
`Reading package lists... Done`,
|
|
813
|
-
`Building dependency tree... Done`,
|
|
814
|
-
`Reading state information... Done`,
|
|
815
|
-
`The following NEW packages will be installed:`,
|
|
816
|
-
` ${toInstall.map((p) => p.name).join(" ")}`,
|
|
817
|
-
`0 upgraded, ${toInstall.length} newly installed, 0 to remove and 0 not upgraded.`,
|
|
818
|
-
`Need to get 0 B/${totalKb} kB of archives.`,
|
|
819
|
-
`After this operation, ${totalKb} kB of additional disk space will be used.`,
|
|
820
|
-
``,
|
|
821
|
-
);
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
for (const def of toInstall) {
|
|
825
|
-
if (!opts.quiet) {
|
|
826
|
-
lines.push(`Selecting previously unselected package ${def.name}.`);
|
|
827
|
-
lines.push(
|
|
828
|
-
`(Reading database ... 12345 files and directories currently installed.)`,
|
|
829
|
-
);
|
|
830
|
-
lines.push(
|
|
831
|
-
`Preparing to unpack .../archives/${def.name}_${def.version}_amd64.deb ...`,
|
|
832
|
-
);
|
|
833
|
-
lines.push(`Unpacking ${def.name} (${def.version}) ...`);
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
// Write files
|
|
837
|
-
for (const f of def.files ?? []) {
|
|
838
|
-
const dir = f.path.slice(0, f.path.lastIndexOf("/"));
|
|
839
|
-
if (dir && !this.vfs.exists(dir)) this.vfs.mkdir(dir, 0o755);
|
|
840
|
-
this.vfs.writeFile(f.path, f.content, { mode: f.mode ?? 0o644 });
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
// Run install hook
|
|
844
|
-
def.onInstall?.(this.vfs, this.users);
|
|
845
|
-
|
|
846
|
-
if (!opts.quiet) {
|
|
847
|
-
lines.push(`Setting up ${def.name} (${def.version}) ...`);
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
const now = new Date().toISOString();
|
|
851
|
-
this.installed.set(def.name, {
|
|
852
|
-
name: def.name,
|
|
853
|
-
version: def.version,
|
|
854
|
-
architecture: def.architecture ?? "amd64",
|
|
855
|
-
maintainer: def.maintainer ?? "Fortune Maintainers <pkg@fortune.local>",
|
|
856
|
-
description: def.description,
|
|
857
|
-
section: def.section ?? "misc",
|
|
858
|
-
installedSizeKb: def.installedSizeKb ?? 0,
|
|
859
|
-
installedAt: now,
|
|
860
|
-
files: (def.files ?? []).map((f) => f.path),
|
|
861
|
-
});
|
|
862
|
-
|
|
863
|
-
this.log(`install ${def.name} ${def.version}`);
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
this.aptLog(
|
|
867
|
-
"install",
|
|
868
|
-
toInstall.map((p) => p.name),
|
|
869
|
-
);
|
|
870
|
-
this.persist();
|
|
871
|
-
|
|
872
|
-
if (!opts.quiet) {
|
|
873
|
-
lines.push(`Processing triggers for man-db (2.11.2-2) ...`);
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
return { output: lines.join("\n"), exitCode: 0 };
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
/**
|
|
880
|
-
* Removes one or more installed packages.
|
|
881
|
-
*
|
|
882
|
-
* Package files are deleted from the VFS. Config files (paths under
|
|
883
|
-
* `/etc/` or ending in `.conf`) are preserved unless `opts.purge` is set.
|
|
884
|
-
* The `onRemove` hook is called for each package.
|
|
885
|
-
*
|
|
886
|
-
* @param names Package names to remove.
|
|
887
|
-
* @param opts Removal options.
|
|
888
|
-
* @param opts.purge Also delete configuration files when `true`.
|
|
889
|
-
* @param opts.quiet Suppress progress output lines when `true`.
|
|
890
|
-
* @returns Terminal-style `output` string and exit code (`0` on success).
|
|
891
|
-
*/
|
|
892
|
-
public remove(
|
|
893
|
-
names: string[],
|
|
894
|
-
opts: { purge?: boolean; quiet?: boolean } = {},
|
|
895
|
-
): { output: string; exitCode: number } {
|
|
896
|
-
const lines: string[] = [];
|
|
897
|
-
const toRemove: InstalledPackage[] = [];
|
|
898
|
-
|
|
899
|
-
for (const name of names) {
|
|
900
|
-
const pkg = this.installed.get(name.toLowerCase());
|
|
901
|
-
if (!pkg) {
|
|
902
|
-
lines.push(`Package '${name}' is not installed, so not removed`);
|
|
903
|
-
} else {
|
|
904
|
-
toRemove.push(pkg);
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
if (toRemove.length === 0) {
|
|
909
|
-
return { output: lines.join("\n") || "Nothing to remove.", exitCode: 0 };
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
if (!opts.quiet) {
|
|
913
|
-
lines.push(
|
|
914
|
-
`Reading package lists... Done`,
|
|
915
|
-
`Building dependency tree... Done`,
|
|
916
|
-
`The following packages will be REMOVED:`,
|
|
917
|
-
` ${toRemove.map((p) => p.name).join(" ")}`,
|
|
918
|
-
`0 upgraded, 0 newly installed, ${toRemove.length} to remove and 0 not upgraded.`,
|
|
919
|
-
);
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
for (const pkg of toRemove) {
|
|
923
|
-
if (!opts.quiet) lines.push(`Removing ${pkg.name} (${pkg.version}) ...`);
|
|
924
|
-
|
|
925
|
-
// Remove files (if purge, include config files)
|
|
926
|
-
for (const filePath of pkg.files) {
|
|
927
|
-
if (
|
|
928
|
-
!opts.purge &&
|
|
929
|
-
(filePath.startsWith("/etc/") || filePath.endsWith(".conf"))
|
|
930
|
-
) {
|
|
931
|
-
continue; // keep config unless --purge
|
|
932
|
-
}
|
|
933
|
-
try {
|
|
934
|
-
if (this.vfs.exists(filePath)) this.vfs.remove(filePath);
|
|
935
|
-
} catch {}
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
// Run remove hook
|
|
939
|
-
const def = this.findInRegistry(pkg.name);
|
|
940
|
-
def?.onRemove?.(this.vfs);
|
|
941
|
-
|
|
942
|
-
this.installed.delete(pkg.name);
|
|
943
|
-
this.log(`remove ${pkg.name} ${pkg.version}`);
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
this.aptLog(
|
|
947
|
-
"remove",
|
|
948
|
-
toRemove.map((p) => p.name),
|
|
949
|
-
);
|
|
950
|
-
this.persist();
|
|
951
|
-
|
|
952
|
-
return { output: lines.join("\n"), exitCode: 0 };
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
/**
|
|
956
|
-
* Searches the registry for packages whose name or description contains
|
|
957
|
-
* the given term (case-insensitive). Equivalent to `apt-cache search`.
|
|
958
|
-
*
|
|
959
|
-
* @param term Search string.
|
|
960
|
-
* @returns Matching `PackageDefinition` entries sorted alphabetically.
|
|
961
|
-
*/
|
|
962
|
-
public search(term: string): PackageDefinition[] {
|
|
963
|
-
const t = term.toLowerCase();
|
|
964
|
-
return PACKAGE_REGISTRY.filter(
|
|
965
|
-
(p) =>
|
|
966
|
-
p.name.includes(t) ||
|
|
967
|
-
p.description.toLowerCase().includes(t) ||
|
|
968
|
-
(p.shortDesc ?? "").toLowerCase().includes(t),
|
|
969
|
-
).sort((a, b) => a.name.localeCompare(b.name));
|
|
970
|
-
}
|
|
971
|
-
|
|
972
|
-
/**
|
|
973
|
-
* Returns a dpkg-style metadata block for a package, including its
|
|
974
|
-
* install status. Equivalent to `apt-cache show` / `dpkg -s`.
|
|
975
|
-
*
|
|
976
|
-
* @param name Package name.
|
|
977
|
-
* @returns Multi-line metadata string, or `null` if not in the registry.
|
|
978
|
-
*/
|
|
979
|
-
public show(name: string): string | null {
|
|
980
|
-
const def = this.findInRegistry(name);
|
|
981
|
-
if (!def) return null;
|
|
982
|
-
const inst = this.installed.get(name);
|
|
983
|
-
return [
|
|
984
|
-
`Package: ${def.name}`,
|
|
985
|
-
`Version: ${def.version}`,
|
|
986
|
-
`Architecture: ${def.architecture ?? "amd64"}`,
|
|
987
|
-
`Maintainer: ${def.maintainer ?? "Fortune Maintainers <pkg@fortune.local>"}`,
|
|
988
|
-
`Installed-Size: ${def.installedSizeKb ?? 0}`,
|
|
989
|
-
`Depends: ${(def.depends ?? []).join(", ") || "(none)"}`,
|
|
990
|
-
`Section: ${def.section ?? "misc"}`,
|
|
991
|
-
`Priority: optional`,
|
|
992
|
-
`Description: ${def.description}`,
|
|
993
|
-
`Status: ${inst ? "install ok installed" : "install ok not-installed"}`,
|
|
994
|
-
].join("\n");
|
|
995
|
-
}
|
|
996
|
-
}
|