]> git.proxmox.com Git - proxmox-apt.git/blob - src/repositories/release.rs
da391e589b42c6066a68e8e5040f0782ec30685e
[proxmox-apt.git] / src / repositories / release.rs
1 use std::fmt::Display;
2 use std::io::{BufRead, BufReader};
3
4 use anyhow::{bail, format_err, Error};
5
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 }
19
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 }
82
83 /// Read the `VERSION_CODENAME` from `/etc/os-release`.
84 pub fn get_current_release_codename() -> Result<DebianCodename, Error> {
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(&['"', '\''][..]);
95 return codename.try_into();
96 }
97 }
98
99 bail!("unable to parse codename from '/etc/os-release'");
100 }