This document covers information for keeping your system updated through periodic upgrades as well as version-to-version upgrade notes. Be sure to read these notes for any upgrade!
- Always back up your system! (See Administration - Backing Up Your System)
- Seriously, always back up your system!
- Review the version to version release notes within this document.
- Upgrade
ENiGMA½ does not currently have much of a "release process" in that instead, it is expected that if you want new features, you will git pull them to your system.
Refer to Upgrading for details around this process.
- Check TROUBLESHOOTING first.
- Report your issue on Xibalba BBS, or file a issue on GitHub!
⚠️ Be sure to inspect these notes during any upgrades!
-
EchoMail exported to a node with no
archiveTypewas silently never delivered (#722). A node with noarchiveTypeconfigured exports bare packets instead of ArcMail bundles, and those were written to the outbound spool with a malformed name — the dot before the extension was missing (43792ae5cutrather than43792ae5.cut). No mailer could match such a file, so the message stayed in the spool indefinitely with no error at any log level. This is fixed; un-archived packets now ship as flow file references like everything else, and no configuration change is required. SettingarchiveTypeis no longer a workaround for anything, though it is still recommended for bandwidth.Action required if you run a node without
archiveType: stranded files are not migrated automatically, because their names carry no destination address. Find them:# the malformed direct-attach names find mail/ftn_out -type f -regextype posix-extended \ -regex '.*/[0-9a-fA-F]{8}(out|cut|iut|hut|dut)' -print # and, if you use fileCase: 'upper', names where the temp extension was never stripped find mail/ftn_out -type f -iname '*.pk_*' -print
Each one is a complete FTS-0001 packet. The directory it sits in identifies the network and zone, and the destination net/node is in the packet header — normally just the uplink that area exports to, but you can read it directly:
node -e 'const b = require("fs").readFileSync(process.argv[1]); console.log(`dest = ${b.readUInt16LE(22)}/${b.readUInt16LE(2)}`)' \ mail/ftn_out/outbound/43792ae5cut
To deliver one, give it a
.pktextension and reference it from that node's flow file, whose name is 4 hex digits of the destination net followed by 4 of its node:mv mail/ftn_out/outbound/43792ae5cut mail/ftn_out/outbound/43792ae5.pkt echo "^$(pwd)/mail/ftn_out/outbound/43792ae5.pkt" >> mail/ftn_out/outbound/00640000.clo
If the messages are old enough not to be worth recovering, deleting the files is safe — they are copies; the originals remain in your message base.
-
Outbound files are now matched case-insensitively. If you set
fileCase: 'upper'on a node, the native BinkP mailer previously reported that node as having mail and then queued none of it — dialing every poll cycle and shipping nothing. The mailer now handles both cases, as FTS-5005.003 §2 asks. No action required; anything queued in upper case starts shipping on the next poll. This also applies to an outbound directory inherited from a DOS-era mailer, where upper case names are the norm. -
Mail to point addresses is now shipped by the native BinkP mailer.
ftn_bsohas always written point mail to theNNNNnnnn.pntsubdirectory the spec requires, but the mailer did not look there, so it was never sent. If you carry points and have been running the built-in mailer, expect a backlog to go out on the next poll — check that the accumulated volume is something you are happy to send before starting up, and delete anything stale frommail/ftn_out/**/*.pnt/first if not. -
Direct-attach netmail packets are renamed when sent. A
NNNNnnnn.?utfile in the outbound is now transmitted as a uniqueNNNNNNNN.pkt, per FTS-5005.003 §3.1. Previously it went out under its.?utname and the receiving system's tosser ignored it. This only affects.?utfiles placed in your outbound by something other than ENiGMA½ — a netmail tracker, another mailer, or by hand. No action required. -
Multi-network BSO outbound directories are now consistent between
ftn_bsoand the native BinkP mailer (#719). The scanner/tosser and the mailer each used their own rule for deciding which FTN network owns the bareoutbound/directory, and the two disagreed whenever more than one network was configured. Both now use the documented rule:scannerTossers.ftn_bso.defaultNetworkwhen set, otherwise the first network listed inmessageNetworks.ftn.networks.If you have two or more FTN networks configured and have not set
defaultNetwork, the first-listed network's outbound now lands inmail/ftn_out/outbound/rather thanmail/ftn_out/<networkName>/.-
Built-in BinkP mailer — no action required. Mail already queued under the previous layout is still found and sent; once that directory drains you may delete it. A startup log entry appears while this applies.
-
External mailer (Binkd, Mystic, etc.) — action required. Either update the mailer's outbound path for that network to
outbound/, or keep the previous layout by explicitly declaring that there is no default network:scannerTossers: { ftn_bso: { // no default network; every network uses its own subdirectory defaultNetwork: null } }
Either way, explicitly setting
defaultNetworkto a network name is recommended for multi-network systems: it pins the layout so that adding or reordering entries inmessageNetworks.ftn.networkscan never relocate a spool directory. See BSO Import / Export. -
-
Network names are now matched case-insensitively when resolving outbound directories. Systems using a mixed-case key in
messageNetworks.ftn.networks(e.g.fsxNet) on a case-sensitive filesystem could have outbound mail written to a directory the mailer never scanned. No action required.
-
No breaking changes or required migrations.
-
DORINFO graphics field changed from
1to2— ENiGMA½ now writes2(ANSI color) in the DORINFO graphics field instead of1(IBM high-bit chars). RBBS-mode doors such as TradeWars 2002 require2to enable ANSI color; other doors treat any non-zero value as graphics-capable and are unaffected. No configuration change required. -
Optional: enable OSC 8 hyperlinks in message viewers — clickable URL support is now available for
%MTviews inprevieworread-onlymode. The default menu templates already includehyperlinks: trueon the appropriate views. If you maintain a custom menu config, addhyperlinks: trueto any message-body or NFO viewer%MTview where you want URL detection:MT1: { mode: preview hyperlinks: true }No effect on terminals that do not support OSC 8 — it degrades silently to plain text.
-
Optional: expose the new
user_status_configmodule — a new module lets users toggle their own availability and visibility. To add it to your menus, wire up a command or menu entry pointing to@menu:userStatusConfig. A minimal menu block is required in your menu config:userStatusConfig: { desc: User Status module: user_status_config config: { art: { menu: user_status_config } enabledIndicator: "√" disabledIndicator: X menuInfoFormat10: "{availableIndicator}" menuInfoFormat11: "{visibleIndicator}" } form: { 0: { mci: { TL10: {} TL11: {} } actionKeys: [ { keys: [ "a", "shift + a" ] action: @method:toggleAvailable } { keys: [ "v", "shift + v" ] action: @method:toggleVisible } { keys: [ "escape", "q", "shift + q" ] action: @systemMethod:prevMenu } ] } } }You will also need to create an art file named
user_status_config(.ans,.asc, etc.) containingTL10andTL11MCI codes for the availability and visibility indicators respectively. ThemenuInfoFormat10/menuInfoFormat11format strings support{availableIndicator},{visibleIndicator},{isAvailable}, and{isVisible}tokens and can be styled with pipe codes in your theme. -
Recommended: review any secrets currently stored as plain text in
config.hjson(privateKeyPass, SMTP/IMAP passwords, BinkPsessionPassword, FTNpacketPassword, TICpassword,jwtSecret, door service credentials) and consider moving them to@file:or@environment:references. This is optional but strongly encouraged — existing plain-text values continue to work unchanged. See Security for examples.
N/A
ActivityPub data may need purged if you have utlized it. Easiest to just delete your activitypub.db file and start anew.
N/A
N/A
-
We are nearing 1.0! Version numbers have changed.
-
⚠️ FSE editor footer art and menu config have changed. The full-screen editor'sfooterEditorform (form2) previously used two separate%TL(Text Label) views —%TL1for cursor position and%TL2for INS/OVR mode — driven by aTLTLform config block. These have been replaced by a single%SB1(StatusBarView) with named panels.If you have a custom
MSGEFTRart file or a customizedcreateMessageEditor/readMessageEditormenu config:-
Art file (
MSGEFTR.ANS) — Replace any%TL1+%TL2pair with a single%SB1. Position it where you want the combined status indicator to appear (the default theme places it near the right side of the footer line). Remove any%TL2entirely. -
Menu config — In the
createMessageEditorandreadMessageEditor(or equivalent) menu entries, replace the old form2block:// OLD — remove this: 2: { TLTL: { mci: { TL1: { width: 5 } TL2: { width: 4 } } } }with the new panel-mode
%SB1config:// NEW — use this: 2: { mci: { SB1: { width: 9 anchor: left justify: left separator: " " panels: [ { name: mode width: 3 justify: right } { name: pos width: 5 justify: left } ] } } }
In all cases, diff the template against your existing config before applying changes — your config likely contains other customizations you don't want to lose:
diff ./misc/menu_templates/message_base.in.hjson ./config/menus/your_board-message_base.hjson
Apply only the form
2changes shown above. See Configuration Files for details. -
-
⚠️ New FSE keyboard shortcuts and find overlay require menu config updates. The following changes apply to all FSE menu entries (messageBaseNewPost,messageAreaViewPost,messageAreaReplyPost, and their private-mail equivalents).New art file —
MSGFND: A find-prompt footer art file is now required. Reference it in each FSE menu'sconfig.artblock:config: { art: { // ... existing art keys ... footerFind: MSGFND } }The art file must contain a single
%ET1(EditTextView) input field. Create and theme it like your other footer art files.Header form (form
0) — Escape key handler change: Replace@systemMethod:prevMenuwith@method:headerEscapePressedin the header form'sactionKeys. This is required so thatCtrl-A("change subject") can return focus to the body without exiting the FSE:// OLD — remove: { keys: [ "escape" ], action: @systemMethod:prevMenu } // NEW — replace with: { keys: [ "escape" ], action: @method:headerEscapePressed }Body editor (form
1) — new action keys: Add to theactionKeysarray in the body (MT1) form:{ keys: [ "ctrl + f" ], action: @method:editModeFind } // open find prompt { keys: [ "ctrl + n" ], action: @method:editModeFindNext } // find next match { keys: [ "ctrl + p" ], action: @method:editModeFindPrev } // find previous match { keys: [ "ctrl + a" ], action: @method:editModeChangeSubject } // edit subject inlineView mode (form
4) — new action keys: Add to the view footeractionKeysarray:{ keys: [ "ctrl + f" ], action: @method:viewModeFind } { keys: [ "ctrl + n" ], action: @method:viewModeFindNext } { keys: [ "ctrl + p" ], action: @method:viewModeFindPrev }New form
6— find footer form: All FSE menu entries need a form6definition. The simplest approach is to use the shared reference added to the template:6: @reference:common.fseFindFooterFormYou must also add the
fseFindFooterFormfragment to your menu file'scommon:section. Copy it verbatim frommisc/menu_templates/message_base.in.hjson(it is anET1input with Enter to submit and Escape to cancel).Editor command menu (form
3) — upload item: The ESC command menu (HM1) now includes an"upload"item allowing users to upload a file as the message body (ANSI art or plain text). Add"upload"to theitemsarray and the corresponding submit action:HM1: { items: [ "save", "discard", "help", "upload" ] } // post HM1: { items: [ "save", "discard", "quote", "help", "upload" ] } // replyWith matching submit entries:
{ value: { 1: N }, action: @method:editModeMenuUpload }Where
Nis the zero-based index of"upload"in your items list. Upload access defaults toGM[users]; override per-menu viaconfig.uploadAcs.As always, diff the template against your config before applying changes:
diff ./misc/menu_templates/message_base.in.hjson ./config/menus/your_board-message_base.hjson
-
nodemailer upgraded to v8. If you have
email.transportconfigured with AWS SES, you will need to update your transport config to use the SESv2 SDK — see the nodemailer SES docs. All other transports (SMTP, etc.) require no changes. -
Pause prompt and TickerView enhancements — new
pause: pageBreakpagination mode,pausePrompt,pausePosition,continuousKey/quitKey, and TickerView (%TK) support in pause prompts. Existingpause: trueconfigs continue to work unchanged. See What's New and Pause Prompts for details.
- A new ActivityPub menu template has been created. Upgrades will not have this file present so you will need to copy the template to your
config/menusdirectory and rename it appropriately (it must match theincludestatement in your mainmenu.hjsonfile). Example:
cp ./misc/menu_templates/activitypub.in.hjson ./config/menus/my_board_name-activitypub.hjson`This will expose the default ActivityPub setup. Enabling ActivityPub functionality requires the web server enabled and ActivityPub itself enabled in your config.hjson. See Configuration Files Include Statements for more information on using include.
- ⚠ The menu flag
noHistoryhas been revamped to work as expected. Some menu entires now need this flag. Look for any "NoResults" entries and removemenuFlags. For example, here is the (updated) defaultfileBaseListEntriesNoResultsmenu:
fileBaseListEntriesNoResults: {
desc: Browsing Files
art: FBNORES
config: {
pause: true
// no menuFlags here
}
}
See also: Menu Modules.
- Due to changes to supported algorithms in newer versions of openssl, the default list of supported algorithms for the ssh login server has changed. There are both removed ciphers as well as optional new kex algorithms available now. NOTE: Changes to supported algorithms are only needed to support keys generated with new versions of openssl, if you already have a ssl key in use you should not have to make any changes to your config.
- Removed ciphers: 'blowfish-cbc', 'arcfour256', 'arcfour128', and 'cast128-cbc'
- Added kex: 'curve25519-sha256', 'curve25519-sha256@libssh.org', 'curve25519-sha256', 'curve25519-sha256@libssh.org', 'ecdh-sha2-nistp256', 'ecdh-sha2-nistp384', 'ecdh-sha2-nistp521'
- To enable the new Waiting for Caller (WFC) support, please see WFC.
- ❗ The SSH server's
ssh2module has gone through a major upgrade. Existing users will need to comment out two SSH KEX algorithms from theirconfig.hjsonif present else clients such as NetRunner will not be able to connect over SSH. Comment outdiffie-hellman-group-exchange-sha256anddiffie-hellman-group-exchange-sha1 - Gopher configuration change. See WHATSNEW
- All features and changes are backwards compatible. There are a few new configuration options in a new
termsection in the configuration. These are all optional, but include the following options in case you use them:
{
term: {
// checkUtf8Encoding requires the use of cursor
// position reports, which are not supported on all terminals.
// Using this with a terminal that does not support cursor
// position reports results in a 2 second delay during the
// connect process, but provides better auto configuration of utf-8
checkUtf8Encoding: true
// Checking the ANSI home position also requires the use of
// cursor position reports, which are not supported on all
/// terminals. Using this with a terminal that does not support
// cursor position reports results in a 3 second delay during
// the connect process, but works around positioning problems with
// non-standard terminals.
checkAnsiHomePosition: true
}
}
In addition to these, there are also new options for term.cp437TermList and term.utf8TermList. Under most circumstances these should not need to be changed. If you want to customize these lists, more information is available in config_default.js
- Be aware that
masteris now mainline! This means allgit pull's will yield the latest version. See WHATSNEW for more information. - BREAKING CHANGE There is no longer a
prompt.hjsonfile. Prompts are now simply part of the menu set in thepromptssection. If you have an existing system you will need to add yourprompt.hjsonto yourmenu.hjson'sincludessection at a minimum. Example:
// menu.hjson
{
includes: [
my-prompts.hjson // ref your old prompts here
]
}
- A set of database fixes were made that cause some records to be properly cleaned up when e.g. deleting a file. Existing
file.dbdatabases will need to be updated manually. Note that this applies to users upgrading within 0.0.12-beta as well:
- Make a backup of your file.db!
- Shut down ENiGMA.
- From the enigma-bbs directory:
sqlite3 db/file.sqlite3 < ./misc/update/tables_update_2020-11-29.sql
- Node.js 12.x LTS is now in use. Follow standard Node.js upgrade procedures (e.g.:
nvm install 12 && nvm use 12).
- Security related files such as private keys and certs are now looked for in
config/securityby default. - Default archive handler for zip files has switched to InfoZip due to a bug in the latest p7Zip packages causing "volume not found" errors. Ensure you have the InfoZip
zipandunzipcommands in ENiGMA's path. You can switch back to 7Zip by overridingarchiveHandlerforapplication/zipin yourconfig.hjsonunderfileTypesto7Zip.
- Development is now against Node.js 10.x LTS. Follow your standard upgrade path to update to Node 10.x before using 0.0.9-alpha!
- The property
justifyfound on various views previously hadleftandrightvalues swapped (oops!); you will need to adjust any customtheme.hjsonthat use one or the other and swap them as well. - Possible breaking changes in FSE: The MCI code
%TL13for error indicator is now%TL4. This is part of a cleanup and standardization on "custom ranges". You may need to update yourtheme.hjsonand related artwork. - Removed view width auto-size: Some views still can auto-size their height, but in general you should be explicit in your themes
- More standardization using "custom ranges" and
itemFormat/focusItemFormatsemantics. Update your themes! - In addition to using
itemFormat, theonelinerzmodule usesuserNamevsusername(note the case) to match other modules loginServers.webSocketconfiguration block has changed to be more consistent with other servers. Example:
webSocket: {
ws: {
enabled: true
}
wss: {
enabled: true
port: 1234
}
proxied: true // X-Forwarded-Proto: https support
}
- The module export
registerEventshas been deprecated. If you have a module that depends on this, use the new more genericmoduleInitializeexport instead. - The
system.dbuser_event_logtable has been updated to include a unique session ID. Previously this table was not used, but you will need to perform a slight maintenance task before it can be properly used. After updating to0.0.9-alpha, please run the following:sqlite3 db/system.db DROP TABLE user_event_log;. The new table format will be created and used at startup. - If you have art configured for message conference or area selection via the
artconfiguration value, you will need to include ashow_artmenu reference. Defaulted tochangeMessageConfPreArtfor conferences andchangeMessageAreaPreArtfor areas & included in the examplemenu.hjson. - Config
defaultssection was theme related and as such, has been renamed totheme.defaults.themeis nowtheme.default, andpreLoginThemeis nowtheme.preLogin. Seeconfig.jsif this isn't clear as mud. - Similar to the last item,
defaults.general.passwordCharintheme.hjsonis now justdefaults.passwordChar.
ENiGMA 0.0.8-alpha comes with some structure changes:
- Configuration files are defaulted to
./config. Related, the--configoption now points to a configuration directory ./mods/arthas been moved to./art/general./modsis now reserved for actual user addon modules- Themes have been moved from
./mods/themesto./art/themes
With the change to the ./mods directory, @systemModule is now implied for module declarations in menu.hjson. To use a user module in ./mods you must specify @userModule!
With the above changes, you'll need to to at least:
- Move your
~/.config/enigma-bbs/config.hjsonto./config/config.hjsonor utlize the--configoption. - Move your
prompt.hjsonandmenu.hjson(e.g.myboardname.hjson) to./config - Move any non-theme art files, and theme directories to their appropriate locations mentioned above
- Move any module directories such as
message_post_evtto./mods/ - Move any certificates, pub/private keys, etc. from
./miscto./config - Specify user modules as
@userModule:my_module_name
No issues
No issues
No issues
You will need to upgrade Node.js to 6.x+. If using nvm (you should be!) the process will go something like this:
nvm install 6
nvm alias default 6Newly written code will use ES6 and a lot of code has started the migration process. Of note is the MenuModule class. If you have created a mod that inherits from MenuModule, you will need to upgrade your class to ES6.
A few upgrades need to be made to your SQLite databases:
rm db/file.sqltie3 # safe to delete this time as it was not used previously
sqlite3 db/message.sqlite
sqlite> INSERT INTO message_fts(message_fts) VALUES('rebuild');If you have overridden or made additions to archivers in your config.hjson you will need to update them. See Archive Configuration and core/config.js
As 0.0.4-alpha contains file bases, you'll want to create a suitable configuration if you wish to use the feature. See File Base Configuration.