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#[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#[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
195pub 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}