Example #1
0
def main():
    import getopt
    from webpie import HTTPServer

    Usage = "python router.py [-p <port>] <config.yaml>"

    if not sys.argv[1:] or sys.argv[1] in ("-h", "--help", "-?"):
        print(Usage)
        sys.exit(2)

    opts, args = getopt.getopt(sys.argv[1:], "p:")
    opts = dict(opts)
    if not args:
        print(Usage)
        sys.exit(2)

    config_file = args[0]
    port = opts.get("-p")
    if not port:
        config = yaml.load(open(config_file, 'r'), Loader=yaml.SafeLoader)
        port = config.get("port")

    if not port:
        print(Usage)
        sys.exit(2)

    port = int(port)
    HTTPServer(port, create_application(config_file)).run()
Example #2
0
    def reconfigure(self):
        #print("MultiServerSubprocess.reconfigure()...")
        self.ReconfiguredTime = os.path.getmtime(self.ConfigFile)
        self.Config = config = expand(
            yaml.load(open(self.ConfigFile, 'r'), Loader=yaml.SafeLoader))

        templates = config.get("templates", {})
        services = config.get("services", [])

        service_list = []
        assert isinstance(services, list)
        for svc_cfg in services:
            #print("svc_cfg:", svc_cfg)
            svc = None
            if "template" in svc_cfg:
                template = templates.get(svc_cfg.get("template", "*"))
                if template is not None:
                    c = {}
                    c.update(template)
                    c.update(svc_cfg)
                    svc_cfg = expand(c)
                names = svc_cfg.get("names", [svc_cfg.get("name")])
                for name in names:
                    c = svc_cfg.copy()
                    c["name"] = name
                    svc = Service(expand(c), self.Logger)
                    if svc.Initialized:
                        service_list.append(svc)
                        #print("Service", svc, "created and added to the list")
                    else:
                        self.log(
                            f'service "{svc.ServiceName}" failed to initialize - removing from service list'
                        )
            else:
                #print("MultiServerSubprocess.reconfigure: svc_cfg:", svc_cfg)
                #print("MultiServerSubprocess.reconfigure: expanded:", expand(svc_cfg))
                svc = Service(expand(svc_cfg), self.Logger)
                if not svc.Initialized:
                    #print("service not initialzed")
                    self.log(
                        f'service "{svc.ServiceName}" failed to initialize - removing from service list'
                    )
                else:
                    service_list.append(svc)
                    #print("Service", svc, "created and added to the list")
            #print("--------")
        names = ",".join(s.Name for s in service_list)
        if self.Server is None:
            self.Server = HTTPServer.from_config(self.Config,
                                                 service_list,
                                                 logger=self.Logger)
            self.log(f"server created with services: {names}")
        else:
            self.Server.setServices(service_list)
            self.log(f"server reconfigured with services: {names}")
        self.Services = service_list
        self.log("reconfigured")
Example #3
0
class Monitor(object):
    def __init__(self, fn, plot_attrs={}):
        #
        # plot attributes:
        #
        # label ->
        self.FileName = fn
        self.Labels = set()
        self.Data = []  # [(t, data_dict),]
        self.SaveInterval = 1
        self.NextSave = self.SaveInterval
        self.Server = None
        self.PlotAttributes = plot_attrs

    def start_server(self, port):
        app = App(self, static_location="static", enable_static=True)
        self.Server = HTTPServer(port, app)
        self.Server.start()
        return self.Server

    def add(self, t, data=None, **data_args):
        if data is None: data = data_args
        self.Data.append((t, data.copy()))
        for k in data.keys():
            self.Labels.add(k)
        self.NextSave -= 1
        if self.NextSave <= 0:
            self.save()
            self.NextSave = self.SaveInterval

    def data_as_table(self):
        labels = list(self.Labels)
        rows = []
        for t, row in self.Data:
            rows.append([t] + [row.get(l) for l in labels])
        return ['t'] + labels, rows

    def save(self):
        labels, rows = self.data_as_table()
        with open(self.FileName, "w") as f:
            writer = csv.writer(f)
            writer.writerow(labels)
            for row in rows:
                writer.writerow(row)
Example #4
0
    def reconfigure(self):
        self.log("reconfigure...")
        self.ReconfiguredTime = os.path.getmtime(self.ConfigFile)
        self.Config = config = expand(yaml.load(open(self.ConfigFile, 'r'), Loader=yaml.SafeLoader))
        templates = config.get("templates", {})
        new_servers = config["servers"]
        new_ports = {cfg["port"] for cfg in new_servers}
        to_stop = []
        
        for p, s in list(self.ServersByPort.items()):
            if not p in new_ports:
                to_stop.append(s)
        
        new_lst = []
        for cfg in new_servers:
            port = cfg["port"]
            apps = []
            for app_cfg in cfg["apps"]:
                if "template" in app_cfg:
                    template = templates.get(app_cfg.get("template", "*"))
                    if template is not None:
                        c = {}
                        c.update(template)
                        c.update(app_cfg)
                        app_cfg = expand(c)
                    instances = app_cfg.get("instances", [app_cfg.get("instance")])
                    for instance in instances:
                        c = app_cfg.copy()
                        c["instance"] = instance
                        apps.append(QueuedApplication(expand(c), self.Logger))
                else:
                    apps.append(QueuedApplication(expand(app_cfg), self.Logger))
            app_list = ",".join(a.Instance for a in apps)
            srv = self.ServersByPort.get(port)
            if srv is None:
                srv = HTTPServer.from_config(cfg, apps, logger=self.Logger)
                srv.start()
                self.log(f"server {srv.Port} started with apps: {app_list}")
            else:
                srv.reconfigureApps(apps)
                self.log(f"server {srv.Port} reconfigured with apps: {app_list}")
            new_lst.append(srv)
        
        self.Servers = new_lst
        self.ServersByPort = {srv.Port:srv for srv in self.Servers}

        for s in to_stop:
            s.stop()
            self.log(f"server {s.Port} stopped")
            
        self.debug("reconfigured")
Example #5
0
class Monitor(object):
    def __init__(self, fn, title="Monitor", plots=[], metadata={}):
        #
        # plot_list: [ plot_desc, ... ]
        # plot_desc: [ series, ... ]
        # series:
        # {
        #   label: "label",
        #   secondary_axis: <bool>,                 default: false
        #   line_width:     <float> or 0.0,         default: 1.0
        #   color:     <string>                default: auto
        #   marker_style:   <string> or null,       default: null
        # }
        #
        self.FileName = fn
        self.Labels = set()
        self.Data = []  # [(t, data_dict), ...]
        self.SaveInterval = 1
        self.NextSave = self.SaveInterval
        self.Server = None
        self.PlotDesc = plots
        self.Title = title
        self.Meta = metadata

    def reset(self):
        self.Labels = set()
        self.Data = []
        self.NextSave = self.SaveInterval

    def start_server(self, port):
        app = App(self, static_location="static", enable_static=True)
        self.Server = HTTPServer(port, app, logging=False)
        self.Server.start()
        return self.Server

    def add(self, t, data=None, **data_args):
        if data is None: data = data_args
        self.Data.append((t, data.copy()))
        for k in data.keys():
            self.Labels.add(k)
        self.NextSave -= 1
        if self.NextSave <= 0:
            self.save()
            self.NextSave = self.SaveInterval

    def data_as_columns(self):
        labels = list(self.Labels)
        n = len(self.Data)
        prescale = 1.0 if n < 10000 else 0.1
        scaler = 0.0
        columns = {c: [] for c in labels}
        columns['t'] = []
        for i, (t, row) in enumerate(self.Data):
            scaler += prescale
            if scaler >= 1.0 or i == n - 1:
                scaler -= 1.0
                columns['t'].append(t)
                for l in labels:
                    columns[l].append(row.get(l))
        return columns

    def data_as_rows(self):
        out = []
        for t, dct in self.Data:
            d = dct.copy()
            d["t"] = t
            out.append(d)
        return out

    def save(self):
        return
        labels, rows = self.data_as_columns()
        with open(self.FileName, "w") as f:
            writer = csv.writer(f)
            writer.writerow(labels)
            for row in rows:
                writer.writerow(row)
Example #6
0
 def start_server(self, port):
     app = App(self, static_location="static", enable_static=True)
     self.Server = HTTPServer(port, app, logging=False)
     self.Server.start()
     return self.Server
Example #7
0
max_jobs = config.MaxJobs
queue_capacity = config.QueueCapacity
port = config.Port
host = config.Host
registry_port = config.RegistryPort
data_server_url = config.DataServerURL  # required
log_file_dir = config.LogFileDir
log_file = None
if log_file_dir:
    log_file = LogFile(log_file_dir + "/job_server.log")
source_archive = config.SourceArchive

rs = RegistryServer(registry_port)
authenticator = Authenticator(config)
js = JobServer(host, port, rs, authenticator, data_server_url,
               config.BulkTransportPort, queue_capacity, max_jobs,
               source_archive, log_file_dir)
application = WebServiceApp(config, rs, authenticator, js)
web_server = HTTPServer(config.WebServerPort, application)

rs.start()
js.start()
web_server.start()
print("Web server port:", config.WebServerPort)
print("Job server port:", config.Port)

with open("job_server.pid", "w") as pidfile:
    pidfile.write("%d" % (os.getpid(), ))

web_server.join()
Example #8
0
        WPHandler.__init__(self, request, app)
    
    def get(self, request, name):
        cell = self.App.Cell
        value = cell.get(name)
        return value if value is not None else 404
        
    def set(self, request, name, value=None):
        cell = self.App.Cell
        value = cell.set(name, value)
        return 200

class App(WPApp):
    
    def __init__(self, cell):
        WPApp.__init__(self, Handler)
        self.Cell = cell

opts, args = getopt.getopt(sys.argv[1:], "c:")
opts = dict(opts)
config = yaml.load(open(opts["-c"], "r"), Loader=yaml.SafeLoader)
port = int(config["server"]["port"])
link = EtherLink(config["ring"])
cell = MemoryCell(link)
link.init(cell)
link.start()

server = HTTPServer(port, App(cell))
server.start()
server.join()