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