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 if cfg!(target_os = "linux") {
49 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}