diff --git a/Cargo.lock b/Cargo.lock index a6a0c03..c5eb870 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", "hashbrown", @@ -470,9 +470,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" dependencies = [ "proc-macro2", "quote", @@ -501,15 +501,15 @@ dependencies = [ [[package]] name = "time-format" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa08af685f978227b475da86d38312cd1acd5024338bf53a1ab9a799219507d" +checksum = "fb54c799611991d3d4a66fee3ff17b9f600c2a0f8c0d34e8209dbd153ff0a87b" [[package]] name = "toml" -version = "1.1.4+spec-1.1.0" +version = "1.1.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +checksum = "12c0ba9680044b4ce98d391a62094047eada0d64860b80166c39f4a6b5640785" dependencies = [ "indexmap", "serde_core", diff --git a/Cargo.toml b/Cargo.toml index ca5393f..68095cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,11 @@ serde_json = "1.0" signal-hook = "0.4" time-format = "1.2" toml = "1.1" + +[profile.release] +lto = true +debug = false +incremental = false +codegen-units = 1 +opt-level = 2 +strip = true diff --git a/src/hive_config.rs b/src/hive_config.rs index 91c8ad3..8efac64 100644 --- a/src/hive_config.rs +++ b/src/hive_config.rs @@ -97,11 +97,11 @@ pub fn read_config() -> Result { Ok(config) } -pub fn change_updates_check_interval(new_interval: u64) -> Result { - let mut config: HiveConfig = read_config()?; - config.update.updates_check_interval = new_interval; - let conf_str = toml::to_string_pretty(&config)?; - fs::write(CONFIG_PATH, conf_str)?; +// pub fn change_updates_check_interval(new_interval: u64) -> Result { +// let mut config: HiveConfig = read_config()?; +// config.update.updates_check_interval = new_interval; +// let conf_str = toml::to_string_pretty(&config)?; +// fs::write(CONFIG_PATH, conf_str)?; - Ok(config) -} +// Ok(config) +// } diff --git a/src/hive_intercom.rs b/src/hive_intercom.rs index 0566317..4f9d800 100644 --- a/src/hive_intercom.rs +++ b/src/hive_intercom.rs @@ -194,3 +194,12 @@ pub fn client_check_for_updates() -> Result { _ => Err(IntercomError::UnexpectedResponse), } } + +pub fn client_schedule_update() -> Result<(), IntercomError> { + let resp = send_and_recv(BzzReq::ScheduleUpdate)?; + match resp { + BzzResp::Finish => Ok(()), + BzzResp::Error(ex) => Err(IntercomError::ServerError(ex)), + _ => Err(IntercomError::UnexpectedResponse), + } +} diff --git a/src/hive_system.rs b/src/hive_system.rs index 2858c74..4383d2e 100644 --- a/src/hive_system.rs +++ b/src/hive_system.rs @@ -388,9 +388,13 @@ fn delete_all_efi_bootnums() -> Result { /// Creates EFI boot record /// boot_index - inserting it at specified boot index (bootorder) /// Assuming boot partition has "bee-efi" PARTLABEL -/// -fn efi_boot_record_create(boot_index: u16, boot_label: &str, uki_path: &str, maybe_kernel_cmd: &Option) -> Result<(), ExecCommandError> { - +/// +fn efi_boot_record_create( + boot_index: u16, + boot_label: &str, + uki_path: &str, + maybe_kernel_cmd: &Option, +) -> Result<(), ExecCommandError> { let (efi_partno, efi_parent_dev) = get_efi_part_info()?; //let local_date = time_format::strftime_local("%Y-%m-%d", time_format::now().unwrap()).unwrap(); @@ -418,8 +422,6 @@ fn efi_boot_record_create(boot_index: u16, boot_label: &str, uki_path: &str, may Ok(()) } - - /// /// Deletes all existing boot records and create a default /// @@ -428,26 +430,31 @@ pub fn init_efi_boot_record(maybe_kernel_cmd: &Option) -> Result<(), Exe delete_all_efi_bootnums()?; // 2 create defaul efi_boot_record_create(0, BOOT_MENU_LABEL, BOOT_UKI_IMAGE_NAME, maybe_kernel_cmd)?; - efi_boot_record_create(1, BOOT_MENU_LABEL_BACK, BOOT_UKI_IMAGE_NAME_BACK, maybe_kernel_cmd)?; + efi_boot_record_create( + 1, + BOOT_MENU_LABEL_BACK, + BOOT_UKI_IMAGE_NAME_BACK, + maybe_kernel_cmd, + )?; Ok(()) } /// -/// List installed kernels by inspecting /usr/lib/modules directory +/// List installed kernels by inspecting /usr/lib/modules directory /// Result is a sorted vector of string -/// +/// fn list_installed_kernels() -> Result, ExecCommandError> { use regex::Regex; let re = Regex::new(r#"^[0-9]+\.[0-9]+\.[0-9]+-[0-9]-kira-lts"#).unwrap(); let mut kernel_dirs: Vec = Vec::new(); - + // Oh boy we roll // finding first dir in /usr/lib/modules that matches common kernel name for r_d_entry in fs::read_dir("/usr/lib/modules")? { let d_entry = r_d_entry?; if d_entry.file_type()?.is_dir() { - let maybe_file_name = d_entry.file_name().to_str().map(|s|s.to_string()); + let maybe_file_name = d_entry.file_name().to_str().map(|s| s.to_string()); if let Some(file_name) = maybe_file_name { if re.is_match(&file_name) { kernel_dirs.push(file_name); @@ -465,20 +472,20 @@ pub fn init_efi_boot_partition_content() -> Result<(), ExecCommandError> { if let Some(kernel_dir) = kernel_dirs.last() { let kernel_img_path = format!("/usr/lib/modules/{}/vmlinuz", kernel_dir); let efi_dir = format!("{}/EFI", EFI_BOOT_MOUNT_POINT); - println!("Romoving efi dir {}",efi_dir); + println!("Romoving efi dir {}", efi_dir); fs::remove_dir_all(&efi_dir)?; - println!("Creating efi dir {}",efi_dir); + println!("Creating efi dir {}", efi_dir); fs::create_dir(efi_dir)?; println!("Copy {} to {}", kernel_img_path, UKI_IMAGE_NAME); fs::copy(&kernel_img_path, UKI_IMAGE_NAME)?; println!("Copy {} to {}", kernel_img_path, UKI_IMAGE_BACK_NAME); fs::copy(&kernel_img_path, UKI_IMAGE_BACK_NAME)?; Ok(()) + } else { + Err(ExecCommandError::Other( + "Cannot find kernel files under /usr/lib/modules dir!".into(), + )) } - else { - Err(ExecCommandError::Other("Cannot find kernel files under /usr/lib/modules dir!".into())) - } - } /// @@ -490,22 +497,28 @@ pub fn init_efi_boot_partition_content() -> Result<(), ExecCommandError> { /// sudo cp /usr/lib/modules/6.18.46-1-kira-lts/vmlinuz /beefi/EFI/kira-linux-lts.efi /// pub fn boot_update() -> Result<(), ExecCommandError> { - // find vmlinuz path in filesystem let kernel_dirs = list_installed_kernels()?; - + // check if kernel even exist lol if let Some(kernel_dir) = kernel_dirs.last() { let kernel_img_path = format!("/usr/lib/modules/{}/vmlinuz", kernel_dir); // rename old kernel to - println!("Renaming old kernel {} to {}",UKI_IMAGE_NAME,UKI_IMAGE_BACK_NAME); + println!( + "Renaming old kernel {} to {}", + UKI_IMAGE_NAME, UKI_IMAGE_BACK_NAME + ); fs::rename(UKI_IMAGE_NAME, UKI_IMAGE_BACK_NAME)?; // copy new kernel image - println!("Copy new kernel from {} to {}",kernel_img_path,UKI_IMAGE_NAME); + println!( + "Copy new kernel from {} to {}", + kernel_img_path, UKI_IMAGE_NAME + ); fs::copy(&kernel_img_path, UKI_IMAGE_NAME)?; Ok(()) - } - else { - Err(ExecCommandError::Other("Cannot find kernel files under /usr/lib/modules dir!".into())) + } else { + Err(ExecCommandError::Other( + "Cannot find kernel files under /usr/lib/modules dir!".into(), + )) } } diff --git a/src/main.rs b/src/main.rs index 77c5e2d..e5c55d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,7 +18,7 @@ use clap::{Args, Parser, Subcommand}; use signal_hook; use std; use std::sync::Arc; -use std::sync::atomic::{AtomicBool}; +use std::sync::atomic::AtomicBool; mod hive_system; @@ -111,13 +111,17 @@ impl std::error::Error for HiveUpError {} #[derive(Args, Debug)] #[group(required = true, multiple = false)] struct RemoteArgs { - /// Ask daemon to chack for updates + /// Ask daemon to check for updates #[arg(long)] check_updates: bool, /// Ask daemon if there is any updates available #[arg(long)] updates_avail: bool, + + /// Ask daemon to perform system update on next reboot + #[arg(long)] + schedule_update: bool, } #[derive(Args, Debug)] @@ -224,6 +228,10 @@ fn main() -> Result<(), HiveUpError> { } else if remote_args.updates_avail { let up_num = hive_intercom::client_updates_available()?; println!("Updates awailable: {}", up_num); + } else if remote_args.schedule_update { + println!("Scheduling system update..."); + hive_intercom::client_schedule_update()?; + print!("Done!") } } }