aboutsummaryrefslogtreecommitdiff
path: root/docker/netiquette/index.mjs
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2019-12-04 18:04:30 +0100
committerQuentin Dufour <quentin@deuxfleurs.fr>2019-12-04 18:04:30 +0100
commitfcc2328a3bf49eb5310413058cc9ebaf8e7819f8 (patch)
treec6faabae8badd96455453b72472ac08a2fe0b1c2 /docker/netiquette/index.mjs
parent0b3eb8ec1b3ba3691410744f6397437c9832e74d (diff)
downloadinfrastructure-fcc2328a3bf49eb5310413058cc9ebaf8e7819f8.tar.gz
infrastructure-fcc2328a3bf49eb5310413058cc9ebaf8e7819f8.zip
WIP netiquette
Diffstat (limited to 'docker/netiquette/index.mjs')
-rw-r--r--docker/netiquette/index.mjs59
1 files changed, 59 insertions, 0 deletions
diff --git a/docker/netiquette/index.mjs b/docker/netiquette/index.mjs
new file mode 100644
index 0000000..6aca6e4
--- /dev/null
+++ b/docker/netiquette/index.mjs
@@ -0,0 +1,59 @@
+'use strict'
+import consul from 'consul'
+import { exec } from './src/io/run.mjs'
+import { readFile } from './src/io/files.mjs'
+
+import ctlg_control_loop from './src/catalog/control_loop.mjs'
+import ctlg_consul from './src/catalog/consul.mjs'
+import inj_iptables from './src/injector/iptables.mjs'
+
+const get_args = () => process
+ .argv
+ .slice(2)
+ .map(a => a.split('='))
+ .reduce((dict, tuple) => {
+ dict[tuple[0]] = tuple.length > 1 ? tuple[1] : null
+ return dict
+ }, {})
+
+/**
+ * If we have multiple catalogs
+ * we cache the results of the other ones
+ */
+function* notifications_aggregator(injectors) {
+ const states = []
+ for(let idx = 0; true; idx++) {
+ yield async (tag_list) => {
+ states[idx] = tag_list
+ const merged = states.reduce((acc, tag) => [...acc, ...tag], [])
+ await Promise.all(injectors.map(notify => notify(merged)))
+ }
+ }
+}
+
+const main = async () => {
+ try {
+ const args = get_args()
+
+ // Initialize all injectors
+ const injectors = [
+ await inj_iptables(args.ipt_base, readFile, exec, console.log),
+ // await inj_upnp
+ ]
+
+ // Initialize all catalogs and map them to the injectors
+ const aggr = notifications_aggregator(injectors)
+ const catalogs = [
+ // this catalog is used to defeat deriving config due to single resource updated async. by multiple prog or by external program not tracked by catalogs
+ await ctlg_control_loop(setInterval, 60000, aggr.next().value),
+ await ctlg_consul(args.node, consul(), console.log, aggr.next().value)
+ ]
+
+ console.log("[main] initialized")
+ } catch(e) {
+ console.error("initialization failed", e)
+ process.exit(1)
+ }
+}
+
+main()