From e1cac588eceb691e3e6e82b66a93277cc840b42c Mon Sep 17 00:00:00 2001 From: kexkey Date: Mon, 16 Nov 2020 16:45:52 -0500 Subject: [PATCH] Features/optionalbatcher (#206) * Batcher cypherapp now optional on cyphernode setup * ignoreThisApp for Sparkwallet when no LN * Use of next in setup * Cleanup --- cyphernodeconf_docker/features.json | 5 + cyphernodeconf_docker/lib/app.js | 4 + cyphernodeconf_docker/lib/config.js | 16 +- .../schema/config-v0.2.5.json | 697 ++++++++++++++++++ .../templates/installer/config.sh | 1 + dist/setup.sh | 29 + 6 files changed, 749 insertions(+), 3 deletions(-) create mode 100644 cyphernodeconf_docker/schema/config-v0.2.5.json diff --git a/cyphernodeconf_docker/features.json b/cyphernodeconf_docker/features.json index 3091e0f..3c96c57 100644 --- a/cyphernodeconf_docker/features.json +++ b/cyphernodeconf_docker/features.json @@ -10,5 +10,10 @@ { "name": "Opentimestamps client", "value": "otsclient" + }, + { + "name": "Batcher Cypherapp", + "value": "batcher" } + ] diff --git a/cyphernodeconf_docker/lib/app.js b/cyphernodeconf_docker/lib/app.js index ef0dd7a..df889d9 100644 --- a/cyphernodeconf_docker/lib/app.js +++ b/cyphernodeconf_docker/lib/app.js @@ -530,6 +530,10 @@ module.exports = class App { torified_webhooks: this.torifyables.find(data => data.value === 'tor_otswebhooks').checked } }, + batcher: { + networks: ['cyphernodeappsnet'], + docker: "cyphernode/batcher:" + this.config.docker_versions['cyphernode/batcher'] + }, lightning: { networks: ['cyphernodenet'], docker: "cyphernode/clightning:"+this.config.docker_versions['cyphernode/clightning'], diff --git a/cyphernodeconf_docker/lib/config.js b/cyphernodeconf_docker/lib/config.js index bfb9b0f..73cfd28 100644 --- a/cyphernodeconf_docker/lib/config.js +++ b/cyphernodeconf_docker/lib/config.js @@ -11,10 +11,11 @@ const schemas = { '0.2.0': require('../schema/config-v0.2.0.json'), '0.2.2': require('../schema/config-v0.2.2.json'), '0.2.3': require('../schema/config-v0.2.3.json'), - '0.2.4': require('../schema/config-v0.2.4.json') + '0.2.4': require('../schema/config-v0.2.4.json'), + '0.2.5': require('../schema/config-v0.2.5.json') }; -const versionHistory = [ '0.1.0', '0.2.0', '0.2.2', '0.2.3', '0.2.4' ]; +const versionHistory = [ '0.1.0', '0.2.0', '0.2.2', '0.2.3', '0.2.4', '0.2.5' ]; const defaultSchemaVersion=versionHistory[0]; const latestSchemaVersion=versionHistory[versionHistory.length-1]; @@ -44,7 +45,8 @@ module.exports = class Config { '0.1.0->0.2.0': this.migrate_0_1_0_to_0_2_0, '0.2.0->0.2.2': this.migrate_0_2_0_to_0_2_2, '0.2.2->0.2.3': this.migrate_0_2_2_to_0_2_3, - '0.2.3->0.2.4': this.migrate_0_2_3_to_0_2_4 + '0.2.3->0.2.4': this.migrate_0_2_3_to_0_2_4, + '0.2.4->0.2.5': this.migrate_0_2_4_to_0_2_5 }; this.setData( { schema_version: latestSchemaVersion } ); @@ -237,4 +239,12 @@ module.exports = class Config { this.data.schema_version = '0.2.4'; } + async migrate_0_2_4_to_0_2_5() { + const currentVersion = this.data.schema_version; + if( currentVersion != '0.2.4' ) { + return; + } + this.data.schema_version = '0.2.5'; + } + }; diff --git a/cyphernodeconf_docker/schema/config-v0.2.5.json b/cyphernodeconf_docker/schema/config-v0.2.5.json new file mode 100644 index 0000000..30e3da2 --- /dev/null +++ b/cyphernodeconf_docker/schema/config-v0.2.5.json @@ -0,0 +1,697 @@ +{ + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://cyphernode.io/config-v0.2.5.json", + "type": "object", + "title": "Cyphernode config file structure v0.2.5", + "additionalProperties": false, + "required": [ + "schema_version", + "setup_version", + "features", + "net", + "use_xpub", + "installer_mode", + "run_as_different_user", + "docker_mode", + "docker_versions", + "adminhash", + "bitcoin_rpcuser", + "bitcoin_rpcpassword", + "bitcoin_prune", + "bitcoin_datapath", + "bitcoin_mode", + "bitcoin_expose", + "gatekeeper_expose", + "gatekeeper_keys", + "gatekeeper_sslcert", + "gatekeeper_sslkey", + "gatekeeper_cns", + "gatekeeper_clientkeyspassword", + "gatekeeper_datapath", + "gatekeeper_port", + "proxy_datapath", + "logs_datapath", + "traefik_datapath", + "traefik_http_port", + "traefik_https_port" + ], + "allOf": [ + { + "if": { + "properties": { + "run_as_different_user": { + "enum": [ + true + ] + } + } + }, + "then": { + "required": [ + "username" + ] + } + }, + { + "if": { + "properties": { + "use_xpub": { + "enum": [ + true + ] + } + } + }, + "then": { + "required": [ + "xpub", + "derivation_path" + ] + } + }, + { + "if": { + "properties": { + "bitcoin_prune": { + "enum": [ + true + ] + } + } + }, + "then": { + "required": [ + "bitcoin_prune_size" + ] + } + }, + { + "if": { + "properties": { + "features": { + "contains": { + "enum": [ + "tor" + ] + } + } + } + }, + "then": { + "required": [ + "tor_datapath", + "torifyables", + "clearnet" + ] + } + }, + { + "if": { + "properties": { + "features": { + "contains": { + "enum": [ + "lightning" + ] + } + } + } + }, + "then": { + "required": [ + "lightning_announce", + "lightning_expose", + "lightning_implementation", + "lightning_datapath", + "lightning_nodename", + "lightning_nodecolor" + ] + } + }, + { + "if": { + "properties": { + "features": { + "contains": { + "enum": [ + "otsclient" + ] + } + } + } + }, + "then": { + "required": [ + "otsclient_datapath" + ] + } + } + ], + "properties": { + "schema_version": { + "type": "string", + "enum": [ + "0.2.5" + ], + "default": "0.3.0", + "examples": [ + "0.2.5" + ] + }, + "setup_version": { + "type": "string", + "examples": [ + "v0.2.0" + ] + }, + "docker_versions": { + "$id": "#/properties/dockerVersions", + "type": "object", + "title": "All versions of the docker containers", + "default": {}, + "additionalProperties": { + "type": "string" + } + }, + "features": { + "$id": "#/properties/features", + "type": "array", + "title": "The optional features of this cyphernode", + "default": [], + "items": { + "$id": "#/properties/features/items", + "type": "string", + "enum": [ + "tor", + "lightning", + "otsclient", + "batcher" + ], + "title": "The feature", + "default": "", + "examples": [ + "tor", + "lightning", + "otsclient", + "batcher" + ] + } + }, + "torifyables": { + "$id": "#/properties/torifyables", + "type": "array", + "title": "The Torified features of this cyphernode", + "default": [], + "items": { + "$id": "#/properties/torifyables/items", + "type": "string", + "enum": [ + "tor_traefik", + "tor_bitcoin", + "tor_lightning", + "tor_otsoperations", + "tor_otswebhooks", + "tor_addrwatcheswebhooks", + "tor_txidwatcheswebhooks" + ], + "title": "The Torified feature", + "default": "", + "examples": [ + "tor_traefik", + "tor_bitcoin", + "tor_lightning", + "tor_otsoperations", + "tor_otswebhooks", + "tor_addrwatcheswebhooks", + "tor_txidwatcheswebhooks" + ] + } + }, + "clearnet": { + "$id": "#/properties/clearnet", + "type": "array", + "title": "The clearnet-allowed Torified features of this cyphernode", + "default": [], + "items": { + "$id": "#/properties/clearnet/items", + "type": "string", + "enum": [ + "clearnet_bitcoin", + "clearnet_lightning" + ], + "title": "The clearnet-allowed Torified feature", + "default": "", + "examples": [ + "clearnet_bitcoin", + "clearnet_lightning" + ] + } + }, + "net": { + "$id": "#/properties/net", + "type": "string", + "enum": [ + "testnet", + "mainnet", + "regtest" + ], + "title": "The net cyphernode is running on", + "default": "testnet", + "examples": [ + "testnet" + ] + }, + "use_xpub": { + "$id": "#/properties/use_xpub", + "type": "boolean", + "title": "Use xpub key?", + "default": false, + "examples": [ + false + ] + }, + "xpub": { + "$id": "#/properties/xpub", + "type": "string", + "title": "Default xpub to derive addresses from", + "pattern": "^(\\w+)$" + }, + "derivation_path": { + "$id": "#/properties/derivation_path", + "type": "string", + "title": "Default derivation path", + "default": "0/n", + "examples": [ + "0/n" + ] + }, + "installer_mode": { + "$id": "#/properties/installer_mode", + "type": "string", + "enum": [ + "docker" + ], + "title": "Install mode", + "default": "docker", + "examples": [ + "docker" + ] + }, + "run_as_different_user": { + "$id": "#/properties/run_as_different_user", + "type": "boolean", + "title": "Run as different user", + "default": true, + "examples": [ + true + ] + }, + "username": { + "$id": "#/properties/username", + "type": "string", + "title": "Username to run under", + "default": "cyphernode", + "examples": [ + "cyphernode" + ] + }, + "docker_mode": { + "$id": "#/properties/docker_mode", + "type": "string", + "enum": [ + "swarm", + "compose" + ], + "title": "How to run the containers", + "default": "swarm", + "examples": [ + "compose" + ] + }, + "bitcoin_rpcuser": { + "$id": "#/properties/bitcoin_rpcuser", + "type": "string", + "title": "Bitcoin rpc user", + "default": "bitcoin", + "examples": [ + "bitcoin" + ] + }, + "bitcoin_rpcpassword": { + "$id": "#/properties/bitcoin_rpcpassword", + "type": "string", + "title": "Bitcoin rpc password", + "default": "CHANGEME", + "examples": [ + "CHANGEME" + ] + }, + "bitcoin_uacomment": { + "$id": "#/properties/bitcoin_uacomment", + "type": "string", + "title": "Bitcoin user agent comment", + "examples": [ + "cyphernode" + ] + }, + "bitcoin_prune": { + "$id": "#/properties/bitcoin_prune", + "type": "boolean", + "title": "Bitcoin prune", + "default": false, + "examples": [ + "false" + ] + }, + "bitcoin_prune_size": { + "$id": "#/properties/bitcoin_prune_size", + "type": "integer", + "title": "Bitcoin prune size", + "default": 550, + "examples": [ + 550 + ] + }, + "bitcoin_datapath": { + "$id": "#/properties/bitcoin_datapath", + "type": "string", + "title": "Bitcoin datapath", + "examples": [ + "/tmp/cyphernode/bitcoin" + ] + }, + "bitcoin_datapath_custom": { + "$id": "#/properties/bitcoin_datapath_custom", + "type": "string", + "title": "Bitcoin custom datapath", + "examples": [ + "/tmp/cyphernode/bitcoin" + ] + }, + "lightning_datapath": { + "$id": "#/properties/lightning_datapath", + "type": "string", + "title": "Lightning datapath", + "examples": [ + "/tmp/cyphernode/lightning" + ] + }, + "lightning_datapath_custom": { + "$id": "#/properties/lightning_datapath_custom", + "type": "string", + "title": "Lightning custom datapath", + "examples": [ + "/tmp/cyphernode/lightning" + ] + }, + "proxy_datapath": { + "$id": "#/properties/proxy_datapath", + "type": "string", + "title": "Proxy datapath", + "examples": [ + "/tmp/cyphernode/proxy" + ] + }, + "proxy_datapath_custom": { + "$id": "#/properties/proxy_datapath_custom", + "type": "string", + "title": "Proxy custom datapath", + "examples": [ + "/tmp/cyphernode/proxy" + ] + }, + "otsclient_datapath": { + "$id": "#/properties/otsclient_datapath", + "type": "string", + "title": "OTS Client datapath", + "examples": [ + "/tmp/cyphernode/otsclient" + ] + }, + "otsclient_datapath_custom": { + "$id": "#/properties/otsclient_datapath_custom", + "type": "string", + "title": "OTS Client custom datapath", + "examples": [ + "/tmp/cyphernode/otsclient" + ] + }, + "traefik_http_port": { + "$id": "#/properties/traefik_port", + "type": "integer", + "title": "Traefik HTTP port", + "default": 80, + "examples": [ + 80 + ] + }, + "traefik_https_port": { + "$id": "#/properties/traefik_https_port", + "type": "integer", + "title": "Traefik HTTPS port", + "default": 443, + "examples": [ + 443 + ] + }, + "traefik_datapath": { + "$id": "#/properties/traefik_datapath", + "type": "string", + "title": "Traefik datapath", + "examples": [ + "/tmp/cyphernode/traefik" + ] + }, + "traefik_datapath_custom": { + "$id": "#/properties/traefik_datapath_custom", + "type": "string", + "title": "Traefik custom datapath", + "examples": [ + "/tmp/cyphernode/traefik" + ] + }, + "logs_datapath": { + "$id": "#/properties/logs_datapath", + "type": "string", + "title": "Logs datapath", + "examples": [ + "/tmp/cyphernode/logs" + ] + }, + "logs_datapath_custom": { + "$id": "#/properties/logs_datapath_custom", + "type": "string", + "title": "Logs custom datapath", + "examples": [ + "/tmp/cyphernode/logs" + ] + }, + "tor_datapath": { + "$id": "#/properties/tor_datapath", + "type": "string", + "title": "Tor datapath", + "examples": [ + "/tmp/cyphernode/tor" + ] + }, + "tor_datapath_custom": { + "$id": "#/properties/tor_datapath_custom", + "type": "string", + "title": "Tor custom datapath", + "examples": [ + "/tmp/cyphernode/tor" + ] + }, + "lightning_announce": { + "$id": "#/properties/lightning_announce", + "type": "boolean", + "title": "Announce lightning ip", + "default": false, + "examples": [ + false + ] + }, + "lightning_external_ip": { + "$id": "#/properties/lightning_external_ip", + "type": "string", + "format": "ipv4", + "title": "External lightning node ip", + "examples": [ + "123.123.123.123" + ] + }, + "bitcoin_mode": { + "$id": "#/properties/bitcoin_mode", + "type": "string", + "enum": [ + "internal" + ], + "title": "Bitcoin mode", + "default": "internal", + "examples": [ + "internal" + ] + }, + "bitcoin_expose": { + "$id": "#/properties/bitcoin_expose", + "type": "boolean", + "title": "Expose bitcoin node", + "default": false, + "examples": [ + true + ] + }, + "lightning_expose": { + "$id": "#/properties/lightning_expose", + "type": "boolean", + "title": "Expose lightning node", + "default": true, + "examples": [ + false + ] + }, + "gatekeeper_expose": { + "$id": "#/properties/gatekeeper_expose", + "type": "boolean", + "title": "Expose gatekeeper port", + "default": false, + "examples": [ + true + ] + }, + "gatekeeper_datapath": { + "$id": "#/properties/gatekeeper_datapath", + "type": "string", + "title": "Gatekeeper datapath", + "examples": [ + "/tmp/cyphernode/gatekeeper" + ] + }, + "gatekeeper_datapath_custom": { + "$id": "#/properties/gatekeeper_datapath_custom", + "type": "string", + "title": "Gatekeeper custom datapath", + "examples": [ + "/tmp/cyphernode/gatekeeper" + ] + }, + "gatekeeper_port": { + "$id": "#/properties/gatekeeper_port", + "type": "integer", + "title": "Gatekeeper port", + "default": 2009, + "examples": [ + 2009 + ] + }, + "gatekeeper_keys": { + "$id": "#/properties/gatekeeper_keys", + "type": "object", + "title": "Gatekeeper keys", + "default": { + "configEntries": [], + "clientInformation": [] + }, + "required": [ + "configEntries", + "clientInformation" + ], + "properties": { + "configEntries": { + "$id": "#/properties/gatekeeper_keys/configEntries", + "type": "array", + "items": { + "$id": "#/properties/gatekeeper_keys/configEntries/entry", + "type": "string", + "pattern": "^kapi_id=\".+\";kapi_key=\".+\";kapi_groups=\".+\";.+$" + }, + "examples": [ + [ + "kapi_id=\"000\";kapi_key=\"a27f9e73fdde6a5005879c259c9aea5e8d917eec77bbdfd73272c0af9b4c6b7a\";kapi_groups=\"stats\";eval ugroups_${kapi_id}=${kapi_groups};eval ukey_${kapi_id}=${kapi_key}", + "kapi_id=\"001\";kapi_key=\"a27f9e73fdde6a5005879c273c9aea5e8d917eec77bbdfd73272c0af9b4c6b7a\";kapi_groups=\"stats,watcher\";eval ugroups_${kapi_id}=${kapi_groups};eval ukey_${kapi_id}=${kapi_key}", + "kapi_id=\"002\";kapi_key=\"fe58ddbb66d7302a7087af3242a98b6326c51a257f5eab1c06bb8cc02e25890d\";kapi_groups=\"stats,watcher,spender\";eval ugroups_${kapi_id}=${kapi_groups};eval ukey_${kapi_id}=${kapi_key}", + "kapi_id=\"003\";kapi_key=\"f0b8bb52f4c7007938757bcdfc73b452d6ce08cc0c660ce57c5464ae95f35417\";kapi_groups=\"stats,watcher,spender,admin\";eval ugroups_${kapi_id}=${kapi_groups};eval ukey_${kapi_id}=${kapi_key}" + ] + ] + }, + "clientInformation": { + "$id": "#/properties/gatekeeper_keys/clientInformation", + "type": "array", + "items": { + "$id": "#/properties/gatekeeper_keys/clientInformation/entry", + "type": "string", + "pattern": "^.+=.+$" + }, + "examples": [ + [ + "000=a27f9e73fdde6a5005879c259c9aea5e8d917eec77bbdfd73272c0af9b4c6b7a", + "001=a27f9e73fdde6a5005879c273c9aea5e8d917eec77bbdfd73272c0af9b4c6b7a", + "002=fe58ddbb66d7302a7087af3242a98b6326c51a257f5eab1c06bb8cc02e25890d", + "003=f0b8bb52f4c7007938757bcdfc73b452d6ce08cc0c660ce57c5464ae95f35417" + ] + ] + } + } + }, + "gatekeeper_sslcert": { + "$id": "#/properties/gatekeeper_sslcert", + "type": "string", + "title": "Gatekeeper SSL Cert" + }, + "gatekeeper_sslkey": { + "$id": "#/properties/gatekeeper_sslkey", + "type": "string", + "title": "Gatekeeper SSL Key" + }, + "gatekeeper_cns": { + "$id": "#/properties/gatekeeper_cns", + "type": "string", + "title": "Gatekeeper cns", + "examples": [ + "myhost.mydomain.com,*.myotherdomain.com,123.123.123.123" + ] + }, + "gatekeeper_clientkeyspassword": { + "$id": "#/properties/gatekeeper_clientkeyspassword", + "type": "string", + "title": "Password for the encrypted client keys archive" + }, + "adminhash": { + "$id": "#/properties/adminhash", + "type": "string", + "title": "Bcrypted hash of admin password" + }, + "lightning_implementation": { + "$id": "#/properties/lightning_implementation", + "type": "string", + "enum": [ + "c-lightning" + ], + "title": "The lightning implementation", + "default": "c-lightning", + "examples": [ + "c-lightning" + ] + }, + "lightning_nodename": { + "$id": "#/properties/lightning_nodename", + "type": "string", + "title": "The lightning node name", + "examples": [ + "🚀 Mighty Moose 🚀" + ] + }, + "lightning_nodecolor": { + "$id": "#/properties/lightning_nodecolor", + "type": "string", + "pattern": "^[0-9A-Fa-f]{6}$", + "title": "The lightning node color", + "examples": [ + "ff0000", + "00ff00", + "00ffff" + ] + } + } +} diff --git a/cyphernodeconf_docker/templates/installer/config.sh b/cyphernodeconf_docker/templates/installer/config.sh index fcfdd65..e8af0b1 100644 --- a/cyphernodeconf_docker/templates/installer/config.sh +++ b/cyphernodeconf_docker/templates/installer/config.sh @@ -1,6 +1,7 @@ INSTALLER_MODE=<%= installer_mode %> BITCOIN_INTERNAL=<%= (bitcoin_mode==="internal"?'true':'false') %> FEATURE_LIGHTNING=<%= (features.indexOf('lightning') != -1)?'true':'false' %> +FEATURE_BATCHER=<%= (features.indexOf('batcher') != -1)?'true':'false' %> FEATURE_OTSCLIENT=<%= (features.indexOf('otsclient') != -1)?'true':'false' %> LIGHTNING_IMPLEMENTATION=<%= lightning_implementation %> PROXY_DATAPATH=<%= proxy_datapath %> diff --git a/dist/setup.sh b/dist/setup.sh index f2a05df..5a5358b 100755 --- a/dist/setup.sh +++ b/dist/setup.sh @@ -765,6 +765,35 @@ install_apps() { echo " clone $apps_repo into apps" docker run --rm -v "$current_path":/git --entrypoint git cyphernode/cyphernodeconf:$CONF_VERSION clone --single-branch -b ${CYPHERAPPS_VERSION} "$apps_repo" /git/apps > /dev/null 2>&1 sudo_if_required chown -R $user $current_path/apps + next + fi + + if [[ $FEATURE_LIGHTNING == true ]]; then + if [ -d "$current_path/apps/sparkwallet" ]; then + step " delete ignoreThisApp for enabled Sparkwallet" + sudo_if_required rm -f $current_path/apps/sparkwallet/ignoreThisApp + next + fi + else + if [ -d "$current_path/apps/sparkwallet" ]; then + step " create ignoreThisApp for disabled Sparkwallet" + sudo_if_required touch $current_path/apps/sparkwallet/ignoreThisApp + next + fi + fi + + if [[ $FEATURE_BATCHER == true ]]; then + if [ -d "$current_path/apps/batcher" ]; then + step " delete ignoreThisApp for enabled Batcher" + sudo_if_required rm -f $current_path/apps/batcher/ignoreThisApp + next + fi + else + if [ -d "$current_path/apps/batcher" ]; then + step " create ignoreThisApp for disabled Batcher" + sudo_if_required touch $current_path/apps/batcher/ignoreThisApp + next + fi fi }