Ejemplo n.º 1
0
def update_esphome_core_repo():
    if CONF_REPOSITORY not in CORE.esphome_core_version:
        return

    if CONF_BRANCH not in CORE.esphome_core_version:
        # Git commit hash or tag cannot be updated
        return

    esphome_core_path = CORE.relative_piolibdeps_path('esphome-core')

    rc, _, _ = run_system_command('git', '-C', esphome_core_path, '--help')
    if rc != 0:
        # git not installed or repo not downloaded yet
        return
    rc, _, _ = run_system_command('git', '-C', esphome_core_path, 'diff-index',
                                  '--quiet', 'HEAD', '--')
    if rc != 0:
        # local changes, cannot update
        _LOGGER.warning(
            "Local changes in esphome-core copy from git. Will not auto-update."
        )
        return
    _LOGGER.info("Updating esphome-core copy from git (%s)", esphome_core_path)
    rc, stdout, _ = run_system_command('git', '-c', 'color.ui=always', '-C',
                                       esphome_core_path, 'pull', '--stat')
    if rc != 0:
        _LOGGER.warning("Couldn't auto-update local git copy of esphome-core.")
        return
    if IS_PY3:
        stdout = stdout.decode('utf-8', 'backslashreplace')
    safe_print(stdout.strip())
Ejemplo n.º 2
0
def _ping_func(filename, address):
    if os.name == 'nt':
        command = ['ping', '-n', '1', address]
    else:
        command = ['ping', '-c', '1', address]
    rc, _, _ = run_system_command(*command)
    return filename, rc == 0
Ejemplo n.º 3
0
def _ping_func(filename, address):
    if os.name == "nt":
        command = ["ping", "-n", "1", address]
    else:
        command = ["ping", "-c", "1", address]
    rc, _, _ = run_system_command(*command)
    return filename, rc == 0
Ejemplo n.º 4
0
    def get(self, configuration=None):
        args = ["esphome", "idedata", settings.rel_path(configuration)]
        rc, stdout, _ = run_system_command(*args)

        if rc != 0:
            self.send_error(404 if rc == 2 else 500)
            return

        idedata = platformio_api.IDEData(json.loads(stdout))

        firmware_offset = "0x10000" if idedata.extra_flash_images else "0x0"
        flash_images = [
            {
                "path": f"./download.bin?configuration={configuration}&type=firmware.bin",
                "offset": firmware_offset,
            }
        ] + [
            {
                "path": f"./download.bin?configuration={configuration}&type={os.path.basename(image.path)}",
                "offset": image.offset,
            }
            for image in idedata.extra_flash_images
        ]

        self.set_header("Content-Type", "application/json")
        self.write(json.dumps(flash_images))
        self.finish()
Ejemplo n.º 5
0
    def get(self, configuration=None):
        type = self.get_argument("type", "firmware.bin")

        if type == "firmware.bin":
            storage_path = ext_storage_path(settings.config_dir, configuration)
            storage_json = StorageJSON.load(storage_path)
            if storage_json is None:
                self.send_error(404)
                return
            filename = f"{storage_json.name}.bin"
            path = storage_json.firmware_bin_path

        elif type == "firmware-factory.bin":
            storage_path = ext_storage_path(settings.config_dir, configuration)
            storage_json = StorageJSON.load(storage_path)
            if storage_json is None:
                self.send_error(404)
                return
            filename = f"{storage_json.name}-factory.bin"
            path = storage_json.firmware_bin_path.replace(
                "firmware.bin", "firmware-factory.bin")

        else:
            args = ["esphome", "idedata", settings.rel_path(configuration)]
            rc, stdout, _ = run_system_command(*args)

            if rc != 0:
                self.send_error(404 if rc == 2 else 500)
                return

            idedata = platformio_api.IDEData(json.loads(stdout))

            found = False
            for image in idedata.extra_flash_images:
                if image.path.endswith(type):
                    path = image.path
                    filename = type
                    found = True
                    break

            if not found:
                self.send_error(404)
                return

        self.set_header("Content-Type", "application/octet-stream")
        self.set_header("Content-Disposition",
                        f'attachment; filename="{filename}"')
        self.set_header("Cache-Control", "no-cache")
        if not Path(path).is_file():
            self.send_error(404)
            return

        with open(path, "rb") as f:
            while True:
                data = f.read(16384)
                if not data:
                    break
                self.write(data)
        self.finish()