mod cli;
use std::path::PathBuf;
use structopt::StructOpt;
#[derive(StructOpt)]
enum BootCommand {
GetOrder,
GetEntries {
#[structopt(short, long)]
verbose: bool,
},
}
#[derive(StructOpt)]
enum Command {
Read {
#[structopt(value_name = "VARIABLE")]
name: String,
#[structopt(value_name = "GUID")]
namespace: Option<uuid::Uuid>,
#[structopt(short, long)]
string: bool,
},
List {
#[structopt(value_name = "GUID")]
namespace: Option<uuid::Uuid>,
#[structopt(short, long)]
all: bool,
},
Delete {
#[structopt(value_name = "VARIABLE")]
name: String,
#[structopt(value_name = "GUID")]
namespace: Option<uuid::Uuid>,
},
Boot(BootCommand),
Dump {
#[structopt(value_name = "VARIABLE")]
name: String,
#[structopt(short, long, value_name = "NAMESPACE")]
namespace: Option<uuid::Uuid>,
#[structopt(value_name = "OUTPUT_FILE")]
output_file: PathBuf,
},
Import {
#[structopt(value_name = "OUTPUT_FILE")]
input_file: PathBuf,
#[structopt(value_name = "VARIABLE")]
name: String,
#[structopt(short, long, value_name = "NAMESPACE")]
namespace: Option<uuid::Uuid>,
},
}
#[derive(StructOpt)]
#[structopt(name = env!("CARGO_PKG_NAME"), author, about)]
struct Opt {
#[structopt(
short,
long,
value_name = "FILE",
parse(from_os_str),
env = "EFIBOOT_STORE"
)]
file_store: Option<PathBuf>,
#[structopt(subcommand)]
cmd: Command,
}
#[paw::main]
fn main(opts: Opt) {
let manager = if let Some(filename) = opts.file_store {
efivar::file_store_std(filename)
} else {
efivar::system()
};
match opts.cmd {
Command::Read {
name,
namespace,
string,
} => {
cli::read(manager, &name, namespace, string);
}
Command::List { namespace, all } => {
cli::list(manager, namespace, all);
}
Command::Delete { name, namespace } => {
cli::delete(manager, &name, namespace);
}
Command::Boot(arg) => match arg {
BootCommand::GetOrder => {
cli::get_boot_order(manager);
}
BootCommand::GetEntries { verbose } => {
cli::get_boot_entries(manager, verbose);
}
},
Command::Dump {
name,
namespace,
output_file,
} => {
cli::dump(manager, &name, namespace, &output_file);
}
Command::Import {
input_file,
name,
namespace,
} => {
cli::import(manager, &input_file, &name, namespace);
}
}
}