#!/usr/bin/env python3 import requests import os import subprocess import logging import logging.handlers as lh import time try: import simplejson as json except ImportError: import json config_file="/etc/opt/evio/config.json" nid_file="/var/opt/evio/nid" log_file="/var/log/evio/evio-control.log" server_addr=None logger=None def runcmd(cmd): """ Run a shell command. if fails, raise an exception. """ if cmd[0] is None: raise ValueError("No executable specified to run") p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) return p def setup_logger(): global logger if os.path.isfile(log_file): os.remove(log_file) logger = logging.getLogger() logger.setLevel(logging.DEBUG) handler = lh.RotatingFileHandler(filename=log_file, maxBytes=10000,backupCount=2) formatter = logging.Formatter( "[%(asctime)s.%(msecs)03d] %(levelname)s:%(message)s", datefmt="%Y%m%d %H:%M:%S") logging.Formatter.converter = time.localtime handler.setFormatter(formatter) logger.addHandler(handler) def node_id(): with open(config_file) as f: config = json.load(f) if "NodeId" in config["CFx"]: return config["CFx"]["NodeId"] with open(nid_file) as f: return f.readline().strip('\n') def server_address(): with open(config_file) as f: config = json.load(f) if "OverlayVisualizer" in config: return config["OverlayVisualizer"].get("WebServiceAddress") def main(): setup_logger() nid = node_id() server_addr = server_address() if server_addr is None: logger.info("No web server address configured") return url=f'http://{server_addr}/eviocontrol/?nodeid={nid}' resp=requests.get(url).json() logger.info(f"Server response: {resp}") if resp and nid == resp[0]["EvioControl"]["NodeId"]: ctrl = resp[0]["EvioControl"]["Control"] if ctrl not in ("stop", "start", "status"): logger.info(f"Invalid evio control {ctrl} received from {url}") return cp = runcmd(["systemctl", ctrl, "openvswitch-switch"]) logger.info(cp) cp = runcmd(["systemctl", ctrl, "evio"]) logger.info(cp) logger.info("***************************************") if __name__ == "__main__": main()