Skip to content

Commit c836f58

Browse files
committed
simplified greenboot with implementation in rust
the pr currently implements only greenboot health-check, failing required script and missing required directory will render health-check as failure whcih in turn will trigger reboot until boot_counter reaches -1, motd is implemented with status as greedboot/redboot in figlet. greenboot can work without config file as default values are embedded in the script itself. Signed-off-by: Sayan Paul <paul.sayan@gmail.com>
1 parent 0ed08a6 commit c836f58

12 files changed

Lines changed: 442 additions & 215 deletions

File tree

.devcontainer/Dockerfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM fedora:latest
2+
3+
RUN bash -c "$(curl -fsSL "https://raw.githubusercontent.com/microsoft/vscode-dev-containers/main/script-library/common-redhat.sh")" -- "true" "vscode" "1000" "1000" "true"
4+
5+
RUN dnf install -y \
6+
sudo git cargo rust rust-src git-core clippy rustfmt \
7+
&& dnf clean all
8+
9+
USER vscode

.devcontainer/devcontainer.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"name": "greenboot-rs",
3+
"build": {
4+
"dockerfile": "Dockerfile"
5+
},
6+
"runArgs": [
7+
"--cap-add=SYS_PTRACE",
8+
"--security-opt",
9+
"seccomp=unconfined"
10+
],
11+
"settings": {
12+
"rust-analyzer.checkOnSave.command": "clippy"
13+
},
14+
"extensions": [
15+
"mutantdino.resourcemonitor",
16+
"matklad.rust-analyzer",
17+
"serayuzgur.crates"
18+
],
19+
"hostRequirements": {
20+
"memory": "4gb"
21+
},
22+
"remoteUser": "vscode",
23+
"updateContentCommand": [
24+
"cargo",
25+
"build"
26+
],
27+
"waitFor": "onCreateCommand"
28+
}

.github/workflows/ci.yml

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
on:
22
push:
33
branches:
4-
- main
4+
- greenboot-rs
55
pull_request:
66

77
name: Continuous integration
@@ -22,20 +22,18 @@ jobs:
2222
skip: "./docs/Gemfile.lock,./docs/_config.yml,./.github,./.git,./greenboot.spec,./dist"
2323

2424
fmt:
25-
name: Rustfmt
25+
name: Cargo fmt
2626
runs-on: ubuntu-latest
27+
container: fedora:latest
2728
steps:
29+
- name: Install deps
30+
run: |
31+
dnf install -y cargo rustfmt
2832
- uses: actions/checkout@v3
29-
- uses: actions-rs/toolchain@v1
30-
with:
31-
profile: minimal
32-
toolchain: stable
33-
override: true
34-
- run: rustup component add rustfmt
3533
- uses: actions-rs/cargo@v1
3634
with:
3735
command: fmt
38-
args: --all -- --check
36+
args: --check --all
3937

4038
clippy:
4139
name: Clippy
@@ -67,7 +65,7 @@ jobs:
6765
steps:
6866
- name: Install deps
6967
run: |
70-
dnf install -y make gcc git cargo rust git clevis
68+
dnf install -y make gcc git cargo rust git
7169
- uses: actions/checkout@v3
7270
with:
7371
persist-credentials: false
@@ -91,30 +89,8 @@ jobs:
9189
uses: actions-rs/cargo@v1
9290
with:
9391
command: test
94-
# This is primarily to ensure that changes to fdo_data.h are committed,
95-
# which is critical for determining whether any stability changes were made
96-
# during the PR review.
97-
- name: Ensure building did not change any code
98-
run: |
99-
git diff --exit-code
100-
101-
commitlint:
102-
runs-on: ubuntu-latest
103-
steps:
104-
- uses: actions/checkout@v3
105-
with:
106-
fetch-depth: 0
107-
- uses: actions/setup-node@v3
108-
with:
109-
node-version: 'latest'
110-
- name: Install commitlint dependencies
111-
run: npm install commitlint
112-
- uses: wagoid/commitlint-github-action@v5
113-
env:
114-
NODE_PATH: ${{ github.workspace }}/node_modules
115-
with:
116-
configFile: .github/commitlint.config.js
117-
failOnWarnings: true
92+
args: -- --test-threads=1
93+
11894

