diff options
Diffstat (limited to 'docker/netiquette/index.mjs')
-rw-r--r-- | docker/netiquette/index.mjs | 59 |
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() |