|
|
|
|
@ -31,7 +31,7 @@ use crate::{
|
|
|
|
|
http_client::make_http_request,
|
|
|
|
|
mail,
|
|
|
|
|
util::{
|
|
|
|
|
container_base_image, format_naive_datetime_local, get_display_size, get_web_vault_version,
|
|
|
|
|
container_base_image, format_naive_datetime_local, get_active_web_release, get_display_size,
|
|
|
|
|
is_running_in_container, NumberOrString,
|
|
|
|
|
},
|
|
|
|
|
CONFIG, VERSION,
|
|
|
|
|
@ -689,6 +689,26 @@ async fn get_ntp_time(has_http_access: bool) -> String {
|
|
|
|
|
String::from("Unable to fetch NTP time.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn web_vault_compare(active: &str, latest: &str) -> i8 {
|
|
|
|
|
use semver::Version;
|
|
|
|
|
use std::cmp::Ordering;
|
|
|
|
|
|
|
|
|
|
let active_semver = Version::parse(active).unwrap_or_else(|e| {
|
|
|
|
|
warn!("Unable to parse active web-vault version '{active}': {e}");
|
|
|
|
|
Version::parse("2025.1.1").unwrap()
|
|
|
|
|
});
|
|
|
|
|
let latest_semver = Version::parse(latest).unwrap_or_else(|e| {
|
|
|
|
|
warn!("Unable to parse latest web-vault version '{latest}': {e}");
|
|
|
|
|
Version::parse("2025.1.1").unwrap()
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
match active_semver.cmp(&latest_semver) {
|
|
|
|
|
Ordering::Less => -1,
|
|
|
|
|
Ordering::Equal => 0,
|
|
|
|
|
Ordering::Greater => 1,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[get("/diagnostics")]
|
|
|
|
|
async fn diagnostics(_token: AdminToken, ip_header: IpHeader, conn: DbConn) -> ApiResult<Html<String>> {
|
|
|
|
|
use chrono::prelude::*;
|
|
|
|
|
@ -708,32 +728,21 @@ async fn diagnostics(_token: AdminToken, ip_header: IpHeader, conn: DbConn) -> A
|
|
|
|
|
_ => "Unable to resolve domain name.".to_string(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let (latest_release, latest_commit, latest_web_build) = get_release_info(has_http_access).await;
|
|
|
|
|
let (latest_vw_release, latest_vw_commit, latest_web_release) = get_release_info(has_http_access).await;
|
|
|
|
|
let active_web_release = get_active_web_release();
|
|
|
|
|
let web_vault_compare = web_vault_compare(&active_web_release, &latest_web_release);
|
|
|
|
|
|
|
|
|
|
let ip_header_name = &ip_header.0.unwrap_or_default();
|
|
|
|
|
|
|
|
|
|
// Get current running versions
|
|
|
|
|
let web_vault_version = get_web_vault_version();
|
|
|
|
|
|
|
|
|
|
// Check if the running version is newer than the latest stable released version
|
|
|
|
|
let web_vault_pre_release = if let Ok(web_ver_match) = semver::VersionReq::parse(&format!(">{latest_web_build}")) {
|
|
|
|
|
web_ver_match.matches(
|
|
|
|
|
&semver::Version::parse(&web_vault_version).unwrap_or_else(|_| semver::Version::parse("2025.1.1").unwrap()),
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
error!("Unable to parse latest_web_build: '{latest_web_build}'");
|
|
|
|
|
false
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let diagnostics_json = json!({
|
|
|
|
|
"dns_resolved": dns_resolved,
|
|
|
|
|
"current_release": VERSION,
|
|
|
|
|
"latest_release": latest_release,
|
|
|
|
|
"latest_commit": latest_commit,
|
|
|
|
|
"latest_release": latest_vw_release,
|
|
|
|
|
"latest_commit": latest_vw_commit,
|
|
|
|
|
"web_vault_enabled": &CONFIG.web_vault_enabled(),
|
|
|
|
|
"web_vault_version": web_vault_version,
|
|
|
|
|
"latest_web_build": latest_web_build,
|
|
|
|
|
"web_vault_pre_release": web_vault_pre_release,
|
|
|
|
|
"active_web_release": active_web_release,
|
|
|
|
|
"latest_web_release": latest_web_release,
|
|
|
|
|
"web_vault_compare": web_vault_compare,
|
|
|
|
|
"running_within_container": running_within_container,
|
|
|
|
|
"container_base_image": if running_within_container { container_base_image() } else { "Not applicable" },
|
|
|
|
|
"has_http_access": has_http_access,
|
|
|
|
|
@ -844,3 +853,32 @@ impl<'r> FromRequest<'r> for AdminToken {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn validate_web_vault_compare() {
|
|
|
|
|
// web_vault_compare(active, latest)
|
|
|
|
|
// Test normal versions
|
|
|
|
|
assert!(web_vault_compare("2025.12.0", "2025.12.1") == -1);
|
|
|
|
|
assert!(web_vault_compare("2025.12.1", "2025.12.1") == 0);
|
|
|
|
|
assert!(web_vault_compare("2025.12.2", "2025.12.1") == 1);
|
|
|
|
|
|
|
|
|
|
// Test patched/+build.n versions
|
|
|
|
|
// Newer latest version
|
|
|
|
|
assert!(web_vault_compare("2025.12.0+build.1", "2025.12.1") == -1);
|
|
|
|
|
assert!(web_vault_compare("2025.12.1", "2025.12.1+build.1") == -1);
|
|
|
|
|
assert!(web_vault_compare("2025.12.0+build.1", "2025.12.1+build.1") == -1);
|
|
|
|
|
assert!(web_vault_compare("2025.12.1+build.1", "2025.12.1+build.2") == -1);
|
|
|
|
|
// Equal versions
|
|
|
|
|
assert!(web_vault_compare("2025.12.1+build.1", "2025.12.1+build.1") == 0);
|
|
|
|
|
assert!(web_vault_compare("2025.12.2+build.2", "2025.12.2+build.2") == 0);
|
|
|
|
|
// Newer active version
|
|
|
|
|
assert!(web_vault_compare("2025.12.1+build.1", "2025.12.1") == 1);
|
|
|
|
|
assert!(web_vault_compare("2025.12.2", "2025.12.1+build.1") == 1);
|
|
|
|
|
assert!(web_vault_compare("2025.12.2+build.1", "2025.12.1+build.1") == 1);
|
|
|
|
|
assert!(web_vault_compare("2025.12.1+build.3", "2025.12.1+build.2") == 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|