add an update checker (#222)
This commit is contained in:
parent
f1855ba7c0
commit
d87caa06f6
5 changed files with 150 additions and 22 deletions
59
Cargo.lock
generated
59
Cargo.lock
generated
|
@ -416,13 +416,22 @@ dependencies = [
|
||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "directories"
|
||||||
|
version = "5.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35"
|
||||||
|
dependencies = [
|
||||||
|
"dirs-sys 0.4.1",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs"
|
name = "dirs"
|
||||||
version = "3.0.2"
|
version = "3.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309"
|
checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dirs-sys",
|
"dirs-sys 0.3.7",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -436,6 +445,18 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dirs-sys"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"option-ext",
|
||||||
|
"redox_users",
|
||||||
|
"windows-sys 0.48.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "discard"
|
name = "discard"
|
||||||
version = "1.0.4"
|
version = "1.0.4"
|
||||||
|
@ -966,7 +987,7 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||||
"windows-sys",
|
"windows-sys 0.36.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1069,6 +1090,12 @@ version = "0.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
|
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "option-ext"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "os_str_bytes"
|
name = "os_str_bytes"
|
||||||
version = "6.1.0"
|
version = "6.1.0"
|
||||||
|
@ -1095,7 +1122,7 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"redox_syscall",
|
"redox_syscall",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"windows-sys",
|
"windows-sys 0.36.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1837,9 +1864,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.81"
|
version = "1.0.99"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c"
|
checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa 1.0.2",
|
"itoa 1.0.2",
|
||||||
"ryu",
|
"ryu",
|
||||||
|
@ -2112,6 +2139,7 @@ dependencies = [
|
||||||
"tempdir",
|
"tempdir",
|
||||||
"text_io",
|
"text_io",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
"update-informer",
|
||||||
"uuid",
|
"uuid",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
@ -2495,6 +2523,18 @@ version = "0.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
|
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "update-informer"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "19d952f24d9cd8b7564d22c7b2cde3429c48b50c6f4e72b07b382ae4ee5f21b3"
|
||||||
|
dependencies = [
|
||||||
|
"directories",
|
||||||
|
"semver 1.0.9",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "url"
|
name = "url"
|
||||||
version = "2.2.2"
|
version = "2.2.2"
|
||||||
|
@ -2721,6 +2761,15 @@ dependencies = [
|
||||||
"windows_x86_64_msvc 0.36.1",
|
"windows_x86_64_msvc 0.36.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.48.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-targets"
|
name = "windows-targets"
|
||||||
version = "0.48.0"
|
version = "0.48.0"
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
[workspace]
|
[workspace]
|
||||||
|
|
||||||
members = [
|
members = ["steamguard"]
|
||||||
"steamguard"
|
|
||||||
]
|
|
||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "steamguard-cli"
|
name = "steamguard-cli"
|
||||||
|
@ -16,8 +14,9 @@ repository = "https://github.com/dyc3/steamguard-cli"
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["qr"]
|
default = ["qr", "updater"]
|
||||||
qr = ["qrcode"]
|
qr = ["qrcode"]
|
||||||
|
updater = ["update-informer"]
|
||||||
|
|
||||||
# [[bin]]
|
# [[bin]]
|
||||||
# name = "steamguard-cli"
|
# name = "steamguard-cli"
|
||||||
|
@ -61,6 +60,7 @@ gethostname = "0.4.3"
|
||||||
secrecy = { version = "0.8", features = ["serde"] }
|
secrecy = { version = "0.8", features = ["serde"] }
|
||||||
zeroize = "^1.4.3"
|
zeroize = "^1.4.3"
|
||||||
serde_path_to_error = "0.1.11"
|
serde_path_to_error = "0.1.11"
|
||||||
|
update-informer = { version = "1.0.0", optional = true, default-features = false, features = ["github"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempdir = "0.3"
|
tempdir = "0.3"
|
||||||
|
|
|
@ -104,6 +104,14 @@ pub(crate) struct GlobalArgs {
|
||||||
pub passkey: Option<String>,
|
pub passkey: Option<String>,
|
||||||
#[clap(short, long, arg_enum, default_value_t=Verbosity::Info, help = "Set the log level. Be warned, trace is capable of printing sensitive data.")]
|
#[clap(short, long, arg_enum, default_value_t=Verbosity::Info, help = "Set the log level. Be warned, trace is capable of printing sensitive data.")]
|
||||||
pub verbosity: Verbosity,
|
pub verbosity: Verbosity,
|
||||||
|
|
||||||
|
#[cfg(feature = "updater")]
|
||||||
|
#[clap(
|
||||||
|
long,
|
||||||
|
help = "Disable checking for updates.",
|
||||||
|
long_help = "Disable checking for updates. By default, steamguard-cli will check for updates every now and then. This can be disabled with this flag."
|
||||||
|
)]
|
||||||
|
pub no_update_check: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
|
|
51
src/main.rs
51
src/main.rs
|
@ -33,30 +33,55 @@ mod encryption;
|
||||||
mod errors;
|
mod errors;
|
||||||
mod secret_string;
|
mod secret_string;
|
||||||
pub(crate) mod tui;
|
pub(crate) mod tui;
|
||||||
|
#[cfg(feature = "updater")]
|
||||||
|
mod updater;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
std::process::exit(match run() {
|
let args = commands::Args::parse();
|
||||||
|
|
||||||
|
stderrlog::new()
|
||||||
|
.verbosity(args.global.verbosity as usize)
|
||||||
|
.module(module_path!())
|
||||||
|
.module("steamguard")
|
||||||
|
.init()
|
||||||
|
.unwrap();
|
||||||
|
debug!("{:?}", args);
|
||||||
|
#[cfg(feature = "updater")]
|
||||||
|
let should_do_update_check = !args.global.no_update_check;
|
||||||
|
|
||||||
|
let exit_code = match run(args) {
|
||||||
Ok(_) => 0,
|
Ok(_) => 0,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("{:?}", e);
|
error!("{:?}", e);
|
||||||
255
|
255
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
#[cfg(feature = "updater")]
|
||||||
|
if should_do_update_check {
|
||||||
|
match updater::check_for_update() {
|
||||||
|
Ok(Some(version)) => {
|
||||||
|
eprintln!();
|
||||||
|
info!(
|
||||||
|
"steamguard-cli v{} is available. Download it here: https://github.com/dyc3/steamguard-cli/releases",
|
||||||
|
version
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(None) => {
|
||||||
|
debug!("No update available");
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Failed to check for updates: {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::process::exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run() -> anyhow::Result<()> {
|
fn run(args: commands::Args) -> anyhow::Result<()> {
|
||||||
let args = commands::Args::parse();
|
|
||||||
info!("{:?}", args);
|
|
||||||
|
|
||||||
let globalargs = args.global;
|
let globalargs = args.global;
|
||||||
|
|
||||||
stderrlog::new()
|
|
||||||
.verbosity(globalargs.verbosity as usize)
|
|
||||||
.module(module_path!())
|
|
||||||
.module("steamguard")
|
|
||||||
.init()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let cmd: CommandType = match args.sub.unwrap_or(Subcommands::Code(args.code)) {
|
let cmd: CommandType = match args.sub.unwrap_or(Subcommands::Code(args.code)) {
|
||||||
Subcommands::Debug(args) => CommandType::Const(Box::new(args)),
|
Subcommands::Debug(args) => CommandType::Const(Box::new(args)),
|
||||||
Subcommands::Completion(args) => CommandType::Const(Box::new(args)),
|
Subcommands::Completion(args) => CommandType::Const(Box::new(args)),
|
||||||
|
|
46
src/updater.rs
Normal file
46
src/updater.rs
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use serde::de::DeserializeOwned;
|
||||||
|
use update_informer::{
|
||||||
|
http_client::{HeaderMap, HttpClient},
|
||||||
|
registry, Check, Version,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::debug;
|
||||||
|
|
||||||
|
pub fn check_for_update() -> update_informer::Result<Option<Version>> {
|
||||||
|
let name = "dyc3/steamguard-cli";
|
||||||
|
let version = env!("CARGO_PKG_VERSION");
|
||||||
|
debug!("Checking for updates to {} v{}", name, version);
|
||||||
|
let informer = update_informer::new(registry::GitHub, name, version)
|
||||||
|
.http_client(ReqwestHttpClient)
|
||||||
|
.interval(Duration::from_secs(60 * 60 * 24 * 2));
|
||||||
|
|
||||||
|
informer.check_version()
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ReqwestHttpClient;
|
||||||
|
|
||||||
|
impl HttpClient for ReqwestHttpClient {
|
||||||
|
fn get<T: DeserializeOwned>(
|
||||||
|
url: &str,
|
||||||
|
timeout: Duration,
|
||||||
|
headers: HeaderMap,
|
||||||
|
) -> update_informer::Result<T> {
|
||||||
|
let mut req = reqwest::blocking::Client::builder()
|
||||||
|
.timeout(timeout)
|
||||||
|
.build()?
|
||||||
|
.get(url)
|
||||||
|
.header(reqwest::header::USER_AGENT, "steamguard-cli");
|
||||||
|
|
||||||
|
for (key, value) in headers {
|
||||||
|
req = req.header(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
let resp = req.send()?;
|
||||||
|
debug!("Update check response status: {:?}", resp.status());
|
||||||
|
let json = resp.json()?;
|
||||||
|
|
||||||
|
Ok(json)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue