forked from Deuxfleurs/infrastructure
59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
'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()
|