11995
# manpages:
12096
# name: Test man page generation
@@ -136,6 +112,6 @@ jobs:
136112
# - name: Install devcontainer CLI
137113
# run: npm install -g @vscode/dev-container-cli
138114
# - name: Build devcontainer
139-
# run: devcontainer build --image-name devcontainer-fdo-rs .
115+
# run: devcontainer build --image-name greenboot-rs .
140116
# - name: Test building in devcontainer
141-
# run: docker run --rm -v `pwd`:/code:z --workdir /code --user root devcontainer-fdo-rs cargo build --verbose
117+
# run: docker run --rm -v `pwd`:/code:z --workdir /code --user root greenboot-rs cargo build --verbose

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@ nix = "0.25.0"
1515
glob = "0.3.0"
1616
serde = "1.0"
1717
serde_json = "1.0"
18+
thiserror = "1.0.38"
19+
figlet-rs = "0.1.5"

dist/systemd/system/greenboot-trigger.service

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[Unit]
2-
Description=Greenboot - TODO
3-
After=multi-user.target
2+
Description=greenboot Health Checks Runner
43
Before=boot-complete.target
4+
OnFailureJobMode=fail
55

66
[Service]
77
Type=oneshot
88
RemainAfterExit=yes
9-
ExecStart=/usr/libexec/greenboot/greenboot check
10-
Restart=no
9+
ExecStart=/usr/libexec/greenboot/greenboot health-check
1110

1211
[Install]
1312
RequiredBy=boot-complete.target
13+
WantedBy=multi-user.target

etc/greenboot/greenboot.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Greenboot configuration file
2+
3+
## Generic
4+
GREENBOOT_MAX_BOOT_ATTEMPTS=3

greenboot.spec

