1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2017 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker use std::path::PathBuf;
6*bb4ee6a4SAndroid Build Coastguard Worker
7*bb4ee6a4SAndroid Build Coastguard Worker use argh::FromArgValue;
8*bb4ee6a4SAndroid Build Coastguard Worker use argh::FromArgs;
9*bb4ee6a4SAndroid Build Coastguard Worker use cros_async::ExecutorKind;
10*bb4ee6a4SAndroid Build Coastguard Worker use devices::virtio::block::DiskOption;
11*bb4ee6a4SAndroid Build Coastguard Worker use devices::virtio::vhost::user::device;
12*bb4ee6a4SAndroid Build Coastguard Worker use devices::virtio::vhost::user::VhostUserParams;
13*bb4ee6a4SAndroid Build Coastguard Worker use devices::virtio::vsock::VsockConfig;
14*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "net")]
15*bb4ee6a4SAndroid Build Coastguard Worker use devices::virtio::NetParameters;
16*bb4ee6a4SAndroid Build Coastguard Worker use devices::SerialParameters;
17*bb4ee6a4SAndroid Build Coastguard Worker use jail::JailConfig;
18*bb4ee6a4SAndroid Build Coastguard Worker
19*bb4ee6a4SAndroid Build Coastguard Worker use crate::crosvm::config::validate_serial_parameters;
20*bb4ee6a4SAndroid Build Coastguard Worker
21*bb4ee6a4SAndroid Build Coastguard Worker #[derive(FromArgs)]
22*bb4ee6a4SAndroid Build Coastguard Worker #[argh(subcommand)]
23*bb4ee6a4SAndroid Build Coastguard Worker /// Unix Devices
24*bb4ee6a4SAndroid Build Coastguard Worker pub enum DeviceSubcommand {
25*bb4ee6a4SAndroid Build Coastguard Worker Console(device::ConsoleOptions),
26*bb4ee6a4SAndroid Build Coastguard Worker Fs(device::FsOptions),
27*bb4ee6a4SAndroid Build Coastguard Worker Vsock(device::VsockOptions),
28*bb4ee6a4SAndroid Build Coastguard Worker Wl(device::WlOptions),
29*bb4ee6a4SAndroid Build Coastguard Worker }
30*bb4ee6a4SAndroid Build Coastguard Worker
parse_vu_serial_options(s: &str) -> Result<VhostUserParams<SerialParameters>, String>31*bb4ee6a4SAndroid Build Coastguard Worker fn parse_vu_serial_options(s: &str) -> Result<VhostUserParams<SerialParameters>, String> {
32*bb4ee6a4SAndroid Build Coastguard Worker let params = VhostUserParams::<SerialParameters>::from_arg_value(s)?;
33*bb4ee6a4SAndroid Build Coastguard Worker
34*bb4ee6a4SAndroid Build Coastguard Worker validate_serial_parameters(¶ms.device)?;
35*bb4ee6a4SAndroid Build Coastguard Worker
36*bb4ee6a4SAndroid Build Coastguard Worker Ok(params)
37*bb4ee6a4SAndroid Build Coastguard Worker }
38*bb4ee6a4SAndroid Build Coastguard Worker
39*bb4ee6a4SAndroid Build Coastguard Worker #[argh_helpers::pad_description_for_argh]
40*bb4ee6a4SAndroid Build Coastguard Worker #[derive(FromArgs, Debug)]
41*bb4ee6a4SAndroid Build Coastguard Worker #[argh(subcommand, name = "devices")]
42*bb4ee6a4SAndroid Build Coastguard Worker /// Start one or several jailed device processes.
43*bb4ee6a4SAndroid Build Coastguard Worker pub struct DevicesCommand {
44*bb4ee6a4SAndroid Build Coastguard Worker /// configure async executor backend to "uring" or "epoll" (default).
45*bb4ee6a4SAndroid Build Coastguard Worker #[argh(option, arg_name = "EXECUTOR")]
46*bb4ee6a4SAndroid Build Coastguard Worker pub async_executor: Option<ExecutorKind>,
47*bb4ee6a4SAndroid Build Coastguard Worker
48*bb4ee6a4SAndroid Build Coastguard Worker #[argh(switch)]
49*bb4ee6a4SAndroid Build Coastguard Worker /// disable sandboxing. Will nullify the --jail option if it was present.
50*bb4ee6a4SAndroid Build Coastguard Worker pub disable_sandbox: bool,
51*bb4ee6a4SAndroid Build Coastguard Worker
52*bb4ee6a4SAndroid Build Coastguard Worker #[argh(
53*bb4ee6a4SAndroid Build Coastguard Worker option,
54*bb4ee6a4SAndroid Build Coastguard Worker arg_name = "jail configuration",
55*bb4ee6a4SAndroid Build Coastguard Worker default = "Default::default()"
56*bb4ee6a4SAndroid Build Coastguard Worker )]
57*bb4ee6a4SAndroid Build Coastguard Worker /// set up the jail configuration.
58*bb4ee6a4SAndroid Build Coastguard Worker /// Possible key values:
59*bb4ee6a4SAndroid Build Coastguard Worker /// pivot-root=/path - Path to empty directory to use for
60*bb4ee6a4SAndroid Build Coastguard Worker /// sandbox pivot root.
61*bb4ee6a4SAndroid Build Coastguard Worker /// seccomp-policy-dir=/path - Path to seccomp .policy files
62*bb4ee6a4SAndroid Build Coastguard Worker /// seccomp-log-failures=(true|false) - Log seccomp filter
63*bb4ee6a4SAndroid Build Coastguard Worker /// failures instead of them being fatal.
64*bb4ee6a4SAndroid Build Coastguard Worker pub jail: JailConfig,
65*bb4ee6a4SAndroid Build Coastguard Worker
66*bb4ee6a4SAndroid Build Coastguard Worker #[argh(
67*bb4ee6a4SAndroid Build Coastguard Worker option,
68*bb4ee6a4SAndroid Build Coastguard Worker arg_name = "vhost=PATH,type=TYPE,[hardware=HW,num=NUM,path=PATH,input=PATH,console,earlycon,stdin,pci-address=ADDR]",
69*bb4ee6a4SAndroid Build Coastguard Worker from_str_fn(parse_vu_serial_options)
70*bb4ee6a4SAndroid Build Coastguard Worker )]
71*bb4ee6a4SAndroid Build Coastguard Worker /// start a serial device.
72*bb4ee6a4SAndroid Build Coastguard Worker /// Possible key values:
73*bb4ee6a4SAndroid Build Coastguard Worker /// vhost=PATH - Path to a vhost-user socket to listen to.
74*bb4ee6a4SAndroid Build Coastguard Worker /// This parameter must be given in first position.
75*bb4ee6a4SAndroid Build Coastguard Worker /// type=(stdout,syslog,sink,file) - Where to route the
76*bb4ee6a4SAndroid Build Coastguard Worker /// serial device
77*bb4ee6a4SAndroid Build Coastguard Worker /// hardware=(serial,virtio-console) - Which type of serial
78*bb4ee6a4SAndroid Build Coastguard Worker /// hardware to emulate. Defaults to 8250 UART (serial).
79*bb4ee6a4SAndroid Build Coastguard Worker /// num=(1,2,3,4) - Serial Device Number. If not provided,
80*bb4ee6a4SAndroid Build Coastguard Worker /// num will default to 1.
81*bb4ee6a4SAndroid Build Coastguard Worker /// path=PATH - The path to the file to write to when
82*bb4ee6a4SAndroid Build Coastguard Worker /// type=file
83*bb4ee6a4SAndroid Build Coastguard Worker /// input=PATH - The path to the file to read from when not
84*bb4ee6a4SAndroid Build Coastguard Worker /// stdin
85*bb4ee6a4SAndroid Build Coastguard Worker /// console - Use this serial device as the guest console.
86*bb4ee6a4SAndroid Build Coastguard Worker /// Can only be given once. Will default to first
87*bb4ee6a4SAndroid Build Coastguard Worker /// serial port if not provided.
88*bb4ee6a4SAndroid Build Coastguard Worker /// earlycon - Use this serial device as the early console.
89*bb4ee6a4SAndroid Build Coastguard Worker /// Can only be given once.
90*bb4ee6a4SAndroid Build Coastguard Worker /// stdin - Direct standard input to this serial device.
91*bb4ee6a4SAndroid Build Coastguard Worker /// Can only be given once. Will default to first serial
92*bb4ee6a4SAndroid Build Coastguard Worker /// port if not provided.
93*bb4ee6a4SAndroid Build Coastguard Worker /// pci-address - Preferred PCI address, e.g. "00:01.0".
94*bb4ee6a4SAndroid Build Coastguard Worker /// Only applies to virtio-console hardware type.
95*bb4ee6a4SAndroid Build Coastguard Worker pub serial: Vec<VhostUserParams<SerialParameters>>,
96*bb4ee6a4SAndroid Build Coastguard Worker
97*bb4ee6a4SAndroid Build Coastguard Worker #[argh(option, arg_name = "vhost=PATH[, block options]")]
98*bb4ee6a4SAndroid Build Coastguard Worker /// start a block device.
99*bb4ee6a4SAndroid Build Coastguard Worker /// Possible key values:
100*bb4ee6a4SAndroid Build Coastguard Worker /// vhost=PATH - Path to a vhost-user socket to listen to.
101*bb4ee6a4SAndroid Build Coastguard Worker /// This parameter must be given in first position.
102*bb4ee6a4SAndroid Build Coastguard Worker /// block options:
103*bb4ee6a4SAndroid Build Coastguard Worker /// See help from `crosvm run` command.
104*bb4ee6a4SAndroid Build Coastguard Worker pub block: Vec<VhostUserParams<DiskOption>>,
105*bb4ee6a4SAndroid Build Coastguard Worker
106*bb4ee6a4SAndroid Build Coastguard Worker #[argh(option, arg_name = "vhost=PATH,cid=CID[,device=VHOST_DEVICE]")]
107*bb4ee6a4SAndroid Build Coastguard Worker /// start a vsock device.
108*bb4ee6a4SAndroid Build Coastguard Worker /// Possible key values:
109*bb4ee6a4SAndroid Build Coastguard Worker /// vhost=PATH - Path to a vhost-user socket to listen to.
110*bb4ee6a4SAndroid Build Coastguard Worker /// This parameter must be given in first position.
111*bb4ee6a4SAndroid Build Coastguard Worker /// cid=CID - CID to use for the device.
112*bb4ee6a4SAndroid Build Coastguard Worker /// device=VHOST_DEVICE - path to the vhost-vsock device to
113*bb4ee6a4SAndroid Build Coastguard Worker /// use (Linux only). Defaults to /dev/vhost-vsock.
114*bb4ee6a4SAndroid Build Coastguard Worker pub vsock: Vec<VhostUserParams<VsockConfig>>,
115*bb4ee6a4SAndroid Build Coastguard Worker
116*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "net")]
117*bb4ee6a4SAndroid Build Coastguard Worker #[argh(option, arg_name = "net options")]
118*bb4ee6a4SAndroid Build Coastguard Worker /// start a network device.
119*bb4ee6a4SAndroid Build Coastguard Worker /// Possible key values:
120*bb4ee6a4SAndroid Build Coastguard Worker /// vhost=PATH - Path to a vhost-user socket to listen to.
121*bb4ee6a4SAndroid Build Coastguard Worker /// This parameter must be given in first position.
122*bb4ee6a4SAndroid Build Coastguard Worker /// network options:
123*bb4ee6a4SAndroid Build Coastguard Worker /// See help from the `crosvm run` command.
124*bb4ee6a4SAndroid Build Coastguard Worker pub net: Vec<VhostUserParams<NetParameters>>,
125*bb4ee6a4SAndroid Build Coastguard Worker
126*bb4ee6a4SAndroid Build Coastguard Worker #[argh(option, short = 's', arg_name = "PATH")]
127*bb4ee6a4SAndroid Build Coastguard Worker /// path to put the control socket.
128*bb4ee6a4SAndroid Build Coastguard Worker pub control_socket: Option<PathBuf>,
129*bb4ee6a4SAndroid Build Coastguard Worker }
130*bb4ee6a4SAndroid Build Coastguard Worker
131*bb4ee6a4SAndroid Build Coastguard Worker #[derive(FromArgs)]
132*bb4ee6a4SAndroid Build Coastguard Worker #[argh(subcommand)]
133*bb4ee6a4SAndroid Build Coastguard Worker /// Unix Commands
134*bb4ee6a4SAndroid Build Coastguard Worker pub enum Commands {
135*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
136*bb4ee6a4SAndroid Build Coastguard Worker Devices(DevicesCommand),
137*bb4ee6a4SAndroid Build Coastguard Worker }
138