From 26849ba4fa943aa47d958890cff48162112504c2 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 31 Jan 2018 23:35:54 +0000 Subject: [PATCH] * Docs theme to match ENiGMA website * New docs layout ready for github pages serving * Tonnes of new docs * Update gitignore * Probably other stuff too --- .gitignore | 5 +- docs/404.html | 24 ++ docs/Gemfile | 31 ++ docs/Gemfile.lock | 101 ++++++ docs/_config.yml | 28 ++ docs/_includes/nav.md | 67 ++++ docs/_layouts/default.html | 41 +++ docs/_layouts/page.html | 8 + docs/_layouts/post.html | 25 ++ docs/_sass/_default_colors.scss | 16 + docs/_sass/jekyll-theme-hacker.scss | 326 ++++++++++++++++++ docs/_sass/rouge-base16-dark.scss | 87 +++++ docs/about.md | 19 - docs/art/general.md | 6 + docs/art/mci.md | 135 ++++++++ docs/art/themes.md | 25 ++ docs/assets/css/style.scss | 4 + docs/assets/images/bkg.png | Bin 0 -> 1218 bytes docs/assets/images/bullet.png | Bin 0 -> 603 bytes docs/assets/images/enigma-logo.png | Bin 0 -> 16643 bytes .../archivers.md} | 5 +- .../config-hjson.md} | 19 +- docs/configuration/creating-config.md | 27 ++ docs/configuration/directory-structure.md | 20 ++ docs/configuration/editing-hjson.md | 16 + docs/configuration/menu-hjson.md | 101 ++++++ docs/configuration/sysop-setup.md | 6 + docs/file_base.md | 89 ----- docs/filebase/acs.md | 25 ++ docs/filebase/first-file-area.md | 71 ++++ docs/filebase/index.md | 19 + docs/filebase/tic-support.md | 100 ++++++ docs/filebase/uploads.md | 8 + docs/filebase/web-access.md | 11 + docs/index.md | 150 ++------ docs/installation/docker.md | 21 ++ docs/installation/install-script.md | 16 + docs/installation/installation-methods.md | 13 + docs/installation/manual.md | 74 ++++ docs/installation/network.md | 6 + docs/{rpi.md => installation/os-hardware.md} | 28 +- docs/installation/production.md | 12 + docs/installation/testing.md | 44 +++ docs/mci.md | 113 ------ docs/menu_system.md | 86 ----- docs/messageareas/bso-import-export.md | 74 ++++ .../configuring-a-message-area.md | 65 ++++ docs/messageareas/message-networks.md | 67 ++++ docs/messageareas/netmail.md | 38 ++ docs/modding.md | 15 - docs/modding/door-servers.md | 61 ++++ docs/modding/existing-mods.md | 11 + docs/{doors.md => modding/local-doors.md} | 74 +--- docs/mods.md | 9 - docs/msg_conf_area.md | 57 --- docs/msg_networks.md | 196 ----------- docs/oputil/index.md | 17 + docs/servers/ssh.md | 36 ++ docs/servers/telnet.md | 4 + docs/{web_server.md => servers/web-server.md} | 11 +- .../websocket.md} | 6 +- docs/troubleshooting/monitoring-logs.md | 15 + 62 files changed, 1974 insertions(+), 810 deletions(-) create mode 100644 docs/404.html create mode 100644 docs/Gemfile create mode 100644 docs/Gemfile.lock create mode 100644 docs/_config.yml create mode 100644 docs/_includes/nav.md create mode 100644 docs/_layouts/default.html create mode 100644 docs/_layouts/page.html create mode 100644 docs/_layouts/post.html create mode 100644 docs/_sass/_default_colors.scss create mode 100644 docs/_sass/jekyll-theme-hacker.scss create mode 100644 docs/_sass/rouge-base16-dark.scss delete mode 100644 docs/about.md create mode 100644 docs/art/general.md create mode 100644 docs/art/mci.md create mode 100644 docs/art/themes.md create mode 100644 docs/assets/css/style.scss create mode 100644 docs/assets/images/bkg.png create mode 100644 docs/assets/images/bullet.png create mode 100644 docs/assets/images/enigma-logo.png rename docs/{archive.md => configuration/archivers.md} (98%) rename docs/{config.md => configuration/config-hjson.md} (85%) create mode 100644 docs/configuration/creating-config.md create mode 100644 docs/configuration/directory-structure.md create mode 100644 docs/configuration/editing-hjson.md create mode 100644 docs/configuration/menu-hjson.md create mode 100644 docs/configuration/sysop-setup.md delete mode 100644 docs/file_base.md create mode 100644 docs/filebase/acs.md create mode 100644 docs/filebase/first-file-area.md create mode 100644 docs/filebase/index.md create mode 100644 docs/filebase/tic-support.md create mode 100644 docs/filebase/uploads.md create mode 100644 docs/filebase/web-access.md create mode 100644 docs/installation/docker.md create mode 100644 docs/installation/install-script.md create mode 100644 docs/installation/installation-methods.md create mode 100644 docs/installation/manual.md create mode 100644 docs/installation/network.md rename docs/{rpi.md => installation/os-hardware.md} (52%) create mode 100644 docs/installation/production.md create mode 100644 docs/installation/testing.md delete mode 100644 docs/mci.md delete mode 100644 docs/menu_system.md create mode 100644 docs/messageareas/bso-import-export.md create mode 100644 docs/messageareas/configuring-a-message-area.md create mode 100644 docs/messageareas/message-networks.md create mode 100644 docs/messageareas/netmail.md delete mode 100644 docs/modding.md create mode 100644 docs/modding/door-servers.md create mode 100644 docs/modding/existing-mods.md rename docs/{doors.md => modding/local-doors.md} (76%) delete mode 100644 docs/mods.md delete mode 100644 docs/msg_conf_area.md delete mode 100644 docs/msg_networks.md create mode 100644 docs/oputil/index.md create mode 100644 docs/servers/ssh.md create mode 100644 docs/servers/telnet.md rename docs/{web_server.md => servers/web-server.md} (82%) rename docs/{vtx_web_client.md => servers/websocket.md} (96%) create mode 100644 docs/troubleshooting/monitoring-logs.md diff --git a/.gitignore b/.gitignore index ee9fc3d8..5a58c717 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ logs/ db/ dropfiles/ -node_modules/ \ No newline at end of file +node_modules/ +docs/_site/ +docs/.sass-cache/ +` \ No newline at end of file diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 00000000..c472b4ea --- /dev/null +++ b/docs/404.html @@ -0,0 +1,24 @@ +--- +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 00000000..1a0104dd --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,31 @@ +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> 3.7.0" + +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "hacker" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.6" + gem 'jekyll-seo-tag' + gem 'jekyll-theme-hacker' + gem 'jekyll-sitemap' + gem 'jemoji' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] + diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 00000000..f49b797b --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,101 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (4.2.9) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + colorator (1.1.0) + concurrent-ruby (1.0.5) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.5) + ffi (1.9.18) + forwardable-extended (2.6.0) + gemoji (3.0.0) + hacker (0.0.1) + html-pipeline (2.7.1) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.6.0) + i18n (0.9.1) + concurrent-ruby (~> 1.0) + jekyll (3.7.0) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-feed (0.9.2) + jekyll (~> 3.3) + jekyll-sass-converter (1.5.1) + sass (~> 3.4) + jekyll-seo-tag (2.4.0) + jekyll (~> 3.3) + jekyll-sitemap (1.1.1) + jekyll (~> 3.3) + jekyll-theme-hacker (0.1.0) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-watch (2.0.0) + listen (~> 3.0) + jemoji (0.8.1) + activesupport (~> 4.0, >= 4.2.9) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0) + kramdown (1.16.2) + liquid (4.0.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + mercenary (0.3.6) + mini_portile2 (2.3.0) + minitest (5.11.1) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) + pathutil (0.16.1) + forwardable-extended (~> 2.6) + public_suffix (3.0.1) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rouge (3.1.0) + ruby_dep (1.5.0) + safe_yaml (1.0.4) + sass (3.5.5) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + thread_safe (0.3.6) + tzinfo (1.2.4) + thread_safe (~> 0.1) + +PLATFORMS + ruby + +DEPENDENCIES + hacker + jekyll (~> 3.7.0) + jekyll-feed (~> 0.6) + jekyll-seo-tag + jekyll-sitemap + jekyll-theme-hacker + jemoji + tzinfo-data + +BUNDLED WITH + 1.16.1 diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..b791e4fb --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,28 @@ +title: ENiGMA½ BBS Software +email: your-email@example.com +description: >- # this means to ignore newlines until "baseurl:" + ENiGMA½ BBS is modern open source BBS software with a nostalgic flair, written in Node.js. +url: +logo: /assets/images/enigma-logo.png + +# Build settings +markdown: kramdown +theme: jekyll-theme-hacker +plugins: + - jekyll-feed + - jekyll-seo-tag + - jekyll-sitemap + - jemoji + +# Exclude from processing. +# The following items will not be processed, by default. Create a custom list +# to override the default setting. +exclude: + - Gemfile + - Gemfile.lock + - node_modules + - vendor/bundle/ + - vendor/cache/ + - vendor/gems/ + - vendor/ruby/ + - .idea diff --git a/docs/_includes/nav.md b/docs/_includes/nav.md new file mode 100644 index 00000000..f8fbb643 --- /dev/null +++ b/docs/_includes/nav.md @@ -0,0 +1,67 @@ + - Installation + - [Installation Methods](/installation/installation-methods) + - [Install script](/installation/install-script) + - [Docker](/installation/docker) + - [Manual installation](/installation/manual) + - [OS / Hardware Specific](/installation/os-hardware) + - Raspberry Pi + - Windows + - [Your Network Setup](/installation/network) + - [Testing Your Installation](/installation/testing) + - [Production Installation](/installation/production) + + - Configuration + - [Creating Config Files](/configuration/creating-config) + - [SysOp Setup](/configuration/sysop-setup) + - [Editing hjson](/configuration/editing-hjson) + - [config.hjson](/configuration/config-hjson) + - [menu.hjson](/configuration/menu-hjson) + - prompt.hjson + - [Directory Structure](/configuration/directory-structure) + - [Archivers](/configuration/archivers) + - Scheduled jobs + - SMTP + + - File Base + - [About](/filebase/) + - [Configuring a File Area](/filebase/first-file-area) + - [ACS model](/filebase/acs) + - [Uploads](/filebase/uploads) + - [Web Access](/filebase/web-access) + - [TIC Support](/filebase/tic-support) (Importing from FTN networks) + - Tips and tricks + - Network mounts and symlinks + + - Message Areas + - [Configuring a Message Area](/messageareas/configuring-a-message-area) + - [Message networks](/messageareas/message-networks) + - [BSO Import & Export](/messageareas/bso-import-export) + - [Netmail](/messageareas/netmail) + + - Art + - [General](/art/general) + - [Themes](/art/themes) + - [MCI Codes](/art/mci) + + - Servers + - Login Servers + - [Telnet](/servers/telnet) + - [SSH](/servers/ssh) + - [WebSocket](/servers/websocket) + - Build your own + - Content Servers + - [Web](/servers/web-server) + + - Modding + - [Local Doors](/modding/local-doors) + - [Door Servers](/modding/door-servers) + - DoorParty + - BBSLink + - Combatnet + - Exodus + - [Existing Mods](/modding/existing-mods) + + - [Oputil](/oputil/) + + - Troubleshooting + - [Monitoring Logs](/troubleshooting/monitoring-logs) diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html new file mode 100644 index 00000000..8b01d854 --- /dev/null +++ b/docs/_layouts/default.html @@ -0,0 +1,41 @@ + + + + + + + + + {% seo %} + + + + + Fork me on GitHub + +
+
+
+ {{ content }} +
+
+
+ + {% if site.google_analytics %} + + {% endif %} + + diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html new file mode 100644 index 00000000..404d540a --- /dev/null +++ b/docs/_layouts/page.html @@ -0,0 +1,8 @@ +--- +layout: default +--- + +
+

{{ page.title }}

+ {{ content }} +
\ No newline at end of file diff --git a/docs/_layouts/post.html b/docs/_layouts/post.html new file mode 100644 index 00000000..f3def1e6 --- /dev/null +++ b/docs/_layouts/post.html @@ -0,0 +1,25 @@ +--- +layout: default +--- + +
+

{{ page.title }}

+ + {{ content }} +
+ + \ No newline at end of file diff --git a/docs/_sass/_default_colors.scss b/docs/_sass/_default_colors.scss new file mode 100644 index 00000000..4227975a --- /dev/null +++ b/docs/_sass/_default_colors.scss @@ -0,0 +1,16 @@ +$apple-blossom: #ac4142; +$alto: #d0d0d0; +$bouquet: #aa759f; +$enigma-purple: #8900aa; +$chelsea-cucumber: #90a959; +$cod-grey: #151515; +$conifer: #b5e853; +$dove-grey: #666; +$gallery: #eaeaea; +$grey: #888; +$gulf-stream: #75b5aa; +$hippie-blue: #6a9fb5; +$potters-clay: #8f5536; +$rajah: #f4bf75; +$raw-sienna: #d28445; +$silver-chalice: #aaa; diff --git a/docs/_sass/jekyll-theme-hacker.scss b/docs/_sass/jekyll-theme-hacker.scss new file mode 100644 index 00000000..e02b5aad --- /dev/null +++ b/docs/_sass/jekyll-theme-hacker.scss @@ -0,0 +1,326 @@ +@import "rouge-base16-dark"; +@import "default_colors"; + +$body-background: $cod-grey !default; +$body-foreground: $gallery !default; +$header: $conifer !default; +$blockquote-color: $silver-chalice !default; +$blockquote-border: $dove-grey !default; + +body { + margin: 0; + padding: 0; + background: $body-background url("../images/bkg.png") 0 0; + color: $body-foreground; + font-size: 16px; + line-height: 1.5; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; +} + +/* General & 'Reset' Stuff */ + +.container { + width: 90%; + /*max-width: 1000px;*/ + margin: 0 auto; +} + +section { + display: block; + margin: 0 0 20px 0; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0 0 20px; +} + +li { + line-height: 1.4 ; +} + +/* Header,
+ header - container + h1 - project name + h2 - project description +*/ + +header { + background: rgba(0, 0, 0, 0.1); + width: 100%; + border-bottom: 1px dashed $conifer; //header; + padding: 20px 0; + margin: 0 0 40px 0; + text-align: center; +} + +header h1 { + font-size: 30px; + line-height: 1.5; + margin: 0 0 0 -40px; + font-weight: bold; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color: $conifer;//$header; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), + 0 0 5px rgba(181, 232, 83, 0.1), + 0 0 10px rgba(181, 232, 83, 0.1); + letter-spacing: -1px; + -webkit-font-smoothing: antialiased; +} + +header h1:before { + content: "./ "; + font-size: 24px; +} + +header h2 { + font-size: 18px; + font-weight: 300; + color: #666; +} + +header img { + padding: 0px; + margin: 0px; + max-width: 100%; +} + +#downloads .btn { + display: inline-block; + text-align: center; + margin: 0; +} + +/* Main Content +*/ +.sidebar { + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: 22rem; + height: 100%; + text-align: left; + border-right: 1px dashed $conifer; //header; + overflow-y: scroll; + display: block; + float: left; + + .logo { + padding-top: 20px; + max-width: 100%; + } + + ul { + padding-bottom: 0px; + } + ul li { + margin-bottom: 0px; + padding-top: 5px; + } +} + +.main_area { + padding-left: 22em; + padding-top: 20px; +} + +#main_content { + + -webkit-font-smoothing: antialiased; +} +section img { + max-width: 100% +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color: $header; + letter-spacing: -0.03em; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), + 0 0 5px rgba(181, 232, 83, 0.1), + 0 0 10px rgba(181, 232, 83, 0.1); +} + +#main_content h1 { + font-size: 30px; +} + +#main_content h2 { + font-size: 24px; +} + +#main_content h3 { + font-size: 18px; +} + +#main_content h4 { + font-size: 14px; +} + +#main_content h5 { + font-size: 12px; + text-transform: uppercase; + margin: 0 0 5px 0; +} + +#main_content h6 { + font-size: 12px; + text-transform: uppercase; + color: #999; + margin: 0 0 5px 0; +} + +dt { + font-style: italic; + font-weight: bold; +} + +ul { + padding-bottom: 5px; +} + +ul li { + list-style-image:url('../images/bullet.png'); + margin-bottom: 10px; + padding-top: 10px; +} + +nav { + text-align: left; + + ul { + list-style: none; + margin-left: 0; + padding-left: 0; + margin-top: 20; + margin-bottom: 0; + padding-bottom: 0; + + li { + display: inline-block; + margin-left: 0.5em; + padding-right: 20px; + + a { + color: $enigma-purple; + text-decoration: none; + } + + a:hover { + color: $bouquet; + } + } + } +} + + +blockquote { + color: $blockquote-color; + padding-left: 10px; + border-left: 1px dotted $blockquote-border; +} + +pre { + background: rgba(0, 0, 0, 0.9); + border: 1px solid rgba(255, 255, 255, 0.15); + padding: 10px; + font-size: 16px; + color: #b5e853; + border-radius: 2px; + text-wrap: normal; + overflow: auto; + overflow-y: hidden; +} + +code.highlighter-rouge { + background: rgba(0,0,0,0.9); + border: 1px solid rgba(255, 255, 255, 0.15); + padding: 0px 3px; + margin: 0px -3px; + color: #aa759f; + border-radius: 2px; +} + +table { + width: 100%; + margin: 0 0 20px 0; +} + +th { + text-align: left; + border-bottom: 1px dashed #b5e853; + padding: 5px 10px; +} + +td { + padding: 5px 10px; +} + +hr { + height: 0; + border: 0; + border-bottom: 1px dashed #b5e853; + color: #b5e853; +} + +/* Buttons +*/ + +.btn { + display: inline-block; + background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.3), rgba(35, 35, 35, 0.3) 50%, rgba(10, 10, 10, 0.3) 50%, rgba(0, 0, 0, 0.3)); + padding: 8px 18px; + border-radius: 50px; + border: 2px solid rgba(0, 0, 0, 0.7); + border-bottom: 2px solid rgba(0, 0, 0, 0.7); + border-top: 2px solid rgba(0, 0, 0, 1); + color: rgba(255, 255, 255, 0.8); + font-family: Helvetica, Arial, sans-serif; + font-weight: bold; + font-size: 13px; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.75); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.btn:hover { + background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.6), rgba(35, 35, 35, 0.6) 50%, rgba(10, 10, 10, 0.8) 50%, rgba(0, 0, 0, 0.8)); +} + +.btn .icon { + display: inline-block; + width: 16px; + height: 16px; + margin: 1px 8px 0 0; + float: left; +} + +.btn-github .icon { + opacity: 0.6; + background: url("../images/blacktocat.png") 0 0 no-repeat; +} + +/* Links + a, a:hover, a:visited +*/ + +a { + color: #63c0f5; + text-shadow: 0 0 5px rgba(104, 182, 255, 0.5); +} + +/* Clearfix */ + +.cf:before, .cf:after { + content:""; + display:table; +} + +.cf:after { + clear:both; +} + +.cf { + zoom:1; +} diff --git a/docs/_sass/rouge-base16-dark.scss b/docs/_sass/rouge-base16-dark.scss new file mode 100644 index 00000000..7f839e96 --- /dev/null +++ b/docs/_sass/rouge-base16-dark.scss @@ -0,0 +1,87 @@ +/* + generated by rouge http://rouge.jneen.net/ + original base16 by Chris Kempson (https://github.com/chriskempson/base16) +*/ + +@import "default_colors"; + +.highlight { + + $plaintext: $alto !default; + $string: $chelsea-cucumber !default; + $literal: $chelsea-cucumber !default; + $keyword: $bouquet !default; + $error-foreground: $cod-grey !default; + $error-background: $apple-blossom !default; + $comment: $grey !default; + $preprocessor: $rajah !default; + $name-space: $rajah !default; + $name-attribute: $hippie-blue !default; + $operator: $rajah !default; + $keyword-type: $raw-sienna !default; + $regex: $gulf-stream !default; + $string-escape: $potters-clay !default; + $deleted: $apple-blossom !default; + $header: $hippie-blue !default; + + color: $plaintext; + + table td { padding: 5px; } + table pre { margin: 0; } + .w { + color: $plaintext; + } + .err { + color: $error-foreground; + background-color: $error-background; + } + .c, .cd, .cm, .c1, .cs { + color: $comment; + } + .cp { + color: $preprocessor; + } + .o, .ow { + color: $operator; + } + .p, .pi { + color: $plaintext; + } + .gi { + color: $string; + } + .gd { + color: $deleted; + } + .gh { + color: $header; + font-weight: bold; + } + .k, .kn, .kp, .kr, .kv { + color: $keyword; + } + .kc, .kt, .kd { + color: $keyword-type; + } + .s, .sb, .sc, .sd, .s2, .sh, .sx, .s1 { + color: $string; + } + .sr { + color: $regex; + } + .si, .se { + color: $string-escape; + } + .nt, .nn, .nc, .no{ + color: $name-space; + } + .na { + color: $name-attribute; + } + .m, .mf, .mh, .mi, .il, .mo, .mb, .mx { + color: $literal; + } + .ss { + color: $string; + } +} diff --git a/docs/about.md b/docs/about.md deleted file mode 100644 index 50656011..00000000 --- a/docs/about.md +++ /dev/null @@ -1,19 +0,0 @@ -# About ENiGMA½ - -## High Level Feature Overview - * Multi platform: Anywhere [Node.js](https://nodejs.org/) runs likely works (known to work under Linux, FreeBSD, OpenBSD, OS X and Windows) - * Unlimited multi node support (for all those BBS "callers"!) - * **Highly** customizable via [HJSON](http://hjson.org/) based configuration, menus, and themes in addition to JavaScript based mods - * MCI support for lightbars, toggles, input areas, and so on plus many other other bells and whistles - * Telnet & **SSH** access built in. Additional servers are easy to implement - * [CP437](http://www.ascii-codes.com/) and UTF-8 output - * [SyncTerm](http://syncterm.bbsdev.net/) style font and baud emulation support. Display PC/DOS and Amiga style artwork as it's intended! In general, ANSI-BBS / [cterm.txt](http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/src/conio/cterm.txt?content-type=text%2Fplain&revision=HEAD) / [bansi.txt](http://www.bbsdocumentary.com/library/PROGRAMS/GRAPHICS/ANSI/bansi.txt) are followed for expected BBS behavior - * [SAUCE](http://www.acid.org/info/sauce/sauce.htm) support - * Renegade style pipe color codes - * [SQLite](http://sqlite.org/) storage of users, message areas, and so on - * Strong [PBKDF2](https://en.wikipedia.org/wiki/PBKDF2) backed password encryption - * [Door support](doors.md) including common dropfile formats for legacy DOS doors. Built in [BBSLink](http://bbslink.net/), and [DoorParty](http://forums.throwbackbbs.com/) support! - * [Bunyan](https://github.com/trentm/node-bunyan) logging - * [Message networks](msg_networks.md) with FidoNet Type Network (FTN) + BinkleyTerm Style Outbound (BSO) message import/export - * [Gazelle](https://github.com/WhatCD/Gazelle) inspirted File Bases including fast fully indexed full text search (FTS), #tags, and HTTP(S) temporary download URLs using a built in [web server](web_server.md). Legacy X/Y/Z modem also supported! - * Upload processor supporting [FILE_ID.DIZ](https://en.wikipedia.org/wiki/FILE_ID.DIZ) and [NFO](https://en.wikipedia.org/wiki/.nfo) extraction, year estimation, and more! \ No newline at end of file diff --git a/docs/art/general.md b/docs/art/general.md new file mode 100644 index 00000000..c43d915c --- /dev/null +++ b/docs/art/general.md @@ -0,0 +1,6 @@ +--- +layout: page +title: General +--- +General art lives in the `art/general` directory. 'General' art is ANSI you want to stay consistent across themes, +such as a welcome ANSI or a rotation of logoff ANSIs. diff --git a/docs/art/mci.md b/docs/art/mci.md new file mode 100644 index 00000000..4befc411 --- /dev/null +++ b/docs/art/mci.md @@ -0,0 +1,135 @@ +--- +layout: page +title: MCI Codes +--- +ENiGMA½ supports a variety of MCI codes. Some **predefined** codes produce information about the current user, system, +or other statistics while others are used to instantiate a **View**. MCI codes are two characters in length and are +prefixed with a percent (%) symbol. Some MCI codes have additional options that may be set directly from the code itself +while others -- and more advanced options -- are controlled via the current theme. Standard (non-focus) and focus colors +are set by placing duplicate codes back to back in art files. + +## Predefined MCI Codes +There are many predefined MCI codes that can be used anywhere on the system (placed in any art file). More are added all +the time so also check out [core/predefined_mci.js](https://github.com/NuSkooler/enigma-bbs/blob/master/core/mci_view_factory.js) +for a full listing. Many codes attempt to pay homage to Oblivion/2, +iNiQUiTY, etc. + +| Code | Description | +|------|--------------| +| `BN` | Board Name | +| `VL` | Version *label*, e.g. "ENiGMA½ v0.0.3-alpha" | +| `VN` | Version *number*, eg.. "0.0.3-alpha" | +| `SN` | SysOp username | +| `SR` | SysOp real name | +| `SL` | SysOp location | +| `SA` | SysOp affiliations | +| `SS` | SysOp sex | +| `SE` | SysOp email address | +| `UN` | Current user's username | +| `UI` | Current user's user ID | +| `UG` | Current user's group membership(s) | +| `UR` | Current user's real name | +| `LO` | Current user's location | +| `UA` | Current user's age | +| `BD` | Current user's birthdate (using theme date format) | +| `US` | Current user's sex | +| `UE` | Current user's email address | +| `UW` | Current user's web address | +| `UF` | Current user's affiliations | +| `UT` | Current user's *theme ID* (e.g. "luciano_blocktronics") | +| `UC` | Current user's login/call count | +| `ND` | Current user's connected node number | +| `IP` | Current user's IP address | +| `ST` | Current user's connected server name (e.g. "Telnet" or "SSH") | +| `FN` | Current user's active file base filter name | +| `DN` | Current user's number of downloads | +| `DK` | Current user's download amount (formatted to appropriate bytes/megs/etc.) | +| `UP` | Current user's number of uploads | +| `UK` | Current user's upload amount (formatted to appropriate bytes/megs/etc.) | +| `NR` | Current user's upload/download ratio | +| `KR` | Current user's upload/download *bytes* ratio | +| `MS` | Current user's account creation date (using theme date format) | +| `PS` | Current user's post count | +| `PC` | Current user's post/call ratio | +| `MD` | Current user's status/viewing menu/activity | +| `MA` | Current user's active message area name | +| `MC` | Current user's active message conference name | +| `ML` | Current user's active message area description | +| `CM` | Current user's active message conference description | +| `SH` | Current user's term height | +| `SW` | Current user's term width | +| `DT` | Current date (using theme date format) | +| `CT` | Current time (using theme time format) | +| `OS` | System OS (Linux, Windows, etc.) | +| `OA` | System architecture (x86, x86_64, arm, etc.) | +| `SC` | System CPU model | +| `NV` | System underlying Node.js version | +| `AN` | Current active node count | +| `TC` | Total login/calls to system | +| `RR` | Displays a random rumor | +| `SD` | Total downloads, system wide | +| `SO` | Total downloaded amount, system wide (formatted to appropriate bytes/megs/etc.) | +| `SU` | Total uploads, system wide | +| `SP` | Total uploaded amount, system wide (formatted to appropriate bytes/megs/etc.) | + +A special `XY` MCI code may also be utilized for placement identification when creating menus. + + +## Views +A **View** is a control placed on a **form** that can display variable data or collect input. One example of a View is +a Vertical Menu (`%VM`): Old-school BBSers may recognize this as a lightbar menu. + +| Code | Name | Description | +|------|----------------------|------------------| +| `TL` | Text Label | Displays text | +| `ET` | Edit Text | Collect user input | +| `ME` | Masked Edit Text | Collect user input using a *mask* | +| `MT` | Multi Line Text Edit | Multi line edit control | +| `BT` | Button | A button | +| `VM` | Vertical Menu | A vertical menu aka a vertical lightbar | +| `HM` | Horizontal Menu | A horizontal menu aka a horizontal lightbar | +| `SM` | Spinner Menu | A spinner input control | +| `TM` | Toggle Menu | A toggle menu commonly used for Yes/No style input | +| `KE` | Key Entry | A *single* key input control | + + +Peek at [/core/mci_view_factory.js](https://github.com/NuSkooler/enigma-bbs/blob/master/core/mci_view_factory.js) to +see additional information. + + +## Properties & Theming +Predefined MCI codes and other Views can have properties set via `menu.hjson` and further *themed* via `theme.hjson`. + +### Common Properties + +| Property | Description | +|-------------|--------------| +| `textStyle` | Sets the standard (non-focus) text style. See **Text Styles** below | +| `focusTextStyle` | Sets focus text style. See **Text Styles** below. | +| `itemSpacing` | Used to separate items in menus such as Vertical Menu and Horizontal Menu Views. | +| `height` | Sets the height of views such as menus that may be > 1 character in height | +| `width` | Sets the width of a view | +| `focus` | If set to `true`, establishes initial focus | +| `text` | (initial) text of a view | +| `submit` | If set to `true` any `accept` action upon this view will submit the encompassing **form** | + +These are just a few of the properties set on various views. *Use the source Luke*, as well as taking a look at the default +`menu.hjson` and `theme.hjson` files! + + +### Text Styles + +Standard style types available for `textStyle` and `focusTextStyle`: + +| Style | Description | +|----------|--------------| +| `normal` | Leaves text as-is. This is the default. | +| `upper` | ENIGMA BULLETIN BOARD SOFTWARE | +| `lower` | enigma bulletin board software | +| `title` | Enigma Bulletin Board Software | +| `first lower` | eNIGMA bULLETIN bOARD sOFTWARE | +| `small vowels` | eNiGMa BuLLeTiN BoaRD SoFTWaRe | +| `big vowels` | EniGMa bUllEtIn bOArd sOftwArE | +| `small i` | ENiGMA BULLETiN BOARD SOFTWARE | +| `mixed` | EnIGma BUlLEtIn BoaRd SOfTWarE (randomly assigned) | +| `l33t` | 3n1gm4 bull371n b04rd 50f7w4r3 | \ No newline at end of file diff --git a/docs/art/themes.md b/docs/art/themes.md new file mode 100644 index 00000000..37631454 --- /dev/null +++ b/docs/art/themes.md @@ -0,0 +1,25 @@ +--- +layout: page +title: Themes +--- +:warning: ***IMPORTANT!*** It is recommended you don't make any customisations to the included +`luciano_blocktronics' theme. Create your own and make changes to that instead: + +1. Copy `/art/themes/luciano_blocktronics` to `art/themes/your_board_theme` +2. Update the `info` block at the top of the theme.hjson file: + + info: { + name: Awesome Theme + author: Cool Artist + group: Sick Group + enabled: true + } + +3. Specify it in the `defaults` section of `config.hjson`. The name supplied should match the name of the +directory you created in step 1: + + ```hjson + defaults: { + theme: your_board_theme + } + ``` diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss new file mode 100644 index 00000000..5f1392bd --- /dev/null +++ b/docs/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import 'jekyll-theme-hacker'; diff --git a/docs/assets/images/bkg.png b/docs/assets/images/bkg.png new file mode 100644 index 0000000000000000000000000000000000000000..d10e5caf1adb7466673bc9cef83621fe855caa3f GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0y~yU=jggMrNQ$#TNBtK#DEEC&X1sN=jNkczmscWgJUHsE1R2ws}X9=R$~%X@*3=-vhL@-NfkR)!pBoqVTzzlmJ$gw$h( za!N&gzAjH}?UE-yuB@->I#KvPao+dRzrL@oCvVpee)R8SO|Rip8+r3Dza~8XxNqSP zmGuR0<=?XLN*y=&ko@A*R?n;zmFGjmpL|X=el)GDnT?nCc-hJ9h-*>(U-v7SP21O( zoNu0S!J*))p{S5clIq(!Rnv%W88O`}e-}D7AF~mxZfpV+3kwX-$FQx)Y;JvA%`)@d zWYLYgd8JI0aw{r!Iv89Q>eyImcyRi@1&bblZJ%(NN9SER*F|RI`9Vy^n|kYj&a|m< zH+i{|PR}_n7 z-gd`kwp)J%TC%IUg`6V4t}fWH9jMCX-LAENwM{str7XO1;E!GNEuasI-gOzw-pnlj z>{){B-p0ScV3upi-pM7+*5to^wpdM0Lo6uhXKvGLxTUb-aiDN)U^44#klW=8|4*sV zntfrzKU=lq{IC4u?*i3*Ut)0K@G9flAeW??UW>QI-$6b&yzF|LRw2jj$QO!RxR2R@ z!p-JEk`UjzM%QUGt5 zsq{^Wh=(VtSvB4F14E?hZ{X9Y?R-}fa@G1cS_4|1{K5DvW*TQF%BQWRm-W8rcnHXW5F_LnOa!0te-Gud{_`k1m{6m9unPa(^B$ zKx8W_XRUv@r+&lLzc+3*l|BZA<&8P3LiGe?mL9UxX48rf2YHj@p3l_yh=pvc)~tHC z{nO?fprlo3bGdkWi`e7f5A45eIR!{NSV4~V*iRMLf15OnS&>IfjrQ$5*USNy<-2E*PZ71vSAxg$R}ir z*HrJV2QIesUSGbBCF#9c#svfK2|7o#H8-glPWYpw_zvjL75X#RJY~u`5Y-X(HrD(= zUCM<84_%p-W@|H8MF_Nfy!EQ%2FOzxtQJYFtLINQ#Ng@b=d#Wzp$P!*bu5qo literal 0 HcmV?d00001 diff --git a/docs/assets/images/bullet.png b/docs/assets/images/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f8de1a7e0d469d77b8852396dd10f338ae23f2 GIT binary patch literal 603 zcmeAS@N?(olHy`uVBq!ia0vp^57${dCd>QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI&pI+kyVsc_(xbi&_G6SPZ!4!i_=@D?9F0w6md%rmzMVCWO3ZMStxs>APeV` z6HToPk{)y4eARTTV}i&**7yU5F8RqPByJ7f7l(V(z*fP#y%N{ZA*k8}SM*o+)sk0^| zVWo&jS?rFxude<7%Cf>m>EMbm?l6Vrx6ksBe>HsTzdZg`C*I{YbAygX z`No(wBmKJvw3*sg? literal 0 HcmV?d00001 diff --git a/docs/assets/images/enigma-logo.png b/docs/assets/images/enigma-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..94f652aeabed0302d06b927b41c59c473ba745cb GIT binary patch literal 16643 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 IWft~702|8K8UO$Q literal 0 HcmV?d00001 diff --git a/docs/archive.md b/docs/configuration/archivers.md similarity index 98% rename from docs/archive.md rename to docs/configuration/archivers.md index 68453098..26755162 100644 --- a/docs/archive.md +++ b/docs/configuration/archivers.md @@ -1,4 +1,7 @@ -# File Archives & Archivers +--- +layout: page +title: Archivers +--- ENiGMA½ can detect and process various archive formats such as zip and arj for a variety of tasks from file upload processing to EchoMail bundle compress/decompression. The `archives` section of `config.hjson` is used to override defaults, add new handlers, and so on. ## Archivers diff --git a/docs/config.md b/docs/configuration/config-hjson.md similarity index 85% rename from docs/config.md rename to docs/configuration/config-hjson.md index 98a6730f..10ca119d 100644 --- a/docs/config.md +++ b/docs/configuration/config-hjson.md @@ -1,6 +1,7 @@ -# Configuration -Configuration files in ENiGMA½ are simple UTF-8 encoded [HJSON](http://hjson.org/) files. HJSON is just like JSON but simplified and much more resilient to human error. - +--- +layout: page +title: config.hjson +--- ## System Configuration The main system configuration file, `config.hjson` both overrides defaults and provides additional configuration such as message areas. The default path is `/enigma-bbs-install-path/config/config.hjson` though you can override the `config.hjson` location with the `--config` parameter when invoking `main.js`. Values found in `core/config.js` may be overridden by simply providing the object members you wish replace. @@ -31,12 +32,6 @@ general: { While not everything that is available in your `config.hjson` file can be found defaulted in `core/config.js`, a lot is. [Poke around and see what you can find](https://github.com/NuSkooler/enigma-bbs/blob/master/core/config.js)! -### Specific Areas of Interest -* [Message Conferences](msg_conf_area.md) -* [Message Networks](msg_networks.md) -* [File Base](file_base.md) -* [File Archives & Archivers](archives.md) -* [Web Server](web_server.md) ### A Sample Configuration Below is a **sample** `config.hjson` illustrating various (but certainly not all!) elements that can be configured / tweaked. @@ -125,9 +120,3 @@ Below is a **sample** `config.hjson` illustrating various (but certainly not all } } ``` - -## See Also -* [Modding](modding.md) -* [Doors](doors.md) -* [MCI Codes](mci.md) -* [Menu System docs](menu_system.md) diff --git a/docs/configuration/creating-config.md b/docs/configuration/creating-config.md new file mode 100644 index 00000000..c8495f1c --- /dev/null +++ b/docs/configuration/creating-config.md @@ -0,0 +1,27 @@ +--- +layout: page +title: Creating Initial Config Files +--- +Configuration files in ENiGMA½ are simple UTF-8 encoded [HJSON](http://hjson.org/) files. HJSON is just +like JSON but simplified and much more resilient to human error. + +## config.hjson +Your initial configuration skeleton can be created using the `oputil.js` command line utility. From your +enigma-bbs root directory: +``` +./oputil.js config new +``` + +You will be asked a series of questions to create an initial configuration. + +## menu.hjson and prompt.hjson + +Create your own copy of `/config/menu.hjson` and `/config/prompt.hjson`, and specify it in the +`general` section of `config.hjson`: + +````hjson +general: { + menuFile: my-menu.hjson + promptFile: my-prompt.hjson +} +```` \ No newline at end of file diff --git a/docs/configuration/directory-structure.md b/docs/configuration/directory-structure.md new file mode 100644 index 00000000..f27878c7 --- /dev/null +++ b/docs/configuration/directory-structure.md @@ -0,0 +1,20 @@ +--- +layout: page +title: Directory Structure +--- +All paths mentioned here are relative to the ENiGMA½ checkout directory. + +| Directory | Description | +|---------------------|-----------------------------------------------------------------------------------------------------------| +| `/art/general` | Non-theme art - welcome ANSI, logoff ANSI, etc. See [General Art](/art/general). +| `/art/themes` | Theme art. Themes should be in their own subdirectory and contain a theme.hjson. See [Themes](/art/themes). +| `/config` | config.hjson, [menu.hjson](/configuration/menu-hjson) and prompt.hjson storage. Also default path for SSL certs and public/private keys +| `/db` | All ENiGMA½ databases in Sqlite3 format +| `/docs` | These docs ;-) +| `/dropfiles` | Dropfiles created for [local doors](/modding/local-doors) +| `/logs` | Logs. See [Monitoring Logs](/troubleshooting/monitoring-logs) +| `/misc` | Stuff with no other home; reset password templates, common password lists, other random bits +| `/mods` | User mods. See [Modding](/modding/existing-mods) +| `/node_modules` | External libraries required by ENiGMA½, installed when you run `npm install` +| `/util` | Various tools used in running/debugging ENiGMA½ +| `/www` | ENiGMA½'s built in webserver root directory \ No newline at end of file diff --git a/docs/configuration/editing-hjson.md b/docs/configuration/editing-hjson.md new file mode 100644 index 00000000..fde61290 --- /dev/null +++ b/docs/configuration/editing-hjson.md @@ -0,0 +1,16 @@ +--- +layout: page +title: Editing Hjson +--- +Hjson is a syntax extension to JSON. It's NOT a proposal to replace JSON or to incorporate it into the JSON spec itself. +It's intended to be used like a user interface for humans, to read and edit before passing the JSON data to the machine. + +You can find more info at the [Hjson.org website](http://hjson.org/). + +## Editor Plugins +### Visual Studio Code + +[Visual Studio Code](https://code.visualstudio.com/) has a nice Hjson extension that can be installed from +within the IDE. It provides syntax highlighting to make it clear when you've made a syntax mistake within +a config file. + diff --git a/docs/configuration/menu-hjson.md b/docs/configuration/menu-hjson.md new file mode 100644 index 00000000..3596e95a --- /dev/null +++ b/docs/configuration/menu-hjson.md @@ -0,0 +1,101 @@ +--- +layout: page +title: menu.hjson +--- +:warning: ***IMPORTANT!*** Before making any customisations, create your own copy of `/config/menu.hjson`, and specify it in the +`general` section of `config.hjson`: + +````hjson +general: { + menuFile: my-menu.hjson +} +```` +This document and others will refer to `menu.hjson`. This should be seen as an alias to `yourboardname.hjson` + +## The Basics +Like all configuration within ENiGMA½, menu configuration is done in [HJSON](https://hjson.org/) format. + +Entries in `menu.hjson` are objects defining a menu. A menu in this sense is something the user can see +or visit. Examples include but are not limited to: + +* Classical Main, Messages, and File menus +* Art file display +* Module driven menus such as door launchers + + +Each entry in `menu.hjson` defines an object that represents a menu. These objects live within the `menus` +parent object. Each object's *key* is a menu name you can reference within other menus in the system. + +## Example +Let's look a couple basic menu entries: + +```hjson +telnetConnected: { + art: CONNECT + next: matrix + options: { nextTimeout: 1500 } +} +``` + +The above entry `telnetConnected` is set as the Telnet server's first menu entry (set by `firstMenu` in +the Telnet server's config). + +An art pattern of `CONNECT` is set telling the system to look for `CONNECT.*` where `` represents +a optional integer in art files to cause randomness, e.g. `CONNECT1.ANS`, `CONNECT2.ANS`, and so on. If +desired, you can also be explicit by supplying a full filename with an extention such as `CONNECT.ANS`. + +The entry `next` sets up the next menu, by name, in the stack (`matrix`) that we'll go to after +`telnetConnected`. + +Finally, an `options` object may contain various common options for menus. In this case, `nextTimeout` +tells the system to proceed to the `next` entry automatically after 1500ms. + +Now let's look at `matrix`, the `next` entry from `telnetConnected`: + +```hjson +matrix: { + art: matrix + desc: Login Matrix + form: { + 0: { + VM: { + mci: { + VM1: { + submit: true + focus: true + items: [ "login", "apply", "log off" ] + argName: matrixSubmit + } + } + submit: { + *: [ + { + value: { matrixSubmit: 0 } + action: @menu:login + } + { + value: { matrixSubmit: 1 }, + action: @menu:newUserApplication + } + { + value: { matrixSubmit: 2 }, + action: @menu:logoff + } + ] + } + } + } + } +} +``` + +In the above entry, you'll notice `form`. This defines a form(s) object. In this case, a single form +by ID of `0`. The system is then told to use a block only when the resulting art provides a `VM` +(*VerticalMenuView*) MCI entry. `VM1` is then setup to `submit` and start focused via `focus: true` +as well as have some menu entries ("login", "apply", ...) defined. We provide an `argName` for this +action as `matrixSubmit`. + +The `submit` object tells the system to attempt to apply provided match entries from any view ID (`*`). + Upon submit, the first match will be executed. For example, if the user selects "login", the first entry + with a value of `{ matrixSubmit: 0 }` will match causing `action` of `@menu:login` to be executed (go + to `login` menu). diff --git a/docs/configuration/sysop-setup.md b/docs/configuration/sysop-setup.md new file mode 100644 index 00000000..b8c4beb6 --- /dev/null +++ b/docs/configuration/sysop-setup.md @@ -0,0 +1,6 @@ +--- +layout: page +title: SysOp Setup +--- +SySop privileges will be granted to the first user to log into a fresh ENiGMA½ installation. + diff --git a/docs/file_base.md b/docs/file_base.md deleted file mode 100644 index 893a93de..00000000 --- a/docs/file_base.md +++ /dev/null @@ -1,89 +0,0 @@ -# File Bases -Starting with version 0.0.4-alpha, ENiGMA½ has support for File Bases! Documentation below covers setup of file area(s), but first some information on what to expect: - -## A Different Approach -ENiGMA½ has strayed away from the old familure setup here and instead takes a more modern approach: -* [Gazelle](https://whatcd.github.io/Gazelle/) inspired system for searching & browsing files -* No File Conferences (just areas!) -* File Areas are still around but should generally be used less. Instead, files can have one or more tags. Think things like `dos.retro`, `pc.warez`, `games`, etc. -* Temporary web (http:// or https://) download links in additional to standard X/Y/Z protocol support -* Users can star rate files & search/filter by ratings -* Concept of user defined filters - -## Other bells and whistles -* A given area can span one to many physical storage locations -* Upload processor can extract and use `FILE_ID.DIZ`/`DESC.SDI`, for standard descriptions as well as `README.TXT`, `*.NFO`, and so on for longer descriptions -* Upload processor also attempts release year estimation by scanning prementioned description file(s) -* Fast indexed Full Text Search (FTS) -* Duplicates validated by SHA-256 - -## Configuration -Like many things in ENiGMA½, configuration of file base(s) is handled via `config.hjson` -- specifically in the `fileBase` section. - -```hjson -fileBase: { - areaStoragePrefix: /path/to/somewhere/ - - storageTags: { - /* ... */ - } - - areas: { - /* ... */ - } -} -``` - -(Take a look at `core/config.js` for additional keys that may be overridden) - -### Storage tags -**Storage Tags** define paths to a physical (file) storage location that can later be referenced in a file *Area* entry. Each entry may be either a fully qualified path or a relative path. Relative paths are relative to the value set by the `areaStoragePrefix` key. Below is an example defining a both a relative and fully qualified path each attached to a storage tag: - -```hjson -storageTags: { - retro_pc: "retro_pc" // relative - retro_pc_bbs: "retro_pc/bbs" // still relative! - bbs_stuff: "/path/to/bbs_stuff_storage" // fully qualified -} -``` - -### Areas -File base **Areas** are configured using the `fileBase::areas` configuration block in `config.hjson`. Each entry within `areas` must contain a `name`, `desc`, and `storageTags`. Remember that in ENiGMA½ while areas are important, they should generally be used less than in tradditional BBS software. It is recommended to favor the use of more **tags** over more areas. - -Example areas section: -```hjson -areas: { - retro_pc: { - name: Retro PC - desc: Oldschool PC/DOS - storageTags: [ "retro_pc", "retro_pc_bbs" ] - acs: { - write: GM[users] /* optional, see ACS below */ - } - } -} -``` - -#### ACS -If no `acs` block is supplied, the following defaults apply to an area: -* `read` (list, download, etc.): `GM[users]` -* `write` (upload): `GM[sysops]` - -To override read and/or write ACS, supply a valid `acs` member. - -#### Uploads -Note that `storageTags` may contain *1:n* storage tag references. **Uploads in a particular area are stored in the first storage tag path**. - -## Web Access -Temporary web HTTP(S) URLs can be used to download files using the built in web server. Temporary links expire after `fileBase::web::expireMinutes`. The full URL given to users is built using `contentServers::web::domain` and will default to HTTPS (http://) if enabled with a fallback to HTTP. The end result is users are given a temporary web link that may look something like this: `https://xibalba.l33t.codes:44512/f/h7JK` - -See [Web Server](web_server.md) for more information. - -## oputil -The `oputil.js` +op utilty `fb` command has tools for managing file bases. For example, to import existing files found within **all** storage locations tied to an area and set tags `tag1` and `tag2` to each import: - -```bash -oputil.js fb scan some_area --tags tag1,tag2 -``` - -See `oputil.js fb --help` for additional information. \ No newline at end of file diff --git a/docs/filebase/acs.md b/docs/filebase/acs.md new file mode 100644 index 00000000..50527928 --- /dev/null +++ b/docs/filebase/acs.md @@ -0,0 +1,25 @@ +--- +layout: page +title: ACS +--- + +If no `acs` block is supplied in a file area definition, the following defaults apply to an area: +* `read` (list, download, etc.): `GM[users]` +* `write` (upload): `GM[sysops]` + +To override read and/or write ACS, supply a valid `acs` member. + +## Example File Area Config with ACS + +```hjson +areas: { + retro_pc: { + name: Retro PC + desc: Oldschool PC/DOS + storageTags: [ "retro_pc", "retro_pc_bbs" ] + acs: { + write: GM[users] + } + } +} +``` \ No newline at end of file diff --git a/docs/filebase/first-file-area.md b/docs/filebase/first-file-area.md new file mode 100644 index 00000000..58d4a5c1 --- /dev/null +++ b/docs/filebase/first-file-area.md @@ -0,0 +1,71 @@ +--- +layout: page +title: Configuring a File Base +--- +## ENiGMA½ File Base Key Concepts +Like many things in ENiGMA½, configuration of file base(s) is handled via `config.hjson` -- specifically +in the `fileBase` section. First, there are a couple of concepts you should understand. + + +### Storage tags + +**Storage Tags** define paths to a physical (file) storage locations that are referenced in a +file *Area* entry. Each entry may be either a fully qualified path or a relative path. Relative paths +are relative to the value set by the `areaStoragePrefix` key (defaults to ` ENiGMA½ // HTTPS://GITHUB.COM/NUSKOOLER/ENIGMA-BBS <*> /__/ + +------------------------------------------------------------------------------- + +System started! +``` +Grab your favourite telnet client, connect to localhost:8888 and test out your installation. + +## Points of Interest + +* The default port for Telnet is 8888 and 8889 for SSH. + * Note that on *nix systems port such as telnet/23 are privileged (e.g. require root). See + [this SO article](http://stackoverflow.com/questions/16573668/best-practices-when-running-node-js-with-port-80-ubuntu-linode) for some tips on using these ports on your system if desired. +* The first user you create when logging in will be automatically be added to the `sysops` group. + +## Telnet Software + +If you don't have any telnet software, these are compatible with ENiGMA½: + +* [SyncTERM](http://syncterm.bbsdev.net/) +* [EtherTerm](https://github.com/M-griffin/EtherTerm) +* [NetRunner](http://mysticbbs.com/downloads.html) \ No newline at end of file diff --git a/docs/mci.md b/docs/mci.md deleted file mode 100644 index 61ffee04..00000000 --- a/docs/mci.md +++ /dev/null @@ -1,113 +0,0 @@ -# MCI Codes - -## Introduction -ENiGMA½ supports a variety of MCI codes. Some **predefined** codes produce information about the current user, system, or other statistics while others are used to instanciate a **View**. MCI codes are two characters in length and are prefixed with a percent (%) symbol. Some MCI codes have additional options that may be set directly from the code itself while others -- and more advanced options -- are controlled via the current theme. Standard (non-focus) and focus colors are set by placing duplicate codes back to back in art files. - -## Views -A **View** is a control placed on a **form** that can display variable data or collect input. One example of a View is a Vertical Menu (`%VM`): Oldschool BBSers may recognize this as a lightbar menu. - -### Available Views -* Text Label (`TL`): Displays text -* Edit Text (`ET`): Collect user input -* Masked Edit Text (`ME`): Collect user input using a *mask* -* Multi Line Text Edit (`MT`): Multi line edit control -* Button (`BT`): A button -* Vertical Menu (`VM`): A vertical menu aka a vertical lightbar -* Horizontal Menu (`HM`): A horizontal menu aka a horizontal lightbar -* Spinner Menu (`SM`): A spinner input control -* Toggle Menu (`TM`): A toggle menu commonly used for Yes/No style input -* Key Entry (`KE`): A *single* key input control - -(Peek at `core/mci_view_factory.js` to see additional information on these) - -## Predefined -There are many predefined MCI codes that can be used anywhere on the system (placed in any art file). More are added all the time so also check out `core/predefined_mci.js` for a full listing. Many codes attempt to pay homage to Oblivion/2, iNiQUiTY, etc. - -* `BN`: Board Name -* `VL`: Version *label*, e.g. "ENiGMA½ v0.0.3-alpha" -* `VN`: Version *number*, eg.. "0.0.3-alpha" -* `SN`: SysOp username -* `SR`: SysOp real name -* `SL`: SysOp location -* `SA`: SysOp affiliations -* `SS`: SysOp sex -* `SE`: SysOp email address -* `UN`: Current user's username -* `UI`: Current user's user ID -* `UG`: Current user's group membership(s) -* `UR`: Current user's real name -* `LO`: Current user's location -* `UA`: Current user's age -* `BD`: Current user's birthdate (using theme date format) -* `US`: Current user's sex -* `UE`: Current user's email address -* `UW`: Current user's web address -* `UF`: Current user's affiliations -* `UT`: Current user's *theme ID* (e.g. "luciano_blocktronics") -* `UC`: Current user's login/call count -* `ND`: Current user's connected node number -* `IP`: Current user's IP address -* `ST`: Current user's connected server name (e.g. "Telnet" or "SSH") -* `FN`: Current user's active file base filter name -* `DN`: Current user's number of downloads -* `DK`: Current user's download amount (formatted to appropriate bytes/megs/etc.) -* `UP`: Current user's number of uploads -* `UK`: Current user's upload amount (formatted to appropriate bytes/megs/etc.) -* `NR`: Current user's upload/download ratio -* `KR`: Current user's upload/download *bytes* ratio -* `MS`: Current user's account creation date (using theme date format) -* `PS`: Current user's post count -* `PC`: Current user's post/call ratio -* `MD`: Current user's status/viewing menu/activity -* `MA`: Current user's active message area name -* `MC`: Current user's active message conference name -* `ML`: Current user's active message area description -* `CM`: Current user's active message conference description -* `SH`: Current user's term height -* `SW`: Current user's term width -* `DT`: Current date (using theme date format) -* `CT`: Current time (using theme time format) -* `OS`: System OS (Linux, Windows, etc.) -* `OA`: System architecture (x86, x86_64, arm, etc.) -* `SC`: System CPU model -* `NV`: System underlying Node.js version -* `AN`: Current active node count -* `TC`: Total login/calls to system -* `RR`: Displays a random rumor -* `SD`: Total downloads, system wide -* `SO`: Total downloaded amount, system wide (formatted to appropriate bytes/megs/etc.) -* `SU`: Total uploads, system wide -* `SP`: Total uploaded amount, system wide (formatted to appropriate bytes/megs/etc.) - - -A special `XY` MCI code may also be utilized for placement identification when creating menus. - -## Properties & Theming -Predefined MCI codes and other Views can have properties set via `menu.hjson` and further *themed* via `theme.hjson`. - -### Common Properties -* `textStyle`: Sets the standard (non-focus) text style. See **Text Styles** below -* `focusTextStyle`: Sets focus text style. See **Text Styles** below. -* `itemSpacing`: Used to separate items in menus such as Vertical Menu and Horizontal Menu Views. -* `height`: Sets the height of views such as menus that may be > 1 character in height -* `width`: Sets the width of a view -* `focus`: If set to `true`, establishes initial focus -* `text`: (initial) text of a view -* `submit`: If set to `true` any `accept` action upon this view will submit the encompassing **form** - -These are just a few of the properties set on various views. *Use the source Luke*, as well as taking a look at the default `menu.hjson` and `theme.hjson` files! - - -#### Text Styles -Standard style types available for `textStyle` and `focusTextStyle`: - -* `normal`: Leaves text as-is. This is the default. -* `upper`: ENIGMA BULLETIN BOARD SOFTWARE -* `lower`: enigma bulletin board software -* `title`: Enigma Bulletin Board Software -* `first lower`: eNIGMA bULLETIN bOARD sOFTWARE -* `small vowels`: eNiGMa BuLLeTiN BoaRD SoFTWaRe -* `big vowels`: EniGMa bUllEtIn bOArd sOftwArE -* `small i`: ENiGMA BULLETiN BOARD SOFTWARE -* `mixed`: EnIGma BUlLEtIn BoaRd SOfTWarE (randomly assigned) -* `l33t`: 3n1gm4 bull371n b04rd 50f7w4r3 \ No newline at end of file diff --git a/docs/menu_system.md b/docs/menu_system.md deleted file mode 100644 index aef51199..00000000 --- a/docs/menu_system.md +++ /dev/null @@ -1,86 +0,0 @@ -# Menu System -ENiGMA½'s menu system is highly flexible and moddable. The possibilities are almost endless! - -This document and others will refer to `menu.hjson`. This should be seen as an alias to `yourboardname.hjson` (or whatever you reference in `config.hjson` using the `menuFile` property — see below). By modifying your `menu.hjson` you will be able to create a custom experience unique to your board. - -The default `menu.hjson` file lives within the `config` directory. It is **highly recommended** to specify another file by setting the `menuFile` property in your `config.hjson` file: -```hjson -general: { - /* Can also specify a full path */ - menuFile: yourboardname.hjson -} -``` - -You can start by copying the default `mods/menu.hjson` to `yourboardname.hjson`. - -## The Basics -Like all configuration within ENiGMA½, menu configuration is done in [HJSON](https://hjson.org/) format. - -Entries in `menu.hjson` are objects defining a menu. A menu in this sense is something the user can see or visit. Examples include but are not limited to: -* Classical Main, Messages, and File menus -* Art file display -* Module driven menus such as door launchers - - -Each entry in `menu.hjson` defines an object that represents a menu. These objects live within the `menus` parent object. Each object's *key* is a menu name you can reference within other menus in the system. - -## Example -Let's look a couple basic menu entries: - -```hjson -telnetConnected: { - art: CONNECT - next: matrix - options: { nextTimeout: 1500 } -} -``` - -The above entry `telnetConnected` is set as the Telnet server's first menu entry (set by `firstMenu` in the Telnet server's config). - -An art pattern of `CONNECT` is set telling the system to look for `CONNECT.*` where `` represents a optional integer in art files to cause randomness, e.g. `CONNECT1.ANS`, `CONNECT2.ANS`, and so on. If desired, you can also be explicit by supplying a full filename with an extention such as `CONNECT.ANS`. - -The entry `next` sets up the next menu, by name, in the stack (`matrix`) that we'll go to after `telnetConnected`. - -Finally, an `options` object may contain various common options for menus. In this case, `nextTimeout` tells the system to proceed to the `next` entry automatically after 1500ms. - -Now let's look at `matrix`, the `next` entry from `telnetConnected`: -```hjson -matrix: { - art: matrix - desc: Login Matrix - form: { - 0: { - VM: { - mci: { - VM1: { - submit: true - focus: true - items: [ "login", "apply", "log off" ] - argName: matrixSubmit - } - } - submit: { - *: [ - { - value: { matrixSubmit: 0 } - action: @menu:login - } - { - value: { matrixSubmit: 1 }, - action: @menu:newUserApplication - } - { - value: { matrixSubmit: 2 }, - action: @menu:logoff - } - ] - } - } - } - } -} -``` - -In the above entry, you'll notice `form`. This defines a form(s) object. In this case, a single form by ID of `0`. The system is then told to use a block only when the resulting art provides a `VM` (*VerticalMenuView*) MCI entry. `VM1` is then setup to `submit` and start focused via `focus: true` as well as have some menu entries ("login", "apply", ...) defined. We provide an `argName` for this action as `matrixSubmit`. - -The `submit` object tells the system to attempt to apply provided match entries from any view ID (`*`). Upon submit, the first match will be executed. For example, if the user selects "login", the first entry with a value of `{ matrixSubmit: 0 }` will match causing `action` of `@menu:login` to be executed (go to `login` menu). diff --git a/docs/messageareas/bso-import-export.md b/docs/messageareas/bso-import-export.md new file mode 100644 index 00000000..49e533d8 --- /dev/null +++ b/docs/messageareas/bso-import-export.md @@ -0,0 +1,74 @@ +--- +layout: page +title: BSO Import / Export +--- +The scanner/tosser module `ftn_bso` provides **B**inkley **S**tyle **O**utbound (BSO) import/toss and +scan/export of messages EchoMail and NetMail messages. Configuration is supplied in `config.hjson` +under `scannerTossers::ftn_bso`. + +| Config Item | Required | Description | +|-------------------------|----------|---------------------------------------------------------------------------------| +| `defaultZone` | :+1: | Sets the default BSO outbound zone +| `defaultNetwork` | :-1: | Sets the default network name from `messageNetworks.ftn.networks`. **Required if more than one network is defined**. +| `paths` | :-1: | Override default paths set by the system. This section may contain `outbound`, `inbound`, and `secInbound`. +| `packetTargetByteSize` | :-1: | Overrides the system *target* packet (.pkt) size of 512000 bytes (512k) +| `bundleTargetByteSize` | :-1: | Overrides the system *target* ArcMail bundle size of 2048000 bytes (2M) +| `schedule` | :+1: | See Scheduling +| `nodes` | :+1: | See Nodes + +## Scheduling +Schedules can be defined for importing and exporting via `import` and `export` under `schedule`. +Each entry is allowed a "free form" text and/or special indicators for immediate export or watch +file triggers. + + * `@immediate`: A message will be immediately exported if this trigger is defined in a schedule. Only used for `export`. + * `@watch:/path/to/file`: This trigger watches the path specified for changes and will trigger an import or export when such events occur. Only used for `import`. + * Free form text can be things like `at 5:00 pm` or `every 2 hours`. + +See [Later text parsing documentation](http://bunkat.github.io/later/parsers.html#text) for more information. + +### Example Configuration + +```hjson +{ + scannerTossers: { + ftn_bso: { + schedule: { + import: every 1 hours or @watch:/path/to/watchfile.ext + export: every 1 hours or @immediate + } + } + } +} +``` + +## Nodes +The `nodes` section defines how to export messages for one or more uplinks. + +A node entry starts with a FTN style address (up to 5D) **as a key** in `config.hjson`. This key may +contain wildcard(s) for net/zone/node/point/domain. + +| Config Item | Required | Description | +|------------------|----------|---------------------------------------------------------------------------------| +| `packetType` | :-1: | `2`, `2.2`, or `2+`. Defaults to `2+` for modern mailer compatiability | +| `packetPassword` | :-1: | Password for the packet | +| `encoding` | :-1: | Encoding to use for message bodies; Defaults to `utf-8` | +| `archiveType` | :-1: | Specifies the archive type for ArcMail bundles. Must be a valid archiver name such as `zip` (See archiver configuration) | + +**Example**: +```hjson +{ + scannerTossers: { + ftn_bso: { + nodes: { + "46:*": { + packetType: 2+ + packetPassword: mypass + encoding: cp437 + archiveType: zip + } + } + } + } +} +``` \ No newline at end of file diff --git a/docs/messageareas/configuring-a-message-area.md b/docs/messageareas/configuring-a-message-area.md new file mode 100644 index 00000000..5ba396ea --- /dev/null +++ b/docs/messageareas/configuring-a-message-area.md @@ -0,0 +1,65 @@ +--- +layout: page +title: Configuring a Message Area +--- +**Message Conferences** and **Areas** allow for grouping of message base topics. + +## Message Conferences +Message Conferences are the top level container for 1:n Message Areas via the `messageConferences` section +in `config.hjson`. Common message conferences may include a local conference and one or more conferences +each dedicated to a particular message network such as FsxNet, AgoraNet, etc. + +Each conference is represented by a entry under `messageConferences`. **The areas key is the conferences tag**. + +| Config Item | Required | Description | +|-------------|----------|---------------------------------------------------------------------------------| +| `name` | :+1: | Friendly conference name | +| `desc` | :+1: | Friendly conference description | +| `sort` | :-1: | If supplied, provides a key used for sorting | +| `default` | :-1: | Specify `true` to make this the default conference (e.g. assigned to new users) | +| `areas` | :+1: | Container of 1:n areas described below | + +### Example + +```hjson +{ + messageConferences: { + local: { + name: Local + desc: Local discussion + sort: 1 + default: true + } + } +} +``` + +## Message Areas +Message Areas are topic specific containers for messages that live within a particular conference. # +**The area's key is its area tag**. For example, "General Discussion" may live under a Local conference +while an AgoraNet conference may contain "BBS Discussion". + +| Config Item | Required | Description | +|-------------|----------|---------------------------------------------------------------------------------| +| `name` | :+1: | Friendly area name | +| `desc` | :+1: | Friendly area discription | +| `sort` | :-1: | If supplied, provides a key used for sorting | +| `default` | :-1: | Specify `true` to make this the default area (e.g. assigned to new users) | + +### Example + +```hjson +messageConferences: { + local: { + // ... see above ... + areas: { + enigma_dev: { // Area tag - required elsewhere! + name: ENiGMA 1/2 Development + desc: ENiGMA 1/2 discussion! + sort: 1 + default: true + } + } + } +} +``` \ No newline at end of file diff --git a/docs/messageareas/message-networks.md b/docs/messageareas/message-networks.md new file mode 100644 index 00000000..bb98b0b7 --- /dev/null +++ b/docs/messageareas/message-networks.md @@ -0,0 +1,67 @@ +--- +layout: page +title: Message Networks +--- +Configuring message networks in ENiGMA½ requires three specific pieces of config - the network and your +assigned address on it, the message areas (echos) of the network you wish to map to ENiGMA½ message areas, +then the schedule and routes to send mail packets on the network. + +## FTN Networks + +FTN networks are configured under the `messageNetworks::ftn` section of `config.hjson`. + +The `networks` section contains a sub section for each network you wish you join your board to. +Each entry's key name is referenced elsewhere in `config.hjson` for FTN oriented configurations. + +### Example Configuration + +```hjson +{ + messageNetworks: { + ftn: { + networks: { + agoranet: { + localAddress: "46:3/102" + } + fsxnet: { + localAddress: "21:4/333" + } + } + } + } +} +``` + +## Message Areas + +The `areas` section describes a mapping of local **area tags** configured in your `messageConferences` (see +[Configuring a Message Area][/messageareas/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`. + +| Config Item | Required | Description | +|-------------|----------|----------------------------------------------------------| +| `network` | :+1: | Associated network from the `networks` section above | +| `tag` | :+1: | FTN area tag | +| `uplinks` | :+1: | An array of FTN address uplink(s) for this network | + +### Example Configuration + +```hjson +{ + messageNetworks: { + ftn: { + areas: { + agoranet_bbs: { // tag found within messageConferences + network: agoranet + tag: AGN_BBS + uplinks: "46:1/100" + } + } + } + } +} +``` \ No newline at end of file diff --git a/docs/messageareas/netmail.md b/docs/messageareas/netmail.md new file mode 100644 index 00000000..3e947e68 --- /dev/null +++ b/docs/messageareas/netmail.md @@ -0,0 +1,38 @@ +--- +layout: page +title: Netmail +--- +ENiGMA support import and export of Netmail from the Private Mail area. `RiPuk @ 21:1/136` and +`RiPuk <21:1/136>` 'To' address formats are supported. + +## Netmail Routing + +A configuration block must be added to the `scannerTossers::ftn_bso` `config.hjson` section to tell the +ENiGMA½ tosser where to route netmail. + +The following configuration would tell ENiGMA½ to route all netmail addressed to 21:* through 21:1/100, +and all 46:* netmail through 46:1/100: + +````hjson + +scannerTossers: { + + /* other scannerTosser config removed for clarity */ + + ftn_bso: { + netMail: { + routes: { + "21:*" : { + address: "21:1/100" + network: fsxnet + } + "46:*" : { + address: "46:1/100" + network: agoranet + } + } + } + } +} +```` +The `network` tag must match the networks defined in `messageNetworks::ftn::networks` within `config.hjson`. \ No newline at end of file diff --git a/docs/modding.md b/docs/modding.md deleted file mode 100644 index 609729b4..00000000 --- a/docs/modding.md +++ /dev/null @@ -1,15 +0,0 @@ -# Modding - -## General Configuraiton -See [Configuration](config.md) - -## Menus -See [Menu System](menu_system.md) - -## Theming -Take a look at how the default `luciano_blocktronics` theme found under `art/themes` works! - -TODO document me! - -## Add-On Modules -See [Mods](mods.md) \ No newline at end of file diff --git a/docs/modding/door-servers.md b/docs/modding/door-servers.md new file mode 100644 index 00000000..5deaf89b --- /dev/null +++ b/docs/modding/door-servers.md @@ -0,0 +1,61 @@ +--- +layout: page +title: Door Servers +--- +## The bbs_link Module +Native support for [BBSLink](http://www.bbslink.net/) doors is provided via the `bbs_link` module. + +Configuration for a BBSLink door is straight forward. Take a look at the following example for launching Tradewars 2002: + +```hjson +doorTradeWars2002BBSLink: { + desc: Playing TW 2002 (BBSLink) + module: bbs_link + config: { + sysCode: XXXXXXXX + authCode: XXXXXXXX + schemeCode: XXXXXXXX + door: tw + } +} + +``` + +Fill in your credentials in `sysCode`, `authCode`, and `schemeCode` and that's it! + +## The door_party Module +The module `door_party` provides native support for [DoorParty!](http://www.throwbackbbs.com/) Configuration is quite easy: + +```hjson +doorParty: { + desc: Using DoorParty! + module: door_party + config: { + username: XXXXXXXX + password: XXXXXXXX + bbsTag: XX + } +} +``` + +Fill in `username`, `password`, and `bbsTag` with credentials provided to you and you should be in business! + +## The CombatNet Module +The `combatnet` module provides native support for [CombatNet](http://combatnet.us/). Add the following to your menu config: + +````hjson +combatNet: { + desc: Using CombatNet + module: combatnet + config: { + bbsTag: CBNxxx + password: XXXXXXXXX + } +} +```` +Update `bbsTag` (in the format CBNxxx) and `password` with the details provided when you register, then +you should be ready to rock! + +## The Exodus Module + +TBC \ No newline at end of file diff --git a/docs/modding/existing-mods.md b/docs/modding/existing-mods.md new file mode 100644 index 00000000..af1b2b74 --- /dev/null +++ b/docs/modding/existing-mods.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Existing Mods +--- +| Name | Author | Description | +|-----------------------------|-------------|-------------| +| Married Bob Fetch Event | NuSkooler | An event for fetching the latest Married Bob ANSI's for display on you board. ACiDic release [ACD-MB4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MB4E.ZIP). Can also be [found on GitHub](https://github.com/NuSkooler/enigma-bbs-married_bob_evt) | +| Latest Files Announcement | NuSkooler | An event for posting the latest file arrivals of your board to message areas such as FTN style networks. ACiDic release [ACD-LFA1.ZIP](https://l33t.codes/outgoing/ACD/ACD-LFA1.ZIP). Also [found on GitHub](https://github.com/NuSkooler/enigma-bbs-latest_files_announce_evt) | +| Message Post Event | NuSkooler | An event for posting messages/ads to networks. ACiDic release [ACD-MP4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MP4E.ZIP) | + +See also [ACiDic BBS Mods by NuSkooler](https://l33t.codes/acidic-mods-by-myself/) \ No newline at end of file diff --git a/docs/doors.md b/docs/modding/local-doors.md similarity index 76% rename from docs/doors.md rename to docs/modding/local-doors.md index 5f72d761..b9620748 100644 --- a/docs/doors.md +++ b/docs/modding/local-doors.md @@ -1,8 +1,7 @@ -# Doors -ENiGMA½ supports a variety of methods for interacting with doors — not limited to: -* `abracadabra` module: Standard in/out (stdio) capture or temporary socket server that can be used with [DOSEMU](http://www.dosemu.org/), [DOSBox](http://www.dosbox.com/), [QEMU](http://wiki.qemu.org/Main_Page), etc. -* `bbs_link` module for interaction with [BBSLink](http://www.bbslink.net/) - +--- +layout: page +title: Local Doors +--- ## 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 process I/O through stdio or a temporary TCP server. @@ -133,7 +132,7 @@ Note the `qemu-system-i386` line. We're telling QEMU to launch and use localtime For doors that do not *require* a FOSSIL driver, it is recommended to not load or use one unless you are having issues. -#### Step 4: Create a menu entry +#### Step 3: Create a menu entry Finally we can create a `menu.hjson` entry using the `abracadabra` module: ```hjson doorLORD: { @@ -155,70 +154,15 @@ doorLORD: { } ``` - -## The bbs_link Module -Native support for [BBSLink](http://www.bbslink.net/) doors is provided via the `bbs_link` module. - -Configuration for a BBSLink door is straight forward. Take a look at the following example for launching Tradewars 2002: - -```hjson -doorTradeWars2002BBSLink: { - desc: Playing TW 2002 (BBSLink) - module: bbs_link - config: { - sysCode: XXXXXXXX - authCode: XXXXXXXX - schemeCode: XXXXXXXX - door: tw - } -} - -``` - -Fill in your credentials in `sysCode`, `authCode`, and `schemeCode` and that's it! - -## The door_party Module -The module `door_party` provides native support for [DoorParty!](http://www.throwbackbbs.com/) Configuration is quite easy: - -```hjson -doorParty: { - desc: Using DoorParty! - module: door_party - config: { - username: XXXXXXXX - password: XXXXXXXX - bbsTag: XX - } -} -``` - -Fill in `username`, `password`, and `bbsTag` with credentials provided to you and you should be in business! - -## The CombatNet Module -The `combatnet` module provides native support for [CombatNet](http://combatnet.us/). Add the following to your menu config: - -````hjson -combatNet: { - desc: Using CombatNet - module: combatnet - config: { - bbsTag: CBNxxx - password: XXXXXXXXX - } -} -```` -Update `bbsTag` (in the format CBNxxx) and `password` with the details provided when you register, then -you should be ready to rock! - -# Resources +## Resources ### DOSBox * Custom DOSBox builds http://home.arcor.de/h-a-l-9000/ -## Door Downloads & Support Sites -### General +### Door Downloads & Support Sites +#### General * http://bbsfiles.com/ * http://bbstorrents.bbses.info/ -### L.O.R.D. +#### L.O.R.D. * http://lord.lordlegacy.com/ \ No newline at end of file diff --git a/docs/mods.md b/docs/mods.md deleted file mode 100644 index f73a3fc6..00000000 --- a/docs/mods.md +++ /dev/null @@ -1,9 +0,0 @@ -# Mods -Custom mods should be added to `/enigma-install-path/mods`. - -## Existing Mods -* **Married Bob Fetch Event**: An event for fetching the latest Married Bob ANSI's for display on you board. ACiDic release [ACD-MB4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MB4E.ZIP). Can also be [found on GitHub](https://github.com/NuSkooler/enigma-bbs-married_bob_evt) -* **Latest Files Announcement**: An event for posting the latest file arrivals of your board to message areas such as FTN style networks. ACiDic release [ACD-LFA1.ZIP](https://l33t.codes/outgoing/ACD/ACD-LFA1.ZIP) Also [found on GitHub](https://github.com/NuSkooler/enigma-bbs-latest_files_announce_evt) -* **Message Post Event**: An event for posting messages/ads to networks. ACiDic release [ACD-MP4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MP4E.ZIP) - -See also [ACiDic BBS Mods by Myself](https://l33t.codes/acidic-mods-by-myself/) \ No newline at end of file diff --git a/docs/msg_conf_area.md b/docs/msg_conf_area.md deleted file mode 100644 index 05c11441..00000000 --- a/docs/msg_conf_area.md +++ /dev/null @@ -1,57 +0,0 @@ -# Message Conferences & Areas -**Message Conferences** and **Areas** allow for grouping of message base topics. - -## Message Conferences -Message Conferences are the top level container for 1:n Message Areas via the `messageConferences` section in `config.hjson`. Common message conferences may include a local conference and one or more conferences each dedicated to a particular message network such as FidoNet, AgoraNet, etc. - -Each conference is represented by a entry under `messageConferences`. **The areas key is the conferences tag**. - -**Members**: -* `name` (required): Friendly conference name -* `desc` (required): Friendly conference description -* `sort` (optional): If supplied, provides a key used for sorting -* `default` (optional): Specify `true` to make this the default conference (e.g. assigned to new users) -* `areas`: Container of 1:n areas described below - -**Example**: -```hjson -{ - messageConferences: { - local: { - name: Local - desc: Local discussion - sort: 1 - default: true - } - } -} -``` - -## Message Areas -Message Areas are topic specific containers for messages that live within a particular conference. **The areas key is it's areas tag**. For example, "General Discussion" may live under a Local conference while an AgoraNet conference may contain "BBS Discussion". - -**Members**: -* `name` (required): Friendly area name -* `desc` (required): Friendly area discription -* `sort` (optional): If supplied, provides a key used for sorting -* `default` (optional): Specify `true` to make this the default area (e.g. assigned to new users) - -**Example**: -```hjson -messageConferences: { - local: { - // ... see above ... - areas: { - local_enigma_dev: { - name: ENiGMA 1/2 Development - desc: Discussion related to features and development of ENiGMA 1/2! - sort: 1 - default: true - } - } - } -} -``` - -## Message Networks -ENiGMA½ has the ability to network with other systems via [Message Networks](msg_networks.md). Message **area tags** (described above) are utilized to map foreign areas with locally defined areas. \ No newline at end of file diff --git a/docs/msg_networks.md b/docs/msg_networks.md deleted file mode 100644 index 11fa9202..00000000 --- a/docs/msg_networks.md +++ /dev/null @@ -1,196 +0,0 @@ -# Message Networks -Message networks are configured in `messageNetworks` section of `config.hjson`. Each network type has it's own sub section such as `ftn` for FidoNet Technology Network (FTN) style networks. Message Networks tie directly with [Message Areas](msg_conf_area.md) that are also defined in `config.hjson`. - -**Members**: - * `ftn`: Configure FTN networks (described below) - * `originLine` (optional): Overrwrite the default origin line for networks that support it. For example: `originLine: Xibalba - xibalba.l33t.codes:44510` - -## FidoNet Technology Network (FTN) -FTN networks are configured under the `messageNetworks.ftn` section of `config.hjson`. - -### Networks -The `networks` section contains a sub section for network(s) you wish you join your board with. Each entry's key name can be referenced elsewhere in `config.hjson` for FTN oriented configurations. - -**Members**: - * `localAddress` (required): FTN address of **your local system** - -**Example**: -```hjson -{ - messageNetworks: { - ftn: { - networks: { - agoranet: { - localAddress: "46:3/102" - } - } - } - } -} -``` - -### Areas -The `areas` section describes a mapping of local **area tags** found in your `messageConferences` to a message network (from `networks` described previously), 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 (In fact you can import AREAS.BBS using `oputil.js`!) - -When importing, messages will be placed in the local area that matches key under `areas`. - -**Members**: - * `network` (required): Associated network from the `networks` section - * `tag` (required): FTN area tag - * `uplinks`: An array of FTN address uplink(s) for this network - -**Example**: -```hjson -{ - messageNetworks: { - ftn: { - areas: { - agoranet_bbs: { /* found within messageConferences */ - network: agoranet - tag: AGN_BBS - uplinks: "46:1/100" - } - } - } - } -} -``` - -### BSO Import / Export -The scanner/tosser module `ftn_bso` provides **B**inkley **S**tyle **O**utbound (BSO) import/toss & scan/export of messages EchoMail and NetMail messages. Configuration is supplied in `config.hjson` under `scannerTossers.ftn_bso`. - -**Members**: - * `defaultZone` (required): Sets the default BSO outbound zone - * `defaultNetwork` (optional): Sets the default network name from `messageNetworks.ftn.networks`. **Required if more than one network is defined**. - * `paths` (optional): Override default paths set by the system. This section may contain `outbound`, `inbound`, and `secInbound`. - * `packetTargetByteSize` (optional): Overrides the system *target* packet (.pkt) size of 512000 bytes (512k) - * `bundleTargetByteSize` (optional): Overrides the system *target* ArcMail bundle size of 2048000 bytes (2M) - * `schedule` (required): See Scheduling - * `nodes` (required): See Nodes - -#### Nodes -The `nodes` section defines how to export messages for one or more uplinks. - -A node entry starts with a FTN style address (up to 5D) **as a key** in `config.hjson`. This key may contain wildcard(s) for net/zone/node/point/domain. - -**Members**: - * `packetType` (optional): `2`, `2.2`, or `2+`. Defaults to `2+` for modern mailer compatiability - * `packetPassword` (optional): Password for the packet - * `encoding` (optional): Encoding to use for message bodies; Defaults to `utf-8` - * `archiveType` (optional): Specifies the archive type for ArcMail bundles. Must be a valid archiver name such as `zip` (See archiver configuration) - -**Example**: -```hjson -{ - scannerTossers: { - ftn_bso: { - nodes: { - "46:*": { - packetType: 2+ - packetPassword: mypass - encoding: cp437 - archiveType: zip - } - } - } - } -} -``` - -#### TIC Support -ENiGMA½ supports TIC files. This is handled by mapping TIC areas to local file areas. - -Under a given node (like the one configured above), TIC configuration may be supplied: - -```hjson -{ - scannerTossers: { - ftn_bso: { - nodes: { - "46:*": { - packetType: 2+ - packetPassword: mypass - encoding: cp437 - archiveType: zip - tic: { - password: TESTY-TEST - uploadBy: Agoranet TIC - allowReplace: true - } - } - } - } - } -} -``` - -You then need to configure the mapping between TIC areas you want to carry, and the file -base area for them to be tossed to. Start by creating a storage tag and file base, if you haven't -already: - -````hjson -fileBase: { - areaStoragePrefix: /home/bbs/file_areas/ - - storageTags: { - msg_network: "msg_network" - } - - areas: { - msgNetworks: { - name: Message Networks - desc: Message networks news & info - storageTags: [ - "msg_network" - ] - } - } -} - -```` -and then create the mapping between the TIC area and the file area created: - -````hjson -ticAreas: { - agn_node: { - areaTag: msgNetworks - hashTags: agoranet,nodelist - storageTag: msg_network - } - - agn_info: { - areaTag: msgNetworks - hashTags: agoranet,infopack - storageTag: msg_network - } -} - -```` -Multiple TIC areas can be mapped to a single file base area. - - -#### Scheduling -Schedules can be defined for importing and exporting via `import` and `export` under `schedule`. Each entry is allowed a "free form" text and/or special indicators for immediate export or watch file triggers. - - * `@immediate`: A message will be immediately exported if this trigger is defined in a schedule. Only used for `export`. - * `@watch:/path/to/file`: This trigger watches the path specified for changes and will trigger an import or export when such events occur. Only used for `import`. - * Free form text can be things like `at 5:00 pm` or `every 2 hours`. - -See [Later text parsing documentation](http://bunkat.github.io/later/parsers.html#text) for more information. - -**Example**: -```hjson -{ - scannerTossers: { - ftn_bso: { - schedule: { - import: every 1 hours or @watch:/path/to/watchfile.ext - export: every 1 hours or @immediate - } - } - } -} -``` - -## More Information -* [ENiGMA 1/2 + Binkd on CentOS 7](https://www.l33t.codes/enigma-12-binkd-on-centos-7/) \ No newline at end of file diff --git a/docs/oputil/index.md b/docs/oputil/index.md new file mode 100644 index 00000000..b23a7362 --- /dev/null +++ b/docs/oputil/index.md @@ -0,0 +1,17 @@ +--- +layout: page +title: oputil +--- + +oputil is the ENiGMA½ command line utility for maintaining users, file areas and message areas, as well as +generating your initial ENiGMA½ config. + +## File areas +The `oputil.js` +op utilty `fb` command has tools for managing file bases. For example, to import existing +files found within **all** storage locations tied to an area and set tags `tag1` and `tag2` to each import: + +```bash +oputil.js fb scan some_area --tags tag1,tag2 +``` + +See `oputil.js fb --help` for additional information. \ No newline at end of file diff --git a/docs/servers/ssh.md b/docs/servers/ssh.md new file mode 100644 index 00000000..ca0b62ec --- /dev/null +++ b/docs/servers/ssh.md @@ -0,0 +1,36 @@ +--- +layout: page +title: SSH Server +--- +## Generate a SSH Private Key + +To utilize the SSH server, an SSH Private Key will need generated. From the ENiGMA installation directory: + +```bash +openssl genrsa -des3 -out ./config/ssh_private_key.pem 2048 +``` + +You then need to enable the SSH server in your `config.hjson`: + +```hjson +{ + loginServers: { + ssh: { + enabled: true + port: 8889 + privateKeyPass: YOUR_PK_PASS + } + } +} +``` + +### SSH Server Options + +| Option | Description +|---------------------|--------------------------------------------------------------------------------------| +| `privateKeyPem` | Path to private key file +| `privateKeyPass` | Password to private key file +| `firstMenu` | First menu an SSH connected user is presented with +| `firstMenuNewUser` | Menu presented to user when logging in with `users::newUserNames` in your config.hjson (defaults to `new` and `apply`) +| `enabled` | Enable/disable SSH server +| `port` | Configure a custom port for the SSH server diff --git a/docs/servers/telnet.md b/docs/servers/telnet.md new file mode 100644 index 00000000..155e6726 --- /dev/null +++ b/docs/servers/telnet.md @@ -0,0 +1,4 @@ +--- +layout: page +title: Telnet Server +--- \ No newline at end of file diff --git a/docs/web_server.md b/docs/servers/web-server.md similarity index 82% rename from docs/web_server.md rename to docs/servers/web-server.md index 1f87cd80..816c28a2 100644 --- a/docs/web_server.md +++ b/docs/servers/web-server.md @@ -1,6 +1,10 @@ -# Web Server +--- +layout: page +title: Web Server +--- ENiGMA½ comes with a built in *content server* for supporting both HTTP and HTTPS. Currently the -[File Bases](file_base.md) registers routes for file downloads, and static files can also be served for your BBS. Other features will likely come in the future or you can easily write your own! +[File Bases](file_base.md) registers routes for file downloads, and static files can also be served +for your BBS. Other features will likely come in the future or you can easily write your own! ## Configuration By default the web server is not enabled. To enable it, you will need to at a minimum configure two keys in @@ -40,6 +44,9 @@ contentServers: { } ``` +If no certificate paths are supplied, ENiGMA½ will assume the defaults of `/config/https_cert.pem` and +`/config/https_cert_key.pem` accordingly. + ### Static Routes Static files live relative to the `contentServers::web::staticRoot` path which defaults to `enigma-bbs/www`. diff --git a/docs/vtx_web_client.md b/docs/servers/websocket.md similarity index 96% rename from docs/vtx_web_client.md rename to docs/servers/websocket.md index 99c45f93..30614006 100644 --- a/docs/vtx_web_client.md +++ b/docs/servers/websocket.md @@ -1,3 +1,7 @@ +--- +layout: page +title: Web Socket / Web Interface Server +--- # VTX Web Client ENiGMA supports the VTX websocket client for connecting to your BBS from a web page. Example usage can be found at [Xibalba](https://l33t.codes/vtx/xibalba.html) and [fORCE9](https://bbs.force9.org/vtx/force9.html). @@ -82,6 +86,6 @@ webserver, and unpack it to a temporary directory. otherwise. 9. If you navigate to http://your-hostname.here/vtx.html, you should see a splash screen like the following: - ![VTXClient](images/vtxclient.png "VTXClient") + ![VTXClient](../images/vtxclient.png "VTXClient") \ No newline at end of file diff --git a/docs/troubleshooting/monitoring-logs.md b/docs/troubleshooting/monitoring-logs.md new file mode 100644 index 00000000..7c04cb40 --- /dev/null +++ b/docs/troubleshooting/monitoring-logs.md @@ -0,0 +1,15 @@ +--- +layout: page +title: Monitoring Logs +--- +ENiGMA½ does not produce much to stdout. Logs are produced by Bunyan which outputs each entry as a +JSON object. + +Start by installing bunyan and making it available on your path: + + npm install bunyan -g + +To tail logs in a colorized and pretty format, issue the following command: + + tail -F /path/to/enigma-bbs/logs/enigma-bbs.log | bunyan +