Lines changed: 73 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -41,94 +41,108 @@ Requires: rpm-ostree
4141
Requires: pam >= 1.4.0
4242
# While not strictly necessary to generate the motd, the main use-case of this package is to display it on SSH login
4343
Recommends: openssh
44-
Provides: greenboot-auto-update-fallback
45-
Obsoletes: greenboot-auto-update-fallback <= 0.12.0
46-
Provides: greenboot-grub2
47-
Obsoletes: greenboot-grub2 <= 0.12.0
48-
Provides: greenboot-reboot
49-
Obsoletes: greenboot-reboot <= 0.12.0
50-
Provides: greenboot-status
51-
Obsoletes: greenboot-status <= 0.12.0
52-
Provides: greenboot-rpm-ostree-grub2
53-
Obsoletes: greenboot-rpm-ostree-grub2 <= 0.12.0
5444
# List of bundled crate in vendor tarball, generated with:
5545
# cargo metadata --locked --format-version 1 | CRATE_NAME="greenboot" ./bundled-provides.jq
5646
Provides: bundled(crate(ahash)) = 0.7.6
57-
Provides: bundled(crate(aho-corasick)) = 0.7.19
58-
Provides: bundled(crate(anyhow)) = 1.0.65
59-
Provides: bundled(crate(async-trait)) = 0.1.57
47+
Provides: bundled(crate(aho-corasick)) = 0.7.20
48+
Provides: bundled(crate(anstream)) = 0.2.6
49+
Provides: bundled(crate(anstyle)) = 0.3.5
50+
Provides: bundled(crate(anstyle-parse)) = 0.1.1
51+
Provides: bundled(crate(anstyle-wincon)) = 0.2.0
52+
Provides: bundled(crate(anyhow)) = 1.0.70
53+
Provides: bundled(crate(async-trait)) = 0.1.68
6054
Provides: bundled(crate(atty)) = 0.2.14
6155
Provides: bundled(crate(autocfg)) = 1.1.0
62-
Provides: bundled(crate(base64)) = 0.13.0
56+
Provides: bundled(crate(base64)) = 0.13.1
6357
Provides: bundled(crate(bitflags)) = 1.3.2
64-
Provides: bundled(crate(block-buffer)) = 0.10.3
58+
Provides: bundled(crate(block-buffer)) = 0.10.4
59+
Provides: bundled(crate(cc)) = 1.0.79
6560
Provides: bundled(crate(cfg-if)) = 1.0.0
66-
Provides: bundled(crate(clap)) = 4.0.4
67-
Provides: bundled(crate(clap_derive)) = 4.0.1
68-
Provides: bundled(crate(clap_lex)) = 0.3.0
69-
Provides: bundled(crate(config)) = 0.13.2
70-
Provides: bundled(crate(cpufeatures)) = 0.2.5
61+
Provides: bundled(crate(clap)) = 4.2.0
62+
Provides: bundled(crate(clap_builder)) = 4.2.0
63+
Provides: bundled(crate(clap_derive)) = 4.2.0
64+
Provides: bundled(crate(clap_lex)) = 0.4.1
65+
Provides: bundled(crate(concolor-override)) = 1.0.0
66+
Provides: bundled(crate(concolor-query)) = 0.3.3
67+
Provides: bundled(crate(config)) = 0.13.3
68+
Provides: bundled(crate(cpufeatures)) = 0.2.6
7169
Provides: bundled(crate(crypto-common)) = 0.1.6
72-
Provides: bundled(crate(digest)) = 0.10.5
70+
Provides: bundled(crate(digest)) = 0.10.6
7371
Provides: bundled(crate(dlv-list)) = 0.3.0
7472
Provides: bundled(crate(env_logger)) = 0.7.1
75-
Provides: bundled(crate(generic-array)) = 0.14.6
76-
Provides: bundled(crate(getrandom)) = 0.2.7
77-
Provides: bundled(crate(glob)) = 0.3.0
73+
Provides: bundled(crate(errno)) = 0.3.0
74+
Provides: bundled(crate(errno-dragonfly)) = 0.1.2
75+
Provides: bundled(crate(figlet-rs)) = 0.1.5
76+
Provides: bundled(crate(generic-array)) = 0.14.7
77+
Provides: bundled(crate(getrandom)) = 0.2.8
78+
Provides: bundled(crate(glob)) = 0.3.1
7879
Provides: bundled(crate(hashbrown)) = 0.12.3
79-
Provides: bundled(crate(heck)) = 0.4.0
80+
Provides: bundled(crate(heck)) = 0.4.1
8081
Provides: bundled(crate(hermit-abi)) = 0.1.19
82+
Provides: bundled(crate(hermit-abi)) = 0.3.1
8183
Provides: bundled(crate(humantime)) = 1.3.0
82-
Provides: bundled(crate(itoa)) = 1.0.3
84+
Provides: bundled(crate(io-lifetimes)) = 1.0.9
85+
Provides: bundled(crate(is-terminal)) = 0.4.6
86+
Provides: bundled(crate(itoa)) = 1.0.6
8387
Provides: bundled(crate(json5)) = 0.4.1
8488
Provides: bundled(crate(lazy_static)) = 1.4.0
85-
Provides: bundled(crate(libc)) = 0.2.133
89+
Provides: bundled(crate(libc)) = 0.2.140
8690
Provides: bundled(crate(linked-hash-map)) = 0.5.6
91+
Provides: bundled(crate(linux-raw-sys)) = 0.3.0
8792
Provides: bundled(crate(log)) = 0.4.17
8893
Provides: bundled(crate(memchr)) = 2.5.0
8994
Provides: bundled(crate(memoffset)) = 0.6.5
9095
Provides: bundled(crate(minimal-lexical)) = 0.2.1
91-
Provides: bundled(crate(nix)) = 0.25.0
92-
Provides: bundled(crate(nom)) = 7.1.1
93-
Provides: bundled(crate(once_cell)) = 1.15.0
96+
Provides: bundled(crate(nix)) = 0.25.1
97+
Provides: bundled(crate(nom)) = 7.1.3
98+
Provides: bundled(crate(once_cell)) = 1.17.1
9499
Provides: bundled(crate(ordered-multimap)) = 0.4.3
95-
Provides: bundled(crate(os_str_bytes)) = 6.3.0
96100
Provides: bundled(crate(pathdiff)) = 0.2.1
97-
Provides: bundled(crate(pest)) = 2.3.1
98-
Provides: bundled(crate(pest_derive)) = 2.3.1
99-
Provides: bundled(crate(pest_generator)) = 2.3.1
100-
Provides: bundled(crate(pest_meta)) = 2.3.1
101+
Provides: bundled(crate(pest)) = 2.5.6
102+
Provides: bundled(crate(pest_derive)) = 2.5.6
103+
Provides: bundled(crate(pest_generator)) = 2.5.6
104+
Provides: bundled(crate(pest_meta)) = 2.5.6
101105
Provides: bundled(crate(pin-utils)) = 0.1.0
102106
Provides: bundled(crate(pretty_env_logger)) = 0.4.0
103-
Provides: bundled(crate(proc-macro-error)) = 1.0.4
104-
Provides: bundled(crate(proc-macro-error-attr)) = 1.0.4
105-
Provides: bundled(crate(proc-macro2)) = 1.0.43
107+
Provides: bundled(crate(proc-macro2)) = 1.0.54
106108
Provides: bundled(crate(quick-error)) = 1.2.3
107-
Provides: bundled(crate(quote)) = 1.0.21
108-
Provides: bundled(crate(regex)) = 1.6.0
109-
Provides: bundled(crate(regex-syntax)) = 0.6.27
109+
Provides: bundled(crate(quote)) = 1.0.26
110+
Provides: bundled(crate(regex)) = 1.7.3
111+
Provides: bundled(crate(regex-syntax)) = 0.6.29
110112
Provides: bundled(crate(ron)) = 0.7.1
111113
Provides: bundled(crate(rust-ini)) = 0.18.0
112-
Provides: bundled(crate(ryu)) = 1.0.11
113-
Provides: bundled(crate(serde)) = 1.0.144
114-
Provides: bundled(crate(serde_derive)) = 1.0.144
115-
Provides: bundled(crate(serde_json)) = 1.0.85
116-
Provides: bundled(crate(sha1)) = 0.10.5
114+
Provides: bundled(crate(rustix)) = 0.37.4
115+
Provides: bundled(crate(ryu)) = 1.0.13
116+
Provides: bundled(crate(serde)) = 1.0.159
117+
Provides: bundled(crate(serde_derive)) = 1.0.159
118+
Provides: bundled(crate(serde_json)) = 1.0.95
119+
Provides: bundled(crate(sha2)) = 0.10.6
117120
Provides: bundled(crate(strsim)) = 0.10.0
118-
Provides: bundled(crate(syn)) = 1.0.100
119-
Provides: bundled(crate(termcolor)) = 1.1.3
120-
Provides: bundled(crate(thiserror)) = 1.0.35
121-
Provides: bundled(crate(thiserror-impl)) = 1.0.35
122-
Provides: bundled(crate(toml)) = 0.5.9
123-
Provides: bundled(crate(typenum)) = 1.15.0
121+
Provides: bundled(crate(syn)) = 1.0.109
122+
Provides: bundled(crate(syn)) = 2.0.11
123+
Provides: bundled(crate(termcolor)) = 1.2.0
124+
Provides: bundled(crate(thiserror)) = 1.0.40
125+
Provides: bundled(crate(thiserror-impl)) = 1.0.40
126+
Provides: bundled(crate(toml)) = 0.5.11
127+
Provides: bundled(crate(typenum)) = 1.16.0
124128
Provides: bundled(crate(ucd-trie)) = 0.1.5
125-
Provides: bundled(crate(unicode-ident)) = 1.0.4
129+
Provides: bundled(crate(unicode-ident)) = 1.0.8
130+
Provides: bundled(crate(utf8parse)) = 0.2.1
126131
Provides: bundled(crate(version_check)) = 0.9.4
127132
Provides: bundled(crate(wasi)) = 0.11.0+wasi_snapshot_preview1
128133
Provides: bundled(crate(winapi)) = 0.3.9
129134
Provides: bundled(crate(winapi-i686-pc-windows-gnu)) = 0.4.0
130135
Provides: bundled(crate(winapi-util)) = 0.1.5
131136
Provides: bundled(crate(winapi-x86_64-pc-windows-gnu)) = 0.4.0
137+
Provides: bundled(crate(windows-sys)) = 0.45.0
138+
Provides: bundled(crate(windows-targets)) = 0.42.2
139+
Provides: bundled(crate(windows_aarch64_gnullvm)) = 0.42.2
140+
Provides: bundled(crate(windows_aarch64_msvc)) = 0.42.2
141+
Provides: bundled(crate(windows_i686_gnu)) = 0.42.2
142+
Provides: bundled(crate(windows_i686_msvc)) = 0.42.2
143+
Provides: bundled(crate(windows_x86_64_gnu)) = 0.42.2
144+
Provides: bundled(crate(windows_x86_64_gnullvm)) = 0.42.2
145+
Provides: bundled(crate(windows_x86_64_msvc)) = 0.42.2
132146
Provides: bundled(crate(yaml-rust)) = 0.4.5
133147

