Skip to content

Commit aecd60a

Browse files
committed
feat: add dockerfile and build scripts
Signed-off-by: James Petersen <jpetersenames@gmail.com>
1 parent cd0f987 commit aecd60a

10 files changed

Lines changed: 229 additions & 8 deletions

File tree

Dockerfile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
FROM ghcr.io/edera-dev/cross-base-linux-musl:latest@sha256:87ba899ea380bd85c22f194ab2f4f2cf791fc832d27ee20bb00d07ce23771975 AS build
2+
3+
ENV TARGET_LIBC=musl TARGET_VENDOR=unknown DISABLE_CROSS_RS=1
4+
5+
WORKDIR /usr/src/app
6+
COPY . .
7+
RUN ./hack/build/cargo.sh build --release --bin preflight
8+
RUN mv ./target/$(./hack/build/target.sh)/release/preflight /usr/sbin
9+
10+
FROM cgr.dev/chainguard/wolfi-base:latest
11+
ENTRYPOINT ["/usr/sbin/preflight"]
12+
COPY --from=build /usr/sbin/preflight /usr/sbin/preflight
13+
COPY --from=build /usr/src/app/scripts /scripts

hack/build/arch.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/sh
2+
set -e
3+
4+
TOOLS_DIR="$(dirname "${0}")"
5+
6+
RUST_TARGET="$("${TOOLS_DIR}/target.sh")"
7+
TARGET_ARCH="$(echo "${RUST_TARGET}" | awk -F '-' '{print $1}')"
8+
9+
if [ "${PROTECT_ARCH_ALT_NAME}" = "1" ] || [ "${PROTECT_ARCH_KERNEL_NAME}" = "1" ]; then
10+
if [ "${TARGET_ARCH}" = "x86_64" ] && [ "${PROTECT_ARCH_KERNEL_NAME}" != "1" ]; then
11+
TARGET_ARCH="amd64"
12+
fi
13+
14+
if [ "${TARGET_ARCH}" = "aarch64" ]; then
15+
TARGET_ARCH="arm64"
16+
fi
17+
fi
18+
19+
echo "${TARGET_ARCH}"

hack/build/cargo.sh

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/bin/sh
2+
set -e
3+
4+
TOOLS_DIR="$(dirname "${0}")"
5+
RUST_TARGET="$("${TOOLS_DIR}/target.sh")"
6+
7+
# `cross` doesn't pass thru the `fmt` command,
8+
# but `fmt` doesn't require a build anyway.
9+
IS_FMT_COMMAND="0"
10+
if [ "${1}" = "fmt" ]; then
11+
IS_FMT_COMMAND="1"
12+
fi
13+
14+
if [ -z "${CARGO}" ]; then
15+
if [ "${DISABLE_CROSS_RS}" = "1" ] || [ "${IS_FMT_COMMAND}" = "1" ]; then
16+
CARGO="cargo"
17+
else
18+
if ! command -v cross >/dev/null; then
19+
echo "ERROR: 'cross' binary not installed, consider running 'hack/build/install-cross-rs.sh', otherwise local builds may fail due to missing dependencies"
20+
exit 1
21+
fi
22+
CARGO="cross"
23+
fi
24+
fi
25+
26+
git submodule init && git submodule update
27+
28+
if [ "${CARGO_BUILD_STATIC_CRT}" = "1" ]; then
29+
export RUSTFLAGS="-Ctarget-feature=+crt-static"
30+
fi
31+
32+
echo "[${CARGO}] version: $(${CARGO} --version)" >/dev/stderr
33+
export CARGO_BUILD_TARGET="${RUST_TARGET}"
34+
echo "[${CARGO}] [${CARGO_BUILD_TARGET}] ${*}" >/dev/stderr
35+
exec "${CARGO}" "${@}"

hack/build/cross-compile.sh

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/bin/sh
2+
set -e
3+
4+
TOOLS_DIR="$(dirname "${0}")"
5+
6+
RUST_TARGET="$("${TOOLS_DIR}/target.sh")"
7+
TARGET_ARCH="$(echo "${RUST_TARGET}" | awk -F '-' '{print $1}')"
8+
9+
HOST_ARCH="$(uname -m)"
10+
11+
if [ "${HOST_ARCH}" = "arm64" ]; then
12+
HOST_ARCH="aarch64"
13+
fi
14+
15+
HOST_OS="$(uname -s)"
16+
HOST_OS="$(echo "${HOST_OS}" | awk -F '_' '{print $1}')"
17+
HOST_OS="$(echo "${HOST_OS}" | tr '[:upper:]' '[:lower:]')"
18+
19+
if [ "${HOST_OS}" = "mingw64" ]; then
20+
HOST_OS="windows"
21+
fi
22+
23+
if [ -z "${TARGET_OS}" ]; then
24+
TARGET_OS="${HOST_OS}"
25+
fi
26+
27+
# Darwin can cross compile on all architectures to all other supported
28+
# architectures without cross compilation consideration. For cross-compile
29+
# check, make sure HOST_ARCH is TARGET_ARCH for comparison.
30+
if [ "${TARGET_OS}" = "darwin" ]; then
31+
HOST_ARCH="${TARGET_ARCH}"
32+
fi
33+
34+
if [ "${HOST_ARCH}" != "${TARGET_ARCH}" ] || [ "${HOST_OS}" != "${TARGET_OS}" ]; then
35+
echo "1"
36+
else
37+
echo "0"
38+
fi

