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