typescript-virtual-container 1.5.3 → 1.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/README.md +43 -23
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/SSHMimic/executor.js +23 -5
  4. package/dist/VirtualPackageManager/index.js +10 -0
  5. package/dist/commands/basename.d.ts +13 -0
  6. package/dist/commands/basename.js +45 -0
  7. package/dist/commands/file.d.ts +8 -0
  8. package/dist/commands/file.js +57 -0
  9. package/dist/commands/fun.d.ts +32 -0
  10. package/dist/commands/fun.js +172 -0
  11. package/dist/commands/ifconfig.d.ts +7 -0
  12. package/dist/commands/ifconfig.js +52 -0
  13. package/dist/commands/last.d.ts +13 -0
  14. package/dist/commands/last.js +68 -0
  15. package/dist/commands/manuals-bundle.js +598 -6
  16. package/dist/commands/registry.js +24 -2
  17. package/dist/commands/runtime.js +22 -2
  18. package/dist/commands/sh.js +5 -0
  19. package/dist/commands/tput.d.ts +13 -0
  20. package/dist/commands/tput.js +76 -0
  21. package/dist/commands/w.d.ts +7 -0
  22. package/dist/commands/w.js +38 -0
  23. package/dist/utils/expand.d.ts +12 -0
  24. package/dist/utils/expand.js +84 -0
  25. package/package.json +9 -3
  26. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -50
  27. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -31
  28. package/.github/dependabot.yml +0 -27
  29. package/.github/pull_request_template.md +0 -21
  30. package/.github/workflows/create-pull-request.yml +0 -85
  31. package/.github/workflows/publish.yml +0 -25
  32. package/.github/workflows/test-battery.yml +0 -102
  33. package/.vscode/settings.json +0 -20
  34. package/CODE_OF_CONDUCT.md +0 -39
  35. package/CONTRIBUTING.md +0 -59
  36. package/HONEYPOT.md +0 -358
  37. package/SECURITY.md +0 -33
  38. package/benchmark-results.txt +0 -40
  39. package/benchmark-virtualshell.ts +0 -88
  40. package/biome.json +0 -37
  41. package/build.js +0 -22
  42. package/builds/fortune-nyx-v1.5.3-directbash-k6.1.0.mjs +0 -1764
  43. package/builds/fortune-nyx-v1.5.3-ssh-nosftp.js +0 -1764
  44. package/builds/fortune-nyx-v1.5.3-ssh.cjs +0 -1765
  45. package/builds/fortune-nyx-v1.5.3-web.min.js +0 -17036
  46. package/bun.lock +0 -244
  47. package/docs/.nojekyll +0 -1
  48. package/docs/app.js +0 -1751
  49. package/docs/assets/hierarchy.js +0 -1
  50. package/docs/assets/highlight.css +0 -162
  51. package/docs/assets/icons.js +0 -18
  52. package/docs/assets/icons.svg +0 -1
  53. package/docs/assets/main.js +0 -60
  54. package/docs/assets/navigation.js +0 -1
  55. package/docs/assets/search.js +0 -1
  56. package/docs/assets/style.css +0 -1633
  57. package/docs/classes/HoneyPot.html +0 -31
  58. package/docs/classes/IdleManager.html +0 -162
  59. package/docs/classes/SshClient.html +0 -66
  60. package/docs/classes/VirtualFileSystem.html +0 -279
  61. package/docs/classes/VirtualPackageManager.html +0 -63
  62. package/docs/classes/VirtualSftpServer.html +0 -169
  63. package/docs/classes/VirtualShell.html +0 -285
  64. package/docs/classes/VirtualSshServer.html +0 -182
  65. package/docs/classes/VirtualUserManager.html +0 -276
  66. package/docs/demo.html +0 -82
  67. package/docs/functions/assertDiff.html +0 -6
  68. package/docs/functions/diffSnapshots.html +0 -7
  69. package/docs/functions/formatDiff.html +0 -6
  70. package/docs/functions/getArg.html +0 -13
  71. package/docs/functions/getFlag.html +0 -15
  72. package/docs/functions/ifFlag.html +0 -11
  73. package/docs/hierarchy.html +0 -1
  74. package/docs/index.html +0 -1869
  75. package/docs/interfaces/AuditLogEntry.html +0 -6
  76. package/docs/interfaces/CommandContext.html +0 -22
  77. package/docs/interfaces/CommandResult.html +0 -26
  78. package/docs/interfaces/ExecStream.html +0 -11
  79. package/docs/interfaces/HoneyPotStats.html +0 -16
  80. package/docs/interfaces/IdleManagerOptions.html +0 -7
  81. package/docs/interfaces/InstalledPackage.html +0 -20
  82. package/docs/interfaces/NanoEditorSession.html +0 -8
  83. package/docs/interfaces/PackageDefinition.html +0 -30
  84. package/docs/interfaces/PackageFile.html +0 -8
  85. package/docs/interfaces/PasswordChallenge.html +0 -16
  86. package/docs/interfaces/RemoveOptions.html +0 -4
  87. package/docs/interfaces/ShellEnv.html +0 -6
  88. package/docs/interfaces/ShellModule.html +0 -14
  89. package/docs/interfaces/ShellProperties.html +0 -14
  90. package/docs/interfaces/ShellStream.html +0 -11
  91. package/docs/interfaces/SudoChallenge.html +0 -24
  92. package/docs/interfaces/VfsBaseNode.html +0 -12
  93. package/docs/interfaces/VfsDiff.html +0 -10
  94. package/docs/interfaces/VfsDiffEntry.html +0 -6
  95. package/docs/interfaces/VfsDiffModified.html +0 -10
  96. package/docs/interfaces/VfsDirectoryNode.html +0 -15
  97. package/docs/interfaces/VfsFileNode.html +0 -17
  98. package/docs/interfaces/VfsOptions.html +0 -26
  99. package/docs/interfaces/VfsSnapshot.html +0 -3
  100. package/docs/interfaces/VfsSnapshotBaseNode.html +0 -8
  101. package/docs/interfaces/VfsSnapshotDirectoryNode.html +0 -10
  102. package/docs/interfaces/VfsSnapshotFileNode.html +0 -12
  103. package/docs/interfaces/VirtualActiveSession.html +0 -12
  104. package/docs/interfaces/VirtualSftpServerOptions.html +0 -7
  105. package/docs/interfaces/VirtualShellVfsLike.html +0 -15
  106. package/docs/interfaces/VirtualShellVfsOptions.html +0 -3
  107. package/docs/interfaces/WriteFileOptions.html +0 -6
  108. package/docs/media/LICENSE +0 -21
  109. package/docs/modules.html +0 -1
  110. package/docs/types/ArgParseOptions.html +0 -4
  111. package/docs/types/CommandMode.html +0 -2
  112. package/docs/types/CommandOutcome.html +0 -2
  113. package/docs/types/IdleState.html +0 -1
  114. package/docs/types/VfsNodeStats.html +0 -2
  115. package/docs/types/VfsNodeType.html +0 -2
  116. package/docs/types/VfsPersistenceMode.html +0 -5
  117. package/docs/types/VfsSnapshotNode.html +0 -2
  118. package/examples/README.md +0 -288
  119. package/examples/app.js +0 -1751
  120. package/examples/app.ts +0 -299
  121. package/examples/build.js +0 -27
  122. package/examples/demo.html +0 -33
  123. package/examples/honeypot-audit.ts +0 -180
  124. package/examples/honeypot-export.ts +0 -253
  125. package/examples/honeypot-quickstart.ts +0 -110
  126. package/examples/index.html +0 -82
  127. package/examples/server.js +0 -55
  128. package/polyfills/buffer.js +0 -117
  129. package/polyfills/node_child_process/index.js +0 -2
  130. package/polyfills/node_crypto/index.js +0 -167
  131. package/polyfills/node_events/index.js +0 -9
  132. package/polyfills/node_fs/index.js +0 -202
  133. package/polyfills/node_fs/promises.js +0 -4
  134. package/polyfills/node_os/index.js +0 -9
  135. package/polyfills/node_path/index.js +0 -28
  136. package/polyfills/node_vm/index.js +0 -7
  137. package/polyfills/node_zlib/index.js +0 -3
  138. package/polyfills/process.js +0 -14
  139. package/polyfills/ssh2/index.js +0 -75
  140. package/scripts/build-all.mjs +0 -226
  141. package/scripts/build-names.mjs +0 -43
  142. package/scripts/generate-manuals-bundle.mjs +0 -49
  143. package/scripts/postinstall.js +0 -42
  144. package/scripts/publish-package.sh +0 -70
  145. package/src/Honeypot/index.ts +0 -457
  146. package/src/SSHClient/index.ts +0 -270
  147. package/src/SSHMimic/exec.ts +0 -49
  148. package/src/SSHMimic/executor.ts +0 -251
  149. package/src/SSHMimic/hostKey.ts +0 -21
  150. package/src/SSHMimic/index.ts +0 -337
  151. package/src/SSHMimic/loginBanner.ts +0 -36
  152. package/src/SSHMimic/loginFormat.ts +0 -10
  153. package/src/SSHMimic/prompt.ts +0 -14
  154. package/src/SSHMimic/sftp.ts +0 -883
  155. package/src/VirtualFileSystem/binaryPack.ts +0 -258
  156. package/src/VirtualFileSystem/index.ts +0 -1193
  157. package/src/VirtualFileSystem/internalTypes.ts +0 -43
  158. package/src/VirtualFileSystem/journal.ts +0 -171
  159. package/src/VirtualFileSystem/path.ts +0 -74
  160. package/src/VirtualPackageManager/index.ts +0 -996
  161. package/src/VirtualShell/idleManager.ts +0 -137
  162. package/src/VirtualShell/index.ts +0 -475
  163. package/src/VirtualShell/shell.ts +0 -700
  164. package/src/VirtualShell/shellParser.ts +0 -285
  165. package/src/VirtualUserManager/index.ts +0 -758
  166. package/src/bun.d.ts +0 -1
  167. package/src/commands/adduser.ts +0 -103
  168. package/src/commands/alias.ts +0 -69
  169. package/src/commands/apt.ts +0 -233
  170. package/src/commands/awk.ts +0 -168
  171. package/src/commands/base64.ts +0 -29
  172. package/src/commands/cat.ts +0 -52
  173. package/src/commands/cd.ts +0 -25
  174. package/src/commands/chmod.ts +0 -85
  175. package/src/commands/clear.ts +0 -15
  176. package/src/commands/command-helpers.ts +0 -286
  177. package/src/commands/cp.ts +0 -83
  178. package/src/commands/curl.ts +0 -147
  179. package/src/commands/cut.ts +0 -36
  180. package/src/commands/date.ts +0 -30
  181. package/src/commands/declare.ts +0 -49
  182. package/src/commands/deluser.ts +0 -98
  183. package/src/commands/df.ts +0 -23
  184. package/src/commands/diff.ts +0 -43
  185. package/src/commands/dpkg.ts +0 -180
  186. package/src/commands/du.ts +0 -56
  187. package/src/commands/echo.ts +0 -58
  188. package/src/commands/env.ts +0 -23
  189. package/src/commands/exit.ts +0 -18
  190. package/src/commands/export.ts +0 -34
  191. package/src/commands/find.ts +0 -68
  192. package/src/commands/free.ts +0 -47
  193. package/src/commands/grep.ts +0 -116
  194. package/src/commands/groups.ts +0 -19
  195. package/src/commands/gzip.ts +0 -88
  196. package/src/commands/head.ts +0 -52
  197. package/src/commands/help.ts +0 -152
  198. package/src/commands/helpers.ts +0 -234
  199. package/src/commands/history.ts +0 -34
  200. package/src/commands/hostname.ts +0 -14
  201. package/src/commands/htop.ts +0 -20
  202. package/src/commands/id.ts +0 -19
  203. package/src/commands/index.ts +0 -9
  204. package/src/commands/kill.ts +0 -19
  205. package/src/commands/ln.ts +0 -71
  206. package/src/commands/ls.ts +0 -243
  207. package/src/commands/lsb-release.ts +0 -63
  208. package/src/commands/man.ts +0 -31
  209. package/src/commands/manuals/adduser.txt +0 -11
  210. package/src/commands/manuals/apt-cache.txt +0 -12
  211. package/src/commands/manuals/apt.txt +0 -20
  212. package/src/commands/manuals/awk.txt +0 -13
  213. package/src/commands/manuals/cat.txt +0 -14
  214. package/src/commands/manuals/cd.txt +0 -16
  215. package/src/commands/manuals/chmod.txt +0 -16
  216. package/src/commands/manuals/clear.txt +0 -10
  217. package/src/commands/manuals/cp.txt +0 -10
  218. package/src/commands/manuals/curl.txt +0 -20
  219. package/src/commands/manuals/date.txt +0 -14
  220. package/src/commands/manuals/declare.txt +0 -12
  221. package/src/commands/manuals/deluser.txt +0 -10
  222. package/src/commands/manuals/df.txt +0 -10
  223. package/src/commands/manuals/dpkg-query.txt +0 -11
  224. package/src/commands/manuals/dpkg.txt +0 -14
  225. package/src/commands/manuals/du.txt +0 -11
  226. package/src/commands/manuals/echo.txt +0 -11
  227. package/src/commands/manuals/false.txt +0 -10
  228. package/src/commands/manuals/find.txt +0 -11
  229. package/src/commands/manuals/free.txt +0 -12
  230. package/src/commands/manuals/grep.txt +0 -13
  231. package/src/commands/manuals/groups.txt +0 -10
  232. package/src/commands/manuals/gzip.txt +0 -11
  233. package/src/commands/manuals/head.txt +0 -10
  234. package/src/commands/manuals/help.txt +0 -11
  235. package/src/commands/manuals/history.txt +0 -11
  236. package/src/commands/manuals/hostname.txt +0 -10
  237. package/src/commands/manuals/id.txt +0 -10
  238. package/src/commands/manuals/kill.txt +0 -13
  239. package/src/commands/manuals/ls.txt +0 -20
  240. package/src/commands/manuals/lsb_release.txt +0 -14
  241. package/src/commands/manuals/mkdir.txt +0 -10
  242. package/src/commands/manuals/mv.txt +0 -10
  243. package/src/commands/manuals/nano.txt +0 -11
  244. package/src/commands/manuals/neofetch.txt +0 -10
  245. package/src/commands/manuals/node.txt +0 -13
  246. package/src/commands/manuals/npm.txt +0 -13
  247. package/src/commands/manuals/npx.txt +0 -13
  248. package/src/commands/manuals/passwd.txt +0 -11
  249. package/src/commands/manuals/ping.txt +0 -10
  250. package/src/commands/manuals/printf.txt +0 -11
  251. package/src/commands/manuals/ps.txt +0 -10
  252. package/src/commands/manuals/pwd.txt +0 -10
  253. package/src/commands/manuals/python3.txt +0 -13
  254. package/src/commands/manuals/readlink.txt +0 -10
  255. package/src/commands/manuals/return.txt +0 -10
  256. package/src/commands/manuals/rm.txt +0 -10
  257. package/src/commands/manuals/sed.txt +0 -11
  258. package/src/commands/manuals/set.txt +0 -11
  259. package/src/commands/manuals/shift.txt +0 -10
  260. package/src/commands/manuals/sleep.txt +0 -10
  261. package/src/commands/manuals/sort.txt +0 -12
  262. package/src/commands/manuals/source.txt +0 -11
  263. package/src/commands/manuals/ssh.txt +0 -11
  264. package/src/commands/manuals/stat.txt +0 -10
  265. package/src/commands/manuals/su.txt +0 -13
  266. package/src/commands/manuals/sudo.txt +0 -11
  267. package/src/commands/manuals/tail.txt +0 -10
  268. package/src/commands/manuals/tar.txt +0 -19
  269. package/src/commands/manuals/tee.txt +0 -10
  270. package/src/commands/manuals/test.txt +0 -11
  271. package/src/commands/manuals/touch.txt +0 -11
  272. package/src/commands/manuals/tr.txt +0 -10
  273. package/src/commands/manuals/trap.txt +0 -10
  274. package/src/commands/manuals/true.txt +0 -10
  275. package/src/commands/manuals/type.txt +0 -10
  276. package/src/commands/manuals/uname.txt +0 -12
  277. package/src/commands/manuals/uniq.txt +0 -12
  278. package/src/commands/manuals/unset.txt +0 -10
  279. package/src/commands/manuals/uptime.txt +0 -11
  280. package/src/commands/manuals/wc.txt +0 -12
  281. package/src/commands/manuals/wget.txt +0 -12
  282. package/src/commands/manuals/which.txt +0 -10
  283. package/src/commands/manuals/whoami.txt +0 -10
  284. package/src/commands/manuals/xargs.txt +0 -10
  285. package/src/commands/manuals-bundle.ts +0 -898
  286. package/src/commands/mkdir.ts +0 -31
  287. package/src/commands/mv.ts +0 -50
  288. package/src/commands/nano.ts +0 -38
  289. package/src/commands/neofetch.ts +0 -53
  290. package/src/commands/node.ts +0 -341
  291. package/src/commands/npm.ts +0 -132
  292. package/src/commands/passwd.ts +0 -50
  293. package/src/commands/ping.ts +0 -32
  294. package/src/commands/printf.ts +0 -129
  295. package/src/commands/ps.ts +0 -58
  296. package/src/commands/pwd.ts +0 -9
  297. package/src/commands/python.ts +0 -2229
  298. package/src/commands/read.ts +0 -46
  299. package/src/commands/registry.ts +0 -249
  300. package/src/commands/rm.ts +0 -42
  301. package/src/commands/runtime.ts +0 -421
  302. package/src/commands/sed.ts +0 -68
  303. package/src/commands/seq.ts +0 -43
  304. package/src/commands/set.ts +0 -29
  305. package/src/commands/sh.ts +0 -467
  306. package/src/commands/shift.ts +0 -63
  307. package/src/commands/sleep.ts +0 -20
  308. package/src/commands/sort.ts +0 -46
  309. package/src/commands/source.ts +0 -52
  310. package/src/commands/stat.ts +0 -61
  311. package/src/commands/su.ts +0 -72
  312. package/src/commands/sudo.ts +0 -76
  313. package/src/commands/tail.ts +0 -53
  314. package/src/commands/tar.ts +0 -102
  315. package/src/commands/tee.ts +0 -36
  316. package/src/commands/test.ts +0 -137
  317. package/src/commands/touch.ts +0 -28
  318. package/src/commands/tr.ts +0 -70
  319. package/src/commands/tree.ts +0 -20
  320. package/src/commands/true.ts +0 -27
  321. package/src/commands/type.ts +0 -48
  322. package/src/commands/uname.ts +0 -29
  323. package/src/commands/uniq.ts +0 -39
  324. package/src/commands/unset.ts +0 -17
  325. package/src/commands/uptime.ts +0 -54
  326. package/src/commands/wc.ts +0 -55
  327. package/src/commands/wget.ts +0 -148
  328. package/src/commands/which.ts +0 -37
  329. package/src/commands/who.ts +0 -25
  330. package/src/commands/whoami.ts +0 -14
  331. package/src/commands/xargs.ts +0 -31
  332. package/src/index.ts +0 -67
  333. package/src/modules/linuxRootfs.ts +0 -1961
  334. package/src/modules/neofetch.ts +0 -358
  335. package/src/modules/shellInteractive.ts +0 -57
  336. package/src/modules/shellRuntime.ts +0 -76
  337. package/src/self-standalone.ts +0 -542
  338. package/src/standalone-wo-sftp.ts +0 -38
  339. package/src/standalone.ts +0 -72
  340. package/src/types/commands.ts +0 -146
  341. package/src/types/pipeline.ts +0 -52
  342. package/src/types/streams.ts +0 -32
  343. package/src/types/tar-stream.d.ts +0 -38
  344. package/src/types/vfs.ts +0 -98
  345. package/src/utils/expand.ts +0 -491
  346. package/src/utils/perfLogger.ts +0 -72
  347. package/src/utils/tokenize.ts +0 -98
  348. package/src/utils/vfsDiff.ts +0 -275
  349. package/tests/command-helpers.test.ts +0 -116
  350. package/tests/commands-admin-net.test.ts +0 -441
  351. package/tests/commands-advanced.test.ts +0 -456
  352. package/tests/commands-core.test.ts +0 -562
  353. package/tests/commands-missing.test.ts +0 -570
  354. package/tests/commands-specific-units.test.ts +0 -327
  355. package/tests/commands-text-sys.test.ts +0 -445
  356. package/tests/expand.test.ts +0 -170
  357. package/tests/helpers.test.ts +0 -97
  358. package/tests/new-features.test.ts +0 -1036
  359. package/tests/parser-executor.test.ts +0 -37
  360. package/tests/sftp.test.ts +0 -323
  361. package/tests/ssh-exec.test.ts +0 -45
  362. package/tests/test-helper.ts +0 -79
  363. package/tests/users.test.ts +0 -86
  364. package/tsconfig.json +0 -49
  365. package/typedoc.json +0 -47
