Added checksum validation and command handling

This commit is contained in:
1e9abhi1e10
2024-07-03 08:43:22 +05:30
parent bd9592c19c
commit 092126bded
2 changed files with 37 additions and 62 deletions

View File

@@ -19,6 +19,10 @@ import json
from typing import Any
import httpx
import aiofiles
import aiohttp
import hashlib
from pathlib import Path
from pyasic import settings
from pyasic.errors import APIError
@@ -46,6 +50,14 @@ class ePICWebAPI(BaseWebAPI):
async with httpx.AsyncClient(transport=settings.transport()) as client:
for retry_cnt in range(settings.get("get_data_retries", 1)):
try:
if parameters.get("form") is not None:
form_data = parameters["form"]
form_data.add_field('password', self.pwd)
response = await client.post(
f"http://{self.ip}:{self.port}/{command}",
timeout=5,
data=form_data,
)
if post:
response = await client.post(
f"http://{self.ip}:{self.port}/{command}",
@@ -135,3 +147,22 @@ class ePICWebAPI(BaseWebAPI):
async def capabilities(self) -> dict:
return await self.send_command("capabilities")
async def system_update(self, file: Path | str, keep_settings: bool = True):
"""Perform a system update by uploading a firmware file and sending a
command to initiate the update."""
# calculate the SHA256 checksum of the firmware file
sha256_hash = hashlib.sha256()
async with aiofiles.open(str(file), "rb") as f:
while chunk := await f.read(8192):
sha256_hash.update(chunk)
checksum = sha256_hash.hexdigest()
# prepare the multipart/form-data request
form_data = aiohttp.FormData()
form_data.add_field('checksum', checksum)
form_data.add_field('keepsettings', str(keep_settings).lower())
form_data.add_field('update.zip', open(file, 'rb'), filename='update.zip')
await self.send_command("systemupdate", form=form_data)