+ oputil.js config cat

* Many updates to config gen
y
This commit is contained in:
Bryan Ashby 2018-11-10 23:59:26 -07:00
parent 82cfdc978f
commit c24695e998
5 changed files with 337 additions and 254 deletions

View File

@ -19,6 +19,9 @@ This document attempts to track **major** changes and additions in ENiGMA½. For
* Any module may now register for a system startup intiialization via the `initializeModules(initInfo, cb)` export. * Any module may now register for a system startup intiialization via the `initializeModules(initInfo, cb)` export.
* User event log is now functional. Various events a user performs will be persisted to the `system.db` `user_event_log` table for up to 90 days. An example usage can be found in the updated `last_callers` module where events are turned into Ami/X style actions. Please see `UPGRADE.md`! * User event log is now functional. Various events a user performs will be persisted to the `system.db` `user_event_log` table for up to 90 days. An example usage can be found in the updated `last_callers` module where events are turned into Ami/X style actions. Please see `UPGRADE.md`!
* New MCI codes including general purpose movement codes. See [MCI codes](docs/art/mci.md) * New MCI codes including general purpose movement codes. See [MCI codes](docs/art/mci.md)
* `install.sh` will now attempt to use NPM's `--build-from-source` option when ARM is detected.
* `oputil.js config new` will now generate a much more complete configuration file with comments, examples, etc. `oputil.js config cat` dumps your current config to stdout.
## 0.0.8-alpha ## 0.0.8-alpha

View File

@ -346,6 +346,19 @@ function getDefaultConfig() {
certPem : paths.join(__dirname, './../config/https_cert.pem'), certPem : paths.join(__dirname, './../config/https_cert.pem'),
keyPem : paths.join(__dirname, './../config/https_cert_key.pem'), keyPem : paths.join(__dirname, './../config/https_cert_key.pem'),
} }
},
gopher : {
enabled : false,
port : 8070,
publicHostname : 'another-fine-enigma-bbs.org',
publicPort : 8080, // adjust if behind NAT/etc.
bannerFile : 'gopher_banner.asc',
//
// Set messageConferences{} to maps of confTag -> [ areaTag1, areaTag2, ... ]
// to export message confs/areas
//
} }
}, },

View File

