441 lines
13 KiB
JavaScript
441 lines
13 KiB
JavaScript
import test from 'brittle'
|
|
import b4a from 'b4a'
|
|
import Hyperdrive from 'hyperdrive'
|
|
import Corestore from 'corestore'
|
|
import { mkdirSync, rmSync } from 'node:fs'
|
|
import { readFile, readdir } from 'node:fs/promises'
|
|
import path from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
import { createRequire } from 'node:module'
|
|
import { PassThrough } from 'node:stream'
|
|
import { XTERM_CLEAR_SCROLLBACK_AND_VIEWPORT } from '../lib/cli/terminal-escapes.js'
|
|
import { runKernelFromSource, runBinCommand } from '../lib/boot/kernel-runner.js'
|
|
import { createGitFsFromVfs } from '../lib/vfs/git-fs-adapter.js'
|
|
import { runGitCli } from '../lib/tools/git-cli.js'
|
|
import {
|
|
createStreamLineReader,
|
|
sanitizeInteractiveShellLine
|
|
} from '../lib/cli/cli-readline.js'
|
|
import {
|
|
createVfs,
|
|
BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE
|
|
} from '../lib/vfs/vfs.js'
|
|
import { parseHdmsPairArgv } from '../lib/p2p/hdms-cli-argv.js'
|
|
import hcCrypto from 'hypercore-crypto'
|
|
import idEnc from 'hypercore-id-encoding'
|
|
import {
|
|
decodeRwShareOffer,
|
|
decodeShareOffer,
|
|
HDMS_AUTOPASS_SHARE_KEY,
|
|
HDMS_AUTOPASS_SHARE_RW_KEY,
|
|
normalizeWriterSecretHex
|
|
} from '../lib/p2p/hdms-share-offer.js'
|
|
import { buildBareOsHypercorePackHrpcLifecycleProcJson } from '../lib/proc/bare-os-proc-hypercore-pack-hrpc-lifecycle.js'
|
|
import { buildBareOsPearCorestoreHrpcProcJson } from '../lib/proc/bare-os-proc-pear-corestore-hrpc.js'
|
|
import { buildBareOsPearInspectLoggerTlsProcJson } from '../lib/proc/bare-os-proc-pear-inspect-logger-tls.js'
|
|
import { buildBareOsBareRuntimeProtoMuxProcJson } from '../lib/proc/bare-os-proc-bare-runtime-proto-mux.js'
|
|
import { buildBareOsBootGraphProcJson } from '../lib/boot/bare-os-boot-graph-proc.js'
|
|
import { pathnameExpandShellWord } from '../lib/shell/shell-glob.js'
|
|
import { createBareOsIpc } from '../lib/tools/bare-os-ipc.js'
|
|
import { BareOsSwarmConnectionManager } from '../lib/p2p/bare-os-swarm-connection-manager.js'
|
|
import {
|
|
createBareOsLifecycleStateMachine,
|
|
runTransactionalLifecycleHooks
|
|
} from '../lib/host/bare-os-lifecycle-manager.js'
|
|
import {
|
|
bareOsRegisterCorestoreSuspendResumeHooks,
|
|
bareOsInstallCorestoreSuspendResumeHooks
|
|
} from '../lib/host/corestore-host-lifecycle.js'
|
|
import { bareOsFindOrphanProcessRows } from '../lib/proc/bare-os-process-table.js'
|
|
import {
|
|
topologicalOrderKernelExtensions,
|
|
resolveKernelExtensionsFull
|
|
} from '../lib/boot/kernel-extension-resolver.js'
|
|
import { createBareOsProtomuxAliasRegistry } from '../lib/p2p/bare-os-protomux-alias-registry.js'
|
|
import { bareOsHttpUrlAllowed } from '../lib/security/bare-os-http-policy.js'
|
|
import {
|
|
bareOsParseBareAclText,
|
|
bareOsAclDeniesSubject
|
|
} from '../lib/vfs/bare-os-vfs-acl-enforce.js'
|
|
import { raceWithAbortAndTimeout } from '../lib/security/bare-os-abort.js'
|
|
import {
|
|
tokenize,
|
|
expandWord,
|
|
execShellLine,
|
|
expandArgvAliases,
|
|
defaultShellAliases,
|
|
loadBarerc,
|
|
BARERC_SKELETON,
|
|
splitTokensBySemicolon,
|
|
splitTokensByAndOr,
|
|
bareOsShellAstSnapshot,
|
|
planShellRedirections,
|
|
buildShellExecutionGraph,
|
|
dispatchShellTrapSignal,
|
|
BARE_OS_EXIT_STATUS_ENV,
|
|
syncBareOsExitStatusEnv,
|
|
getBareOsPipelineLimits,
|
|
DEFAULT_PIPELINE_MAX_STAGES,
|
|
} from '../lib/shell/shell.js'
|
|
import { tokenizeBareShellLineDetailed } from '../lib/shell/shell-tokenizer.js'
|
|
import { decodeBareOsDollarQuote } from '../lib/shell/shell-lex.js'
|
|
import {
|
|
applyBareOsThemeFromEnv,
|
|
bareOsListThemeNames
|
|
} from '../lib/cli/bare-os-theme-presets.js'
|
|
import {
|
|
bareParseLsColors,
|
|
bareSerializeLsColors,
|
|
bareLsColorOpenSgrFromMap,
|
|
bareDefaultDircolorsDatabase,
|
|
bareParseDircolorsDatabase
|
|
} from 'bare-os-lscolors'
|
|
import { BARE_OS_CTX_API_VERSION } from '../lib/ctx/bare-os-ctx-api.js'
|
|
import { buildBareOsRuntimeCaps } from '../lib/ctx/bare-os-runtime-caps.js'
|
|
import {
|
|
bareOsBareModulesEnabled,
|
|
bareOsBareModuleManifestEmbeddedRef,
|
|
buildBareCtxObjectFromHost,
|
|
buildPearCtxObjectFromHost,
|
|
loadBareModuleManifest,
|
|
maybeMergeBareFromDrive
|
|
} from '../lib/ctx/bare-os-ctx-bare.js'
|
|
import { maybeBareOsBuildBinManifest } from '../lib/tools/bare-os-bin-index.js'
|
|
import {
|
|
createFishReadLine,
|
|
fuzzyMatch,
|
|
stripAnsi,
|
|
parseHistoryFile,
|
|
formatHistoryFile,
|
|
dedupeConsecutiveHistory,
|
|
searchHistoryEntries,
|
|
shouldPersistShellHistoryCommand,
|
|
scrubShellHistoryEntries,
|
|
SHELL_BUILTINS,
|
|
resolveShellPromptHookSegment
|
|
} from '../lib/cli/fish-readline.js'
|
|
import {
|
|
parseCompletionContext,
|
|
rankCompletionItems,
|
|
suggestGhostFromHistory,
|
|
suggestGhostFromFs,
|
|
ghostReplaceCurrentWord,
|
|
longestCommonCompletionPrefix,
|
|
completeLine,
|
|
levenshtein
|
|
} from '../lib/cli/completion-engine.js'
|
|
import {
|
|
fieldMatches,
|
|
dowFieldMatches,
|
|
parseCronLine,
|
|
jobMatchesDate
|
|
} from '../lib/initd/bare-cron.js'
|
|
import '../lib/services/bare-openssh.js'
|
|
import {
|
|
bareInitdReadinessSnapshot,
|
|
bareInitdShutdownActiveUnitsReverse,
|
|
getBareServiceRuntime,
|
|
registerBareInitdDisposer,
|
|
registerKernelShutdownHook,
|
|
runKernelShutdownHooks,
|
|
startBareInitd,
|
|
stopBareInitd,
|
|
getLastBareInitdDagSnapshotJson
|
|
} from '../lib/initd/bare-initd.js'
|
|
import {
|
|
appendVarLog,
|
|
ensureBareOsVarLogTree,
|
|
KERNEL_CONSOLE_LOG,
|
|
BOOT_LOG
|
|
} from '../lib/vfs/bare-os-var-log.js'
|
|
import {
|
|
bareOsKernelMetricsReset,
|
|
bareOsKernelMetricsSnapshot
|
|
} from '../lib/boot/bare-os-kernel-metrics.js'
|
|
import { parseUnitDropInText } from '../lib/initd/bare-initd-user.js'
|
|
import {
|
|
bareOsHyperswarmOptsFromEnv,
|
|
bareOsBootJoinPeerHexFromEnv
|
|
} from '../lib/p2p/swarm-opts.js'
|
|
import {
|
|
bareOsBootInitPrefetchEnabled,
|
|
bareOsBootWarmBinDownloadDiffEnabled
|
|
} from '../lib/boot/boot-prefetch.js'
|
|
import { bareOsProcessTableSnapshot } from '../lib/proc/bare-os-process-table.js'
|
|
import { buildBareOsSyscallsProcJson } from '../lib/posix/bare-os-syscalls-proc-json.js'
|
|
import {
|
|
bareOsParseSendmsgScmRights,
|
|
wantPosixSocketScmRights
|
|
} from '../lib/posix/bare-os-socket-scm-rights.js'
|
|
import {
|
|
parseBareOsHrpcAllowlistJson,
|
|
bareOsHrpcAllowlistDeniesRoute
|
|
} from '../lib/tools/bare-os-hrpc-allowlist.js'
|
|
import { buildBareOsProtomuxExtensionsProcJson } from '../lib/p2p/bare-os-protomux-extensions-proc.js'
|
|
import { createBareOsDiskOsBridge } from '../lib/host/bare-os-disk-os-bridge.js'
|
|
import { buildBareOsReplicationLiveSketch } from '../lib/p2p/bare-os-replication-proc-live.js'
|
|
import {
|
|
evaluateBareOsPeerAdmission,
|
|
bareOsFormatPeerAdmissionAuditEvent,
|
|
bareOsPeerAdmissionAuditRateAllow
|
|
} from '../lib/p2p/bare-os-peer-admission.js'
|
|
import {
|
|
parseDelegateAllowSet,
|
|
isDelegateKindAllowed
|
|
} from '../lib/host/host-delegate-registry.js'
|
|
import {
|
|
bareOsAuditAppend,
|
|
bareOsAuditVerifyRows
|
|
} from '../lib/security/bare-os-audit-chain.js'
|
|
import { bareOsDrainFcntlLockWaiters } from '../lib/posix/bare-os-fcntl-cooperative-lock.js'
|
|
import { buildBareOsReplicationOperatorSurfaceProcJson } from '../lib/proc/bare-os-proc-replication-operator-surface.js'
|
|
import {
|
|
DEFAULT_CURL_USER_AGENT,
|
|
DEFAULT_WGET_USER_AGENT
|
|
} from '../lib/tools/http-fetch-url.js'
|
|
import { filenameFromContentDisposition } from '../lib/tools/curl-cli.js'
|
|
import { encodeUstarHeader, runTarCli } from '../lib/tools/tar-cli.js'
|
|
|
|
|
|
export {
|
|
test,
|
|
b4a,
|
|
Hyperdrive,
|
|
Corestore,
|
|
mkdirSync,
|
|
rmSync,
|
|
readFile,
|
|
readdir,
|
|
path,
|
|
fileURLToPath,
|
|
PassThrough,
|
|
XTERM_CLEAR_SCROLLBACK_AND_VIEWPORT,
|
|
runKernelFromSource,
|
|
runBinCommand,
|
|
createGitFsFromVfs,
|
|
runGitCli,
|
|
createStreamLineReader,
|
|
sanitizeInteractiveShellLine,
|
|
createVfs,
|
|
BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE,
|
|
parseHdmsPairArgv,
|
|
hcCrypto,
|
|
idEnc,
|
|
decodeRwShareOffer,
|
|
decodeShareOffer,
|
|
HDMS_AUTOPASS_SHARE_KEY,
|
|
HDMS_AUTOPASS_SHARE_RW_KEY,
|
|
normalizeWriterSecretHex,
|
|
buildBareOsHypercorePackHrpcLifecycleProcJson,
|
|
buildBareOsPearCorestoreHrpcProcJson,
|
|
buildBareOsPearInspectLoggerTlsProcJson,
|
|
buildBareOsBareRuntimeProtoMuxProcJson,
|
|
buildBareOsBootGraphProcJson,
|
|
pathnameExpandShellWord,
|
|
createBareOsIpc,
|
|
BareOsSwarmConnectionManager,
|
|
createBareOsLifecycleStateMachine,
|
|
runTransactionalLifecycleHooks,
|
|
bareOsRegisterCorestoreSuspendResumeHooks,
|
|
bareOsInstallCorestoreSuspendResumeHooks,
|
|
bareOsFindOrphanProcessRows,
|
|
topologicalOrderKernelExtensions,
|
|
resolveKernelExtensionsFull,
|
|
createBareOsProtomuxAliasRegistry,
|
|
bareOsHttpUrlAllowed,
|
|
bareOsParseBareAclText,
|
|
bareOsAclDeniesSubject,
|
|
raceWithAbortAndTimeout,
|
|
tokenize,
|
|
expandWord,
|
|
execShellLine,
|
|
expandArgvAliases,
|
|
defaultShellAliases,
|
|
loadBarerc,
|
|
BARERC_SKELETON,
|
|
splitTokensBySemicolon,
|
|
splitTokensByAndOr,
|
|
bareOsShellAstSnapshot,
|
|
planShellRedirections,
|
|
buildShellExecutionGraph,
|
|
dispatchShellTrapSignal,
|
|
BARE_OS_EXIT_STATUS_ENV,
|
|
syncBareOsExitStatusEnv,
|
|
getBareOsPipelineLimits,
|
|
DEFAULT_PIPELINE_MAX_STAGES,
|
|
tokenizeBareShellLineDetailed,
|
|
decodeBareOsDollarQuote,
|
|
applyBareOsThemeFromEnv,
|
|
bareOsListThemeNames,
|
|
bareParseLsColors,
|
|
bareSerializeLsColors,
|
|
bareLsColorOpenSgrFromMap,
|
|
bareDefaultDircolorsDatabase,
|
|
bareParseDircolorsDatabase,
|
|
BARE_OS_CTX_API_VERSION,
|
|
buildBareOsRuntimeCaps,
|
|
bareOsBareModulesEnabled,
|
|
bareOsBareModuleManifestEmbeddedRef,
|
|
buildBareCtxObjectFromHost,
|
|
buildPearCtxObjectFromHost,
|
|
loadBareModuleManifest,
|
|
maybeMergeBareFromDrive,
|
|
maybeBareOsBuildBinManifest,
|
|
createFishReadLine,
|
|
fuzzyMatch,
|
|
stripAnsi,
|
|
parseHistoryFile,
|
|
formatHistoryFile,
|
|
dedupeConsecutiveHistory,
|
|
searchHistoryEntries,
|
|
shouldPersistShellHistoryCommand,
|
|
scrubShellHistoryEntries,
|
|
SHELL_BUILTINS,
|
|
resolveShellPromptHookSegment,
|
|
parseCompletionContext,
|
|
rankCompletionItems,
|
|
suggestGhostFromHistory,
|
|
suggestGhostFromFs,
|
|
ghostReplaceCurrentWord,
|
|
longestCommonCompletionPrefix,
|
|
completeLine,
|
|
levenshtein,
|
|
fieldMatches,
|
|
dowFieldMatches,
|
|
parseCronLine,
|
|
jobMatchesDate,
|
|
bareInitdReadinessSnapshot,
|
|
bareInitdShutdownActiveUnitsReverse,
|
|
getBareServiceRuntime,
|
|
registerBareInitdDisposer,
|
|
registerKernelShutdownHook,
|
|
runKernelShutdownHooks,
|
|
startBareInitd,
|
|
stopBareInitd,
|
|
getLastBareInitdDagSnapshotJson,
|
|
appendVarLog,
|
|
ensureBareOsVarLogTree,
|
|
KERNEL_CONSOLE_LOG,
|
|
BOOT_LOG,
|
|
bareOsKernelMetricsReset,
|
|
bareOsKernelMetricsSnapshot,
|
|
parseUnitDropInText,
|
|
bareOsHyperswarmOptsFromEnv,
|
|
bareOsBootJoinPeerHexFromEnv,
|
|
bareOsBootInitPrefetchEnabled,
|
|
bareOsBootWarmBinDownloadDiffEnabled,
|
|
bareOsProcessTableSnapshot,
|
|
buildBareOsSyscallsProcJson,
|
|
bareOsParseSendmsgScmRights,
|
|
wantPosixSocketScmRights,
|
|
parseBareOsHrpcAllowlistJson,
|
|
bareOsHrpcAllowlistDeniesRoute,
|
|
buildBareOsProtomuxExtensionsProcJson,
|
|
createBareOsDiskOsBridge,
|
|
buildBareOsReplicationLiveSketch,
|
|
evaluateBareOsPeerAdmission,
|
|
bareOsFormatPeerAdmissionAuditEvent,
|
|
bareOsPeerAdmissionAuditRateAllow,
|
|
parseDelegateAllowSet,
|
|
isDelegateKindAllowed,
|
|
bareOsAuditAppend,
|
|
bareOsAuditVerifyRows,
|
|
bareOsDrainFcntlLockWaiters,
|
|
buildBareOsReplicationOperatorSurfaceProcJson,
|
|
DEFAULT_CURL_USER_AGENT,
|
|
DEFAULT_WGET_USER_AGENT,
|
|
filenameFromContentDisposition,
|
|
encodeUstarHeader,
|
|
runTarCli
|
|
}
|
|
|
|
/** bare-ssh2 needs Bare `require.addon` (bare-crypto); skip auto-start in brittle-node. */
|
|
if (
|
|
typeof process !== 'undefined' &&
|
|
process.env &&
|
|
process.env.BARE_OS_INITD_DISABLED === undefined
|
|
) {
|
|
process.env.BARE_OS_INITD_DISABLED = 'bare-openssh'
|
|
}
|
|
|
|
export const __dirname = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
|
|
export const require = createRequire(path.join(__dirname, 'package.json'))
|
|
export const TAR_BLK = 512
|
|
|
|
/** @param {Uint8Array[]} parts */
|
|
export function concatTarParts(parts) {
|
|
let n = 0
|
|
for (const p of parts) n += p.length
|
|
const out = new Uint8Array(n)
|
|
let o = 0
|
|
for (const p of parts) {
|
|
out.set(p, o)
|
|
o += p.length
|
|
}
|
|
return out
|
|
}
|
|
|
|
export function headerFromInit(init, name) {
|
|
if (!init?.headers) return undefined
|
|
const h = init.headers
|
|
if (typeof h.get === 'function') return h.get(name)
|
|
return undefined
|
|
}
|
|
|
|
export function testCorestoreDir(name) {
|
|
const dir = path.join(
|
|
__dirname,
|
|
'.test-data',
|
|
name + '-' + process.pid + '-' + Math.random().toString(36).slice(2)
|
|
)
|
|
mkdirSync(path.dirname(dir), { recursive: true })
|
|
return dir
|
|
}
|
|
|
|
export function testCtx(drive, personal, env) {
|
|
const shellEnv = {
|
|
HOME: '/home/user',
|
|
PATH: '/bin',
|
|
USER: 'user',
|
|
UID: '1000',
|
|
GID: '1000',
|
|
PWD: '/home/user',
|
|
BARE_OS_EXIT_STATUS: '0',
|
|
BARE_OS_SSH_LISTEN_PORT: '0',
|
|
...env
|
|
}
|
|
const bareOsIpc = createBareOsIpc()
|
|
const vfs = createVfs(drive, personal, shellEnv, null, { bareOsIpc })
|
|
const ctx = {
|
|
drive,
|
|
personalDrive: personal,
|
|
vfs,
|
|
bareOsIpc,
|
|
env: shellEnv,
|
|
console,
|
|
b4a,
|
|
async bareOsApplyTheme() {
|
|
return applyBareOsThemeFromEnv(this)
|
|
},
|
|
bareOsListThemes() {
|
|
return bareOsListThemeNames()
|
|
}
|
|
}
|
|
return ctx
|
|
}
|
|
|
|
/** Personal-drive path backing logical `/home/<seg>/…` (matches `vfs.js`). */
|
|
export function personalHomeBacking(homePath, rel = '') {
|
|
const seg = homePath.replace(/^\/home\//, '').split('/')[0] || 'user'
|
|
const r = String(rel).replace(/^\//, '')
|
|
return r ? `/.bare-os/home/${seg}/${r}` : `/.bare-os/home/${seg}`
|
|
}
|
|
|
|
/** Built `/bin/<name>` body from the repo kernel tree. */
|
|
export async function readBuiltBin(name) {
|
|
const fs = await import('node:fs/promises')
|
|
const p = path.join(__dirname, '../../kernel/bin', name)
|
|
return fs.readFile(p, 'utf8')
|
|
}
|
|
|