os_type/
lib.rs

1extern crate regex;
2
3use std::process::Command;
4mod lsb_release;
5mod os_release;
6mod rhel_release;
7mod sw_vers;
8mod utils;
9mod windows_ver;
10
11///A list of supported operating system types
12#[derive(Debug, PartialEq, Clone)]
13pub enum OSType {
14    Unknown,
15    Redhat,
16    OSX,
17    Ubuntu,
18    Debian,
19    Arch,
20    Manjaro,
21    CentOS,
22    OpenSUSE,
23    Alpine,
24    Deepin,
25    NixOS,
26    Kali,
27}
28
29/// Holds information about Operating System type and its version
30/// If the version could not be fetched it defaults to `0.0.0`
31#[derive(Debug, Clone, PartialEq)]
32pub struct OSInformation {
33    pub os_type: self::OSType,
34    pub version: String,
35}
36
37fn default_version() -> String {
38    "0.0.0".into()
39}
40
41fn unknown_os() -> OSInformation {
42    OSInformation {
43        os_type: OSType::Unknown,
44        version: default_version(),
45    }
46}
47
48fn is_os_x() -> bool {
49    match Command::new("sw_vers").output() {
50        Ok(output) => output.status.success(),
51        Err(_) => false,
52    }
53}
54
55fn get_sw_vers() -> OSInformation {
56    if let Some(osx_info) = sw_vers::retrieve() {
57        OSInformation {
58            os_type: OSType::OSX,
59            version: osx_info.product_version.unwrap_or(default_version()),
60        }
61    } else {
62        unknown_os()
63    }
64}
65
66fn lsb_release() -> OSInformation {
67    match lsb_release::retrieve() {
68        Some(release) => {
69            if release.distro == Some("Ubuntu".to_string()) {
70                OSInformation {
71                    os_type: OSType::Ubuntu,
72                    version: release.version.unwrap_or(default_version()),
73                }
74            } else if release.distro == Some("Debian".to_string()) {
75                OSInformation {
76                    os_type: OSType::Debian,
77                    version: release.version.unwrap_or(default_version()),
78                }
79            } else if release.distro == Some("Arch".to_string()) {
80                OSInformation {
81                    os_type: OSType::Arch,
82                    version: release.version.unwrap_or(default_version()),
83                }
84            } else if release.distro == Some("ManjaroLinux".to_string()) {
85                OSInformation {
86                    os_type: OSType::Manjaro,
87                    version: release.version.unwrap_or(default_version()),
88                }
89            } else if release.distro == Some("CentOS".to_string()) {
90                OSInformation {
91                    os_type: OSType::CentOS,
92                    version: release.version.unwrap_or(default_version()),
93                }
94            } else if release.distro == Some("openSUSE".to_string()) {
95                OSInformation {
96                    os_type: OSType::OpenSUSE,
97                    version: release.version.unwrap_or(default_version()),
98                }
99            } else if release.distro == Some("NixOS".to_string()) {
100                OSInformation {
101                    os_type: OSType::NixOS,
102                    version: release.version.unwrap_or(default_version()),
103                }
104            } else if release.distro == Some("Kali".to_string()) {
105                OSInformation {
106                    os_type: OSType::Kali,
107                    version: release.version.unwrap_or(default_version()),
108                }
109            } else {
110                unknown_os()
111            }
112        }
113        None => unknown_os(),
114    }
115}
116
117fn rhel_release() -> OSInformation {
118    match rhel_release::retrieve() {
119        Some(release) => {
120            if release.distro == Some("CentOS".to_string()) {
121                OSInformation {
122                    os_type: OSType::CentOS,
123                    version: release.version.unwrap_or(default_version()),
124                }
125            } else {
126                OSInformation {
127                    os_type: OSType::Redhat,
128                    version: release.version.unwrap_or(default_version()),
129                }
130            }
131        }
132        None => unknown_os(),
133    }
134}
135
136fn os_release() -> OSInformation {
137    match os_release::retrieve() {
138        Some(release) => match release.distro {
139            Some(distro) => {
140                if distro.starts_with("Ubuntu") {
141                    OSInformation {
142                        os_type: OSType::Ubuntu,
143                        version: release.version.unwrap_or(default_version()),
144                    }
145                } else if distro.starts_with("Debian") {
146                    OSInformation {
147                        os_type: OSType::Debian,
148                        version: release.version.unwrap_or(default_version()),
149                    }
150                } else if distro.starts_with("Arch") {
151                    OSInformation {
152                        os_type: OSType::Arch,
153                        version: release.version.unwrap_or(default_version()),
154                    }
155                } else if distro.starts_with("CentOS") {
156                    OSInformation {
157                        os_type: OSType::CentOS,
158                        version: release.version.unwrap_or(default_version()),
159                    }
160                } else if distro.starts_with("openSUSE") {
161                    OSInformation {
162                        os_type: OSType::OpenSUSE,
163                        version: release.version.unwrap_or(default_version()),
164                    }
165                } else if distro.starts_with("Alpine") {
166                    OSInformation {
167                        os_type: OSType::Alpine,
168                        version: release.version.unwrap_or(default_version()),
169                    }
170                } else if distro.starts_with("Deepin") {
171                    OSInformation {
172                        os_type: OSType::Deepin,
173                        version: release.version.unwrap_or(default_version()),
174                    }
175                } else if distro.starts_with("NixOS") {
176                    OSInformation {
177                        os_type: OSType::NixOS,
178                        version: release.version.unwrap_or(default_version()),
179                    }
180                } else if distro.starts_with("Kali") {
181                    OSInformation {
182                        os_type: OSType::Kali,
183                        version: release.version.unwrap_or(default_version()),
184                    }
185                } else {
186                    unknown_os()
187                }
188            }
189            None => unknown_os(),
190        },
191        None => unknown_os(),
192    }
193}
194
195///Returns the current operating system type
196///
197///#Example
198///
199///```
200///use os_type;
201///let os = os_type::current_platform();
202///println!("Type: {:?}", os.os_type);
203///println!("Version: {}", os.version);
204///```
205pub fn current_platform() -> OSInformation {
206    if is_os_x() {
207        get_sw_vers()
208    } else if lsb_release::is_available() {
209        lsb_release()
210    } else if utils::file_exists("/etc/os-release") {
211        os_release()
212    } else if utils::file_exists("/etc/redhat-release") || utils::file_exists("/etc/centos-release")
213    {
214        rhel_release()
215    } else {
216        unknown_os()
217    }
218}