Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ jobs:
- 'tests/qemu/test_release_e2e.sh'
- 'tests/qemu/test_executive_integral.sh'
- 'tests/qemu/test_distrib_boot.sh'
- 'tests/qemu/test_startup_phase_driver.sh'
- 'tests/qemu/test_boot_scsnode_hostname_e2e.sh'
- 'tests/qemu/run_boot_scsnode_hostname_e2e.sh'
- 'tests/uat/**'
Expand Down Expand Up @@ -379,6 +380,21 @@ jobs:
ovmx-boot:latest \
/test.sh

# vms-21a. Reuses the image built above (no extra build). Boots the same
# pre-installed distribution disk and, over a real login session, proves
# STARTUP.COM is now a real STDRV phase driver: SHOW LOGICAL SYS$STARTUP
# names the measured multi-value search list, SYS$STARTUP:/SYS$MANAGER:
# carry the phase-driver's data files and the new site files, and
# SYS$MANAGER:OVMX.CONF is verified absent from the booted, mounted
# system disk (not merely deleted from the source tree).
- name: STARTUP.COM phase driver — SYS$STARTUP search list, OVMX.CONF gone
run: |
docker run --rm \
-v ${{ github.workspace }}/tests/qemu/test_startup_phase_driver.sh:/test.sh:ro \
--entrypoint bash \
ovmx-boot:latest \
/test.sh

# -----------------------------------------------------------------------
# cut-release-reproducible (vms-d73, epic vms-a84 RELEASE ENGINEERING)
#
Expand Down
30 changes: 27 additions & 3 deletions distro/Dockerfile.bootable
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
# link-native-cmake-x86_64 job uses; OVMX_LINK_NATIVE auto-detects ON only
# when `$CC -dumpmachine` reports an aarch64/x86_64 *-musl triple, which
# Ubuntu's musl-gcc wrapper does not.
FROM --platform=linux/amd64 alpine:3.20 AS link-native

Check warning on line 45 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / PARTS 0.2 Demo E2E (real boot, RMS load, DIRECTORY corroboration)

FROM --platform flag should not use a constant value

FromPlatformFlagConstDisallowed: FROM --platform flag should not use constant value "linux/amd64" More info: https://docs.docker.com/go/dockerfile/rule/from-platform-flag-const-disallowed/

Check warning on line 45 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / VMS User Acceptance Test

FROM --platform flag should not use a constant value

FromPlatformFlagConstDisallowed: FROM --platform flag should not use constant value "linux/amd64" More info: https://docs.docker.com/go/dockerfile/rule/from-platform-flag-const-disallowed/

Check warning on line 45 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / install -> UPGRADE -> boot e2e (vms-f05)

FROM --platform flag should not use a constant value

FromPlatformFlagConstDisallowed: FROM --platform flag should not use constant value "linux/amd64" More info: https://docs.docker.com/go/dockerfile/rule/from-platform-flag-const-disallowed/

Check warning on line 45 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / SCSNODE -> real hostname across reboot (vms-b6a7)

FROM --platform flag should not use a constant value

FromPlatformFlagConstDisallowed: FROM --platform flag should not use constant value "linux/amd64" More info: https://docs.docker.com/go/dockerfile/rule/from-platform-flag-const-disallowed/

Check warning on line 45 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / Release-acceptance gate — boot the CUT artifact, verify shipped version (vms-a86f)

FROM --platform flag should not use a constant value

FromPlatformFlagConstDisallowed: FROM --platform flag should not use constant value "linux/amd64" More info: https://docs.docker.com/go/dockerfile/rule/from-platform-flag-const-disallowed/

Check warning on line 45 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / Persistent Boot Smoke Test

FROM --platform flag should not use a constant value

FromPlatformFlagConstDisallowed: FROM --platform flag should not use constant value "linux/amd64" More info: https://docs.docker.com/go/dockerfile/rule/from-platform-flag-const-disallowed/

RUN apk add --no-cache cmake gcc g++ musl-dev binutils make linux-headers

