Skip to content

FidoNet-Style Networks (FTN)

FidoNet proper and other FidoNet-Style networks are supported by ENiGMA½. A bit of configuration and you’ll be up and running in no time!

Getting a fully running FTN enabled system requires a few configuration points:

  1. messageNetworks.ftn.networks: Declares available networks. That is, networks you wish to sync up with.
  2. messageNetworks.ftn.areas: Establishes local area mappings (ENiGMA½ to/from FTN area tags) and per-area specific configurations.
  3. scannerTossers.ftn_bso: General configuration for the scanner/tosser (import/export) process. This is also where we configure per-node (uplink) settings.

The networks block is a per-network configuration where each entry’s ID (or “key”) may be referenced elsewhere in config.hjson. Network keys are matched case-insensitively, so fsxNet, fsxnet, and FSXNET are all equivalent — just be consistent within your config. For example, consider two networks: ArakNet and fsxNet:

{
messageNetworks: {
ftn: {
networks: {
fsxnet: {
defaultZone: 21
localAddress: "21:1/121"
}
araknet: {
defaultZone: 10
localAddress: "10:101/9"
}
}
}
}
}

The areas section describes a mapping of local area tags configured in your messageConferences (see Configuring a Message Area) to a message network (described above), a FTN specific area tag, and remote uplink address(s). This section can be thought of similar to the AREAS.BBS file used by other BBS packages.

When ENiGMA½ imports messages, they will be placed in the local area that matches key under areas while exported messages will be sent to the relevant network.

Config ItemRequiredDescription
networkYesAssociated network from the networks section above
tagYesFTN area tag (ie: FSX_GEN)
uplinksYesAn array of FTN address uplink(s) for this network
relayNoSet true to pass imported EchoMail on to the area’s other uplinks. See Relaying EchoMail.

By default ENiGMA½ exports only the messages written by users on this system. Mail that arrives from an area’s upstream source is imported and stops there.

That is the right behaviour for an ordinary node, and the wrong one as soon as something downstream of you is configured as a second uplink — a point, or a sub-hub. Such a link would receive only local chatter and none of the echo it actually subscribed to.

Set relay: true on an area to pass imported mail on:

fsx_general: {
network: fsxnet
tag: FSX_GEN
uplinks: [ "21:1/100", "21:1/121.1" ] // hub, and our own point
relay: true
}

It is opt-in per area on purpose: relaying is visible to the rest of the network, and a board that configured a second uplink for some other reason should not silently start feeding it.

For each imported message, every uplink of the area is considered in turn:

  • Never back to the system that sent it. The packet header origin recorded at import decides this, so it holds even when a sender omits itself from SEEN-BY.
  • Always to your own points. SEEN-BY has no point component (FTS-1027): a point’s net/node are its boss’s, and an upstream sender routinely lists the boss before the message ever reaches you. A plain SEEN-BY test would therefore read “already seen” for every point, every time, and nothing would ever be relayed to one.
  • Otherwise, only if the uplink is not already in SEEN-BY, which is the ordinary loop guard for a genuine peer relationship.

SEEN-BY and ^aPATH are updated on the way out exactly as they are for locally written mail, and the original MSGID is preserved rather than regenerated.

Example:

{
messageNetworks: {
ftn: {
areas: {
// it is recommended to use lowercase area tags
fsx_general: // *local* tag found within messageConferences
network: fsxnet // that we are mapping to this network
tag: FSX_GEN // ...and this remote FTN-specific tag
uplinks: [ "21:1/100" ] // a single string also allowed here
}
}
}
}
}

Below is a more complete example illustrating some of the concepts above:

{
messageNetworks: {
ftn: {
networks: {
fsxnet: {
defaultZone: 21
localAddress: "21:1/121"
}
}
areas: {
fsx_general: {
network: fsxnet
// ie as found in your info packs .NA file
tag: FSX_GEN
uplinks: [ "21:1/100" ]
}
}
}
}
}

EchoMail that arrives for an FTN area tag you have not configured is skipped and, because the packet is then removed, lost. ENiGMA½ can instead create those areas for you. The feature is off unless you configure it, and a system with no autoAreas block behaves exactly as it always has.

Run this once:

Terminal window
./oputil.js mb auto-areas init

That creates config/auto-areas.hjson and adds it to includes in your config.hjson, in that order — a file listed in includes that does not exist stops the board from starting, so it must be created first. The command is safe to re-run.

