Exemplo n.º 1
0
def gnss_on(name):
    """
    """

    ret = {"name": name, "result": None, "changes": {}, "comment": ""}

    res = salt_more.call_error_safe(__salt__["ec2x.gnss"])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get current GNSS state: {:}".format(
            res["error"])
        return ret

    if res["value"] == "on":
        ret["result"] = True
        ret["comment"] = "GNSS is already turned on"
        return ret

    if __opts__["test"]:
        ret["comment"] = "GNSS will be turned on"
        return ret

    res = salt_more.call_error_safe(__salt__["ec2x.gnss"], enable=True)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to turn on GNSS: {:}".format(res["error"])
        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully turned on GNSS"
    ret["changes"]["old"] = "off"
    ret["changes"]["new"] = "on"
    return ret
Exemplo n.º 2
0
def gnss_set_fix_frequency(name, value):
    """
    """

    ret = {"name": name, "result": None, "changes": {}, "comment": ""}

    res = salt_more.call_error_safe(__salt__["ec2x.gnss_fix_frequency"])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get current GNSS fix frequency: {:}".format(
            res["error"])
        return ret

    old_fixfreq = res["fixfreq"]
    if res["fixfreq"] == value:
        ret["result"] = True
        ret["comment"] = "GNSS fix frequency already set to {:}".format(value)
        return ret

    if __opts__["test"]:
        ret["result"] = True
        ret["comment"] = "GNSS fix frequency will be set to {:}".format(value)
        return ret

    res = salt_more.call_error_safe(__salt__["ec2x.gnss_fix_frequency"],
                                    value=value)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to set GNSS fix frequency: {:}".format(
            res["error"])
        return ret

    # do we need to restart GNSS engine?
    res = salt_more.call_error_safe(__salt__["ec2x.gnss"])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get GNSS power state: {:}".format(
            res["error"])
        return ret

    if res["value"] == "on":
        # yes we do
        res = salt_more.call_error_safe(__salt__["ec2x.gnss"], enable=False)
        if "error" in res:
            ret["result"] = False
            ret["comment"] = "Failed to restart GNSS: {:}".format(ret["error"])
            return ret

        res = salt_more.call_error_safe(__salt__["ec2x.gnss"], enable=True)
        if "error" in res:
            ret["result"] = False
            ret["comment"] = "Failed to restart GNSS: {:}".format(ret["error"])
            return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully set GNSS fix frequency"
    ret["changes"]["old"] = old_fixfreq
    ret["changes"]["new"] = value
    return ret
Exemplo n.º 3
0
def gnss_assist_enabled(name):
    """
    """

    ret = {
        "name": name,
        "result": None,
        "changes": {},
        "comment": ""
    }

    # Check if enabled
    res = salt_more.call_error_safe(__salt__["ec2x.gnss_assist"])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get current GNSS assist state: {:}".format(res["error"])
        return ret

    # If enabled do nothing
    if res["enabled"]:
        ret["result"] = True
        ret["comment"] = "GNSS assist is already enabled"
        return ret

    # Return now if in test mode
    if __opts__["test"]:
        ret["comment"] = "GNSS assist will be enabled"
        return ret

    # Go ahead and enable
    res = salt_more.call_error_safe(__salt__["ec2x.gnss_assist"], enable=True)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to enable GNSS assist: {:}".format(res["error"])
        return ret

    # Restart required
    res = salt_more.call_error_safe(__salt__["ec2x.power_off"], normal=True)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to power off EC2X module: {:}".format(res["error"])
        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully enabled GNSS assist"
    ret["changes"]["old"] = "disabled"
    ret["changes"]["new"] = "enabled"
    return ret
Exemplo n.º 4
0
def gnss_assist_data_reset(name, type=3):
    """
    """

    ret = {
        "name": name,
        "result": None,
        "changes": {},
        "comment": ""
    }

    # Return now if in test mode
    if __opts__["test"]:
        ret["comment"] = "GNSS assist data will be reset"
        return ret

    # Go ahead and reset
    res = salt_more.call_error_safe(__salt__["ec2x.gnss_assist_data_reset"], type=type)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to reset GNSS assist data: {:}".format(res["error"])
        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully reset GNSS assist data"
    ret["changes"]["reset"] = True
    return ret
Exemplo n.º 5
0
def configured(name, args=[], kwargs={}):
    """
    Generic state to configure module function by convention.

    The convention is:
      - 'name' is the module + function (dot separated). 
      - 'args' are additional arguments but they are not allowed to perform any changes when specified.
      - 'kwargs' are the settings that needs to be configured. If not specifed the module should query current settings.
    """

    ret = {"name": name, "result": None, "changes": {}, "comment": ""}

    res = salt_more.call_error_safe(__salt__["{:s}".format(name)], *args)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get current configuration: {:}".format(
            res["error"])
        return ret

    old = {k: v for k, v in res.iteritems() if not k.startswith("_")}
    new = kwargs

    if cmp(old, new) == 0:
        ret["result"] = True
        ret["comment"] = "Configuration is already up-to-date"
        return ret

    if __opts__["test"]:
        ret["comment"] = "Configuration will be updated"
        return ret

    res = salt_more.call_error_safe(__salt__["{:s}".format(name)], *args,
                                    **kwargs)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to update configuration: {:}".format(
            res["error"])
        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully updated configuration"
    ret["changes"]["old"] = old
    ret["changes"]["new"] = new

    return ret
