7.4 KiB
layout | title |
---|---|
page | Local Doors |
Local Doors
ENiGMA½ has many ways to add doors to your system. In addition to the many built in door server modules, local doors are of course also supported using the ! The abracadabra
module!
The abracadabra Module
The abracadabra
module provides a generic and flexible solution for many door types. Through this module you can execute native processes & scripts directly, and perform I/O through standard I/O (stdio) or a temporary TCP server.
Configuration
The abracadabra
config
block can contain the following members:
name
: Used as a key for tracking number of clients using a particular door.dropFileType
: Specifies the type of drop file to generate (See Argument Variables below).cmd
: Path to executable to launch.args
: Array of argument(s) to pass tocmd
. See below for information on variables that can be used here.cwd
: Set the Current Working Directory forcmd
. Defaults to the directory ofcmd
.nodeMax
: Max number of nodes that can access this door at once. Usesname
as a mapping keytooManyArt
: Art file spec to display if too many instances are already in useio
: Where to process I/O. Can bestdio
orsocket
. When usingstdio
, I/O is input/output from stdin/stdout. When usingsocket
a temporary socket server is spawned that can be connected to. The server listens on localhost on{srvPort}
(see below under Argument Variables).encoding
: Specify the door's encoding. Defaults tocp437
. Linux binaries for example, often produceutf8
.
Drop File Types
Drop file types specified by dropFileType
:
DOOR
: DOOR.SYSDOOR32
: DOOR32.SYSDORINFO
: DORINFOx.DEF
Argument Variables
The following variables may be used in args
entries:
{node}
: Current node number.{dropFile}
: Drop filename only.{dropFilePath}
: Full path to generated drop file.{userId}
: Current user ID.{userName}
: Sanitized username. Safe for filenames, etc.{userNameRaw}
: Raw username. May not be safe for filenames!{srvPort}
: Temporary server port whenio
is set tosocket
.{cwd}
: Current Working Directory.
Example:
args: [
"-D", "{dropFile}", "-N", "{node}"
]
DOSEMU with abracadabra
DOSEMU can provide a good solution for running legacy DOS doors when running on Linux systems. For this, we will create a virtual serial port (COM1) that communicates via stdio.
As an example, here are the steps for setting up Pimp Wars:
First, create a dosemu.conf
file with the following contents:
$_cpu = "80486"
$_cpu_emu = "vm86"
$_external_char_set = "utf8"
$_internal_char_set = "cp437"
$_term_updfreq = (8)
$_layout = "us"
$_rawkeyboard = (0)
$_com1 = "virtual"
The line $_com1 = "virtual"
tells DOSEMU to use stdio
as a virtual serial port on COM1.
Next, we create a virtual X drive for Pimp Wars to live such as /enigma-bbs/DOS/X/PW
and map it with a custom autoexec.bat
file within DOSEMU:
@echo off
path d:\bin;d:\gnu;d:\dosemu
set TEMP=c:\tmp
prompt $P$G
REM http://www.pcmicro.com/bnu/
C:\BNU\BNU.COM /L0:57600,8N1 /F
lredir.com x: linux\fs\enigma-bbs\DOS\X
unix -e
Note that we also have the BNU FOSSIL driver installed at C:\BNU\\
. Another option would be to install this to X: somewhere as well.
Finally, let's create a menu.hjson
entry to launch the game:
doorPimpWars: {
desc: Playing PimpWars
module: abracadabra
config: {
name: PimpWars
dropFileType: DORINFO
cmd: /usr/bin/dosemu
args: [
"-quiet",
"-f",
"/path/to/dosemu.conf",
"X:\\PW\\START.BAT {dropFile} {node}"
],
nodeMax: 1
tooManyArt: DOORMANY
io: stdio
}
}
QEMU with abracadabra
QEMU provides a robust, cross platform solution for launching doors under many platforms (likely anwywhere Node.js is supported and ENiGMA½ can run). Note however that there is an important and major caveat: Multiple instances of a particular door/OS image should not be run at once! Being more flexible means being a bit more complex. Let's look at an example for running L.O.R.D. under a UNIX like system such as Linux or FreeBSD.
Basically we'll be creating a bootstrap shell script that generates a temporary node specific go.bat
to launch our door. This will be called from autoexec.bat
within our QEMU FreeDOS partition.
Step 1: Create a FreeDOS image
FreeDOS is a free mostly MS-DOS compatible DOS package that works well for running 16bit doors. Follow the QEMU/FreeDOS guide for creating an freedos_c.img
. This will contain FreeDOS itself and installed BBS doors.
After this is complete, copy LORD to C:\DOORS\LORD within FreeDOS. An easy way to tranfer files from host to DOS is to use QEMU's vfat as a drive. For example:
qemu-system-i386 -localtime /home/enigma/dos/images/freedos_c.img -hdb fat:/path/to/downloads
With the above you can now copy files from D: to C: within FreeDOS and add the following to it's autoexec.bat
:
CALL E:\GO.BAT
Step 2: Create a bootstrap script
Our bootstrap script will prepare GO.BAT
and launch FreeDOS. Below is an example:
#!/bin/bash
NODE=$1
DROPFILE=D:\\$2
SRVPORT=$3
mkdir -p /home/enigma/dos/go/node$NODE
cat > /home/enigma/dos/go/node$NODE/GO.BAT <<EOF
C:
CD \FOSSIL\BNU
BNU.COM
CD \DOORS\LORD
COPY /Y $DROPFILE
CALL START.BAT $NODE
FDAPM POWEROFF
EOF
unix2dos /home/enigma/dos/go/node$NODE/GO.BAT
qemu-system-i386 -localtime /home/enigma/dos/images/freedos_c.img -chardev socket,port=$SRVPORT,nowait,host=localhost,id=s0 -device isa-serial,chardev=s0 -hdb fat:/home/enigma/xibalba/dropfiles/node$NODE -hdc fat:/home/enigma/dos/go/node$NODE -nographic
Note the qemu-system-i386
line. We're telling QEMU to launch and use localtime for the clock, create a character device that connects to our temporary server port on localhost and map that to a serial device. The -hdb
entry will represent the D: drive where our drop file is generated, while -hdc
is the path that GO.BAT
is generated in (E:\GO.BAT
). Finally we specify -nographic
to run headless.
For doors that do not require a FOSSIL driver, it is recommended to not load or use one unless you are having issues.
Step 3: Create a menu entry
Finally we can create a menu.hjson
entry using the abracadabra
module:
doorLORD: {
desc: Playing L.O.R.D.
module: abracadabra
config: {
name: LORD
dropFileType: DOOR
cmd: /home/enigma/dos/scripts/lord.sh
args: [
"{node}",
"{dropFile}",
"{srvPort}",
],
nodeMax: 1
tooManyArt: DOORMANY
io: socket
}
}
Shared Socket Descriptors
As of this writing DOOR32.SYS
style socket descriptor sharing is not supported. Workarounds include using the Telnet Bridge (telnet_bridge
module) to hook up to local Telnet-accessible door servers such as NET2BBS.