mirror of https://github.com/EdgeVPNio/tools.git
112 lines
3.4 KiB
Python
Executable File
112 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
try:
|
|
import simplejson as json
|
|
except ImportError:
|
|
import json
|
|
|
|
import argparse
|
|
import ipaddress
|
|
import os
|
|
import pathlib
|
|
import pickle
|
|
import random
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
from copy import deepcopy
|
|
|
|
from template import BASE_TEMAPLTE, NODE_ID, UPDATES
|
|
|
|
|
|
class ConfigGen:
|
|
def __init__(
|
|
self,
|
|
):
|
|
parser = argparse.ArgumentParser(
|
|
description="Generates EdgeVPN config files for a range of nodes",
|
|
fromfile_prefix_chars="@",
|
|
)
|
|
parser.add_argument(
|
|
"-t",
|
|
"--template",
|
|
action="store",
|
|
dest="template",
|
|
type=str,
|
|
help="Fully qualified filename for configuration template used to generate the others",
|
|
)
|
|
parser.add_argument(
|
|
"-u",
|
|
"--updates",
|
|
action="store",
|
|
dest="updates",
|
|
help="Fully qualified filename for configuration parameters to merge/overwrite on the template ",
|
|
)
|
|
parser.add_argument(
|
|
"-o",
|
|
"--output_dir",
|
|
action="store",
|
|
dest="output_dir",
|
|
type=pathlib.Path,
|
|
help="Directory for generated configuration files",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-r",
|
|
"--range",
|
|
action="store",
|
|
dest="range",
|
|
nargs=2,
|
|
required=True,
|
|
help="Specifies the range of files to genereate",
|
|
)
|
|
self.args = parser.parse_args()
|
|
self.range_end = int(self.args.range[1])
|
|
self.range_start = int(self.args.range[0])
|
|
if not self.args.output_dir:
|
|
self.output_dir = os.path.abspath(".")
|
|
else:
|
|
self.args.output_dir.mkdir(exist_ok=True)
|
|
self.output_dir = str(self.args.output_dir)
|
|
self.config_file_base = "{0}/config-".format(self.output_dir)
|
|
|
|
def gen(self):
|
|
config = deepcopy(UPDATES)
|
|
node_id = NODE_ID
|
|
for val in range(self.range_start, self.range_end):
|
|
rng_str = "{0:03}".format(val)
|
|
cfg_file = f"{self.config_file_base}{rng_str}.json"
|
|
node_id = "{0}{1}{2}{1}{3}".format(
|
|
node_id[:4], rng_str, node_id[7:29], node_id[32:]
|
|
)
|
|
overlays = config["Broker"].get("Overlays", [])
|
|
config["Broker"]["NodeId"] = node_id
|
|
for olid in overlays:
|
|
netwk = config["BridgeController"]["Overlays"][olid]["NetDevice"][
|
|
"AppBridge"
|
|
].pop("NetworkAddress")
|
|
netwk = ipaddress.IPv4Network(netwk)
|
|
node_ip = str(netwk[val])
|
|
config["BridgeController"]["Overlays"][olid]["NetDevice"]["AppBridge"][
|
|
"IP4"
|
|
] = node_ip
|
|
config["BridgeController"]["Overlays"][olid]["NetDevice"]["AppBridge"][
|
|
"PrefixLen"
|
|
] = netwk.prefixlen
|
|
config["Topology"]["Overlays"][olid]["LocationId"] = val
|
|
with open(cfg_file, "w") as cfg_fle:
|
|
json.dump(config, cfg_fle, indent=2)
|
|
cfg_fle.flush()
|
|
config = deepcopy(UPDATES)
|
|
|
|
print("{0} config file(s) generated".format(self.range_end - self.range_start))
|
|
|
|
|
|
def main(): # pylint: disable=too-many-return-statements
|
|
cfg = ConfigGen()
|
|
cfg.gen()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|