Exemplo n.º 6
0
def power_trigger(name, enable=None, rule=None):
    """
    """

    ret = {
        "name": name,
        "result": None,
        "changes": {},
        "comment": ""
    }

    res = salt_more.call_error_safe(__salt__["stn.{:s}".format(name)])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get current status of trigger: {:}".format(res["error"])
        return ret

    old = _parse_trigger(res["value"])
    new = {
        "enable": enable,
        "rule": rule
    }

    if old["enable"] == new["enable"] and old["rule"].upper() == new["rule"].upper():
        ret["result"] = True
        ret["comment"] = "Trigger is already up-to-date"
        return ret

    if __opts__["test"]:
        ret["comment"] = "Trigger will be updated"
        return ret

    res = salt_more.call_error_safe(__salt__["stn.{:s}".format(name)], enable=enable, rule=rule)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to update trigger: {:}".format(res["error"])
        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully updated trigger"
    ret["changes"]["old"] = old
    ret["changes"]["new"] = new
    return ret
Exemplo n.º 7
0
def firmware_flashed(name, version):
    """
    Ensures a specific SPM firmware version is flashed onto the ATtiny.
    """

    ret = {
        "name": name,
        "result": None,
        "changes": {},
        "comment": ""
    }

    res = salt_more.call_error_safe(__salt__["spm.query"], "version")
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get version of installed firmware: {:}".format(res["error"])
        return ret

    old = res["value"]
    new = version

    if old == new:
        ret["result"] = True
        ret["comment"] = "Firmware is already up-to-date"
        return ret

    if __opts__["test"]:
        ret["comment"] = "Firmware will be flashed"
        return ret

    res = salt_more.call_error_safe(__salt__["spm.flash_firmware"], name, confirm=True, check_only=False)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to flash firmware: {:}".format(res["error"])
        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully updated firmware"
    ret["changes"]["old"] = old
    ret["changes"]["new"] = new

    return ret
Exemplo n.º 8
0
def gnss_auto_start(name, enable=True):
    """
    """

    ret = {"name": name, "result": None, "changes": {}, "comment": ""}

    res = salt_more.call_error_safe(__salt__["ec2x.gnss_auto_start"])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get current GNSS auto start mode: {:}".format(
            res["error"])
        return ret

    old = res["value"]
    new = enable

    if old == new:
        ret["result"] = True
        ret["comment"] = "GNSS auto start is already {:}".format(
            "enabled" if new else "disabled")
        return ret

    if __opts__["test"]:
        ret["comment"] = "GNSS auto start will be {:}".format(
            "enabled" if new else "disabled")
        return ret

    res = salt_more.call_error_safe(__salt__["ec2x.gnss_auto_start"],
                                    enable=new)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to change GNSS auto start mode: {:}".format(
            res["error"])
        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully changed GNSS auto start mode"
    ret["changes"]["old"] = old
    ret["changes"]["new"] = new
    return ret
Exemplo n.º 9
0
def module(name, args=[], kwargs={}, validate=[]):
    """
    Tests a module.
    """

    ret = {
        "name": name,
        "result": None,
        "changes": {},
        "comment": ""
    }

    res = salt_more.call_error_safe(__salt__["{:s}".format(name)], *args, **kwargs)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to test module: {:}".format(res["error"])

        return ret

    ret["result"] = True
    ret["comment"] = "Sucessfully tested module"
    ret["changes"]["ret"] = res

    for expr in validate if isinstance(validate, list) else [validate]:
        try:
            success = eval(expr, {"ret": res})

            if not success:
                ret["result"] = False
                ret["comment"] = "Module test failed due to invalid result"

            ret["changes"].setdefault("eval", {})[expr] = success

        except Exception as ex:
            log.exception("Failed to validate result")

            ret["result"] = False
            ret["comment"] = "Module test failed due to failure in validation"
            ret["changes"].setdefault("eval", {})[expr] = str(ex)

    return ret