@@ -1,48 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
- import { resolveModule } from "./registry";
3
-
4
- /**
5
- * Describe how a command name would be interpreted (builtin, function, or file).
6
- * @category shell
7
- * @params ["<command...>"]
8
- */
9
- export const typeCommand: ShellModule = {
10
- name: "type",
11
- description: "Describe how a command would be interpreted",
12
- category: "shell",
13
- params: ["<command...>"],
14
- run: ({ args, shell, env }) => {
15
- if (args.length === 0)
16
- return { stderr: "type: missing argument", exitCode: 1 };
17
-
18
- const pathDirs = (env?.vars?.PATH ?? "/usr/local/bin:/usr/bin:/bin").split(
19
- ":",
20
- );
21
- const lines: string[] = [];
22
- let exitCode = 0;
23
-
24
- for (const name of args) {
25
- if (resolveModule(name)) {
26
- lines.push(`${name} is a shell builtin`);
27
- continue;
28
- }
29
-
30
- let found = false;
31
- for (const dir of pathDirs) {
32
- const full = `${dir}/${name}`;
33
- if (shell.vfs.exists(full)) {
34
- lines.push(`${name} is ${full}`);
35
- found = true;
36
- break;
37
- }
38
- }
39
-
40
- if (!found) {
41
- lines.push(`${name}: not found`);
42
- exitCode = 1;
43
- }
44
- }
45
-
46
- return { stdout: lines.join("\n"), exitCode };
47
- },
48
- };
@@ -1,29 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
- import { ifFlag } from "./command-helpers";
3
-
4
- /**
5
- * Print system information (kernel name, version, machine type).
6
- * @category system
7
- * @params ["[-a] [-s] [-r] [-m]"]
8
- */
9
- export const unameCommand: ShellModule = {
10
- name: "uname",
11
- description: "Print system information",
12
- category: "system",
13
- params: ["[-a] [-s] [-r] [-m]"],
14
- run: ({ shell, args }) => {
15
- const all = ifFlag(args, ["-a"]);
16
- const sysname = "Linux";
17
- const release = shell.properties?.kernel ?? "5.15.0";
18
- const machine = shell.properties?.arch ?? "x86_64";
19
- const hostname = shell.hostname;
20
- if (all)
21
- return {
22
- stdout: `${sysname} ${hostname} ${release} #1 SMP ${machine} GNU/Linux`,
23
- exitCode: 0,
24
- };
25
- if (ifFlag(args, ["-r"])) return { stdout: release, exitCode: 0 };
26
- if (ifFlag(args, ["-m"])) return { stdout: machine, exitCode: 0 };
27
- return { stdout: sysname, exitCode: 0 };
28
- },
29
- };
@@ -1,39 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
- import { ifFlag } from "./command-helpers";
3
-
4
- /**
5
- * Report or filter out repeated consecutive lines.
6
- * @category text
7
- * @params ["[-c] [-d] [-u] [file]"]
8
- */
9
- export const uniqCommand: ShellModule = {
10
- name: "uniq",
11
- description: "Report or filter out repeated lines",
12
- category: "text",
13
- params: ["[-c] [-d] [-u] [file]"],
14
- run: ({ args, stdin }) => {
15
- const count = ifFlag(args, ["-c"]);
16
- const dupOnly = ifFlag(args, ["-d"]);
17
- const uniqOnly = ifFlag(args, ["-u"]);
18
- const lines = (stdin ?? "").split("\n");
19
- const out: string[] = [];
20
- let i = 0;
21
- while (i < lines.length) {
22
- let j = i;
23
- while (j < lines.length && lines[j] === lines[i]) j++;
24
- const n = j - i;
25
- const line = lines[i]!;
26
- if (dupOnly && n === 1) {
27
- i = j;
28
- continue;
29
- }
30
- if (uniqOnly && n > 1) {
31
- i = j;
32
- continue;
33
- }
34
- out.push(count ? `${String(n).padStart(4)} ${line}` : line);
35
- i = j;
36
- }
37
- return { stdout: out.join("\n"), exitCode: 0 };
38
- },
39
- };
@@ -1,17 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
-
3
- /**
4
- * Remove shell variable from the environment.
5
- * @category shell
6
- * @params ["<VAR>"]
7
- */
8
- export const unsetCommand: ShellModule = {
9
- name: "unset",
10
- description: "Remove shell variable",
11
- category: "shell",
12
- params: ["<VAR>"],
13
- run: ({ args, env }) => {
14
- for (const name of args) delete env.vars[name];
15
- return { exitCode: 0 };
16
- },
17
- };
@@ -1,54 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
- import { ifFlag } from "./command-helpers";
3
-
4
- /**
5
- * Tell how long the system has been running.
6
- * @category system
7
- * @params ["[-p] [-s]"]
8
- */
9
- export const uptimeCommand: ShellModule = {
10
- name: "uptime",
11
- description: "Tell how long the system has been running",
12
- category: "system",
13
- params: ["[-p] [-s]"],
14
- run: ({ args, shell }) => {
15
- const pretty = ifFlag(args, ["-p"]);
16
- const since = ifFlag(args, ["-s"]);
17
-
18
- const uptimeSec = Math.floor((Date.now() - shell.startTime) / 1000);
19
- const days = Math.floor(uptimeSec / 86400);
20
- const hours = Math.floor((uptimeSec % 86400) / 3600);
21
- const mins = Math.floor((uptimeSec % 3600) / 60);
22
-
23
- if (since) {
24
- return {
25
- stdout: new Date(shell.startTime)
26
- .toISOString()
27
- .slice(0, 19)
28
- .replace("T", " "),
29
- exitCode: 0,
30
- };
31
- }
32
-
33
- if (pretty) {
34
- const parts: string[] = [];
35
- if (days > 0) parts.push(`${days} day${days > 1 ? "s" : ""}`);
36
- if (hours > 0) parts.push(`${hours} hour${hours > 1 ? "s" : ""}`);
37
- parts.push(`${mins} minute${mins !== 1 ? "s" : ""}`);
38
- return { stdout: `up ${parts.join(", ")}`, exitCode: 0 };
39
- }
40
-
41
- const timeStr = new Date().toTimeString().slice(0, 8);
42
- const uptimeStr =
43
- days > 0
44
- ? `${days} day${days > 1 ? "s" : ""}, ${String(hours).padStart(2)}:${String(mins).padStart(2, "0")}`
45
- : `${String(hours).padStart(2)}:${String(mins).padStart(2, "0")}`;
46
- const sessions = shell.users.listActiveSessions().length;
47
- const load = (Math.random() * 0.5).toFixed(2);
48
-
49
- return {
50
- stdout: ` ${timeStr} up ${uptimeStr}, ${sessions} user${sessions !== 1 ? "s" : ""}, load average: ${load}, ${load}, ${load}`,
51
- exitCode: 0,
52
- };
53
- },
54
- };
@@ -1,55 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
- import { ifFlag } from "./command-helpers";
3
- import { assertPathAccess, resolvePath } from "./helpers";
4
-
5
- /**
6
- * Count words, lines, and/or bytes in files or stdin.
7
- * @category text
8
- * @params ["[-l] [-w] [-c] [file...]"]
9
- */
10
- export const wcCommand: ShellModule = {
11
- name: "wc",
12
- description: "Count words/lines/bytes",
13
- category: "text",
14
- params: ["[-l] [-w] [-c] [file...]"],
15
- run: ({ authUser, shell, cwd, args, stdin }) => {
16
- const lines = ifFlag(args, ["-l"]);
17
- const words = ifFlag(args, ["-w"]);
18
- const bytes = ifFlag(args, ["-c"]);
19
- const showAll = !lines && !words && !bytes;
20
- const positionals = args.filter((a) => !a.startsWith("-"));
21
-
22
- const count = (content: string, label: string): string => {
23
- const l = content.length === 0 ? 0 : content.trim().split("\n").length;
24
- const w = content.trim().split(/\s+/).filter(Boolean).length;
25
- const c = Buffer.byteLength(content, "utf8");
26
- const parts: string[] = [];
27
- if (showAll || lines) parts.push(String(l).padStart(7));
28
- if (showAll || words) parts.push(String(w).padStart(7));
29
- if (showAll || bytes) parts.push(String(c).padStart(7));
30
- if (label) parts.push(` ${label}`);
31
- return parts.join("");
32
- };
33
-
34
- if (positionals.length === 0) {
35
- const content = stdin ?? "";
36
- return { stdout: count(content, ""), exitCode: 0 };
37
- }
38
-
39
- const results: string[] = [];
40
- for (const file of positionals) {
41
- const filePath = resolvePath(cwd, file);
42
- try {
43
- assertPathAccess(authUser, filePath, "wc");
44
- const content = shell.vfs.readFile(filePath);
45
- results.push(count(content, file));
46
- } catch {
47
- return {
48
- stderr: `wc: ${file}: No such file or directory`,
49
- exitCode: 1,
50
- };
51
- }
52
- }
53
- return { stdout: results.join("\n"), exitCode: 0 };
54
- },
55
- };
@@ -1,148 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
- import { ifFlag, parseArgs } from "./command-helpers";
3
- import { assertPathAccess, resolvePath, stripUrlFilename } from "./helpers";
4
-
5
- /**
6
- * Download files from the web (fetch-based implementation).
7
- * @category network
8
- * @params ["[options] <url>"]
9
- */
10
- export const wgetCommand: ShellModule = {
11
- name: "wget",
12
- description: "File downloader (pure fetch)",
13
- category: "network",
14
- params: ["[options] <url>"],
15
- run: async ({ authUser, cwd, args, shell }) => {
16
- const { flagsWithValues, positionals } = parseArgs(args, {
17
- flagsWithValue: [
18
- "-O",
19
- "--output-document",
20
- "-o",
21
- "--output-file",
22
- "-P",
23
- "--directory-prefix",
24
- "--tries",
25
- "--timeout",
26
- ],
27
- });
28
-
29
- if (ifFlag(args, ["-h", "--help"])) {
30
- return {
31
- stdout: [
32
- "Usage: wget [option]... [URL]...",
33
- " -O, --output-document=FILE Write to FILE ('-' for stdout)",
34
- " -P, --directory-prefix=DIR Save files in DIR",
35
- " -q, --quiet Quiet mode",
36
- " -v, --verbose Verbose output (default)",
37
- " -c, --continue Continue partial download",
38
- " --tries=N Retry N times",
39
- " --timeout=N Timeout in seconds",
40
- ].join("\n"),
41
- exitCode: 0,
42
- };
43
- }
44
-
45
- if (ifFlag(args, ["-V", "--version"])) {
46
- return {
47
- stdout: "GNU Wget 1.21.3 (virtual) built on Fortune GNU/Linux.",
48
- exitCode: 0,
49
- };
50
- }
51
-
52
- const urlWithoutProtocol = positionals[0];
53
- if (!urlWithoutProtocol) {
54
- return {
55
- stderr: "wget: missing URL\nUsage: wget [OPTION]... [URL]...",
56
- exitCode: 1,
57
- };
58
- }
59
-
60
- const url = urlWithoutProtocol.startsWith("http://") ||
61
- urlWithoutProtocol.startsWith("https://")
62
- ? urlWithoutProtocol
63
- : `http://${urlWithoutProtocol}`;
64
- if (!url)
65
- return {
66
- stderr: "wget: missing URL\nUsage: wget [OPTION]... [URL]...",
67
- exitCode: 1,
68
- };
69
-
70
- const outputArg =
71
- flagsWithValues.get("-O") ??
72
- flagsWithValues.get("--output-document") ??
73
- null;
74
- const dirPrefix =
75
- flagsWithValues.get("-P") ??
76
- flagsWithValues.get("--directory-prefix") ??
77
- null;
78
- const quiet = ifFlag(args, ["-q", "--quiet"]);
79
-
80
- // Derive target filename
81
- const filename =
82
- outputArg === "-" ? null : (outputArg ?? stripUrlFilename(url));
83
- const targetPath = filename
84
- ? resolvePath(cwd, dirPrefix ? `${dirPrefix}/${filename}` : filename)
85
- : null;
86
-
87
- if (targetPath) assertPathAccess(authUser, targetPath, "wget");
88
-
89
- const stderrLines: string[] = [];
90
- if (!quiet) {
91
- stderrLines.push(`--${new Date().toISOString()}-- ${url}`);
92
- stderrLines.push(`Resolving ${new URL(url).host}...`);
93
- stderrLines.push(`Connecting to ${new URL(url).host}...`);
94
- }
95
-
96
- let response: Response;
97
- try {
98
- response = await fetch(url, {
99
- headers: { "User-Agent": "Wget/1.21.3 (Fortune GNU/Linux)" },
100
- });
101
- } catch (err) {
102
- const msg = err instanceof Error ? err.message : String(err);
103
- stderrLines.push(`wget: unable to resolve host: ${msg}`);
104
- return { stderr: stderrLines.join("\n"), exitCode: 4 };
105
- }
106
-
107
- if (!response.ok) {
108
- stderrLines.push(`ERROR ${response.status}: ${response.statusText}`);
109
- return { stderr: stderrLines.join("\n"), exitCode: 8 };
110
- }
111
-
112
- let body: string;
113
- try {
114
- body = await response.text();
115
- } catch {
116
- return { stderr: "wget: failed to read response", exitCode: 1 };
117
- }
118
-
119
- if (!quiet) {
120
- const ct =
121
- response.headers.get("content-type") ?? "application/octet-stream";
122
- stderrLines.push(
123
- `HTTP request sent, awaiting response... ${response.status} ${response.statusText}`,
124
- );
125
- stderrLines.push(`Length: ${body.length} [${ct}]`);
126
- }
127
-
128
- // Output to stdout (pipe) or file
129
- if (outputArg === "-") {
130
- return {
131
- stdout: body,
132
- stderr: stderrLines.join("\n") || undefined,
133
- exitCode: 0,
134
- };
135
- }
136
-
137
- if (targetPath) {
138
- shell.writeFileAsUser(authUser, targetPath, body);
139
- if (!quiet)
140
- stderrLines.push(
141
- `Saving to: '${targetPath}'\n${targetPath} 100%[==================>] ${body.length} B`,
142
- );
143
- return { stderr: stderrLines.join("\n") || undefined, exitCode: 0 };
144
- }
145
-
146
- return { stdout: body, exitCode: 0 };
147
- },
148
- };
@@ -1,37 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
-
3
- export const whichCommand: ShellModule = {
4
- name: "which",
5
- description: "Locate a command in PATH",
6
- category: "shell",
7
- params: ["<command...>"],
8
- run: ({ args, shell, env }) => {
9
- if (args.length === 0)
10
- return { stderr: "which: missing argument", exitCode: 1 };
11
-
12
- const pathDirs = (env?.vars?.PATH ?? "/usr/local/bin:/usr/bin:/bin").split(
13
- ":",
14
- );
15
- const lines: string[] = [];
16
- let anyMissing = false;
17
-
18
- for (const name of args) {
19
- let found = false;
20
- for (const dir of pathDirs) {
21
- const full = `${dir}/${name}`;
22
- if (shell.vfs.exists(full)) {
23
- const st = shell.vfs.stat(full);
24
- if (st.type === "file") {
25
- lines.push(full);
26
- found = true;
27
- break;
28
- }
29
- }
30
- }
31
- if (!found) anyMissing = true;
32
- }
33
-
34
- if (lines.length === 0) return { exitCode: 1 };
35
- return { stdout: lines.join("\n"), exitCode: anyMissing ? 1 : 0 };
36
- },
37
- };
@@ -1,25 +0,0 @@
1
- import { formatLoginDate } from "../SSHMimic/loginFormat";
2
- import type { ShellModule } from "../types/commands";
3
-
4
- /**
5
- * Show active user sessions.
6
- * @category system
7
- * @params []
8
- */
9
- export const whoCommand: ShellModule = {
10
- name: "who",
11
- description: "Show active sessions",
12
- category: "system",
13
- params: [],
14
- run: ({ shell }) => {
15
- const lines = shell.users.listActiveSessions().map((session) => {
16
- const loginAt = new Date(session.startedAt);
17
- const displayDate = Number.isNaN(loginAt.getTime())
18
- ? session.startedAt
19
- : formatLoginDate(loginAt);
20
- return `${session.username} ${session.tty} ${displayDate} (${session.remoteAddress || "unknown"})`;
21
- });
22
-
23
- return { stdout: lines.join("\n"), exitCode: 0 };
24
- },
25
- };
@@ -1,14 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
-
3
- /**
4
- * Print the current user name.
5
- * @category system
6
- * @params []
7
- */
8
- export const whoamiCommand: ShellModule = {
9
- name: "whoami",
10
- description: "Print current user",
11
- category: "system",
12
- params: [],
13
- run: ({ authUser }) => ({ stdout: authUser, exitCode: 0 }),
14
- };
@@ -1,31 +0,0 @@
1
- import type { ShellModule } from "../types/commands";
2
- import { runCommand } from "./runtime";
3
-
4
- /**
5
- * Build and execute commands from stdin arguments.
6
- * @category text
7
- * @params ["[command] [args...]"]
8
- */
9
- export const xargsCommand: ShellModule = {
10
- name: "xargs",
11
- description: "Build and execute command lines from stdin",
12
- category: "text",
13
- params: ["[command] [args...]"],
14
- run: async ({ authUser, hostname, mode, cwd, args, stdin, shell, env }) => {
15
- const baseCmd = args[0] ?? "echo";
16
- const extraArgs = args.slice(1);
17
- const items = (stdin ?? "").trim().split(/\s+/).filter(Boolean);
18
- if (items.length === 0) return { exitCode: 0 };
19
- const fullCmd = [baseCmd, ...extraArgs, ...items].join(" ");
20
- return runCommand(
21
- fullCmd,
22
- authUser,
23
- hostname,
24
- mode,
25
- cwd,
26
- shell,
27
- undefined,
28
- env,
29
- );
30
- },
31
- };
package/src/index.ts DELETED
@@ -1,67 +0,0 @@
1
- export { HoneyPot } from "./Honeypot/index";
2
- export { SshClient } from "./SSHClient/index";
3
- export { SftpMimic as VirtualSftpServer, SshMimic as VirtualSshServer } from "./SSHMimic/index";
4
- export type { SftpMimicOptions as VirtualSftpServerOptions } from "./SSHMimic/sftp";
5
- export { default as VirtualFileSystem } from "./VirtualFileSystem/index";
6
- export { VirtualPackageManager } from "./VirtualPackageManager/index";
7
- export { VirtualShell } from "./VirtualShell/index";
8
- export { VirtualUserManager } from "./VirtualUserManager/index";
9
- export type { VirtualActiveSession } from "./VirtualUserManager/index";
10
- export { IdleManager } from "./VirtualShell/idleManager";
11
- export type { IdleManagerOptions, IdleState } from "./VirtualShell/idleManager";
12
-
13
- export type {
14
- AuditLogEntry,
15
- HoneyPotStats
16
- } from "./Honeypot/index";
17
- export type {
18
- CommandContext,
19
- CommandMode,
20
- CommandOutcome,
21
- CommandResult,
22
- NanoEditorSession,
23
- PasswordChallenge,
24
- ShellEnv,
25
- ShellModule,
26
- SudoChallenge
27
- } from "./types/commands";
28
- export type { ExecStream, ShellStream } from "./types/streams";
29
- export type {
30
- RemoveOptions,
31
- VfsBaseNode,
32
- VfsDirectoryNode,
33
- VfsFileNode,
34
- VfsNodeStats,
35
- VfsNodeType,
36
- VfsSnapshot,
37
- VfsSnapshotBaseNode,
38
- VfsSnapshotDirectoryNode,
39
- VfsSnapshotFileNode,
40
- VfsSnapshotNode,
41
- WriteFileOptions
42
- } from "./types/vfs";
43
- export type { VfsOptions, VfsPersistenceMode } from "./VirtualFileSystem/index";
44
- export type { ShellProperties, VirtualShellVfsLike, VirtualShellVfsOptions } from "./VirtualShell/index";
45
-
46
- export type {
47
- InstalledPackage, PackageDefinition,
48
- PackageFile
49
- } from "./VirtualPackageManager/index";
50
-
51
- export {
52
- assertDiff, diffSnapshots,
53
- formatDiff
54
- } from "./utils/vfsDiff";
55
- export type {
56
- VfsDiff,
57
- VfsDiffEntry,
58
- VfsDiffModified
59
- } from "./utils/vfsDiff";
60
-
61
- export {
62
- getArg,
63
- getFlag,
64
- ifFlag
65
- } from "./commands/command-helpers";
66
- export type { ArgParseOptions } from "./commands/command-helpers";
67
-