Skip to main content

crosup_types/
apt.rs

1use indexmap::IndexMap;
2use os_release::OsRelease;
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Debug, Clone, Default)]
6pub struct AptConfiguration {
7    #[serde(serialize_with = "hcl::ser::labeled_block")]
8    pub pkg: IndexMap<String, Package>,
9}
10
11#[derive(Serialize, Deserialize, Debug, Clone, Default)]
12pub struct Package {
13    #[serde(skip_serializing, skip_deserializing)]
14    pub name: String,
15
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub url: Option<String>,
18
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub gpg_key: Option<String>,
21
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub gpg_path: Option<String>,
24
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub setup_repository: Option<String>,
27
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub apt_update: Option<bool>,
30
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub packages: Option<Vec<String>>,
33
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub depends_on: Option<Vec<String>>,
36
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub postinstall: Option<String>,
39
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub version_check: Option<String>,
42}
43
44pub fn default_apt_install() -> IndexMap<String, AptConfiguration> {
45    let mut pkg = IndexMap::new();
46
47    // detect linux
48    if cfg!(target_os = "linux") {
49        // determine linux distribution using os-release
50        if let Ok(os_release) = OsRelease::new() {
51            let os = os_release.id.to_lowercase();
52            let os = os.as_str();
53
54            if os == "debian" {
55                pkg.insert(
56                    "docker".into(),
57                    Package {
58                        name: "docker".into(),
59                        gpg_key: Some("https://download.docker.com/linux/debian/gpg".into()),
60                        gpg_path: Some("/etc/apt/keyrings/docker.gpg".into()),
61                        setup_repository: Some(
62                          r#"echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null"#.into()),
63                        apt_update: Some(true),
64                        packages: Some(vec![
65                          "docker-ce".into(),
66                          "docker-ce-cli".into(),
67                          "containerd.io".into(),
68                          "docker-buildx-plugin".into(),
69                          "docker-compose-plugin".into()
70                          ]),
71                        depends_on: Some(vec!["ca-certificates".into(),"curl".into(), "gnupg".into()]),
72                        postinstall: Some("sudo usermod -aG docker $USER && newgrp docker".into()),
73                        ..Default::default()
74                    },
75                );
76            }
77
78            if os == "debian" || os == "ubuntu" {
79                pkg.insert(
80                    "vscode".into(),
81                    Package {
82                        name: "code".into(),
83                        url: Some(
84                            "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64".into(),
85                        ),
86                        version_check: Some("code".into()),
87                        ..Default::default()
88                    },
89                );
90            }
91        }
92    }
93
94    let mut apt = IndexMap::new();
95    apt.insert("install".into(), AptConfiguration { pkg });
96    apt
97}