This commit is contained in:
37
src/util.rs
37
src/util.rs
@@ -1,10 +1,11 @@
|
||||
use std::{fs, path::PathBuf};
|
||||
use std::{cmp::Reverse, fs, path::PathBuf};
|
||||
|
||||
use log::{debug, info};
|
||||
use log::{error, info};
|
||||
use semver::Version;
|
||||
use std::str::FromStr;
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::schemas::{BoardConfig, BoardType, OTAConfiguration};
|
||||
use crate::schemas::{BoardConfig, BoardType, OTAConfiguration, Services};
|
||||
|
||||
pub fn parse_mac_address(mac: &str) -> Result<[u8; 6], MacAddressError> {
|
||||
if mac.len() != 12 {
|
||||
@@ -38,6 +39,8 @@ pub enum GetFilesError {
|
||||
Extension,
|
||||
#[error("Strum parse Error")]
|
||||
Conversion(#[from] strum::ParseError),
|
||||
#[error("Failed to parse the version")]
|
||||
VersionParse(#[from] semver::Error),
|
||||
}
|
||||
|
||||
pub fn get_files(
|
||||
@@ -73,11 +76,12 @@ pub fn get_files(
|
||||
let board_config = BoardConfig::from_str(split_name[1])?;
|
||||
let service = split_name[0];
|
||||
let board_type = BoardType::from_str(&product_name).unwrap();
|
||||
let version_replaced = version.replace('.', "_");
|
||||
let version = Version::parse(&version)?;
|
||||
let version_replaced = format!("{}-{}-{}", version.major, version.minor, version.patch);
|
||||
let fw_url =
|
||||
format!("{hostname}/{service}/{board_type}/{board_config}/{version_replaced}.bin");
|
||||
let cfg = OTAConfiguration {
|
||||
version: version.to_string(),
|
||||
version: version,
|
||||
url: fw_url,
|
||||
board: Some(board_type),
|
||||
config: Some(board_config),
|
||||
@@ -91,6 +95,25 @@ pub fn get_files(
|
||||
Ok(configs)
|
||||
}
|
||||
|
||||
pub fn prune_files(path: PathBuf, service: Services, keep_last: usize) {
|
||||
let Ok(mut config_list) = get_files(&path, "irrelevant") else {
|
||||
error!("failed to get file list for pruning");
|
||||
return
|
||||
};
|
||||
config_list.sort_by_key(|x| x.version.clone());
|
||||
config_list.truncate(config_list.len() - keep_last);
|
||||
for cfg in config_list {
|
||||
println!("{cfg:?}");
|
||||
let path = path.to_string_lossy();
|
||||
let board_type = cfg. config.unwrap();
|
||||
let path_to_remove = format!("{path}/{service}_{}_{}-{}-{}.bin", board_type, cfg.version.major, cfg.version.minor, cfg.version.patch);
|
||||
if let Err(e) = fs::remove_file(&path_to_remove) {
|
||||
error!("Failed to delete {path_to_remove}, {e:?}");
|
||||
return;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
@@ -98,13 +121,13 @@ mod tests {
|
||||
#[test]
|
||||
fn test_file_loading() {
|
||||
let expected_1 = OTAConfiguration {
|
||||
version: "1.2.3".to_string(),
|
||||
version: Version::parse("1.2.3").unwrap(),
|
||||
url: "example.com/firmware/waterlevel/INA233/1_2_3.bin".to_string(),
|
||||
board: Some(BoardType::Waterlevel),
|
||||
config: Some(BoardConfig::INA233),
|
||||
};
|
||||
let expected_2 = OTAConfiguration {
|
||||
version: "4.5.6".to_string(),
|
||||
version: Version::parse("4.5.6").unwrap(),
|
||||
url: "example.com/firmware/waterlevel/INA226/4_5_6.bin".to_string(),
|
||||
board: Some(BoardType::Waterlevel),
|
||||
config: Some(BoardConfig::INA226),
|
||||
|
||||
Reference in New Issue
Block a user