Expand Down Expand Up @@ -203,6 +203,7 @@
/initramfs-fat/vms/SYS0/SYSCOMMON/SYSMGR \
/initramfs-fat/vms/SYS0/SYSCOMMON/SYSHLP \
/initramfs-fat/vms/SYS0/SYSCOMMON/SYSUPD \
"/initramfs-fat/vms/SYS0/SYSCOMMON/SYS\$STARTUP" \
/initramfs-fat/vms/USERS \
/initramfs-fat/vms/SYSTMP && \
# OVMX binaries → SYSEXE (STARTUP.EXE is also /init).
Expand Down Expand Up @@ -254,6 +255,11 @@
cp src/kernel/vmsfs/vmsfs.ko /initramfs-fat/lib/modules/ && \
# System disk config files → VMS-standard locations
cp -r distro/rootfs/vms/SYS0/SYSCOMMON/SYSMGR/* /initramfs-fat/vms/SYS0/SYSCOMMON/SYSMGR/ && \
# SYS$STARTUP: (vms-21a) -- STDRV's phase/component data files
# (VMS$PHASES.DAT, VMS$VMS.DAT). STARTUP.COM's phase driver opens these
# by filespec at boot; without this copy every OPEN fails %RMS-E-FNF and
# every phase (and every site file the driver invokes) silently never runs.
cp -r "distro/rootfs/vms/SYS0/SYSCOMMON/SYS\$STARTUP/"* "/initramfs-fat/vms/SYS0/SYSCOMMON/SYS\$STARTUP/" && \
cp distro/rootfs/vms/SYS0/SYSCOMMON/SYSEXE/SYSUAF.DAT /initramfs-fat/vms/SYS0/SYSCOMMON/SYSEXE/ && \
cp distro/rootfs/vms/SYS0/SYSCOMMON/SYSEXE/RIGHTSLIST.DAT /initramfs-fat/vms/SYS0/SYSCOMMON/SYSEXE/ 2>/dev/null ; \
# OVMXVMSSYS.PAR (vms-d34): the initial SYSGEN parameter file, seeded
Expand Down Expand Up @@ -342,15 +348,18 @@
# ovmx_kit_pack (tools/ovmx_kit_pack.c) is factory BUILD tooling -- same
# class as vmsfs_master above: never shipped on the media, plain host name,
# never run at boot. It treats the direct children of its staging directory
# as top-level VMS directories, so a scratch tree carrying only the four
# as top-level VMS directories, so a scratch tree carrying only the five
# component directories (not SYSUPD, which holds PARTS -- a separate,
# already-a-kit-shaped layered product, not the OS payload) is assembled
# here before packing.
RUN mkdir -p /kit-stage/SYSEXE /kit-stage/SYSLIB /kit-stage/SYSMGR /kit-stage/SYSHLP && \
# here before packing. SYS$STARTUP (vms-21a) ships so a PRODUCT INSTALL
# upgrade carries STDRV's phase/component data files, same as any other
# system directory.
RUN mkdir -p /kit-stage/SYSEXE /kit-stage/SYSLIB /kit-stage/SYSMGR /kit-stage/SYSHLP "/kit-stage/SYS\$STARTUP" && \
cp -r /initramfs-fat/vms/SYS0/SYSCOMMON/SYSEXE/. /kit-stage/SYSEXE/ && \
cp -r /initramfs-fat/vms/SYS0/SYSCOMMON/SYSLIB/. /kit-stage/SYSLIB/ && \
cp -r /initramfs-fat/vms/SYS0/SYSCOMMON/SYSMGR/. /kit-stage/SYSMGR/ && \
cp -r /initramfs-fat/vms/SYS0/SYSCOMMON/SYSHLP/. /kit-stage/SYSHLP/ 2>/dev/null ; \
cp -r "/initramfs-fat/vms/SYS0/SYSCOMMON/SYS\$STARTUP/." "/kit-stage/SYS\$STARTUP/" && \
/src/build-static/bin/ovmx_kit_pack pack /boot/ovmx-os.kit /kit-stage "X86VMS VMS" && \
/src/build-static/bin/ovmx_kit_pack list /boot/ovmx-os.kit && \
# Ground-source gate: the kit manifest must actually name the images the
Expand Down Expand Up @@ -445,6 +454,21 @@
done && \
[ -f /tmp/distrib-verify/SYS0/SYSCOMMON/SYSMGR/STARTUP.COM ] || { echo "FAIL: mastered image missing SYS\$MANAGER:STARTUP.COM"; exit 1; } && \
echo "OK: ovmx-distrib.img carries SYS\$MANAGER:STARTUP.COM" && \
# vms-21a: STDRV's phase-driver data files must be on the mastered disk,
# or every OPEN in STARTUP.COM's phase driver fails %RMS-E-FNF and no
# phase (and no site file the driver invokes) ever runs.
[ -f "/tmp/distrib-verify/SYS0/SYSCOMMON/SYS\$STARTUP/VMS\$PHASES.DAT" ] || { echo "FAIL: mastered image missing SYS\$STARTUP:VMS\$PHASES.DAT"; exit 1; } && \
[ -f "/tmp/distrib-verify/SYS0/SYSCOMMON/SYS\$STARTUP/VMS\$VMS.DAT" ] || { echo "FAIL: mastered image missing SYS\$STARTUP:VMS\$VMS.DAT"; exit 1; } && \
echo "OK: ovmx-distrib.img carries SYS\$STARTUP:VMS\$PHASES.DAT and VMS\$VMS.DAT" && \
[ -f /tmp/distrib-verify/SYS0/SYSCOMMON/SYSMGR/SYCONFIG.COM ] || { echo "FAIL: mastered image missing SYS\$MANAGER:SYCONFIG.COM"; exit 1; } && \
[ -f /tmp/distrib-verify/SYS0/SYSCOMMON/SYSMGR/SYLOGICALS.COM ] || { echo "FAIL: mastered image missing SYS\$MANAGER:SYLOGICALS.COM"; exit 1; } && \
echo "OK: ovmx-distrib.img carries SYS\$MANAGER:SYCONFIG.COM and SYLOGICALS.COM" && \
# The LARP config files this work deletes must never come back on the
# mastered image -- a regression that recreates distro/rootfs/.../
# OVMX.CONF would silently ship it again without this gate.
[ ! -f /tmp/distrib-verify/SYS0/SYSCOMMON/SYSMGR/OVMX.CONF ] || { echo "FAIL: mastered image carries deleted SYS\$MANAGER:OVMX.CONF"; exit 1; } && \
[ ! -f /tmp/distrib-verify/SYS0/SYSCOMMON/SYSMGR/SYLOGICALS.CONF ] || { echo "FAIL: mastered image carries deleted SYS\$MANAGER:SYLOGICALS.CONF"; exit 1; } && \
echo "OK: ovmx-distrib.img carries neither OVMX.CONF nor SYLOGICALS.CONF" && \
# The SYSTEM-writable persistent directories must be baked in: PID 1 no
# longer creates them (vms-2f0), so if the mastering source ever loses them
# SYS$SCRATCH:/SYS$LOGIN: writes fail at runtime (%RMS-E-DNF). Assert both
Expand Down Expand Up @@ -569,7 +593,7 @@
# boot.sh mounts a host directory at /data so the container owns the disk
# file and can write freely (avoids rootless Docker permission issues).
# When run standalone (no /data mount), falls back to /tmp/sysdisk.img.
CMD ARCH=$(uname -m) && \

Check warning on line 596 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / PARTS 0.2 Demo E2E (real boot, RMS load, DIRECTORY corroboration)

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/

Check warning on line 596 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / VMS User Acceptance Test

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/

Check warning on line 596 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / install -> UPGRADE -> boot e2e (vms-f05)

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/

Check warning on line 596 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / SCSNODE -> real hostname across reboot (vms-b6a7)

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/

Check warning on line 596 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / Release-acceptance gate — boot the CUT artifact, verify shipped version (vms-a86f)

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/

Check warning on line 596 in distro/Dockerfile.bootable

View workflow job for this annotation

GitHub Actions / Persistent Boot Smoke Test

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/
if [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then \
QEMU=qemu-system-aarch64; \
MACHINE="-machine virt -cpu cortex-a57"; \
Expand Down
9 changes: 9 additions & 0 deletions distro/rootfs/vms/SYS0/SYSCOMMON/SYS$STARTUP/VMS$PHASES.DAT
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
INITIAL
DEVICES
PRECONFIG
CONFIG
BASEENVIRON
LPBEGIN
LPMAIN
LPBETA
END
24 changes: 24 additions & 0 deletions distro/rootfs/vms/SYS0/SYSCOMMON/SYS$STARTUP/VMS$VMS.DAT
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
!
! VMS$VMS.DAT - STDRV component registration database
!
! OVMX-DEFINED FORMAT (CLAUDE.md Rule 8): only the FILE NAME is observed
! from the OpenVMS Alpha V8.4 oracle (docs/design-boot-faithful.md sec 3.3,
! DIRECTORY SYS$STARTUP:*.DAT). VSI's internal byte layout for this file was
! never read and is not reproduced here -- this line format is an OVMX
! invention, parsed by SYS$MANAGER:STARTUP.COM's RUN_COMPONENTS subroutine.
!
! One component per line:
!
! phase-name procedure-filespec
!
! separated by whitespace. "phase-name" must exactly match one of the nine
! names in SYS$STARTUP:VMS$PHASES.DAT. STARTUP.COM runs "procedure-filespec"
! (with @) when its phase comes up in the driver loop. Lines beginning with
! "!" and blank lines are comments/ignored.
!
! OVMX registers no components here yet -- there is no OVMX-authored
! per-phase driver procedure to name. An empty phase runs empty: STARTUP.COM
! prints nothing for a phase with no registered component, which is honest
! (docs/design-boot-faithful.md sec4 target #4) rather than inventing a
! component to demonstrate the mechanism against.
!
17 changes: 0 additions & 17 deletions distro/rootfs/vms/SYS0/SYSCOMMON/SYSMGR/OVMX.CONF

This file was deleted.

129 changes: 114 additions & 15 deletions distro/rootfs/vms/SYS0/SYSCOMMON/SYSMGR/STARTUP.COM
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
$! STARTUP.COM - OVMX System Startup Command Procedure
$! STARTUP.COM - OVMX System Startup Command Procedure (STDRV)
$!
$! Runs after kernel modules and system disk mount. There is no logical
$! name daemon to wait for: on VMS the logical name tables are
Expand All @@ -16,9 +16,9 @@ $! 3. provisions the accounts' home directories and the system tree's
$! ownership;
$! 4. execs DCL.EXE on THIS FILE, in the SAME process.
$!
$! So this procedure -- and SYSTARTUP_VMS.COM after it -- runs under SYSTEM's
$! identity as the executive recorded it, which is what OpenVMS does: STARTUP
$! runs under username SYSTEM.
$! So this procedure -- and everything it invokes below -- runs under
$! SYSTEM's identity as the executive recorded it, which is what OpenVMS
$! does: STARTUP runs under username SYSTEM.
$!
$! PID 1 DOES NOT READ SYSUAF.DAT and must not start. It is statically linked,
$! so when it did, it carried two hand-rolled 512-byte parsers of its own --
Expand All @@ -27,13 +27,59 @@ $! line limit could leave the system with no readable SYSTEM record and no
$! boot. Account provisioning and system identity are system management, and
$! system management belongs on this path.
$!
$! --------------------------------------------------------------------
$! THIS PROCEDURE IS STDRV -- A PHASED STARTUP DRIVER (vms-21a,
$! docs/design-boot-faithful.md sec3.2/3.3), not a flat script. It:
$!
$! 1. defines SYS$STARTUP (below) and the other system-wide logicals;
$! 2. reads the nine startup PHASES from SYS$STARTUP:VMS$PHASES.DAT
$! (OVMX-authored; the phase NAMES are OBSERVED OpenVMS Alpha V8.4
$! boot behavior, CLAUDE.md Rule 8 -- a data file naming phases was
$! read, no VSI procedure content was);
$! 3. for each phase, in order, runs every component procedure the
$! OVMX-DEFINED database SYS$STARTUP:VMS$VMS.DAT registers for it
$! (RUN_COMPONENTS, below -- only the FILE NAME is observed; the line
$! format inside it is an OVMX invention, labeled at its own point of
$! definition in ovmx_layout.h). A phase with nothing registered runs
$! empty and prints nothing -- that is honest, not a bug;
$! 4. at the CONFIG phase, additionally runs SYS$MANAGER:SYCONFIG.COM;
$! at BASEENVIRON, SYS$MANAGER:SYLOGICALS.COM; at LPMAIN,
$! SYS$MANAGER:SYSTARTUP_VMS.COM -- the three documented OpenVMS
$! site-customization files (VSI OpenVMS System Manager's Manual,
$! "Customizing Startup with Site-Specific Files"). This phase
$! assignment is this project's own reading of that public
$! documentation, not an oracle capture -- flagged here rather than
$! silently presented as measured.
$!
$! This REPLACES SYS$MANAGER:OVMX.CONF and SYLOGICALS.CONF (both deleted,
$! vms-21a, docs/design-boot-faithful.md sec2.4): a Unix KEY=VALUE config
$! file is not how VMS configures a boot. NODE_NAME lives in the SYSGEN
$! parameter SCSNODE, already read at boot by read_boot_parameters()
$! (vms-b6a7); VERSION_LIMIT and DEFAULT_PROTECTION are SYSGEN parameters /
$! SET commands a site now places in SYCONFIG.COM, once OVMX has a SYSGEN
$! parameter or SET command for them -- neither exists yet, so neither
$! config key had anywhere honest to go and both are simply gone, not
$! ported (OVMX.CONF had ZERO code readers on main; verified again here).
$!
$ SET NOON
$!
$! Display system time
$ SHOW TIME
$!
$! Define system-wide logical names
$ DEFINE/SYSTEM SYS$STARTUP SYS$MANAGER
$! Define system-wide logical names.
$!
$! SYS$STARTUP is the measured SEARCH LIST (docs/design-boot-faithful.md
$! sec3.2): "SYS$SYSROOT:[SYS$STARTUP]" then "SYS$MANAGER" -- a multi-value
$! logical, exactly what vms-420 built DEFINE/SYSTEM support for. OVMX does
$! not model SYS$SYSROOT as reaching SYSCOMMON on its own (lnm_defaults.c's
$! lnm_setup_defaults() seeds SYS$MANAGER the same flattened way, straight
$! off SYS$SYSDEVICE, rather than via SYS$SYSROOT:[SYSMGR]), so the first
$! element here is OVMX's flattened equivalent of the real directory
$! (ovmx_layout.h VMS_SYS_STARTUP) rather than the oracle's literal
$! "SYS$SYSROOT:[SYS$STARTUP]" text -- SHOW LOGICAL SYS$STARTUP will show
$! the OVMX path, not the VSI one, and that divergence is intentional and
$! documented here rather than silent.
$ DEFINE/SYSTEM SYS$STARTUP SYS$SYSDEVICE:[SYS0.SYSCOMMON.SYS$STARTUP],SYS$MANAGER
$ DEFINE/SYSTEM SYS$LOGIN SYS$MANAGER
$!
$! SYS$UPDATE -- [SYS0.SYSCOMMON.SYSUPD], the standard VMS home for
Expand All @@ -45,15 +91,68 @@ $! adding to that baseline table.
$ DEFINE/SYSTEM SYS$UPDATE SYS$SYSDEVICE:[SYS0.SYSCOMMON.SYSUPD]
$!
$! Login banners are NOT set here -- LOGINOUT reads SYS$ANNOUNCE and
$! SYS$WELCOME, which a manager defines in SYS$MANAGER:SYLOGICALS.CONF.
$! The startup banner itself is displayed by STARTUP.EXE from the system
$! identity module, so there is exactly one place that knows the version.
$! SYS$WELCOME, which a manager defines in SYS$MANAGER:SYLOGICALS.COM (run
$! at the BASEENVIRON phase, below). The startup banner itself is
$! displayed by STARTUP.EXE from the system identity module, so there is
$! exactly one place that knows the version.
$!
$! Site-specific startup. This is where services are started, and the
$! only place: STARTUP.EXE (PID 1) starts none of its own. Invoked
$! unconditionally and last, after the system logical names exist -- if
$! the procedure is missing, DCL says so rather than skipping it
$! silently.
$ @SYS$MANAGER:SYSTARTUP_VMS.COM
$! Run the phase driver. Every startup phase after this line -- component
$! procedures and the three site files -- happens inside RUN_PHASES.
$ GOSUB RUN_PHASES
$!
$ EXIT
$!
$! ======================================================================
$! RUN_PHASES - STDRV's phase loop.
$!
$! Reads SYS$STARTUP:VMS$PHASES.DAT one phase name per line (READ signals
$! end-of-file as SS$_ENDOFFILE, decimal 2160 -- checked via $STATUS since
$! this DCL has no READ/END_OF_FILE= qualifier). For each phase: run its
$! registered components (RUN_COMPONENTS), then the one site file (if any)
$! documented for that phase.
$! ======================================================================
$ RUN_PHASES:
$ OPEN/READ PHASE_FILE SYS$STARTUP:VMS$PHASES.DAT
$ PHASE_LOOP:
$ READ PHASE_FILE PHASE_NAME
$ IF $STATUS .EQ. 2160 THEN GOTO PHASE_LOOP_DONE
$ GOSUB RUN_COMPONENTS
$ IF PHASE_NAME .EQS. "CONFIG" THEN @SYS$MANAGER:SYCONFIG.COM
$ IF PHASE_NAME .EQS. "BASEENVIRON" THEN @SYS$MANAGER:SYLOGICALS.COM
$ IF PHASE_NAME .EQS. "LPMAIN" THEN GOSUB RUN_SITE_STARTUP
$ GOTO PHASE_LOOP
$ PHASE_LOOP_DONE:
$ CLOSE PHASE_FILE
$ RETURN
$!
$! RUN_SITE_STARTUP - the LPMAIN-phase site-specific commands (the role
$! SYSTARTUP_VMS.COM already had before vms-21a; unchanged here, only its
$! call site moved into the phase driver). See SYSTARTUP_VMS.COM's own
$! header for why this text is not oracle-pinned.
$ RUN_SITE_STARTUP:
$ WRITE SYS$OUTPUT "The OVMX system is now executing the site-specific startup commands."
$ @SYS$MANAGER:SYSTARTUP_VMS.COM
$ RETURN
$!
$! RUN_COMPONENTS - run every SYS$STARTUP:VMS$VMS.DAT component registered
$! for the CURRENT phase (PHASE_NAME, set by RUN_PHASES above). See
$! SYS$STARTUP:VMS$VMS.DAT's own header for the OVMX-defined line format
$! (Rule 8: this format is OVMX's invention, not VMS-authentic). A phase
$! with no matching line runs nothing and prints nothing -- an empty phase
$! is honest, not a shortcut.
$ RUN_COMPONENTS:
$ OPEN/READ COMPONENT_FILE SYS$STARTUP:VMS$VMS.DAT
$ COMPONENT_LOOP:
$ READ COMPONENT_FILE COMPONENT_LINE
$ IF $STATUS .EQ. 2160 THEN GOTO COMPONENT_LOOP_DONE
$ IF COMPONENT_LINE .EQS. "" THEN GOTO COMPONENT_LOOP
$ COMPONENT_FIRST_CHAR = F$EXTRACT(0,1,COMPONENT_LINE)
$ IF COMPONENT_FIRST_CHAR .EQS. "!" THEN GOTO COMPONENT_LOOP
$ COMPONENT_PHASE = F$ELEMENT(0," ",'COMPONENT_LINE')
$ IF COMPONENT_PHASE .NES. PHASE_NAME THEN GOTO COMPONENT_LOOP
$ COMPONENT_PROC = F$ELEMENT(1," ",'COMPONENT_LINE')
$ IF COMPONENT_PROC .NES. "" THEN @'COMPONENT_PROC'
$ GOTO COMPONENT_LOOP
$ COMPONENT_LOOP_DONE:
$ CLOSE COMPONENT_FILE
$ RETURN
23 changes: 23 additions & 0 deletions distro/rootfs/vms/SYS0/SYSCOMMON/SYSMGR/SYCONFIG.COM
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
$! SYCONFIG.COM - Site-specific device/configuration startup command
$! procedure (vms-21a).
$!
$! Invoked by SYS$MANAGER:STARTUP.COM's phase driver (STDRV) during the
$! CONFIG phase, before SYLOGICALS.COM and well before SYSTARTUP_VMS.COM's
$! site-specific commands (VSI OpenVMS System Manager's Manual,
$! "Customizing Startup with Site-Specific Files" -- SYCONFIG.COM is the
$! documented home for device and controller configuration commands, run
$! early enough that later startup phases see the configured devices).
$! Edits on the system disk persist across reboots and survive a PRODUCT
$! INSTALL upgrade (seed-once, vms-2c9 -- see
$! tools/ovmx_kit_pack.c is_seed_once_filename()).
$!
$! THIS PROCEDURE CONFIGURES NO DEVICE, AND THAT IS DELIBERATE. OVMX has no
$! device-configuration facility yet (no SET DEVICE-style controller setup)
$! -- a worked example here would name a command that does not exist on
$! OVMX, which would fail on every boot and teach the reader that the
$! failure is normal. Same honesty rule SYSTARTUP_VMS.COM's own header
$! documents for service startup.
$!
$ SET NOON
$!
$ EXIT
37 changes: 37 additions & 0 deletions distro/rootfs/vms/SYS0/SYSCOMMON/SYSMGR/SYLOGICALS.COM
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
$! SYLOGICALS.COM - Site-specific logical name definitions (vms-21a).
$!
$! Invoked by SYS$MANAGER:STARTUP.COM's phase driver (STDRV) during the
$! BASEENVIRON phase -- after SYCONFIG.COM has configured devices and after
$! STARTUP.COM's own system logical names (SYS$STARTUP, SYS$LOGIN,
$! SYS$UPDATE) exist, but before SYSTARTUP_VMS.COM starts any site service
$! (VSI OpenVMS System Manager's Manual, "Customizing Startup with
$! Site-Specific Files" -- SYLOGICALS.COM is the documented home for a
$! site's own DEFINE/SYSTEM commands, run early enough that every later
$! startup phase and every login session sees them).
$!
$! This REPLACES the old SYS$MANAGER:SYLOGICALS.CONF (deleted, vms-21a): a
$! real VMS site file is a command procedure a manager edits with DCL
$! DEFINE commands, never a "TABLE NAME VALUE" config file for a daemon to
$! parse. Edits on the system disk persist across reboots and survive a
$! PRODUCT INSTALL upgrade (seed-once, vms-2c9 -- see
$! tools/ovmx_kit_pack.c is_seed_once_filename()).
$!
$ SET NOON
$!
$! ---------------------------------------------------------------------
$! Login banners (LOGINOUT, src/libvms/include/ovmx_banner.h).
$!
$! SYS$ANNOUNCE is displayed BEFORE the "Username:" prompt.
$! SYS$WELCOME is displayed AFTER a successful login.
$!
$! Both are left UNDEFINED here, as OpenVMS ships them: with no SYS$WELCOME
$! defined, the built-in OVMX banner is displayed, and with no SYS$ANNOUNCE
$! nothing is displayed before the prompt. Uncomment to override.
$!
$! An equivalence string beginning with "@" names a FILE whose contents are
$! displayed -- use that for a multi-line site banner.
$!
$! $ DEFINE/SYSTEM SYS$ANNOUNCE "Unauthorized access is prohibited."
$! $ DEFINE/SYSTEM SYS$WELCOME "@SYS$MANAGER:WELCOME.TXT"
$!
$ EXIT
Loading
Loading