1#![allow(clippy::large_enum_variant)]
17
18use clap::Parser;
19use reqwest::Url;
20
21mod console;
22#[cfg(feature = "docgen")]
23mod doc;
24mod install;
25mod serializer;
26mod types;
27
28pub use self::console::*;
29#[cfg(feature = "docgen")]
30pub use self::doc::*;
31pub use self::install::InstallConfig;
32pub use self::types::*;
33
34#[derive(Debug, Parser)]
39#[command(version)]
40#[command(args_conflicts_with_subcommands = true)]
41#[command(disable_help_subcommand = true)]
42#[command(help_expected = true)]
43pub enum Cmd {
44 Install(InstallConfig),
46 Download(DownloadConfig),
48 ListStream(ListStreamConfig),
50 #[command(subcommand)]
52 Iso(IsoCmd),
53 #[command(subcommand)]
55 Pxe(PxeCmd),
56 #[command(subcommand)]
58 Pack(PackCmd),
59 #[command(subcommand)]
61 Dev(DevCmd),
62}
63
64#[derive(Debug, Parser)]
65pub enum IsoCmd {
66 #[command(hide = true)]
69 Embed(IsoEmbedConfig),
70 #[command(hide = true)]
73 Show(IsoShowConfig),
74 #[command(hide = true)]
77 Remove(IsoRemoveConfig),
78 Customize(IsoCustomizeConfig),
80 #[command(subcommand)]
82 Ignition(IsoIgnitionCmd),
83 #[command(subcommand)]
85 Network(IsoNetworkCmd),
86 #[command(subcommand)]
88 Kargs(IsoKargsCmd),
89 #[command(subcommand)]
91 Extract(IsoExtractCmd),
92 Reset(IsoResetConfig),
94}
95
96#[derive(Debug, Parser)]
97pub enum IsoIgnitionCmd {
98 Embed(IsoIgnitionEmbedConfig),
100 Show(IsoIgnitionShowConfig),
102 Remove(IsoIgnitionRemoveConfig),
104}
105
106#[derive(Debug, Parser)]
107pub enum IsoNetworkCmd {
108 Embed(IsoNetworkEmbedConfig),
110 Extract(IsoNetworkExtractConfig),
112 Remove(IsoNetworkRemoveConfig),
114}
115
116#[derive(Debug, Parser)]
117pub enum IsoKargsCmd {
118 Modify(IsoKargsModifyConfig),
120 Reset(IsoKargsResetConfig),
122 Show(IsoKargsShowConfig),
124}
125
126#[derive(Debug, Parser)]
127pub enum IsoExtractCmd {
128 Pxe(IsoExtractPxeConfig),
130 MinimalIso(IsoExtractMinimalIsoConfig),
132}
133
134#[derive(Debug, Parser)]
135pub enum PxeCmd {
136 Customize(PxeCustomizeConfig),
138 #[command(subcommand)]
140 Ignition(PxeIgnitionCmd),
141 #[command(subcommand)]
143 Network(PxeNetworkCmd),
144}
145
146#[derive(Debug, Parser)]
147pub enum PxeIgnitionCmd {
148 Wrap(PxeIgnitionWrapConfig),
150 Unwrap(PxeIgnitionUnwrapConfig),
152}
153
154#[derive(Debug, Parser)]
155pub enum PxeNetworkCmd {
156 Wrap(PxeNetworkWrapConfig),
158 Unwrap(PxeNetworkUnwrapConfig),
160}
161
162#[derive(Debug, Parser)]
163#[command(hide = true)]
165pub enum PackCmd {
166 Osmet(PackOsmetConfig),
168 MinimalIso(PackMinimalIsoConfig),
170 #[cfg(feature = "docgen")]
172 Man(PackManConfig),
173 #[cfg(feature = "docgen")]
175 ExampleConfig(PackExampleConfigConfig),
176}
177
178#[derive(Debug, Parser)]
179#[command(hide = true)]
181pub enum DevCmd {
182 #[command(subcommand)]
184 Show(DevShowCmd),
185 #[command(subcommand)]
187 Extract(DevExtractCmd),
188}
189
190#[derive(Debug, Parser)]
191pub enum DevShowCmd {
192 Iso(DevShowIsoConfig),
194 Initrd(DevShowInitrdConfig),
196 Fiemap(DevShowFiemapConfig),
198}
199
200#[derive(Debug, Parser)]
201pub enum DevExtractCmd {
202 Osmet(DevExtractOsmetConfig),
204 Initrd(DevExtractInitrdConfig),
206}
207
208#[derive(Debug, Parser)]
209pub struct DownloadConfig {
210 #[arg(short, long, value_name = "name", default_value = "stable")]
212 pub stream: String,
213 #[arg(short, long, value_name = "name", default_value_t)]
215 pub architecture: DefaultedString<Architecture>,
216 #[arg(short, long, value_name = "name", default_value = "metal")]
218 pub platform: String,
219 #[arg(short, long, value_name = "name", default_value = "raw.xz")]
221 pub format: String,
222 #[arg(short = 'u', long, value_name = "URL")]
224 pub image_url: Option<Url>,
225 #[arg(short = 'C', long, value_name = "path", default_value = ".")]
227 pub directory: String,
228 #[arg(short, long)]
230 pub decompress: bool,
231 #[arg(long)]
233 pub insecure: bool,
234 #[arg(long, value_name = "URL")]
236 pub stream_base_url: Option<Url>,
237 #[arg(long, value_name = "N", default_value_t)]
239 pub fetch_retries: FetchRetries,
240}
241
242#[derive(Debug, Parser)]
243pub struct ListStreamConfig {
244 #[arg(short, long, value_name = "name", default_value = "stable")]
246 pub stream: String,
247 #[arg(long, value_name = "URL")]
249 pub stream_base_url: Option<Url>,
250}
251
252#[derive(Debug, Parser)]
253pub struct CommonCustomizeConfig {
254 #[arg(long, value_name = "path")]
259 pub dest_ignition: Vec<String>,
260 #[arg(long, value_name = "path")]
266 pub dest_device: Option<String>,
267 #[arg(long, value_name = "spec")]
273 pub dest_console: Vec<Console>,
274 #[arg(long, value_name = "arg")]
279 pub dest_karg_append: Vec<String>,
280 #[arg(long, value_name = "arg")]
285 pub dest_karg_delete: Vec<String>,
286 #[arg(long, value_name = "path")]
294 pub network_keyfile: Vec<String>,
295 #[arg(long, value_name = "path")]
303 pub network_nmstate: Vec<String>,
304 #[arg(long, value_name = "path")]
311 pub ignition_ca: Vec<String>,
312 #[arg(long, value_name = "path")]
318 pub pre_install: Vec<String>,
319 #[arg(long, value_name = "path")]
325 pub post_install: Vec<String>,
326 #[arg(long, value_name = "path")]
332 pub installer_config: Vec<String>,
333 #[arg(long, value_name = "path")]
338 pub live_ignition: Vec<String>,
339}
340
341#[derive(Debug, Parser)]
342pub struct IsoCustomizeConfig {
343 #[command(flatten)]
345 pub common: CommonCustomizeConfig,
346 #[arg(long, value_name = "arg")]
350 pub live_karg_append: Vec<String>,
351 #[arg(long, value_name = "arg")]
355 pub live_karg_delete: Vec<String>,
356 #[arg(long, value_name = "k=o=n")]
362 pub live_karg_replace: Vec<String>,
363
364 #[arg(short, long)]
367 pub force: bool,
368 #[arg(short, long, value_name = "path")]
370 pub output: Option<String>,
371 #[arg(value_name = "ISO")]
373 pub input: String,
374}
375
376#[derive(Debug, Parser)]
377pub struct IsoEmbedConfig {
378 #[arg(short, long, value_name = "path")]
380 pub config: Option<String>,
381 #[arg(short, long)]
383 pub force: bool,
384 #[arg(short, long, value_name = "path")]
386 pub output: Option<String>,
387 #[arg(value_name = "ISO")]
389 pub input: String,
390}
391
392#[derive(Debug, Parser)]
393pub struct IsoShowConfig {
394 #[arg(value_name = "ISO")]
396 pub input: String,
397}
398
399#[derive(Debug, Parser)]
400pub struct IsoRemoveConfig {
401 #[arg(short, long, value_name = "path")]
403 pub output: Option<String>,
404 #[arg(value_name = "ISO")]
406 pub input: String,
407}
408
409#[derive(Debug, Parser)]
410pub struct IsoIgnitionEmbedConfig {
411 #[arg(short, long)]
413 pub force: bool,
414 #[arg(short, long, value_name = "path")]
416 pub ignition_file: Option<String>,
417 #[arg(short, long, value_name = "path")]
419 pub output: Option<String>,
420 #[arg(value_name = "ISO")]
422 pub input: String,
423}
424
425#[derive(Debug, Parser)]
426pub struct IsoIgnitionShowConfig {
427 #[arg(value_name = "ISO")]
429 pub input: String,
430}
431
432#[derive(Debug, Parser)]
433pub struct IsoIgnitionRemoveConfig {
434 #[arg(short, long, value_name = "path")]
436 pub output: Option<String>,
437 #[arg(value_name = "ISO")]
439 pub input: String,
440}
441
442#[derive(Debug, Parser)]
443pub struct IsoNetworkEmbedConfig {
444 #[arg(short, long, required = true, value_name = "path")]
448 pub keyfile: Vec<String>,
449 #[arg(short, long)]
451 pub force: bool,
452 #[arg(short, long, value_name = "path")]
454 pub output: Option<String>,
455 #[arg(value_name = "ISO")]
457 pub input: String,
458}
459
460#[derive(Debug, Parser)]
461pub struct IsoNetworkExtractConfig {
462 #[arg(short = 'C', long, value_name = "path")]
464 pub directory: Option<String>,
465 #[arg(value_name = "ISO")]
467 pub input: String,
468}
469
470#[derive(Debug, Parser)]
471pub struct IsoNetworkRemoveConfig {
472 #[arg(short, long, value_name = "path")]
474 pub output: Option<String>,
475 #[arg(value_name = "ISO")]
477 pub input: String,
478}
479
480#[derive(Debug, Parser)]
481pub struct IsoKargsModifyConfig {
482 #[arg(short, long, value_name = "KARG")]
484 pub append: Vec<String>,
485 #[arg(short, long, value_name = "KARG")]
487 pub delete: Vec<String>,
488 #[arg(short, long, value_name = "KARG=OLDVAL=NEWVAL")]
490 pub replace: Vec<String>,
491 #[arg(short, long, value_name = "PATH")]
493 pub output: Option<String>,
494 #[arg(value_name = "ISO")]
496 pub input: String,
497}
498
499#[derive(Debug, Parser)]
500pub struct IsoKargsResetConfig {
501 #[arg(short, long, value_name = "PATH")]
503 pub output: Option<String>,
504 #[arg(value_name = "ISO")]
506 pub input: String,
507}
508
509#[derive(Debug, Parser)]
510pub struct IsoKargsShowConfig {
511 #[arg(short, long)]
513 pub default: bool,
514 #[arg(value_name = "ISO")]
516 pub input: String,
517}
518
519#[derive(Debug, Parser)]
520pub struct DevShowIsoConfig {
521 #[arg(long, conflicts_with = "kargs")]
523 pub ignition: bool,
524 #[arg(long, conflicts_with = "ignition")]
526 pub kargs: bool,
527 #[arg(value_name = "ISO")]
529 pub input: String,
530}
531
532#[derive(Debug, Parser)]
533pub struct IsoExtractPxeConfig {
534 #[arg(value_name = "ISO")]
536 pub input: String,
537 #[arg(short, long, value_name = "PATH", default_value = ".")]
539 pub output_dir: String,
540}
541
542#[derive(Debug, Parser)]
543pub struct IsoExtractMinimalIsoConfig {
544 #[arg(value_name = "ISO")]
546 pub input: String,
547 #[arg(long, value_name = "PATH")]
549 pub output_rootfs: Option<String>,
550 #[arg(value_name = "OUTPUT_ISO", default_value = "-")]
552 pub output: String,
553 #[arg(long, value_name = "URL")]
555 pub rootfs_url: Option<String>,
556}
557
558#[derive(Debug, Parser)]
559pub struct PackMinimalIsoConfig {
560 #[arg(value_name = "FULL_ISO")]
562 pub full: String,
563 #[arg(value_name = "MINIMAL_ISO")]
565 pub minimal: String,
566 #[arg(long)]
568 pub consume: bool,
569}
570
571#[derive(Debug, Parser)]
572pub struct IsoResetConfig {
573 #[arg(short, long, value_name = "path")]
575 pub output: Option<String>,
576 #[arg(value_name = "ISO")]
578 pub input: String,
579}
580
581#[derive(Debug, Parser)]
582#[command(override_usage = "coreos-installer pack osmet [OPTIONS]")]
584pub struct PackOsmetConfig {
585 #[arg(long, required = true, value_name = "FILE")]
588 pub output: String,
589 #[arg(long, required = true, value_name = "SHA256")]
594 pub checksum: String,
595 #[arg(long, required = true, value_name = "TEXT")]
597 pub description: String,
598 #[arg(long)]
600 pub fast: bool,
601 #[arg(value_name = "DEV")]
603 pub device: String,
604}
605
606#[derive(Debug, Parser)]
607pub struct DevExtractOsmetConfig {
608 #[arg(long, required = true, value_name = "PATH")]
610 pub osmet: String,
611 #[arg(value_name = "PATH")]
613 pub repo: String,
614 #[arg(value_name = "DEV")]
616 pub device: String,
617}
618
619#[derive(Debug, Parser)]
620pub struct DevShowFiemapConfig {
621 #[arg(value_name = "PATH")]
623 pub file: String,
624}
625
626#[derive(Debug, Parser)]
627pub struct PxeCustomizeConfig {
628 #[command(flatten)]
630 pub common: CommonCustomizeConfig,
631
632 #[arg(short, long, value_name = "path")]
635 pub output: String,
636 #[arg(value_name = "path")]
638 pub input: String,
639}
640
641#[derive(Debug, Parser)]
642pub struct PxeIgnitionWrapConfig {
643 #[arg(short, long, value_name = "path")]
645 pub ignition_file: Option<String>,
646 #[arg(short, long, value_name = "path")]
648 pub output: Option<String>,
649}
650
651#[derive(Debug, Parser)]
652pub struct PxeIgnitionUnwrapConfig {
653 #[arg(value_name = "initrd")]
655 pub input: Option<String>,
656}
657
658#[derive(Debug, Parser)]
659pub struct PxeNetworkWrapConfig {
660 #[arg(short, long, required = true, value_name = "path")]
664 pub keyfile: Vec<String>,
665 #[arg(short, long, value_name = "path")]
667 pub output: Option<String>,
668}
669
670#[derive(Debug, Parser)]
671pub struct PxeNetworkUnwrapConfig {
672 #[arg(short = 'C', long, value_name = "path")]
674 pub directory: Option<String>,
675 #[arg(value_name = "initrd")]
677 pub input: Option<String>,
678}
679
680#[derive(Debug, Parser)]
681pub struct DevShowInitrdConfig {
682 #[arg(value_name = "initrd")]
684 pub input: String,
685 #[arg(value_name = "glob")]
687 pub filter: Vec<String>,
688}
689
690#[derive(Debug, Parser)]
691pub struct DevExtractInitrdConfig {
692 #[arg(short = 'C', long, value_name = "path", default_value = ".")]
694 pub directory: String,
695 #[arg(short, long)]
697 pub verbose: bool,
698 #[arg(value_name = "initrd")]
700 pub input: String,
701 #[arg(value_name = "glob")]
703 pub filter: Vec<String>,
704}
705
706#[cfg(feature = "docgen")]
707#[derive(Debug, Parser)]
708pub struct PackManConfig {
709 #[arg(short = 'C', long, value_name = "path", default_value = ".")]
711 pub directory: String,
712}
713
714#[cfg(feature = "docgen")]
715#[derive(Debug, Parser)]
716pub struct PackExampleConfigConfig {}
717
718#[cfg(test)]
719mod test {
720 use super::*;
721 use clap::CommandFactory;
722
723 #[test]
724 fn clap_app() {
725 Cmd::command().debug_assert()
726 }
727}