infrastructure/docker/tag-config/index.mjs

57 lines
1.3 KiB
JavaScript
Raw Normal View History

2019-06-01 14:02:49 +00:00
'use strict'
import consul from 'consul'
import { exec } from './src/io/run.mjs'
import { readFile } from './src/io/files.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
await Promise.all(
injectors.map(notify =>
notify(states.reduce((acc, tag) => [...acc, ...tag], []))))
}
}
}
const main = async () => {
try {
const args = get_args()
// Initialize all injectors
const injectors = [
await inj_iptables(args.ipt_base, readFile, exec, console.log)
]
// Initialize all catalogs and map them to the injectors
const aggr = notifications_aggregator(injectors)
const catalogs = [
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()