Skip to content

Repository files navigation

ABBS Last Callers 1.0.0

ABBS Last Callers is a small, read-only ARexx Last Callers door for ABBS / ABBS for All on classic AmigaOS. It displays the newest ten ABBS callers across all node logs on an 80-column BBS terminal. It has no third-party runtime dependency and requires no temporary files. This project is independently developed and is not an official ABBS component.

Distribution / Aminet

Install jlha-utils and lhasa on a Debian or Ubuntu build host, then run:

make aminet-check

This produces dist/ABBSLastCallers.lha, the classic Amiga distribution, alongside dist/ABBSLastCallers.readme, its external Aminet submission metadata, and dist/SHA256SUMS. Generated artifacts are not committed. See docs/AMINET-PACKAGING.md for verified conventions, the exact layout, reproducibility details, and manual submission requirements.

Requirements

  • ABBS / ABBS for All
  • Classic AmigaOS 3.1 or later
  • ARexx
  • A configured ABBS node

Validation status

Runtime validation

Environment / path Status
Host-side CI (format and invariant checks only) AVAILABLE
AmigaOS 3.1 Shell VALIDATED
ABBS II local A-type ARexx door VALIDATED
ABBS II remote Telnet caller VALIDATED

Host-side CI does not execute AmigaOS, ARexx, or ABBS and is not runtime validation. The project uses four validation layers:

  1. Host-side regression tests protect logfile-format assumptions, aggregation, presentation width, and production-source safety invariants.
  2. An AmigaOS 3.1 Shell smoke test validates ARexx execution and real log parsing outside an ABBS node.
  3. An ABBS local-node test validates the native A-type door path and return to ABBS.
  4. An external ABBS remote/Telnet caller test validates remote delivery and connection behavior; this layer is validated.

The v1.0.0 release includes full runtime validation across all four layers.

Shell validation

The Shell path was validated on AmigaOS 3.1 under FS-UAE. The canonical installed invocation is:

rx ABBS:Doors/LastCallers.abbs
echo $RC

Observed output included:

Per Ousdal   node 1   09/08-26   23:41

That validates Shell ARexx execution, real logfile reading and parsing, 80-column output, and clean Shell return.

Historical note: development builds before M2 used ABBS:Sys/LastCallers.abbs for Shell testing. That obsolete development-stage copy is no longer required once the canonical ABBS:Doors/LastCallers.abbs copy is installed.

Real ABBS door validation

M2 was runtime-validated as an A-type ARexx door on 10 August 2026. From an active local ABBS node, OPEN displayed the registered Days and Last Callers entries. Selecting Last Callers ran the script in the caller/node window and displayed these real Login: records in chronological order:

Per Ousdal    1    09/08-26    23:41
Per Ousdal    1    10/08-26    03:13

The door then returned cleanly to (NEWS) Main Command (? for menu):. This validates A-type registration and invocation, the inherited per-node ARexx host, door-mode detection, WRITETEXT/OUTIMAGE output, real node-log parsing, multi-record display, and normal EXIT back to ABBS. It does not validate a remote Telnet caller.

Tested environment

  • ABBS II, active local node
  • AmigaOS 3.1
  • FS-UAE, A1200 / 68020 configuration
  • Real ABBS node logfile data

Historical ABBS review

The source material was found locally in the FS-UAE ABBS-Dev hard drive. The ABBS and pristine Install/ABBS copies of both manuals are byte-for-byte identical.

  • ABBS:Docs/Doors.doc (DoorsDoc, 1 February 1994) documents ABBS:Doors/NodeXMenu and ABBS:Doors/NodeXConfig. Each valid config line is numbered in order. Type A is an ARexx door, followed by a filename containing no spaces. The user enters OPEN, sees NodeXMenu, and selects the corresponding numbered entry. P and S are Paragon and Shell doors; M2 uses neither.
  • ABBS:Docs/abbsrexx.doc documents the per-node port name as ABBS node #x port. WRITETEXT appends text to ABBS's node write buffer; OUTIMAGE emits that buffer with a newline; BREAKOUTIMAGE emits it without one. GETLINE and READCHAR are the documented input calls. Any host command may return RC 20 for carrier loss and a script must then exit immediately.
  • The installed historical ABBS:Doors/DAYS/DAYS.ABBS is registered as an A door and calls WRITETEXT, OUTIMAGE, GETLINE, and READCHAR directly, without an ADDRESS statement. This observes that ABBS starts an A-type script with the current node port as its ARexx command host. Normal EXIT returns to ABBS; there is no separate return command.
  • Stock LoginScript.abbs, LogoutScript.abbs, Newuser.abbs, Questionnaire.ABBS, Download.abbs, Upload.script, Clock.abbs, and Clock1.abbs were also inspected. They reinforce the buffered output and immediate-error-exit pattern. Upload.script is an AmigaDOS hook, not an ARexx door. No inspected script uses rexxplslib.library.
  • The requested MHL-Todayscallers.abbs, Status.abbs, and User.abbs were not present locally. No mechanism was inferred from them.

Therefore rexxplslib.library is not necessary. The smallest documented M2 path is a direct A-type ARexx door, not a Shell launcher or wrapper.

Architecture

caller enters OPEN
       |
       v
ABBS:Doors/NodeXMenu / NodeXConfig
       |  A  ABBS:Doors/LastCallers.abbs
       v
ABBS launches ARexx with current node port as command host
       |
       v
read-only scan of ABBS:node1logfile ... node32logfile
       |
       v
