2 use std
::io
::{BufRead, BufReader}
;
4 use anyhow
::{bail, format_err, Error}
;
6 /// The code names of Debian releases. Does not include `sid`.
7 #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
8 pub enum DebianCodename
{
21 pub fn next(&self) -> Option
<Self> {
22 match (*self as u8 + 1).try_into() {
23 Ok(codename
) => Some(codename
),
29 impl TryFrom
<&str> for DebianCodename
{
32 fn try_from(string
: &str) -> Result
<Self, Error
> {
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
),
48 impl TryFrom
<u8> for DebianCodename
{
51 fn try_from(number
: u8) -> Result
<Self, Error
> {
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
),
67 impl Display
for DebianCodename
{
68 fn fmt(&self, f
: &mut std
::fmt
::Formatter
<'_
>) -> std
::fmt
::Result
{
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"),
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
))?
;
88 let reader
= BufReader
::new(&*raw
);
90 for line
in reader
.lines() {
91 let line
= line
.map_err(|err
| format_err
!("unable to read '/etc/os-release' - {}", err
))?
;
93 if let Some(codename
) = line
.strip_prefix("VERSION_CODENAME=") {
94 let codename
= codename
.trim_matches(&['
"', '\''][..]);
95 return codename.try_into();
99 bail!("unable to parse codename from '
/etc
/os
-release'
");