Skip to content

Commit

Permalink
fix: OTA logging: fixed typos / minor changes (#6854)
Browse files Browse the repository at this point in the history
* fix(ignore): Fixed typos / logging consistency

* feat(ignore): Added device's model ID to the debug output

* fix(ignore): Removed duplicate debug output
  • Loading branch information
FabianMangold committed Jan 7, 2024
1 parent 3a1b7a9 commit 22c4673
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 39 deletions.
59 changes: 29 additions & 30 deletions src/lib/ota/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export function readLocalFile(fileName: string, logger: Logger) {
fileName = path.join(dataDir, fileName);
}

logger.debug(`OTA: getting local firmware file ${fileName}`);
logger.debug(`OTA: Getting local firmware file '${fileName}'`);
return fs.readFileSync(fileName);
}

Expand All @@ -80,11 +80,11 @@ export async function getFirmwareFile(image: KeyValueAny, logger: Logger) {

// First try to download firmware file with the URL provided
if (isValidUrl(urlOrName)) {
logger.debug(`OTA: downloading firmware image from ${urlOrName}`);
logger.debug(`OTA: Downloading firmware image from '${urlOrName}'`);
return await getAxios().get(urlOrName, {responseType: 'arraybuffer'});
}

logger.debug(`OTA: Try to read firmware image from local file ${urlOrName}`);
logger.debug(`OTA: Try to read firmware image from local file '${urlOrName}'`);
return {data: readLocalFile(urlOrName, logger)};
}