Exemplo n.º 10
0
def voltage_calibrated(name, url, samples=3):
    """
    Ensure STN voltage is calibrated to the reference value provided by the given HTTP endpoint.
    """

    ret = {"name": name, "result": None, "changes": {}, "comment": ""}

    # First get reference voltage level
    res = salt_more.call_error_safe(__salt__["http.query"],
                                    url,
                                    decode=True,
                                    decode_type="json")
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get reference voltage level by URL '{:}': {:}".format(
            url, res["error"])
        return ret

    expected = res["dict"]["value"]

    # Then get actual voltage level
    res = salt_more.call_error_safe(__salt__["stn.volt_level"],
                                    samples=samples)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get actual voltage level: {:}".format(
            url, res["error"])
        return ret

    actual = res["average"]

    # Check if actual voltage matches expected
    if round(actual, 1) == round(expected, 1):
        ret["result"] = True
        ret["comment"] = "Voltage is already calibrated"
        return ret

    ret["changes"]["before"] = {"expected": expected, "actual": actual}

    if __opts__["test"]:
        ret["comment"] = "Voltage will be calibrated"
        return ret

    # Perform calibration
    res = salt_more.call_error_safe(__salt__["stn.volt_calibrate"],
                                    value=int(
                                        str(round(expected,
                                                  2)).replace(".", "")))
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to calibrate voltage: {:}".format(
            res["error"])
        return ret

    # Get reference voltage level again
    res = salt_more.call_error_safe(__salt__["http.query"],
                                    url,
                                    decode=True,
                                    decode_type="json")
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get reference voltage level by URL '{:}': {:}".format(
            url, res["error"])
        return ret

    expected = res["dict"]["value"]

    # Then get actual voltage level again
    res = salt_more.call_error_safe(__salt__["stn.volt_level"],
                                    samples=samples)
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get actual voltage level: {:}".format(
            url, res["error"])
        return ret

    actual = res["average"]

    ret["changes"]["after"] = {"expected": expected, "actual": actual}

    # Check if actual voltage does not match expected
    if round(actual, 1) != round(expected, 1):
        ret["result"] = False
        ret["comment"] = "Inaccurate voltage level after calibration"
        return ret

    return ret
Exemplo n.º 11
0
def gnss_assist_data_valid(name,
                           force=False,
                           valid_mins=-1,
                           expire_mins=180,
                           keep_cache=False):
    """
    Update GNSS assist data if no longer valid according to specified thresholds.
    """

    ret = {"name": name, "result": None, "changes": {}, "comment": ""}

    # Get status of assist data
    res = salt_more.call_error_safe(__salt__["ec2x.gnss_assist_data"])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get current state of GNSS assist data: {:}".format(
            res["error"])
        return ret

    if not force:

        # Check if assist data is valid according to thresholds
        valid = True
        if valid_mins > 0 and res["valid_mins"] >= valid_mins:
            valid = False
        if expire_mins > 0 and res["expire_mins"] <= expire_mins:
            valid = False

        if valid:
            ret["result"] = True
            ret["comment"] = "Existing GNSS assist data is still valid"
            return ret

    old = res

    # Return now if in test mode
    if __opts__["test"]:
        ret["comment"] = "GNSS assist data will be updated"
        return ret

    # Download new assist data file to cache
    cache_dir = os.path.join(__opts__["cachedir"], "extrn_files", __env__,
                             "ec2x")
    __salt__["file.mkdir"](cache_dir)

    cached_file = os.path.join(cache_dir, urllib.quote_plus(name))
    res = __salt__["cmd.run_all"]("wget -O {:} {:}".format(cached_file, name))
    if res["retcode"] != 0:
        ret["result"] = False
        ret["comment"] = "Failed to download assist data file: {:}".format(
            res["stderr"])
        return ret

    filename = None
    storage = None

    try:
        # Upload cached assist data file to device
        res = salt_more.call_error_safe(__salt__["ec2x.upload_file"],
                                        cached_file)
        if "error" in res:
            ret["result"] = False
            ret["comment"] = "Failed to upload GNSS assist data file to EC2X module: {:}".format(
                res["error"])
            return ret

        filename = res["name"]
        storage = res["storage"]
    finally:
        # Clean up cached file
        if not keep_cache:
            os.unlink(cached_file)

    try:
        # Inject assist time
        res = salt_more.call_error_safe(__salt__["ec2x.gnss_assist_time"])
        if "error" in res:
            ret["result"] = False
            ret["comment"] = "Failed to inject GNSS assist time into GNSS engine: {:}".format(
                res["error"])
            return ret

        # Inject assist data file
        res = salt_more.call_error_safe(__salt__["ec2x.gnss_assist_data"],
                                        filename=filename,
                                        storage=storage)
        if "error" in res:
            ret["result"] = False
            ret["comment"] = "Failed to inject GNSS assist data file '{:s}' into GNSS engine: {:}".format(
                filename, res["error"])
            return ret

    finally:
        # Delete assist data file from device
        res = salt_more.call_error_safe(__salt__["ec2x.delete_file"],
                                        filename,
                                        storage=storage)
        if "error" in res and ret[
                "result"] == None:  # Do not overwrite other result if present
            ret["result"] = False
            ret["comment"] = "Failed to delete GNSS assist data file '{:s}' from EC2X module: {:}".format(
                filename, res["error"])
            return ret

    # Check again status of assist data
    res = salt_more.call_error_safe(__salt__["ec2x.gnss_assist_data"])
    if "error" in res:
        ret["result"] = False
        ret["comment"] = "Failed to get state of GNSS assist data after update: {:}".format(
            res["error"])
        return ret

    new = res

    ret["result"] = True
    ret["comment"] = "Successfully updated GNSS assist data"
    ret["changes"]["old"] = old
    ret["changes"]["new"] = new
    return ret