hack/build/install-cross-rs.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# NOTE that Github CI currently looks for this rev in this script as well
5+
CROSS_RS_REV="e281947ca900da425e4ecea7483cfde646c8a1ea"
6+
7+
cargo install cross --git "https://github.com/cross-rs/cross.git" --rev "${CROSS_RS_REV}" "${@}"

hack/build/target.sh

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#!/bin/sh
2+
set -e
3+
4+
if [ -z "${RUST_TARGET}" ] && [ -z "${TARGET_ARCH}" ] && [ -n "${TARGET_DEFAULT_ARCH}" ]; then
5+
TARGET_ARCH="${TARGET_DEFAULT_ARCH}"
6+
fi
7+
8+
if [ -z "${RUST_TARGET}" ] && [ -z "${TARGET_OS}" ] && [ -n "${TARGET_DEFAULT_OS}" ]; then
9+
TARGET_OS="${TARGET_DEFAULT_OS}"
10+
fi
11+
12+
if [ -z "${TARGET_LIBC}" ] && [ -e "/etc/alpine-release" ] && [ "${PROTECT_TARGET_IGNORE_LIBC}" != "1" ]; then
13+
TARGET_LIBC="musl"
14+
TARGET_VENDOR="alpine"
15+
fi
16+
17+
if [ -z "${TARGET_VENDOR}" ]; then
18+
TARGET_VENDOR="unknown"
19+
fi
20+
21+
if [ -z "${TARGET_LIBC}" ] || [ "${PROTECT_TARGET_IGNORE_LIBC}" = "1" ]; then
22+
TARGET_LIBC="gnu"
23+
fi
24+
25+
if [ -z "${TARGET_HOST}" ]; then
26+
TARGET_HOST="0"
27+
fi
28+
29+
if [ "${TARGET_HOST}" = "1" ] || [ -z "${TARGET_ARCH}" ]; then
30+
TARGET_ARCH="$(uname -m)"
31+
fi
32+
33+
if [ "${TARGET_ARCH}" = "arm64" ]; then
34+
TARGET_ARCH="aarch64"
35+
fi
36+
37+
if [ "${TARGET_HOST}" = "1" ] || [ -z "${TARGET_OS}" ]; then
38+
TARGET_OS="$(uname -s)"
39+
TARGET_OS="$(echo "${TARGET_OS}" | awk -F '_' '{print $1}')"
40+
TARGET_OS="$(echo "${TARGET_OS}" | tr '[:upper:]' '[:lower:]')"
41+
42+
if [ "${TARGET_OS}" = "mingw64" ]; then
43+
TARGET_OS="windows"
44+
fi
45+
fi
46+
47+
if [ "${TARGET_OS}" = "darwin" ]; then
48+
if [ -z "${RUST_TARGET}" ]; then
49+
[ "${TARGET_ARCH}" = "x86_64" ] && RUST_TARGET="x86_64-apple-darwin"
50+
[ "${TARGET_ARCH}" = "aarch64" ] && RUST_TARGET="aarch64-apple-darwin"
51+
fi
52+
elif [ "${TARGET_OS}" = "windows" ]; then
53+
if [ -z "${RUST_TARGET}" ]; then
54+
[ "${TARGET_ARCH}" = "x86_64" ] && RUST_TARGET="x86_64-pc-windows-msvc"
55+
[ "${TARGET_ARCH}" = "aarch64" ] && RUST_TARGET="aarch64-pc-windows-msvc"
56+
fi
57+
elif [ "${TARGET_OS}" = "freebsd" ]; then
58+
if [ -z "${RUST_TARGET}" ]; then
59+
[ "${TARGET_ARCH}" = "x86_64" ] && RUST_TARGET="x86_64-${TARGET_VENDOR}-freebsd"
60+
fi
61+
elif [ "${TARGET_OS}" = "netbsd" ]; then
62+
if [ -z "${RUST_TARGET}" ]; then
63+
[ "${TARGET_ARCH}" = "x86_64" ] && RUST_TARGET="x86_64-${TARGET_VENDOR}-netbsd"
64+
fi
65+
else
66+
if [ -z "${RUST_TARGET}" ]; then
67+
[ "${TARGET_ARCH}" = "x86_64" ] && RUST_TARGET="x86_64-${TARGET_VENDOR}-linux-${TARGET_LIBC}"
68+
[ "${TARGET_ARCH}" = "aarch64" ] && RUST_TARGET="aarch64-${TARGET_VENDOR}-linux-${TARGET_LIBC}"
69+
[ "${TARGET_ARCH}" = "riscv64gc" ] && RUST_TARGET="riscv64gc-${TARGET_VENDOR}-linux-${TARGET_LIBC}"
70+
fi
71+
fi
72+
73+
if [ -z "${C_TARGET}" ]; then
74+
[ "${TARGET_ARCH}" = "x86_64" ] && C_TARGET="x86_64-linux-${TARGET_LIBC}"
75+
[ "${TARGET_ARCH}" = "aarch64" ] && C_TARGET="aarch64-linux-${TARGET_LIBC}"
76+
fi
77+
78+
if [ "${PROTECT_TARGET_C_MODE}" = "1" ]; then
79+
if [ -z "${C_TARGET}" ]; then
80+
echo "ERROR: Unable to determine C_TARGET, your os or architecture may not be supported by Edera Protect." >/dev/stderr
81+
exit 1
82+
fi
83+
84+
echo "${C_TARGET}"
85+
else
86+
if [ -z "${RUST_TARGET}" ]; then
87+
echo "ERROR: Unable to determine RUST_TARGET, your os or architecture may not be supported by Edera Protect." >/dev/stderr
88+
exit 1
89+
fi
90+
91+
echo "${RUST_TARGET}"
92+
fi

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ impl CheckGroupResult {
7777

7878
pub trait CheckGroup {
7979
fn name(&self) -> &str;
80+
fn id(&self) -> &str;
8081
fn description(&self) -> &str;
8182
fn run(&self) -> CheckGroupResult;
8283
}

src/main.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,18 @@ use std::env;
1111

1212
fn main() -> Result<()> {
1313
env_logger::init();
14-
let checks: Vec<Box<dyn CheckGroup>> = vec![Box::new(SystemChecks), Box::new(ScriptChecks)];
14+
15+
let groups: Vec<Box<dyn CheckGroup>> = vec![Box::new(SystemChecks), Box::new(ScriptChecks)];
1516

1617
let mut final_result = Passed;
1718

1819
// Run each check group
19-
for check in checks {
20-
info!("Running Group [{}] - {}", check.name(), check.description());
21-
let check_group_result = check.run();
20+
for group in groups {
21+
// if group.id() == "ScriptedChecks" {
22+
// continue;
23+
// }
24+
info!("Running Group [{}] - {}", group.name(), group.description());
25+
let check_group_result = group.run();
2226
check_group_result.log_group();
2327
if env::var("EDERA_PREFLIGHT_VERBOSE").unwrap_or_default() == "true" {
2428
check_group_result.log_individual_checks();

src/script/mod.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ use std::fs;
1010
use std::path::PathBuf;
1111
use std::process::Command;
1212

13-
pub struct ScriptChecks;
14-
13+
const GROUP_IDENTIFIER: &str = "ScriptedChecks";
1514
const NAME: &str = "Scripted Checks";
1615

16+
pub struct ScriptChecks;
17+
1718
impl ScriptChecks {
1819
pub fn run_all(&self) -> CheckGroupResult {
1920
let mut results = Vec::new();
@@ -126,6 +127,10 @@ impl ScriptChecks {
126127
}
127128

128129
impl CheckGroup for ScriptChecks {
130+
fn id(&self) -> &str {
131+
GROUP_IDENTIFIER
132+
}
133+
129134
fn name(&self) -> &str {
130135
NAME
131136
}

src/system/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ use super::{
33
CheckResultValue::{Errored, Failed, Passed},
44
};
55

6+
use log::debug;
67
use sysinfo::System;
78

8-
pub struct SystemChecks;
9-
9+
const GROUP_IDENTIFIER: &str = "SystemChecks";
1010
const NAME: &str = "System Checks";
1111
const MINIMUM_MEMORY: u64 = 10000;
1212

13+
pub struct SystemChecks;
14+
1315
impl SystemChecks {
1416
pub fn run_all(&self) -> CheckGroupResult {
1517
let results = vec![self.enough_memory(), self.erroring(), self.failing()];
@@ -39,6 +41,7 @@ impl SystemChecks {
3941
sys.refresh_all();
4042

4143
let total_mem = sys.total_memory();
44+
debug!("total memory = {total_mem}");
4245

4346
let mut result = Passed;
4447
if total_mem < MINIMUM_MEMORY {
@@ -60,6 +63,10 @@ impl SystemChecks {
6063
}
6164

6265
impl CheckGroup for SystemChecks {
66+
fn id(&self) -> &str {
67+
GROUP_IDENTIFIER
68+
}
69+
6370
fn name(&self) -> &str {
6471
NAME
6572
}

0 commit comments

Comments
 (0)