Expand Down Expand Up @@ -126,7 +126,7 @@ export async function getOverrideIndexFile(urlOrName: string) {
const {data: index} = await getAxios().get(urlOrName);

if (!index) {
throw new Error(`OTA: Error getting override index file from ${urlOrName}`);
throw new Error(`OTA: Error getting override index file from '${urlOrName}'`);
}

return index;
Expand Down Expand Up @@ -182,7 +182,7 @@ export function parseImage(buffer: Buffer): Ota.Image {

const raw = buffer.slice(0, header.totalImageSize);

assert(Buffer.compare(header.otaUpgradeFileIdentifier, upgradeFileIdentifier) === 0, 'Not an OTA file');
assert(Buffer.compare(header.otaUpgradeFileIdentifier, upgradeFileIdentifier) === 0, `Not an OTA file`);

let position = header.otaHeaderLength;
const elements = [];
Expand All @@ -192,7 +192,7 @@ export function parseImage(buffer: Buffer): Ota.Image {
position += element.data.length + 6;
}

assert(position === header.totalImageSize, 'Size mismatch');
assert(position === header.totalImageSize, `Size mismatch`);
return {header, elements, raw};
}

Expand Down Expand Up @@ -372,11 +372,11 @@ function callOnProgress(startTime: number, lastUpdate: number, imageBlockRequest

export async function isUpdateAvailable(device: Zh.Device, logger: Logger, requestPayload: Ota.ImageInfo,
isNewImageAvailable: IsNewImageAvailable = null, getImageMeta: Ota.GetImageMeta = null) {
logger.debug(`OTA: Checking if update available for '${device.ieeeAddr}' (${device.modelID})`);
logger.debug(`OTA: Checking if an update is available for '${device.ieeeAddr}' (${device.modelID})`);

if (requestPayload === null) {
const endpoint = getOTAEndpoint(device);
assert(endpoint != null, `Failed to find endpoint which support OTA cluster`);
assert(endpoint != null, `Failed to find an endpoint which supports the OTA cluster`);
logger.debug(`OTA: Using endpoint '${endpoint.ID}'`);

const request = await requestOTA(endpoint);
Expand All @@ -385,16 +385,16 @@ export async function isUpdateAvailable(device: Zh.Device, logger: Logger, reque
}

const availableResult = await isNewImageAvailable(requestPayload, logger, device, getImageMeta);
logger.debug(`OTA: Update available for '${device.ieeeAddr}': ${availableResult.available < 0 ? 'YES' : 'NO'}`);
logger.debug(`OTA: Update available for '${device.ieeeAddr}' (${device.modelID}): ${availableResult.available < 0 ? 'YES' : 'NO'}`);
if (availableResult.available > 0) {
logger.warn(`OTA: Firmware on '${device.ieeeAddr}' is newer than latest firmware online.`);
logger.warn(`OTA: Firmware on '${device.ieeeAddr}' (${device.modelID}) is newer than latest firmware online.`);
}
return {...availableResult, available: availableResult.available < 0};
}

export async function isNewImageAvailable(current: Ota.ImageInfo, logger: Logger, device: Zh.Device, getImageMeta: Ota.GetImageMeta) {
const currentS = JSON.stringify(current);
logger.debug(`OTA: Is new image available for '${device.ieeeAddr}', current '${currentS}'`);
logger.debug(`OTA: Is new image available for '${device.ieeeAddr}' (${device.modelID}), current '${currentS}'`);
const meta = await getImageMeta(current, logger, device);

// Soft-fail because no images in repo/URL for specified device
Expand All @@ -409,7 +409,7 @@ export async function isNewImageAvailable(current: Ota.ImageInfo, logger: Logger
};
}

logger.debug(`OTA: Is new image available for '${device.ieeeAddr}', latest meta '${JSON.stringify(meta)}'`);
logger.debug(`OTA: Is new image available for '${device.ieeeAddr}' (${device.modelID}), latest meta '${JSON.stringify(meta)}'`);

// Negative number means the new firmware is 'newer' than current one
return {
Expand All @@ -423,12 +423,12 @@ export async function updateToLatest(device: Zh.Device, logger: Logger, onProgre
getImageMeta: Ota.GetImageMeta = null, downloadImage: DownloadImage = null): Promise<number> {
logger.debug(`OTA: Updating to latest '${device.ieeeAddr}' (${device.modelID})`);
const endpoint = getOTAEndpoint(device);
assert(endpoint != null, `Failed to find endpoint which support OTA cluster`);
assert(endpoint != null, `Failed to find an endpoint which supports the OTA cluster`);
logger.debug(`OTA: Using endpoint '${endpoint.ID}'`);
const request = await requestOTA(endpoint);
logger.debug(`OTA: Got request '${JSON.stringify(request.payload)}'`);
const image = await getNewImage(request.payload, logger, device, getImageMeta, downloadImage);
logger.debug(`OTA: Got new image for '${device.ieeeAddr}'`);
logger.debug(`OTA: Got new image for '${device.ieeeAddr}' (${device.modelID})`);

const waiters: Waiters = {};
let lastUpdate: number = null;
Expand Down Expand Up @@ -515,7 +515,7 @@ export async function updateToLatest(device: Zh.Device, logger: Logger, onProgre
},
() => {
cancelWaiters(waiters);
reject(new Error('OTA: Timeout, device did not request any image blocks'));
reject(new Error(`OTA: Timeout, device did not request any image blocks`));
},
);
};
Expand All @@ -531,7 +531,7 @@ export async function updateToLatest(device: Zh.Device, logger: Logger, onProgre
// No need to timeout here, will already be done in answerNextImageBlockRequest
waiters.upgradeEndRequest = endpoint.waitForCommand('genOta', 'upgradeEndRequest', null, maxTimeout);
waiters.upgradeEndRequest.promise.then((data) => {
logger.debug(`OTA: Got upgrade end request for '${device.ieeeAddr}': ${JSON.stringify(data.payload)}`);
logger.debug(`OTA: Got upgrade end request for '${device.ieeeAddr}' (${device.modelID}): ${JSON.stringify(data.payload)}`);
cancelWaiters(waiters);

if (data.payload.status === 0) {
Expand Down Expand Up @@ -570,7 +570,7 @@ export async function updateToLatest(device: Zh.Device, logger: Logger, onProgre
}
});

logger.debug('OTA: Starting upgrade');
logger.debug(`OTA: Starting upgrade`);
answerNextImageBlockOrPageRequest();
answerNextImageRequest();

Expand All @@ -582,10 +582,9 @@ export async function updateToLatest(device: Zh.Device, logger: Logger, onProgre
export async function getNewImage(current: Ota.ImageInfo, logger: Logger, device: Zh.Device,
getImageMeta: Ota.GetImageMeta, downloadImage: DownloadImage): Promise<Ota.Image> {
const meta = await getImageMeta(current, logger, device);
logger.debug(`OTA: Get new image for '${device.ieeeAddr}'`);
assert(meta, 'Images currently unavailable');
logger.debug(`OTA: Get new image for '${device.ieeeAddr}', latest meta ${JSON.stringify(meta)}`);
assert(meta.fileVersion > current.fileVersion || meta.force, 'No new image available');
assert(meta, `Images for '${device.ieeeAddr}' (${device.modelID}) currently unavailable`);
logger.debug(`OTA: Getting new image for '${device.ieeeAddr}' (${device.modelID}), latest meta ${JSON.stringify(meta)}`);
assert(meta.fileVersion > current.fileVersion || meta.force, `No new image available`);

const download = downloadImage ? await downloadImage(meta, logger) :
await getAxios().get(meta.url, {responseType: 'arraybuffer'});
Expand All @@ -594,20 +593,20 @@ export async function getNewImage(current: Ota.ImageInfo, logger: Logger, device
if (checksum) {
const hash = crypto.createHash(meta.sha512 ? 'sha512' : 'sha256');
hash.update(download.data);
assert(hash.digest('hex') === checksum, 'File checksum validation failed');
logger.debug(`OTA: Update checksum validation succeeded for '${device.ieeeAddr}'`);
assert(hash.digest('hex') === checksum, `File checksum validation failed`);
logger.debug(`OTA: Update checksum validation succeeded for '${device.ieeeAddr}' (${device.modelID})`);
}

const start = download.data.indexOf(upgradeFileIdentifier);
const image = parseImage(download.data.slice(start));
logger.debug(`OTA: Get new image for '${device.ieeeAddr}', image header ${JSON.stringify(image.header)}`);
assert(image.header.fileVersion === meta.fileVersion, 'File version mismatch');
assert(!meta.fileSize || image.header.totalImageSize === meta.fileSize, 'Image size mismatch');
assert(image.header.manufacturerCode === current.manufacturerCode, 'Manufacturer code mismatch');
assert(image.header.imageType === current.imageType, 'Image type mismatch');
logger.debug(`OTA: Get new image for '${device.ieeeAddr}' (${device.modelID}), image header ${JSON.stringify(image.header)}`);
assert(image.header.fileVersion === meta.fileVersion, `File version mismatch`);
assert(!meta.fileSize || image.header.totalImageSize === meta.fileSize, `Image size mismatch`);
assert(image.header.manufacturerCode === current.manufacturerCode, `Manufacturer code mismatch`);
assert(image.header.imageType === current.imageType, `Image type mismatch`);
if ('minimumHardwareVersion' in image.header && 'maximumHardwareVersion' in image.header) {
assert(image.header.minimumHardwareVersion <= device.hardwareVersion &&
device.hardwareVersion <= image.header.maximumHardwareVersion, 'Hardware version mismatch');
device.hardwareVersion <= image.header.maximumHardwareVersion, `Hardware version mismatch`);
}
validateImageData(image);
return image;
Expand Down Expand Up @@ -648,7 +647,7 @@ export function getAxios(caBundle: string[] = null) {
try {
const parsedUrl = new URL(redirectUrl);
if (!parsedUrl.protocol || !parsedUrl.host) {
throw new Error('OTA: Get Axios, no scheme or domain');
throw new Error(`OTA: Get Axios, no scheme or domain`);
}
} catch {
// Prepend scheme and domain from the original request's base URL
Expand Down
15 changes: 6 additions & 9 deletions src/lib/ota/zigbeeOTA.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,24 +39,22 @@ async function getIndex(logger: Logger) {
const {data: mainIndex} = await axios.get(url);

if (!mainIndex) {
throw new Error(`ZigbeeOTA: Error getting firmware page at ${url}`);
throw new Error(`ZigbeeOTA: Error getting firmware page at '${url}'`);
}

logger.debug(`ZigbeeOTA: downloaded main index`);
logger.debug(`ZigbeeOTA: Downloaded main index`);

if (overrideIndexFileName) {
logger.debug(`ZigbeeOTA: Loading override index ${overrideIndexFileName}`);
logger.debug(`ZigbeeOTA: Loading override index '${overrideIndexFileName}'`);
const localIndex = await common.getOverrideIndexFile(overrideIndexFileName);

// Resulting index will have overridden items first
return localIndex.concat(mainIndex).map((item: KeyValueAny) => common.isValidUrl(item.url) ? item : fillImageInfo(item, logger));
}

return mainIndex;
}

export async function getImageMeta(current: Ota.ImageInfo, logger: Logger, device: Zh.Device): Promise<Ota.ImageMeta> {
logger.debug(`ZigbeeOTA: call getImageMeta for ${device.modelID}`);
logger.debug(`ZigbeeOTA: Getting image metadata for '${device.modelID}'`);
const images = await getIndex(logger);
// NOTE: Officially an image can be determined with a combination of manufacturerCode and imageType.
// However Gledopto pro products use the same imageType (0) for every device while the image is different.
Expand Down Expand Up @@ -89,7 +87,6 @@ async function isNewImageAvailable(current: Ota.ImageInfo, logger: Logger, devic
current = {...current, fileVersion: device.meta.aqaraFileVersion};
}
}

return common.isNewImageAvailable(current, logger, device, getImageMeta);
}

Expand All @@ -98,13 +95,13 @@ export async function getFirmwareFile(image: KeyValueAny, logger: Logger) {

// First try to download firmware file with the URL provided
if (common.isValidUrl(urlOrName)) {
logger.debug(`OTA: downloading firmware image from ${urlOrName} using the zigbeeOTA custom CA certificates`);
logger.debug(`OTA: Downloading firmware image from '${urlOrName}' using the zigbeeOTA custom CA certificates`);
const otaCaBundle = await common.processCustomCaBundle(caBundleUrl);
const response = await common.getAxios(otaCaBundle).get(urlOrName, {responseType: 'arraybuffer'});
return response;
}

logger.debug(`OTA: Try to read firmware image from local file ${urlOrName}`);
logger.debug(`OTA: Trying to read firmware image from local file '${urlOrName}'`);
return {data: common.readLocalFile(urlOrName, logger)};
}

Expand Down

0 comments on commit 22c4673

Please sign in to comment.