Skip to content

Commit 0b9e795

Browse files
Merge pull request #141 from FrameworkComputer/readonly
Add --feature readonly, to build a bin without risky commands
2 parents 23a752b + acb91b9 commit 0b9e795

File tree

8 files changed

+107
-19
lines changed

8 files changed

+107
-19
lines changed

.github/workflows/ci.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,17 @@ jobs:
7777
run: rustup show
7878

7979
- name: Build UEFI application (no ESP)
80-
run: make -C framework_uefi build/x86_64-unknown-uefi/boot.efi
80+
run: |
81+
make -C framework_uefi build/x86_64-unknown-uefi/boot.efi
82+
mv framework_uefi/build/x86_64-unknown-uefi/boot.efi framework_tool_full.efi
83+
make -C framework_uefi FEATURES=readonly build/x86_64-unknown-uefi/boot.efi
84+
cp framework_uefi/build/x86_64-unknown-uefi/boot.efi framework_tool.efi
8185
8286
- name: Upload UEFI App
8387
uses: actions/upload-artifact@v4
8488
with:
85-
name: framework.efi
86-
path: framework_uefi/build/x86_64-unknown-uefi/boot.efi
89+
name: framework_efi.zip
90+
path: ./*.efi
8791

8892
- name: Install mtools to build ESP and ISO (Linux)
8993
run: sudo apt-get install -y mtools genisoimage

framework_lib/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ build = "build.rs"
1414

1515
[features]
1616
default = ["hidapi", "rusb"]
17+
readonly = [ ]
1718
rusb = ["dep:rusb"]
1819
hidapi = ["dep:hidapi"]
1920
uefi = [ "lazy_static/spin_no_std" ]

framework_lib/src/commandline/clap_std.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use clap_num::maybe_hex;
99
use crate::chromium_ec::commands::SetGpuSerialMagic;
1010
use crate::chromium_ec::CrosEcDriverType;
1111
use crate::commandline::{
12-
Cli, ConsoleArg, FpBrightnessArg, HardwareDeviceType, InputDeckModeArg, RebootEcArg,
12+
Cli, ConsoleArg, FpBrightnessArg, HardwareDeviceType, InputDeckModeArg, LogLevel, RebootEcArg,
1313
TabletModeArg,
1414
};
1515

@@ -381,7 +381,7 @@ pub fn parse(args: &[String]) -> Cli {
381381
};
382382

383383
Cli {
384-
verbosity: args.verbosity.log_level_filter(),
384+
verbosity: LogLevel(args.verbosity.log_level_filter()),
385385
versions: args.versions,
386386
version: args.version,
387387
features: args.features,

framework_lib/src/commandline/mod.rs

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,22 @@ impl From<InputDeckModeArg> for DeckStateMode {
134134
}
135135
}
136136

137+
#[derive(Debug)]
138+
pub struct LogLevel(log::LevelFilter);
139+
140+
impl Default for LogLevel {
141+
fn default() -> Self {
142+
LogLevel(log::LevelFilter::Error)
143+
}
144+
}
145+
137146
/// Shadows `clap_std::ClapCli` with extras for UEFI
138147
///
139148
/// The UEFI commandline currently doesn't use clap, so we need to shadow the struct.
140149
/// Also it has extra options.
141-
#[derive(Debug)]
150+
#[derive(Debug, Default)]
142151
pub struct Cli {
143-
pub verbosity: log::LevelFilter,
152+
pub verbosity: LogLevel,
144153
pub versions: bool,
145154
pub version: bool,
146155
pub features: bool,
@@ -212,9 +221,73 @@ pub struct Cli {
212221

213222
pub fn parse(args: &[String]) -> Cli {
214223
#[cfg(feature = "uefi")]
215-
return uefi::parse(args);
224+
let cli = uefi::parse(args);
216225
#[cfg(not(feature = "uefi"))]
217-
return clap_std::parse(args);
226+
let cli = clap_std::parse(args);
227+
228+
if cfg!(feature = "readonly") {
229+
// Initialize a new Cli with no arguments
230+
// Set all arguments that are readonly/safe
231+
// We explicitly only cope the safe ones so that if we add new arguments in the future,
232+
// which might be unsafe, we can't forget to exclude them from the safe set.
233+
// TODO: Instead of silently ignoring blocked command, we should remind the user
234+
Cli {
235+
verbosity: cli.verbosity,
236+
versions: cli.versions,
237+
version: cli.version,
238+
esrt: cli.esrt,
239+
device: cli.device,
240+
power: cli.power,
241+
thermal: cli.thermal,
242+
sensors: cli.sensors,
243+
// fansetduty
244+
// fansetrpm
245+
// autofanctrl
246+
privacy: cli.privacy,
247+
pd_info: cli.version,
248+
dp_hdmi_info: cli.dp_hdmi_info,
249+
// dp_hdmi_update
250+
audio_card_info: cli.audio_card_info,
251+
pd_bin: cli.pd_bin,
252+
ec_bin: cli.ec_bin,
253+
capsule: cli.capsule,
254+
dump: cli.dump,
255+
h2o_capsule: cli.h2o_capsule,
256+
// dump_ec_flash
257+
// flash_ec
258+
// flash_ro_ec
259+
driver: cli.driver,
260+
test: cli.test,
261+
intrusion: cli.intrusion,
262+
inputdeck: cli.inputdeck,
263+
inputdeck_mode: cli.inputdeck_mode,
264+
expansion_bay: cli.expansion_bay,
265+
// charge_limit
266+
// charge_current_limit
267+
get_gpio: cli.get_gpio,
268+
fp_led_level: cli.fp_led_level,
269+
fp_brightness: cli.fp_brightness,
270+
kblight: cli.kblight,
271+
rgbkbd: cli.rgbkbd,
272+
// tablet_mode
273+
// touchscreen_enable
274+
stylus_battery: cli.stylus_battery,
275+
console: cli.console,
276+
reboot_ec: cli.reboot_ec,
277+
// ec_hib_delay
278+
hash: cli.hash,
279+
pd_addrs: cli.pd_addrs,
280+
pd_ports: cli.pd_ports,
281+
help: cli.help,
282+
info: cli.info,
283+
// allupdate
284+
paginate: cli.paginate,
285+
// raw_command
286+
..Default::default()
287+
}
288+
} else {
289+
cli
290+
}
218291
}
219292

220293
fn print_single_pd_details(pd: &PdController) {
@@ -815,7 +888,7 @@ fn compare_version(device: Option<HardwareDeviceType>, version: String, ec: &Cro
815888
pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
816889
#[cfg(feature = "uefi")]
817890
{
818-
log::set_max_level(args.verbosity);
891+
log::set_max_level(args.verbosity.0);
819892
}
820893
#[cfg(not(feature = "uefi"))]
821894
{
@@ -824,7 +897,7 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
824897
// .filter("FRAMEWORK_COMPUTER_LOG")
825898
// .write_style("FRAMEWORK_COMPUTER_LOG_STYLE");
826899

827-
let level = args.verbosity.as_str();
900+
let level = args.verbosity.0.as_str();
828901
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(level))
829902
.format_target(false)
830903
.format_timestamp(None)

framework_lib/src/commandline/uefi.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use uefi::Handle;
1010

1111
use crate::chromium_ec::commands::SetGpuSerialMagic;
1212
use crate::chromium_ec::{CrosEcDriverType, HardwareDeviceType};
13-
use crate::commandline::Cli;
13+
use crate::commandline::{Cli, LogLevel};
1414

1515
use super::{ConsoleArg, FpBrightnessArg, InputDeckModeArg, RebootEcArg, TabletModeArg};
1616

@@ -26,7 +26,7 @@ pub fn get_args(bs: &BootServices, image_handle: Handle) -> Vec<String> {
2626

2727
pub fn parse(args: &[String]) -> Cli {
2828
let mut cli = Cli {
29-
verbosity: log::LevelFilter::Error,
29+
verbosity: LogLevel(log::LevelFilter::Error),
3030
paginate: false,
3131
versions: false,
3232
version: false,
@@ -103,15 +103,15 @@ pub fn parse(args: &[String]) -> Cli {
103103

104104
for (i, arg) in args.iter().enumerate() {
105105
if arg == "-q" {
106-
cli.verbosity = log::LevelFilter::Off;
106+
cli.verbosity = LogLevel(log::LevelFilter::Off);
107107
} else if arg == "-v" {
108-
cli.verbosity = log::LevelFilter::Warn;
108+
cli.verbosity = LogLevel(log::LevelFilter::Warn);
109109
} else if arg == "-vv" {
110-
cli.verbosity = log::LevelFilter::Info;
110+
cli.verbosity = LogLevel(log::LevelFilter::Info);
111111
} else if arg == "-vvv" {
112-
cli.verbosity = log::LevelFilter::Debug;
112+
cli.verbosity = LogLevel(log::LevelFilter::Debug);
113113
} else if arg == "-vvvv" {
114-
cli.verbosity = log::LevelFilter::Trace;
114+
cli.verbosity = LogLevel(log::LevelFilter::Trace);
115115
} else if arg == "--versions" {
116116
cli.versions = true;
117117
found_an_option = true;

framework_tool/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ edition = "2021"
1212
name = "framework_tool"
1313
path = "src/main.rs"
1414

15+
[features]
16+
default = [ ]
17+
readonly = [ "framework_lib/readonly" ]
18+
1519
[dependencies.framework_lib]
1620
path = "../framework_lib"
1721

framework_uefi/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ rust-version = "1.74"
1414
name = "uefitool"
1515
path = "src/main.rs"
1616

17+
[features]
18+
default = [ ]
19+
readonly = [ "framework_lib/readonly" ]
20+
1721
[dependencies]
1822
uefi = { version = "0.20", features = ["alloc"] }
1923
uefi-services = "0.17"

framework_uefi/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
TARGET?=x86_64-unknown-uefi
22
BUILD=build/$(TARGET)
3+
FEATURES?=''
34

45
SRC_DIR=.
56

@@ -18,7 +19,7 @@ all: $(BUILD)/boot.img
1819
iso: $(BUILD)/UEFI-Shell-fwk.iso
1920

2021
clean:
21-
rm -r $(BUILD)
22+
rm -rf $(BUILD)
2223

2324
qemu: $(BUILD)/boot.img
2425
$(QEMU) $(QEMU_FLAGS) $<
@@ -61,6 +62,7 @@ $(BUILD)/boot.efi: ../Cargo.lock $(SRC_DIR)/Cargo.toml $(SRC_DIR)/src/*
6162
mkdir -p $(BUILD)
6263
cargo rustc \
6364
--target $(TARGET) \
65+
--features $(FEATURES) \
6466
--release \
6567
-- \
6668
--emit link=framework_uefi/$@

0 commit comments

Comments
 (0)