/*! * Copyright 2019-2020 Lime Technology Inc. All rights reserved. * Written by: Alexis Tyler */ import path from 'path'; import mm from 'micromongo'; import { paths } from '../paths'; import { LooseObject, IniStringBoolean, CommaSeparatedString } from '../types'; import { toBoolean } from '../utils/casting'; import { parseConfig } from '../utils/misc'; import { ArrayState } from './state'; type NetworkIni = Record; const parse = (state: NetworkIni) => { return Object.values(state).map(network => { const result = { ...network, dhcpKeepresolv: toBoolean(network.dhcpKeepresolv), dhcp6Keepresolv: toBoolean(network.dhcp6Keepresolv), bonding: toBoolean(network.bonding), bondnics: network.bondnics.split(','), bridging: toBoolean(network.bridging), 'useDhcp:0': toBoolean(network['useDhcp:0']), 'useDhcp6:0': toBoolean(network['useDhcp6:0']) }; return result; }); }; /** * Network */ class Network extends ArrayState { private static instance: Network; public channel = 'network'; constructor() { super(); if (Network.instance) { // eslint-disable-next-line no-constructor-return return Network.instance; } Network.instance = this; } get data() { if (this._data.length === 0) { const statesDirectory = paths.get('states')!; const statePath = path.join(statesDirectory, 'network.ini'); const state = parseConfig({ filePath: statePath, type: 'ini' }); this._data = this.parse(state); } return this._data; } parse(state: any) { const data = parse(state); // Update local data this.set(data); // Update network channel with new networks this.emit('UPDATED', data); return data; } find(query?: LooseObject): Network[] { return super.find(query); } findOne(query: LooseObject = {}): Network { return mm.findOne(this.data, query); } } export const networkState = new Network();