]>
Commit | Line | Data |
---|---|---|
fb51dcf9 FE |
1 | use std::fmt::Display; |
2 | use std::io::{BufRead, BufReader}; | |
3 | ||
76d3a5ba FE |
4 | use anyhow::{bail, format_err, Error}; |
5 | ||
fb51dcf9 FE |
6 | /// The code names of Debian releases. Does not include `sid`. |
7 | #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] | |
8 | pub enum DebianCodename { | |
9 | Lenny = 5, | |
10 | Squeeze, | |
11 | Wheezy, | |
12 | Jessie, | |
13 | Stretch, | |
14 | Buster, | |
15 | Bullseye, | |
16 | Bookworm, | |
17 | Trixie, | |
18 | } | |
76d3a5ba | 19 | |
fb51dcf9 FE |
20 | impl DebianCodename { |
21 | pub fn next(&self) -> Option<Self> { | |
22 | match (*self as u8 + 1).try_into() { | |
23 | Ok(codename) => Some(codename), | |
24 | Err(_) => None, | |
25 | } | |
26 | } | |
27 | } | |
28 | ||
29 | impl TryFrom<&str> for DebianCodename { | |
30 | type Error = Error; | |
31 | ||
32 | fn try_from(string: &str) -> Result<Self, Error> { | |
33 | match string { | |
34 | "lenny" => Ok(DebianCodename::Lenny), | |
35 | "squeeze" => Ok(DebianCodename::Squeeze), | |
36 | "wheezy" => Ok(DebianCodename::Wheezy), | |
37 | "jessie" => Ok(DebianCodename::Jessie), | |
38 | "stretch" => Ok(DebianCodename::Stretch), | |
39 | "buster" => Ok(DebianCodename::Buster), | |
40 | "bullseye" => Ok(DebianCodename::Bullseye), | |
41 | "bookworm" => Ok(DebianCodename::Bookworm), | |
42 | "trixie" => Ok(DebianCodename::Trixie), | |
43 | _ => bail!("unknown Debian code name '{}'", string), | |
44 | } | |
45 | } | |
46 | } | |
47 | ||
48 | impl TryFrom<u8> for DebianCodename { | |
49 | type Error = Error; | |
50 | ||
51 | fn try_from(number: u8) -> Result<Self, Error> { | |
52 | match number { | |
53 | 5 => Ok(DebianCodename::Lenny), | |
54 | 6 => Ok(DebianCodename::Squeeze), | |
55 | 7 => Ok(DebianCodename::Wheezy), | |
56 | 8 => Ok(DebianCodename::Jessie), | |
57 | 9 => Ok(DebianCodename::Stretch), | |
58 | 10 => Ok(DebianCodename::Buster), | |
59 | 11 => Ok(DebianCodename::Bullseye), | |
60 | 12 => Ok(DebianCodename::Bookworm), | |
61 | 13 => Ok(DebianCodename::Trixie), | |
62 | _ => bail!("unknown Debian release number '{}'", number), | |
63 | } | |
64 | } | |
65 | } | |
66 | ||
67 | impl Display for DebianCodename { | |
68 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | |
69 | match self { | |
70 | DebianCodename::Lenny => write!(f, "lenny"), | |
71 | DebianCodename::Squeeze => write!(f, "squeeze"), | |
72 | DebianCodename::Wheezy => write!(f, "wheezy"), | |
73 | DebianCodename::Jessie => write!(f, "jessie"), | |
74 | DebianCodename::Stretch => write!(f, "stretch"), | |
75 | DebianCodename::Buster => write!(f, "buster"), | |
76 | DebianCodename::Bullseye => write!(f, "bullseye"), | |
77 | DebianCodename::Bookworm => write!(f, "bookworm"), | |
78 | DebianCodename::Trixie => write!(f, "trixie"), | |
79 | } | |
80 | } | |
81 | } | |
76d3a5ba FE |
82 | |
83 | /// Read the `VERSION_CODENAME` from `/etc/os-release`. | |
fb51dcf9 | 84 | pub fn get_current_release_codename() -> Result<DebianCodename, Error> { |
76d3a5ba FE |
85 | let raw = std::fs::read("/etc/os-release") |
86 | .map_err(|err| format_err!("unable to read '/etc/os-release' - {}", err))?; | |
87 | ||
88 | let reader = BufReader::new(&*raw); | |
89 | ||
90 | for line in reader.lines() { | |
91 | let line = line.map_err(|err| format_err!("unable to read '/etc/os-release' - {}", err))?; | |
92 | ||
93 | if let Some(codename) = line.strip_prefix("VERSION_CODENAME=") { | |
94 | let codename = codename.trim_matches(&['"', '\''][..]); | |
fb51dcf9 | 95 | return codename.try_into(); |
76d3a5ba FE |
96 | } |
97 | } | |
98 | ||
99 | bail!("unable to parse codename from '/etc/os-release'"); | |
100 | } |