134148
%description
@@ -147,7 +161,11 @@ cat >.cargo/config << EOF
147161
[build]
148162
rustc = "%{__rustc}"
149163
rustdoc = "%{__rustdoc}"
164+
%if 0%{?rhel} && !0%{?eln}
150165
rustflags = %{__global_rustflags_toml}
166+
%else
167+
rustflags = "%{__global_rustflags_toml}"
168+
%endif
151169
152170
[install]
153171
root = "%{buildroot}%{_prefix}"
@@ -182,6 +200,7 @@ install -Dpm0644 -t %{buildroot}%{_unitdir} \
182200
# add config
183201
mkdir -p %{buildroot}%{_exec_prefix}/lib/motd.d/
184202
mkdir -p %{buildroot}%{_libexecdir}/%{name}
203+
install -Dpm0644 -t %{buildroot}%{_sysconfdir}/%{name} etc/greenboot/greenboot.conf
185204
mkdir -p %{buildroot}%{_sysconfdir}/%{name}/check/required.d
186205
mkdir %{buildroot}%{_sysconfdir}/%{name}/check/wanted.d
187206
mkdir %{buildroot}%{_sysconfdir}/%{name}/green.d
@@ -196,23 +215,20 @@ mkdir -p %{buildroot}%{_tmpfilesdir}
196215

197216
%post
198217
%systemd_post greenboot.service
199-
%systemd_post greenboot-trigger.service
200218

201219
%preun
202220
%systemd_preun greenboot.service
203-
%systemd_preun greenboot-trigger.service
204221

205222
%postun
206223
%systemd_postun greenboot.service
207-
%systemd_postun greenboot-trigger.service
208224

209225
%files
210226
%doc README.md
211227
%license LICENSE
212228
%dir %{_libexecdir}/%{name}
213229
%{_libexecdir}/%{name}/%{name}
214230
%{_unitdir}/greenboot.service
215-
%{_unitdir}/greenboot-trigger.service
231+
%{_sysconfdir}/%{name}/greenboot.conf
216232
%dir %{_prefix}/lib/%{name}
217233
%dir %{_prefix}/lib/%{name}/check
218234
%dir %{_prefix}/lib/%{name}/check/required.d

0 commit comments

Comments
 (0)