@ -4,12 +4,14 @@
// ENiGMA½ // ENiGMA½
const resolvePath = require('../../core/misc_util.js').resolvePath; const resolvePath = require('../../core/misc_util.js').resolvePath;
const printUsageAndSetExitCode = require('./oputil_common.js').printUsageAndSetExitCode; const {
const ExitCodes = require('./oputil_common.js').ExitCodes; printUsageAndSetExitCode,
const argv = require('./oputil_common.js').argv; getConfigPath,
const getConfigPath = require('./oputil_common.js').getConfigPath; argv,
ExitCodes,
initConfigAndDatabases
} = require('./oputil_common.js');
const getHelpFor = require('./oputil_help.js').getHelpFor; const getHelpFor = require('./oputil_help.js').getHelpFor;
const initConfigAndDatabases = require('./oputil_common.js').initConfigAndDatabases;
const Errors = require('../../core/enig_error.js').Errors; const Errors = require('../../core/enig_error.js').Errors;
// deps // deps
@ -21,6 +23,8 @@ const hjson = require('hjson');
const paths = require('path'); const paths = require('path');
const _ = require('lodash'); const _ = require('lodash');
const packageJson = require('../../package.json');
exports.handleConfigCommand = handleConfigCommand; exports.handleConfigCommand = handleConfigCommand;
@ -37,6 +41,15 @@ const ConfigIncludeKeys = [
'fileBase.areaStoragePrefix', 'fileBase.areaStoragePrefix',
]; ];
const HJSONStringifyComonOpts = {
emitRootBraces : true,
bracesSameLine : true,
space : 4,
keepWsc : true,
quotes : 'min',
eol : '\n',
};
const QUESTIONS = { const QUESTIONS = {
Intro : [ Intro : [
{ {
@ -214,7 +227,10 @@ function askNewConfigQuestions(cb) {
} }
function writeConfig(config, path) { function writeConfig(config, path) {
config = hjson.stringify(config, { bracesSameLine : true, space : '\t', keepWsc : true, quotes : 'strings' } ); config = hjson.stringify(config, HJSONStringifyComonOpts)
.replace(/%ENIG_VERSION%/g, packageJson.version)
.replace(/%HJSON_VERSION%/g, hjson.version)
;
try { try {
fs.writeFileSync(path, config, 'utf8'); fs.writeFileSync(path, config, 'utf8');
@ -522,6 +538,24 @@ function getImportEntries(importType, importData) {
return importEntries; return importEntries;
} }
function catCurrentConfig() {
try {
const config = hjson.rt.parse(fs.readFileSync(getConfigPath(), 'utf8'));
const hjsonOpts = Object.assign({}, HJSONStringifyComonOpts, {
colors : false === argv.colors ? false : true,
keepWsc : false === argv.comments ? false : true,
});
console.log(hjson.stringify(config, hjsonOpts));
} catch(e) {
if('ENOENT' == e.code) {
console.error(`File not found: ${getConfigPath()}`);
} else {
console.error(e);
}
}
}
function handleConfigCommand() { function handleConfigCommand() {
if(true === argv.help) { if(true === argv.help) {
return printUsageAndSetExitCode(getHelpFor('Config'), ExitCodes.ERROR); return printUsageAndSetExitCode(getHelpFor('Config'), ExitCodes.ERROR);
@ -532,6 +566,7 @@ function handleConfigCommand() {
switch(action) { switch(action) {
case 'new' : return buildNewConfig(); case 'new' : return buildNewConfig();
case 'import-areas' : return importAreas(); case 'import-areas' : return importAreas();
case 'cat' : return catCurrentConfig();
default : return printUsageAndSetExitCode(getHelpFor('Config'), ExitCodes.ERROR); default : return printUsageAndSetExitCode(getHelpFor('Config'), ExitCodes.ERROR);
} }

View File

@ -39,12 +39,17 @@ actions:
actions: actions:
new generate a new/initial configuration new generate a new/initial configuration
import-areas PATH import areas using fidonet *.NA or AREAS.BBS file from PATH import-areas PATH import areas using fidonet *.NA or AREAS.BBS file from PATH
cat cat current configuration to stdout
import-areas args: import-areas args:
--conf CONF_TAG specify conference tag in which to import areas --conf CONF_TAG specify conference tag in which to import areas
--network NETWORK specify network name/key to associate FTN areas --network NETWORK specify network name/key to associate FTN areas
--uplinks UL1,UL2,... specify one or more comma separated uplinks --uplinks UL1,UL2,... specify one or more comma separated uplinks
--type TYPE specifies area import type. valid options are "bbs" and "na" --type TYPE specifies area import type. valid options are "bbs" and "na"
cat args:
--no-color disable color
--no-comments strip any comments
`, `,
FileBase : FileBase :
`usage: oputil.js fb <action> [<args>] `usage: oputil.js fb <action> [<args>]

View File

@ -1,281 +1,308 @@
{ {
/* /*
./\/\.' ENiGMA½ System Configuration -/--/-------- - -- - ./\/\.' ENiGMA½ System Configuration -/--/-------- - -- -
_____________________ _____ ____________________ __________\_ / _____________________ _____ ____________________ __________\_ /
\__ ____/\_ ____ \ /____/ / _____ __ \ / ______/ // /___jp! \__ ____/\_ ____ \ /____/ / _____ __ \ / ______/ // /___jp!
// __|___// | \// |// | \// | | \// \ /___ /_____ // __|___// | \// |// | \// | | \// \ /___ /_____
/____ _____| __________ ___|__| ____| \ / _____ \ /____ _____| __________ ___|__| ____| \ / _____ \
---- \______\ -- |______\ ------ /______/ ---- |______\ - |______\ /__/ // ___/ ---- \______\ -- |______\ ------ /______/ ---- |______\ - |______\ /__/ // ___/
/__ _\ /__ _\
<*> ENiGMA½ // HTTPS://GITHUB.COM/NUSKOOLER/ENIGMA-BBS <*> /__/ <*> ENiGMA½ // HTTPS://GITHUB.COM/NUSKOOLER/ENIGMA-BBS <*> /__/
------------------------------------------------------------------------------- *-----------------------------------------------------------------------------*
Generated by ENiGMA½ v%ENIG_VERSION% / hjson v%HJSON_VERSION%
*-----------------------------------------------------------------------------*
General Information
-------------------------------
This configuration is in HJSON (http://hjson.org/) format. Strict to-spec
JSON is also perfectly valid. Use 'hjson' from npm to convert to/from JSON.
See http://hjson.org/ for more information and syntax. ------------------------------- -- - -
General Information
------------------------------- - -
This configuration is in HJSON (http://hjson.org/) format. Strict to-spec
JSON is also perfectly valid. Use 'hjson' from npm to convert to/from JSON.
Various editors and IDEs have plugins for the HJSON format which can be See http://hjson.org/ for more information and syntax.
very useful.
Available Configuration Various editors and IDEs such as Sublime Text 3, Visual Studio Code, and so
------------------------------- on have syntax highlighting for the HJSON format which are highly recommended.
ENiGMA½ is highly configurable! By default, this file contains common
configuration elements, examples, etc. To see a full list of settings
available to this file, don't be afraid to open up core/config.js and
look around. Do not make changes there however, you may override any
of the configuration from within this file!
See the documentation for more information, and don't be shy to ask
for help!
*/
general: { ------------------------------- -- - -
// Your BBS Name! Configuration
boardName: XXXXX ------------------------------- - -
} ENiGMA½ is *highly* configurable, and thus can be overwhelming at first!
logging: { By default, this file contains common configuration elements, examples, etc.
// To see a more complete view of settings available to the system, don't be
// By default, the system will rotate logs. afraid to open up core/config.js and look around. Do not make changes there
// Remember you can pipe logs through bunyan to pretty-print: however! All system configuration can be extended and defaults overridden
// > tail -F enigma/logs/enigma-bbs.log | enigma/node_modules/bunyan/bin/bunyan via this file!
//
rotatingFile: {
// If you're having trouble, try setting this to "trace"
level: XXXXX
}
}
theme: { Please see RTFM ...er, uh... see the documentation for more information, and
// Default theme applied to new users. "*" indicates random. don't be shy to ask for help:
default: XXXXX
// Theme applied before a user has logged in. "*" indicates random. BBS : Xibalba @ xibalba.l33t.codes
preLogin: XXXXX FTN : BBS Discussion on fsxNet
IRC : #enigma-bbs / FreeNode
Email : bryan@leet.codes
*/
// general: {
// dateFormat, timeFormat, and dateTimeFormat blocks configure // Your BBS Name!
// moment.js (https://momentjs.com/docs/#/displaying/) style formats boardName: XXXXX
// for dates and times. Short and long versions are available. }
// Note that themes may override these settings.
//
}
// logging: {
// Login servers represent available servers (or protocols) in which //
// users are permitted to access your system. // By default, the system will rotate logs.
// // Remember you can pipe logs through bunyan to pretty-print:
loginServers: { // > tail -F enigma/logs/enigma-bbs.log | enigma/node_modules/bunyan/bin/bunyan
// Remember kids, Telnet is insecure! //
telnet: { rotatingFile: {
// It's best to use non-privileged ports and NAT/foward to them // If you're having trouble, try setting this to "trace"
port: XXXXX level: XXXXX
} }
}
// ...but SSH *is* secure! theme: {
ssh: { // Default theme applied to new users. "*" indicates random.
port: XXXXX default: XXXXX
// Theme applied before a user has logged in. "*" indicates random.
preLogin: XXXXX
// //
// To enable SSH: // dateFormat, timeFormat, and dateTimeFormat blocks configure
// 1) Generate a Private Key (PK): // moment.js (https://momentjs.com/docs/#/displaying/) style formats
// > openssl genrsa -des3 -out ./config/ssh_private_key.pem 2048 // for dates and times. Short and long versions are available.
// 2) Set "privateKeyPass" below // Note that themes may override these settings.
// //
enabled: XXXXX }
// set this to your PK's password, generated in step #1 above //
privateKeyPass: SuperSecretPasswordChangeMe! // Login servers represent available servers (or protocols) in which
// users are permitted to access your system.
//
loginServers: {
// Remember kids, Telnet is insecure!
telnet: {
// It's best to use non-privileged ports and NAT/foward to them
port: XXXXX
}
// // ...but SSH *is* secure!
// It's possible to lock down various algorithms available to ssh: {
// SSH, but be aware this may limit the clients that can connect! port: XXXXX
//
algorithms: {}
}
webSocket: { //
// // To enable SSH:
// Setting "proxied" to true allows non-secure (ws://) WebSockets // 1) Generate a Private Key (PK):
// to be considered secure when the X-Fowarded-Proto HTTP header // > openssl genrsa -des3 -out ./config/ssh_private_key.pem 2048
// is set to "https". This is helpful when ENiGMA is running behind // 2) Set "privateKeyPass" below
// another web server doing SSL/TLS termination. //
// enabled: XXXXX
proxied: false
// Non-secure WebSockets, or ws:// // set this to your PK's password, generated in step #1 above
ws: { privateKeyPass: SuperSecretPasswordChangeMe!
port: XXXXX
}
// Secure WebSockets, or wss:// //
wss: { // It's possible to lock down various algorithms available to
port: XXXXX // SSH, but be aware this may limit the clients that can connect!
enabled: XXXXX //
algorithms: {}
}
// webSocket: {
// Certificate and Key in PEM format. //
// Note that web browsers will not trust self-signed certs. Look // Setting "proxied" to true allows non-secure (ws://) WebSockets
// into Let's Encrypt and perhaps running ENiGMA behind another // to be considered secure when the X-Fowarded-Proto HTTP header
// web server such as Caddy. // is set to "https". This is helpful when ENiGMA is running behind
// // another web server doing SSL/TLS termination.
certPem: XXXXX //
keyPem: XXXXX proxied: false
}
}
}
// // Non-secure WebSockets, or ws://
// Content Servers expose content from the system ws: {
// port: XXXXX
contentServers: { }
//
// The Web Content Server can expose content over HTTP (http://) and
// HTTPS (https://) for (but not limited to) the following purposes:
// * Static content
// * Web downloads from the file base
// * Password reset forms (sent to users in PW reset emails; see
// "email" block below)
//
web: {
// Set to your public FQDN
domain: XXXXX
}
}
// // Secure WebSockets, or wss://
// Currently, ENiGMA½ can use external email to mail wss: {
// users for password resets. Additional functionality will port: XXXXX
// be added in the future. enabled: XXXXX
//
email: {
//
// Set the following keys to configure:
// * "defaultFrom" to the reply address
// * "transport" to a configuration block that meets the
// requirements of Nodemailer (https://nodemailer.com/)
//
// Example:
// transport: {
// service: Zoho
// auth: {
// user: myuser@myhost.com
// pass: supersecretpassword
// }
// }
//
}
// Message conferences and areas are within this block //
messageConferences: { // Certificate and Key in PEM format.
// An entry here prepresents a conference taka aka confTag // Note that web browsers will not trust self-signed certs. Look
another_sample_conf: { // into Let's Encrypt and perhaps running ENiGMA behind another
name: "Another Sample Conference" // web server such as Caddy.
desc: "Another conf sample. Change me!" //
areas: { certPem: XXXXX
// Similar to confTags, this is a areaTag keyPem: XXXXX
another_sample_area: { }
name: "Another Sample Area" }
desc: "Another area example. Change me!" }
// The 'sort' key can override natural sort order and can live at the conference and area levels
sort: 2
}
}
}
}
// //
// ENiGMA½ comes with a very powerful File Base, but may be a bit strange // Content Servers expose content from the system
// until you get used to it. Please see the documentation! //
// contentServers: {
fileBase: { //
// // The Web Content Server can expose content over HTTP (http://) and
// Storage tags with relative paths (that is, paths that do not start // HTTPS (https://) for (but not limited to) the following purposes:
// with a "/") are relative to the following path: // * Static content
// // * Web downloads from the file base
areaStoragePrefix: XXXXX // * Password reset forms (sent to users in PW reset emails; see
// "email" block below)
//
web: {
// Set to your public FQDN
domain: XXXXX
}
// // Ladies and gentlemen, a Gopher server!
// Storage tags create a tag -> directory (relative or full path) gopher: {
// that can be used in areas. port: XXXXX
// enabled: false
storageTags: {
//
// Example storage tag: "super_l33t_warez":
// super_l33t_warez: "/path/to/super/l33t/warez"
//
}
areas: { //
// // The Gopher Content Server can export message base
// Example area with the areaTag of "an_example_area": // conferences and areas via the "messageConferences" key.
// an_example_area: { //
// name: "Example File Area" // Example:
// desc: "It's just an example, yo!" // messageConferences: {
// storageTags: [ // some_conf: [ "area_tag1", "area_tag2" ]
// "super_l33t_warez" // }
// ] }
// } }
//
// File Base Areas are read-only (ie: download only) by default.
// To make a uploadable area, set ACS as you like. For example,
// to allow all users to upload to an area:
//
// an_example_area: {
// // ...
// acs: {
// write: GM[users]
// }
// }
}
}
// General user configuration //
users: { // Currently, ENiGMA½ can use external email to mail
// // users for password resets. Additional functionality will
// ENiGMA½ utilizes user groups similar to Windows and *nix. Built in groups // be added in the future.
// include "users" (for regular users) and "sysops" for +ops. You can add other //
// groups to the system as well by adding a 'groups' key in this section: email: {
// groups: [ "leet", "lamerz" ] //
// // Set the following keys to configure:
// * "defaultFrom" to the reply address
// * "transport" to a configuration block that meets the
// requirements of Nodemailer (https://nodemailer.com/)
//
// Example:
// transport: {
// service: Zoho
// auth: {
// user: myuser@myhost.com
// pass: supersecretpassword
// }
// }
//
}
// Set default group(s) new users should automatically be assigned to // Message conferences and areas are within this block
// defaultGroups : [ "lamerz" ] messageConferences: {
// An entry here prepresents a conference taka aka confTag
another_sample_conf: {
name: "Another Sample Conference"
desc: "Another conf sample. Change me!"
areas: {
// Similar to confTags, this is a areaTag
another_sample_area: {
name: "Another Sample Area"
desc: "Another area example. Change me!"
// The 'sort' key can override natural sort order and can live at the conference and area levels
sort: 2
}
}
}
}
// Should new users require +op activation? //
requireActivation: false, // ENiGMA½ comes with a very powerful File Base, but may be a bit strange
} // until you get used to it. Please see the documentation!
//
fileBase: {
//
// Storage tags with relative paths (that is, paths that do not start
// with a "/") are relative to the following path:
//
areaStoragePrefix: XXXXX
// Archive files and related //
archives: { // Storage tags create a tag -> directory (relative or full path)
archivers: { // that can be used in areas.
// //
// Each key in the "archivers" configuration block represents a specific storageTags: {
// external archive utility. ENiGMA½ has sane configuration by default //
// for many archivers, but the tools themselves are likely not yet installed // Example storage tag: "super_l33t_warez":
// on your system! // super_l33t_warez: "/path/to/super/l33t/warez"
// //
// You'll want to have archivers configured for the many old-school archive }
// formats that a BBS may encounter! Please consult the documentation on
// information as to where to find and install these utilities!
//
}
}
fileTransferProtocols: { areas: {
// //
// Each key in the "fileTransferProtocols" configuration block defines // Example area with the areaTag of "an_example_area":
// an external file transfer utility for legacy protocols such as // an_example_area: {
// X, Y, and Z-Modem. // name: "Example File Area"
// // desc: "It's just an example, yo!"
// You will want to ensure your system has these external utilities // storageTags: [
// installed and/or define new or additional protocols. Please // "super_l33t_warez"
// see the documentation for more information! // ]
// // }
} //
// File Base Areas are read-only (ie: download only) by default.
// To make a uploadable area, set ACS as you like. For example,
// to allow all users to upload to an area:
//
// an_example_area: {
// // ...
// acs: {
// write: GM[users]
// }
// }
}
}
// General user configuration
users: {
//
// ENiGMA½ utilizes user groups similar to Windows and *nix. Built in groups
// include "users" (for regular users) and "sysops" for +ops. You can add other
// groups to the system as well by adding a 'groups' key in this section:
// groups: [ "leet", "lamerz" ]
//
// Set default group(s) new users should automatically be assigned to
// defaultGroups : [ "lamerz" ]
// Should new users require +op activation?
requireActivation: false,
}
// Archive files and related
archives: {
archivers: {
//
// Each key in the "archivers" configuration block represents a specific
// external archive utility. ENiGMA½ has sane configuration by default
// for many archivers, but the tools themselves are likely not yet installed
// on your system!
//
// You'll want to have archivers configured for the many old-school archive
// formats that a BBS may encounter! Please consult the documentation on
// information as to where to find and install these utilities!
//
}
}
fileTransferProtocols: {
//
// Each key in the "fileTransferProtocols" configuration block defines
// an external file transfer utility for legacy protocols such as
// X, Y, and Z-Modem.
//
// You will want to ensure your system has these external utilities
// installed and/or define new or additional protocols. Please
// see the documentation for more information!
//
}
} }