WRITETEXT + OUTIMAGE to caller, then EXIT to ABBS

The script identifies door mode from the standard ARexx ADDRESS() value. It only checks that the inherited host begins ABBS node #; it neither assumes node 1 nor requests caller/session state. The caller's node number is not needed to scan the logs. Under Shell rx, the host is not an ABBS node port, so the same output continues to use SAY.

The parser remains unchanged: only strict Login: records are accepted, usernames may contain spaces, all 32 possible logfile names are considered despite gaps, malformed records are rejected, and only the newest requested events are retained. Files are opened only with mode R.

Installation

The documented conventional location for an ARexx door is ABBS:Doors. LastCallers has one canonical installed copy: ABBS:Doors/LastCallers.abbs.

ABBS:Doors/
    LastCallers.abbs
    NodeXConfig
    NodeXMenu
  1. Copy the script:

    copy LastCallers.abbs ABBS:Doors/LastCallers.abbs
    
  2. For every node that should offer the door, append this exact valid entry to that node's existing ABBS:Doors/NodeXConfig (replace X with the node number; do not replace the file):

    A    ABBS:Doors/LastCallers.abbs    ; Last Callers
    
  3. Count valid A, P, and S lines from the top of that config. The new line's ordinal is the door selection number. Add the same number to the corresponding existing ABBS:Doors/NodeXMenu. For example, if it is the second valid config line, add:

    2... Last Callers
    

    This number cannot safely be hard-coded for all installations because Doors.doc defines it by the existing per-node line order. On the inspected validated node, Node0Config had DAYS first, so Last Callers was entry 2.

Repeat steps 2–3 for every node where the door should be available. NodeXConfig and NodeXMenu are per-node; the door file itself is shared and contains no node-specific configuration. Do not assume the ordinal is 2 on another node or installation.

Do not register it as an S Shell door. Shell doors have a different and security-sensitive launcher contract documented in Doors.doc.

Shell mode

The already validated diagnostic invocation remains available:

rx ABBS:Doors/LastCallers.abbs
echo $RC

Fixture mode from a repository checkout is unchanged and does not require a second installed copy:

makedir RAM:lc
copy fixtures/node#?logfile RAM:lc/
rx LastCallers.abbs "RAM:lc/node" 10
echo $RC

Door behavior and return

Door mode sends every plain-ASCII line through documented WRITETEXT and OUTIMAGE. Output is at most 57 printable columns and needs no ANSI or terminal-control support. ABBS's normal paging remains in control.

Colour investigation

No colour was added. The locally recorded historical review establishes WRITETEXT and OUTIMAGE as the normal buffered output API, but neither the reviewed ABBS manuals nor the inspected stock ARexx doors establish a safe, documented colour/control convention. Emitting guessed escape sequences would add a terminal assumption. Optional title/header colour remains a possible future enhancement if a documented and historically demonstrated ABBS mechanism is found; plain ASCII will remain the baseline.

There is deliberately no input pause: historical A-type doors return through normal ARexx EXIT, and neither manual requires a pause. Avoiding GETLINE or READCHAR also avoids an indefinite wait. If either output call returns any nonzero RC—including carrier loss—the script exits immediately without making another ABBS host call.

Safety

The door performs no writes, deletes, renames, temporary-file work, user or message operations, conference changes, file-database operations, networking, or configuration changes. Installation requires only copying the script and manually adding the explicit menu/config entries above. Runtime logfile access uses OPEN(..., 'R') only.

Manual validation checklist

Shell smoke test:

rx ABBS:Doors/LastCallers.abbs
echo $RC

Expected: the table is displayed using SAY, followed by RC 0.

ABBS test:

OPEN
<select Last Callers at its configured ordinal>

Expected: the table appears in the active ABBS node, real Login: records appear, and control returns to the ABBS command prompt. No Shell window is required and ABBS remains running.

Remote Telnet validation

This test requires a configured public ABBS node and a real external caller. Before connecting, ensure that Last Callers is registered in that node's ABBS:Doors/NodeXConfig, for example:

A    ABBS:Doors/LastCallers.abbs    ; Last Callers

Ensure the matching entry also exists in that node's NodeXMenu. NodeXConfig and NodeXMenu are per-node, and the menu number is the config entry's ordinal in that node; do not hard-code a menu number.

  1. Connect from an external BBS or Telnet client and log in normally.
  2. Enter OPEN and select Last Callers at its configured ordinal.
  3. Verify the Last Callers output reaches the remote terminal.
  4. Verify caller rows are readable and aligned.
  5. Verify the connection remains alive throughout output.
  6. Verify control returns to the ABBS command prompt.
  7. Verify ABBS remains stable and no local-only assumptions are visible.

This validation was completed successfully on real ABBS II. A remote Telnet caller connected, invoked Last Callers via OPEN 2, received the complete display with all ten caller rows rendered correctly (User, Node, Date, Time), the footer reported 10 callers shown, and control returned cleanly to the ABBS command prompt. No ARexx errors or session disruption were observed.

The complete validation procedure is in docs/RELEASE-CHECKLIST.md.

Known limitations

  • Two-digit years sort as observed (YY/MM/DD HH:MM); century rollover is undefined.
  • Date fields receive range checks, not full calendar validation.
  • Same-minute events use node number and read order as deterministic tie-breakers.
  • Log rotation or concurrent append behavior needs target observation.
  • Remote Telnet caller display validated; forced disconnect/carrier-loss during active output remains untested.

License

This project is available under the MIT License.

About

ABBS LastCallers

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages