def run_server(kconfig, sdkconfig):
    config = kconfiglib.Kconfig(kconfig)
    config.load_config(sdkconfig)

    config_dict = confgen.get_json_values(config)
    ranges_dict = get_ranges(config)
    json.dump({
        "version": 1,
        "values": config_dict,
        "ranges": ranges_dict
    }, sys.stdout)
    print("\n")

    while True:
        line = sys.stdin.readline()
        if not line:
            break
        req = json.loads(line)
        before = confgen.get_json_values(config)
        before_ranges = get_ranges(config)

        if "load" in req:  # if we're loading a different sdkconfig, response should have all items in it
            before = {}
            before_ranges = {}

            # if no new filename is supplied, use existing sdkconfig path, otherwise update the path
            if req["load"] is None:
                req["load"] = sdkconfig
            else:
                sdkconfig = req["load"]

        if "save" in req:
            if req["save"] is None:
                req["save"] = sdkconfig
            else:
                sdkconfig = req["save"]

        error = handle_request(config, req)

        after = confgen.get_json_values(config)
        after_ranges = get_ranges(config)

        values_diff = diff(before, after)
        ranges_diff = diff(before_ranges, after_ranges)
        response = {"version": 1, "values": values_diff, "ranges": ranges_diff}
        if error:
            for e in error:
                print("Error: %s" % e, file=sys.stderr)
            response["error"] = error
        json.dump(response, sys.stdout)
        print("\n")
Beispiel #2
0
def run_server(kconfig,
               sdkconfig,
               sdkconfig_rename,
               default_version=MAX_PROTOCOL_VERSION):
    config = kconfiglib.Kconfig(kconfig)
    sdkconfig_renames = [sdkconfig_rename] if sdkconfig_rename else []
    sdkconfig_renames += os.environ.get("COMPONENT_SDKCONFIG_RENAMES",
                                        "").split()
    deprecated_options = confgen.DeprecatedOptions(
        config.config_prefix, path_rename_files=sdkconfig_renames)
    f_o = tempfile.NamedTemporaryFile(mode='w+b', delete=False)
    try:
        with open(sdkconfig, mode='rb') as f_i:
            f_o.write(f_i.read())
        f_o.close(
        )  # need to close as DeprecatedOptions will reopen, and Windows only allows one open file
        deprecated_options.replace(sdkconfig_in=f_o.name,
                                   sdkconfig_out=sdkconfig)
    finally:
        os.unlink(f_o.name)
    config.load_config(sdkconfig)

    print("Server running, waiting for requests on stdin...", file=sys.stderr)

    config_dict = confgen.get_json_values(config)
    ranges_dict = get_ranges(config)
    visible_dict = get_visible(config)

    if default_version == 1:
        # V1: no 'visibility' key, send value None for any invisible item
        values_dict = dict((k, v if visible_dict[k] else False)
                           for (k, v) in config_dict.items())
        json.dump({
            "version": 1,
            "values": values_dict,
            "ranges": ranges_dict
        }, sys.stdout)
    else:
        # V2 onwards: separate visibility from version
        json.dump(
            {
                "version": default_version,
                "values": config_dict,
                "ranges": ranges_dict,
                "visible": visible_dict
            }, sys.stdout)
    print("\n")
    sys.stdout.flush()

    while True:
        line = sys.stdin.readline()
        if not line:
            break
        try:
            req = json.loads(line)
        except ValueError as e:  # json module throws JSONDecodeError (sublcass of ValueError) on Py3 but ValueError on Py2
            response = {
                "version": default_version,
                "error": ["JSON formatting error: %s" % e]
            }
            json.dump(response, sys.stdout)
            print("\n")
            sys.stdout.flush()
            continue
        before = confgen.get_json_values(config)
        before_ranges = get_ranges(config)
        before_visible = get_visible(config)

        if "load" in req:  # load a new sdkconfig

            if req.get("version", default_version) == 1:
                # for V1 protocol, send all items when loading new sdkconfig.
                # (V2+ will only send changes, same as when setting an item)
                before = {}
                before_ranges = {}
                before_visible = {}

            # if no new filename is supplied, use existing sdkconfig path, otherwise update the path
            if req["load"] is None:
                req["load"] = sdkconfig
            else:
                sdkconfig = req["load"]

        if "save" in req:
            if req["save"] is None:
                req["save"] = sdkconfig
            else:
                sdkconfig = req["save"]

        error = handle_request(deprecated_options, config, req)

        after = confgen.get_json_values(config)
        after_ranges = get_ranges(config)
        after_visible = get_visible(config)

        values_diff = diff(before, after)
        ranges_diff = diff(before_ranges, after_ranges)
        visible_diff = diff(before_visible, after_visible)
        if req["version"] == 1:
            # V1 response, invisible items have value None
            for k in (k for (k, v) in visible_diff.items() if not v):
                values_diff[k] = None
            response = {
                "version": 1,
                "values": values_diff,
                "ranges": ranges_diff
            }
        else:
            # V2+ response, separate visibility values
            response = {
                "version": req["version"],
                "values": values_diff,
                "ranges": ranges_diff,
                "visible": visible_diff
            }
        if error:
            for e in error:
                print("Error: %s" % e, file=sys.stderr)
            response["error"] = error
        json.dump(response, sys.stdout)
        print("\n")
        sys.stdout.flush()
Beispiel #3
0
def run_server(kconfig, sdkconfig, default_version=MAX_PROTOCOL_VERSION):
    config = kconfiglib.Kconfig(kconfig)
    config.load_config(sdkconfig)

    print("Server running, waiting for requests on stdin...", file=sys.stderr)

    config_dict = confgen.get_json_values(config)
    ranges_dict = get_ranges(config)
    visible_dict = get_visible(config)

    if default_version == 1:
        # V1: no 'visibility' key, send value None for any invisible item
        values_dict = dict((k, v if visible_dict[k] else False)
                           for (k, v) in config_dict.items())
        json.dump({
            "version": 1,
            "values": values_dict,
            "ranges": ranges_dict
        }, sys.stdout)
    else:
        # V2 onwards: separate visibility from version
        json.dump(
            {
                "version": default_version,
                "values": config_dict,
                "ranges": ranges_dict,
                "visible": visible_dict
            }, sys.stdout)
    print("\n")

    while True:
        line = sys.stdin.readline()
        if not line:
            break
        try:
            req = json.loads(line)
        except ValueError as e:  # json module throws JSONDecodeError (sublcass of ValueError) on Py3 but ValueError on Py2
            response = {
                "version": default_version,
                "error": ["JSON formatting error: %s" % e]
            }
            json.dump(response, sys.stdout)
            print("\n")
            continue
        before = confgen.get_json_values(config)
        before_ranges = get_ranges(config)
        before_visible = get_visible(config)

        if "load" in req:  # load a new sdkconfig

            if req.get("version", default_version) == 1:
                # for V1 protocol, send all items when loading new sdkconfig.
                # (V2+ will only send changes, same as when setting an item)
                before = {}
                before_ranges = {}
                before_visible = {}

            # if no new filename is supplied, use existing sdkconfig path, otherwise update the path
            if req["load"] is None:
                req["load"] = sdkconfig
            else:
                sdkconfig = req["load"]

        if "save" in req:
            if req["save"] is None:
                req["save"] = sdkconfig
            else:
                sdkconfig = req["save"]

        error = handle_request(config, req)

        after = confgen.get_json_values(config)
        after_ranges = get_ranges(config)
        after_visible = get_visible(config)

        values_diff = diff(before, after)
        ranges_diff = diff(before_ranges, after_ranges)
        visible_diff = diff(before_visible, after_visible)
        if req["version"] == 1:
            # V1 response, invisible items have value None
            for k in (k for (k, v) in visible_diff.items() if not v):
                values_diff[k] = None
            response = {
                "version": 1,
                "values": values_diff,
                "ranges": ranges_diff
            }
        else:
            # V2+ response, separate visibility values
            response = {
                "version": req["version"],
                "values": values_diff,
                "ranges": ranges_diff,
                "visible": visible_diff
            }
        if error:
            for e in error:
                print("Error: %s" % e, file=sys.stderr)
            response["error"] = error
        json.dump(response, sys.stdout)
        print("\n")
Beispiel #4
0
def run_server(kconfig, sdkconfig, default_version=MAX_PROTOCOL_VERSION):
    config = kconfiglib.Kconfig(kconfig)
    config.load_config(sdkconfig)

    print("Server running, waiting for requests on stdin...", file=sys.stderr)

    config_dict = confgen.get_json_values(config)
    ranges_dict = get_ranges(config)
    visible_dict = get_visible(config)

    if default_version == 1:
        # V1: no 'visibility' key, send value None for any invisible item
        values_dict = dict((k, v if visible_dict[k] else False) for (k,v) in config_dict.items())
        json.dump({"version": 1, "values": values_dict, "ranges": ranges_dict}, sys.stdout)
    else:
        # V2 onwards: separate visibility from version
        json.dump({"version": default_version, "values": config_dict, "ranges": ranges_dict, "visible": visible_dict}, sys.stdout)
    print("\n")

    while True:
        line = sys.stdin.readline()
        if not line:
            break
        try:
            req = json.loads(line)
        except ValueError as e:  # json module throws JSONDecodeError (sublcass of ValueError) on Py3 but ValueError on Py2
            response = {"version": default_version, "error": ["JSON formatting error: %s" % e]}
            json.dump(response, sys.stdout)
            print("\n")
            continue
        before = confgen.get_json_values(config)
        before_ranges = get_ranges(config)
        before_visible = get_visible(config)

        if "load" in req:  # load a new sdkconfig

            if req.get("version", default_version) == 1:
                # for V1 protocol, send all items when loading new sdkconfig.
                # (V2+ will only send changes, same as when setting an item)
                before = {}
                before_ranges = {}
                before_visible = {}

            # if no new filename is supplied, use existing sdkconfig path, otherwise update the path
            if req["load"] is None:
                req["load"] = sdkconfig
            else:
                sdkconfig = req["load"]

        if "save" in req:
            if req["save"] is None:
                req["save"] = sdkconfig
            else:
                sdkconfig = req["save"]

        error = handle_request(config, req)

        after = confgen.get_json_values(config)
        after_ranges = get_ranges(config)
        after_visible = get_visible(config)

        values_diff = diff(before, after)
        ranges_diff = diff(before_ranges, after_ranges)
        visible_diff = diff(before_visible, after_visible)
        if req["version"] == 1:
            # V1 response, invisible items have value None
            for k in (k for (k,v) in visible_diff.items() if not v):
                values_diff[k] = None
            response = {"version": 1, "values": values_diff, "ranges": ranges_diff}
        else:
            # V2+ response, separate visibility values
            response = {"version": req["version"], "values": values_diff, "ranges": ranges_diff, "visible": visible_diff}
        if error:
            for e in error:
                print("Error: %s" % e, file=sys.stderr)
            response["error"] = error
        json.dump(response, sys.stdout)
        print("\n")