Automatically created areas are written to auto-areas.hjson, never to your config.hjson. Includes are merged such that config.hjson always wins, so that file can be rewritten on every pass without ever touching something you set by hand.

Configured per network under messageNetworks.ftn.networks.<network>.autoAreas:

{
messageNetworks: {
ftn: {
networks: {
fsxnet: {
defaultZone: 21
localAddress: "21:1/121"
autoAreas: {
// conference new areas are placed in; must already exist
confTag: fsxnet
// never create these, and remove them if already created
ignore: [ "FSX_BOT", "SOME.AREA" ]
// cap on the TOTAL number ever created for this network
maxAutoCreate: 500
onDemand: {
// create areas when EchoMail arrives for an unknown tag
enabled: true
}
infoPack: {
// take real names and descriptions from the network info pack
enabled: true
// file area the pack is TIC'd into, and how to spot it there
areaTag: fsxnet_info
match: "fsxnet*.zip"
// the area list INSIDE the pack. Name it exactly: fsxNet also
// ships fsx_file.na, which is a FILEBONE file echo list
areaFile: fsxnet.na
}
}
}
}
}
}
}

There is no parent enabled flag: the feature is on for a network if either onDemand.enabled or infoPack.enabled is set. Two flags that have to agree is a configuration bug waiting to happen.

Config ItemRequiredDescription
confTagYesMessage conference created areas are placed in. Must already exist; creation is refused otherwise
ignoreFTN tags never to create. Also removes ones already created, so this is how you un-create something
maxAutoCreateCap on the total number of areas ever created for this network. Defaults to 500. This is a total, not a per-run limit

An area created this way carries no uplinks, so nothing is ever exported from it. That alone is not read-only — a local user could still post into an area that looks live and goes nowhere — so it also gets acs: { write: ID0 }, which no user satisfies.

To adopt an area, define it in your config.hjson under the same conference and area tag with your own uplinks and acs. Your config.hjson wins over the generated file, so the two coexist.

Some tags are refused outright rather than merged, and the operator is told why:

  • A tag that would lower case onto a built-in area, such as PRIVATE_MAIL → private_mail
  • A tag already used by an area in any conference, or already carried by another network

Networks distribute an “info pack” — an archive with the area list, nodelist and documentation — through a file echo, so it arrives by TIC like any other file. ENiGMA½ does not wait to be told about it; it looks in the file area you name. A pack that landed before you turned the feature on is picked up just the same, as is one you dropped in by hand and scanned with oputil fb scan.

Its job is narrow: replace the placeholder name and description on areas you already carry. A pack lists what the network carries, not what you are linked to, so creating from it wholesale would leave you with hundreds of permanently empty areas. Set createUnlinked: true if you want that anyway.

Some networks ship no machine-readable list at all. If the file cannot be recognised, you get a warning saying what it looked like instead, and your areas keep their tag-based names.

Optionally, an AreaFix request can be sent to your uplink after an area is created, asking it to send the backlog. This is off by default and has no default command, because there is no portable syntax:

Uplink softwareWorking per-area rescan
Mystic, CrashMail II=TAG R=n
husky, SBBSecho%RESCAN TAG R=n

FSC-0057 specifies =TAG R=n, but husky and SBBSecho do not implement =: they read it as a request to add an area with a garbage tag, and a husky hub with forwardRequests may pass that upstream. So you state the form your uplink speaks, or nothing is sent:

onDemand: {
enabled: true
rescan: true
rescanUplink: "21:1/100"
rescanPassword: "YOURPASS"
rescanDays: 30
// %TAG% and %DAYS% are substituted
rescanCommand: "=%TAG% R=%DAYS%"
}

Replies from the uplink’s AreaFix robot are matched against requests actually sent — by address, robot name, and a 14 day window — and only lines naming an area asked about are read. You get a NetMail summarising what the uplink said. Reply wording differs between tossers; anything not recognised is reported with the raw line rather than acted on, and you can teach it more:

messageNetworks: {
ftn: {
areaFixStatusPhrases: {
"linked ok": added
}
}
}

Add its FTN tag to ignore. It is dropped from auto-areas.hjson on the next pass.

Its messages are not deleted — they stay in the database keyed by area tag, invisible, and reappear if the tag is ever created again. A later re-link and rescan will dupe-drop rather than re-import that history, since the MSGID duplicate check is system wide.

Please see the FTN/BSO Scanner/Tosser documentation for information on this area.