Files
bare-operating-system/packages/bare-os-seeder/kernel/bin/getconf
T
Raven Scott 0d7b27bea8 feat(booter): OpenMetrics proc export, protomux wire JSON, audit batch API, and doc sync
Expose /proc/bare_os/metrics.prom (kernel counter OpenMetrics) and
/proc/bare_os/protomux.json (alias registry snapshot). Extend VFS routing,
readdir, pseudo watch, and bare_os_proc_index to schema 8; restore flat
/proc entries for syscalls and process_table with sort order matching
tests. Add ctx.bareOsAuditLogAppendBatch and bump BARE_OS_CTX_API_VERSION
to 1.30.0 with d.ts and compatibility-matrix updates.
Harden swarm peer ban backoff with jitter on the exponential window.
Refresh conformance matrix, environment appendix, booter package doc, and
handbook chapters for proc paths, param expansion V3, vault at rest, and
baretop snapshot keys. Align baretop-snapshot with bareOsReadBareTopSnapshot.
2026-04-04 19:23:06 -04:00

174 lines
5.2 KiB
Plaintext

/* BARE_OS_BIN_API 1.0.0 — bump when staged /bin script semantics change (see developer guide). */
/** Shared helpers for drive-resident /bin scripts (prepended before each command). */
function bareStdin(ctx) {
return typeof ctx.shellStdin === 'string' ? ctx.shellStdin : ''
}
/** @param {number} mode @param {'file' | 'directory' | 'symlink'} type */
function bareFormatModeString(mode, type) {
const typeChar = type === 'directory' ? 'd' : type === 'symlink' ? 'l' : '-'
const perm = mode & 0o777
const r = (bit) => (perm & bit ? 'r' : '-')
const w = (bit) => (perm & bit ? 'w' : '-')
const x = (bit) => (perm & bit ? 'x' : '-')
return (
typeChar +
r(0o400) +
w(0o200) +
x(0o100) +
r(0o040) +
w(0o020) +
x(0o010) +
r(0o004) +
w(0o002) +
x(0o001)
)
}
/** @param {number} mtimeMs @param {number} [nowMs] */
function bareFormatLsMtime(mtimeMs, nowMs) {
const now = nowMs != null ? nowMs : Date.now()
const d = new Date(mtimeMs)
const months = [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec'
]
const mon = months[d.getMonth()]
const day = String(d.getDate()).padStart(2, ' ')
const sixMo = 180 * 24 * 3600 * 1000
if (Math.abs(now - mtimeMs) > sixMo) {
const yr = String(d.getFullYear()).padStart(4, ' ')
return mon + ' ' + day + ' ' + yr
}
const hh = String(d.getHours()).padStart(2, '0')
const mm = String(d.getMinutes()).padStart(2, '0')
return mon + ' ' + day + ' ' + hh + ':' + mm
}
/** @param {number} size */
function barePosixBlocks(size) {
return Math.ceil(Number(size) / 512) || 0
}
/**
* Raw stdout for NUL/binary when **`process.stdout.write`** is missing.
* If **`ctx.bareOsBinWrite(Uint8Array|string)`** is set (tests / host), use it.
* @param {Record<string, unknown>} ctx
* @param {string | Uint8Array} chunk
* @returns {boolean}
*/
function bareOsEmitRaw(ctx, chunk) {
if (typeof ctx.bareOsBinWrite === 'function') {
const b4 = ctx.b4a
const u8 =
typeof chunk === 'string'
? b4 && typeof b4.from === 'function'
? b4.from(chunk)
: new TextEncoder().encode(chunk)
: chunk
ctx.bareOsBinWrite(u8 instanceof Uint8Array ? u8 : new Uint8Array(u8))
return true
}
const w = globalThis.process?.stdout?.write
if (typeof w === 'function') {
w.call(globalThis.process.stdout, chunk)
return true
}
return false
}
/**
* Subset of POSIX.1-2017 getconf — fixed values for Bare OS (no host sysconf).
* Unknown names exit with status 1 (matches common getconf for invalid var).
*/
const CONF = {
PATH_MAX: '4096',
NAME_MAX: '255',
/** POSIX minimum for ARG_MAX; Bare uses a conservative cap for runBinCommand argv. */
_POSIX_ARG_MAX: '4096',
ARG_MAX: '262144',
LINE_MAX: '2048',
/** POSIX.1-2008 */
_POSIX_VERSION: '200809',
_POSIX2_VERSION: '200809',
NGROUPS_MAX: '32',
OPEN_MAX: '256',
STREAM_MAX: '256',
TZNAME_MAX: '32',
_POSIX_CHOWN_RESTRICTED: '1',
_POSIX_NO_TRUNC: '1',
_POSIX_VDISABLE: '0',
_POSIX_JOB_CONTROL: '0',
_POSIX_SAVED_IDS: '0',
/** Bare shell line length (reasonable REPL limit, not a hard kernel cap). */
BARE_OS_INPUT_LINE_MAX: '8192',
/** Defaults for simulated pipelines (override with BARE_OS_PIPELINE_* env); see handbook §3. */
BARE_OS_PIPELINE_MAX_STAGES: '32',
BARE_OS_PIPELINE_MAX_BYTES: '2097152',
BARE_OS_PIPELINE_MAX_LINES: '50000',
/** Default cap for find -exec/-ok invocations per run (override with env). */
BARE_OS_FIND_EXEC_MAX: '64',
/** Max lines `yes` prints before stopping (override with BARE_OS_YES_MAX_LINES). */
BARE_OS_YES_MAX_LINES: '100000',
/** Max input lines `shuf` will hold in memory (override with BARE_OS_SHUF_MAX_LINES). */
BARE_OS_SHUF_MAX_LINES: '50000',
/** Max output chunk files `split` may create (override with BARE_OS_SPLIT_MAX_FILES). */
BARE_OS_SPLIT_MAX_FILES: '10000',
/** Comma-separated `ctx.bareOsSyscall` op names implemented in stock booter. */
BARE_OS_SYSCALL_OPS:
'readFile,writeFile,readdir,mkdir,stat,unlink,chmod,chdir,getcwd,readlink,symlink,exists,lstat,rmdir,mount,umount,kill,rename,link,access,utimes,truncate,ftruncate',
/** Encodings accepted by `/bin/iconv` (subset; case-insensitive names). */
BARE_OS_ICONV_ENCODINGS: 'UTF-8,ISO-8859-1,UTF-16LE,UTF-16BE',
/** Synthetic process table JSON path (logical VFS). */
BARE_OS_PROC_PROCESS_TABLE: '/proc/bare_os/process_table.json'
}
async function run(ctx, argv) {
const args = argv.slice(1).filter((a) => a !== '--')
let dumpAll = false
let name = null
for (const a of args) {
if (a === '-a') dumpAll = true
else if (!a.startsWith('-')) name = a
else {
ctx.console.error('getconf: unknown option: ' + a)
ctx.exitCode = 1
return
}
}
if (dumpAll) {
for (const k of Object.keys(CONF).sort()) {
ctx.console.log(k + '\n' + CONF[k])
}
ctx.exitCode = 0
return
}
if (!name) {
ctx.console.error('usage: getconf [-a] system_var')
ctx.exitCode = 1
return
}
if (Object.prototype.hasOwnProperty.call(CONF, name)) {
ctx.console.log(CONF[name])
ctx.exitCode = 0
return
}
ctx.console.error('getconf: ' + name + ': unknown variable')
ctx.exitCode = 1
}