summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-04-08 10:42:05 +0200
committerDavid Lönnhager <david.l@mullvad.net>2024-04-08 10:42:05 +0200
commitde28009a01832ef8f5910a93b6ae167a91cc90e0 (patch)
treebb3f6c94c766b3bbf4a0008b7d1eecb00bbc580e
parentdc6847c9859ceec92deae3e12e07b690879e8bf1 (diff)
parent2ba24c2e668b25a5168fabea3ad4fd9913ee55d3 (diff)
downloadmullvadvpn-de28009a01832ef8f5910a93b6ae167a91cc90e0.tar.xz
mullvadvpn-de28009a01832ef8f5910a93b6ae167a91cc90e0.zip
Merge branch 'macos-extend-version-info'
-rw-r--r--talpid-platform-metadata/src/android.rs2
-rw-r--r--talpid-platform-metadata/src/command.rs5
-rw-r--r--talpid-platform-metadata/src/lib.rs2
-rw-r--r--talpid-platform-metadata/src/linux.rs20
-rw-r--r--talpid-platform-metadata/src/macos.rs80
5 files changed, 89 insertions, 20 deletions
diff --git a/talpid-platform-metadata/src/android.rs b/talpid-platform-metadata/src/android.rs
index 90d638772e..94a8e4e979 100644
--- a/talpid-platform-metadata/src/android.rs
+++ b/talpid-platform-metadata/src/android.rs
@@ -37,5 +37,5 @@ pub fn extra_metadata() -> HashMap<String, String> {
}
fn get_prop(property: &str) -> Option<String> {
- command_stdout_lossy("getprop", &[property])
+ command_stdout_lossy("getprop", &[property]).ok()
}
diff --git a/talpid-platform-metadata/src/command.rs b/talpid-platform-metadata/src/command.rs
index 87ed6c40a0..296c82e1ab 100644
--- a/talpid-platform-metadata/src/command.rs
+++ b/talpid-platform-metadata/src/command.rs
@@ -1,10 +1,9 @@
-use std::process::Command;
+use std::{io, process::Command};
/// Helper for getting stdout of some command as a String. Ignores the exit code of the command.
-pub fn command_stdout_lossy(cmd: &str, args: &[&str]) -> Option<String> {
+pub fn command_stdout_lossy(cmd: &str, args: &[&str]) -> io::Result<String> {
Command::new(cmd)
.args(args)
.output()
.map(|output| String::from_utf8_lossy(&output.stdout).trim().to_string())
- .ok()
}
diff --git a/talpid-platform-metadata/src/lib.rs b/talpid-platform-metadata/src/lib.rs
index d13dd526cc..7a11c97f18 100644
--- a/talpid-platform-metadata/src/lib.rs
+++ b/talpid-platform-metadata/src/lib.rs
@@ -14,6 +14,8 @@ mod imp;
#[path = "android.rs"]
mod imp;
+#[cfg(target_os = "macos")]
+pub use self::imp::MacosVersion;
#[cfg(windows)]
pub use self::imp::WindowsVersion;
pub use self::imp::{extra_metadata, short_version, version};
diff --git a/talpid-platform-metadata/src/linux.rs b/talpid-platform-metadata/src/linux.rs
index 6b6b25c6d0..b8b8791501 100644
--- a/talpid-platform-metadata/src/linux.rs
+++ b/talpid-platform-metadata/src/linux.rs
@@ -68,13 +68,15 @@ fn read_os_release_file() -> Result<String, Option<String>> {
}
fn parse_lsb_release() -> Option<String> {
- command_stdout_lossy("lsb_release", &["-ds"]).and_then(|output| {
- if output.is_empty() {
- None
- } else {
- Some(output)
- }
- })
+ command_stdout_lossy("lsb_release", &["-ds"])
+ .ok()
+ .and_then(|output| {
+ if output.is_empty() {
+ None
+ } else {
+ Some(output)
+ }
+ })
}
pub fn extra_metadata() -> impl Iterator<Item = (String, String)> {
@@ -86,7 +88,7 @@ pub fn extra_metadata() -> impl Iterator<Item = (String, String)> {
/// `uname -r` outputs a single line containing only the kernel version:
/// > 5.9.15
fn kernel_version() -> Option<(String, String)> {
- let kernel = command_stdout_lossy("uname", &["-r"])?;
+ let kernel = command_stdout_lossy("uname", &["-r"]).ok()?;
Some(("kernel".to_string(), kernel))
}
@@ -112,7 +114,7 @@ fn wg_version() -> Option<(String, String)> {
/// > systemd 246 (246)
/// > +PAM +AUDIT -SELINUX +IMA +APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL
fn systemd_version() -> Option<(String, String)> {
- let systemd_version_output = command_stdout_lossy("systemctl", &["--version"])?;
+ let systemd_version_output = command_stdout_lossy("systemctl", &["--version"]).ok()?;
let version = systemd_version_output.lines().next()?.to_string();
Some(("systemd".to_string(), version))
}
diff --git a/talpid-platform-metadata/src/macos.rs b/talpid-platform-metadata/src/macos.rs
index 4b2181fc23..707130721b 100644
--- a/talpid-platform-metadata/src/macos.rs
+++ b/talpid-platform-metadata/src/macos.rs
@@ -1,15 +1,18 @@
mod command;
+
use command::command_stdout_lossy;
+use std::io;
pub fn version() -> String {
- let version = run_sw_vers().unwrap_or(String::from("N/A"));
+ let version = MacosVersion::new()
+ .map(|version| version.version())
+ .unwrap_or(String::from("N/A"));
format!("macOS {}", version)
}
pub fn short_version() -> String {
- let version = run_sw_vers()
- .and_then(parse_short_version_output)
- .map(|(major, minor)| format!("{}.{}", major, minor))
+ let version = MacosVersion::new()
+ .map(|version| version.short_version())
.unwrap_or(String::from("N/A"));
format!("macOS {}", version)
}
@@ -18,14 +21,77 @@ pub fn extra_metadata() -> impl Iterator<Item = (String, String)> {
std::iter::empty()
}
+#[derive(Debug, PartialEq)]
+pub struct MacosVersion {
+ raw_version: String,
+ major: u32,
+ minor: u32,
+ patch: u32,
+}
+
+impl MacosVersion {
+ pub fn new() -> Result<MacosVersion, io::Error> {
+ Self::from_raw_version(&run_sw_vers()?)
+ }
+
+ fn from_raw_version(version_string: &str) -> Result<MacosVersion, io::Error> {
+ let (major, minor, patch) = parse_version_output(version_string).ok_or(io::Error::new(
+ io::ErrorKind::InvalidInput,
+ "Failed to parse raw version string",
+ ))?;
+ Ok(MacosVersion {
+ raw_version: version_string.to_owned(),
+ major,
+ minor,
+ patch,
+ })
+ }
+
+ /// Return the current version as a string (e.g. 14.2.1)
+ pub fn version(&self) -> String {
+ self.raw_version.clone()
+ }
+
+ /// Return the current version as a string (e.g. 14.2), not including the patch version
+ pub fn short_version(&self) -> String {
+ format!("{}.{}", self.major_version(), self.minor_version())
+ }
+
+ pub fn major_version(&self) -> u32 {
+ self.major
+ }
+
+ pub fn minor_version(&self) -> u32 {
+ self.minor
+ }
+
+ pub fn patch_version(&self) -> u32 {
+ self.patch
+ }
+}
+
/// Outputs a string in a format `$major.$minor.$patch`, e.g. `11.0.1`
-fn run_sw_vers() -> Option<String> {
+fn run_sw_vers() -> io::Result<String> {
command_stdout_lossy("sw_vers", &["-productVersion"])
}
-fn parse_short_version_output(output: String) -> Option<(u32, u32)> {
+fn parse_version_output(output: &str) -> Option<(u32, u32, u32)> {
let mut parts = output.split('.');
let major = parts.next()?.parse().ok()?;
let minor = parts.next()?.parse().ok()?;
- Some((major, minor))
+ let patch = parts
+ .next()
+ .and_then(|patch| patch.parse().ok())
+ .unwrap_or(0);
+ Some((major, minor, patch))
+}
+
+#[test]
+fn test_version_parsing() {
+ // % sw_vers --productVersion
+ // 14.2.1
+ let version = MacosVersion::from_raw_version("14.2.1").expect("failed to parse version");
+ assert_eq!(version.major_version(), 14);
+ assert_eq!(version.minor_version(), 2);
+ assert_eq!(version.patch_version(), 1);
}