blob: d77aa2492c21e28c9f31f0dfcf2e2d2824a57165 [file] [log] [blame] [edit]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Provides the command "rollback" for switching to the canary update channel.
use std::process;
use crate::dispatcher::wait_for_result;
use crate::dispatcher::Arguments;
use crate::dispatcher::Command;
use crate::dispatcher::Dispatcher;
use crate::dispatcher::{self};
use crate::util::prompt_for_yes;
use crate::util::UPDATE_ENGINE;
static ROLLBACK_ARGS: &[&str] = &["--rollback"];
pub fn register(dispatcher: &mut Dispatcher) {
dispatcher.register_command(
Command::new(
"rollback",
"",
"
Attempt to rollback to the previous update cached on your system. Only
available on non-stable channels and non-enterprise enrolled devices.
Please note that this will powerwash your device.",
)
.set_command_callback(Some(execute_rollback)),
);
}
fn execute_rollback(_cmd: &Command, args: &Arguments) -> Result<(), dispatcher::Error> {
if !args.get_args().is_empty() {
return Err(dispatcher::Error::CommandInvalidArguments(
"too many arguments".to_string(),
));
}
if !prompt_for_yes(
"NB: This will powerwash your device!
Are you sure you want to rollback to the previous version?",
) {
println!("Not attempting rollback.");
return Ok(());
}
if wait_for_result(
process::Command::new(UPDATE_ENGINE)
.args(ROLLBACK_ARGS)
.spawn()
.map_err(|_| dispatcher::Error::CommandReturnedError)?,
)
.is_ok()
{
println!(concat!(
"Rollback attempt succeeded -- after a couple minutes you will get an ",
"update available and you should reboot to complete rollback."
))
} else {
println!("Rollback attempt failed. Check chrome://system for more information.");
}
Ok(())
}