blob: 656f84fd61f92ed1d6499ac6d69b72505775d123 [file] [log] [blame]
Jorge E. Moreira577383b2018-05-24 14:17:51 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
18#include <memory>
19#include <string>
Cody Schuffelenefadb8d2018-08-10 16:10:35 -070020#include <set>
Jorge E. Moreira577383b2018-05-24 14:17:51 -070021
22namespace Json {
23class Value;
24}
25
26namespace vsoc {
27
Jorge E. Moreirab8dfb992018-07-22 20:53:56 -070028constexpr char kDefaultUuidPrefix[] = "699acfc4-c8c4-11e7-882b-5065f31dc1";
Cody Schuffelenf219a162018-10-11 19:01:57 -070029constexpr char kCuttlefishConfigEnvVarName[] = "CUTTLEFISH_CONFIG_FILE";
Ryan Haining7338d352018-10-24 17:41:52 -070030constexpr char kVsocUserPrefix[] = "vsoc-";
Jorge E. Moreira8dad5042019-10-01 16:04:52 -070031constexpr char kBootStartedMessage[] ="VIRTUAL_DEVICE_BOOT_STARTED";
32constexpr char kBootCompletedMessage[] = "VIRTUAL_DEVICE_BOOT_COMPLETED";
33constexpr char kBootFailedMessage[] = "VIRTUAL_DEVICE_BOOT_FAILED";
34constexpr char kMobileNetworkConnectedMessage[] =
35 "VIRTUAL_DEVICE_NETWORK_MOBILE_CONNECTED";
36constexpr char kWifiConnectedMessage[] =
37 "VIRTUAL_DEVICE_NETWORK_WIFI_CONNECTED";
Jorge E. Moreira1e8e2f12019-10-07 18:09:49 -070038constexpr char kInternalDirName[] = "internal";
39
Jorge E. Moreirab8dfb992018-07-22 20:53:56 -070040
Cody Schuffelenb6fa7362019-05-08 11:58:14 -070041enum class AdbMode {
Cody Schuffelenb6fa7362019-05-08 11:58:14 -070042 VsockTunnel,
43 VsockHalfTunnel,
44 NativeVsock,
Cody Schuffelenb6fa7362019-05-08 11:58:14 -070045 Unknown,
46};
47
Jorge E. Moreira577383b2018-05-24 14:17:51 -070048// Holds the configuration of the cuttlefish instances.
49class CuttlefishConfig {
50 public:
Cody Schuffelen1fcdbc02019-10-04 14:02:23 -070051 static const CuttlefishConfig* Get();
Jorge E. Moreira077d3002018-07-20 11:43:05 -070052
53 CuttlefishConfig();
54 ~CuttlefishConfig();
Jorge E. Moreira577383b2018-05-24 14:17:51 -070055
56 // Saves the configuration object in a file, it can then be read in other
57 // processes by passing the --config_file option.
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -070058 bool SaveToFile(const std::string& file) const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -070059
60 // Returns the path to a file with the given name in the instance directory..
61 std::string PerInstancePath(const char* file_name) const;
Jorge E. Moreira1e8e2f12019-10-07 18:09:49 -070062 std::string PerInstanceInternalPath(const char* file_name) const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -070063
64 std::string instance_name() const;
65
Jorge E. Moreira577383b2018-05-24 14:17:51 -070066 std::string instance_dir() const;
67 void set_instance_dir(const std::string& instance_dir);
68
Jorge E. Moreira1e8e2f12019-10-07 18:09:49 -070069 std::string instance_internal_dir() const;
70
Jorge E. Moreira88322832018-07-22 16:41:01 -070071 std::string vm_manager() const;
72 void set_vm_manager(const std::string& name);
73
Greg Hartmana3c552d2019-03-28 18:20:48 -070074 std::string gpu_mode() const;
75 void set_gpu_mode(const std::string& name);
76
77 std::string wayland_socket() const;
78 void set_wayland_socket(const std::string& path);
79
Greg Hartmaneb04ac52019-07-16 16:44:18 -070080 std::string x_display() const;
81 void set_x_display(const std::string& address);
82
Jorge E. Moreira577383b2018-05-24 14:17:51 -070083 std::string serial_number() const;
84 void set_serial_number(const std::string& serial_number);
85
86 int cpus() const;
87 void set_cpus(int cpus);
88
89 int memory_mb() const;
90 void set_memory_mb(int memory_mb);
91
92 int dpi() const;
93 void set_dpi(int dpi);
94
95 int x_res() const;
96 void set_x_res(int x_res);
97
98 int y_res() const;
99 void set_y_res(int y_res);
100
101 int refresh_rate_hz() const;
102 void set_refresh_rate_hz(int refresh_rate_hz);
103
Jorge E. Moreira80ddd7f2019-02-04 16:30:13 -0800104 // Returns kernel image extracted from the boot image or the user-provided one
105 // if given by command line to the launcher. This function should not be used
106 // to get the kernel image the vmm should boot, GetKernelImageToUse() should
107 // be used instead.
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700108 std::string kernel_image_path() const;
109 void set_kernel_image_path(const std::string& kernel_image_path);
110
Jorge E. Moreira80ddd7f2019-02-04 16:30:13 -0800111 bool decompress_kernel() const;
112 void set_decompress_kernel(bool decompress_kernel);
113
114 // Returns the path to the kernel image that should be given to the vm manager
115 // to boot, takes into account whether the original image was decompressed or
116 // not.
117 std::string GetKernelImageToUse() const {
118 return decompress_kernel() ? decompressed_kernel_image_path()
119 : kernel_image_path();
120 }
121
122 std::string decompressed_kernel_image_path() const;
123 void set_decompressed_kernel_image_path(const std::string& path);
124
Cody Schuffelene13a78a2019-01-29 14:51:26 -0800125 bool use_unpacked_kernel() const;
126 void set_use_unpacked_kernel(bool use_unpacked_kernel);
127
Greg Hartman91f81422018-07-09 16:04:49 -0700128 std::string gdb_flag() const;
129 void set_gdb_flag(const std::string& gdb);
130
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700131 std::string ramdisk_image_path() const;
132 void set_ramdisk_image_path(const std::string& ramdisk_image_path);
133
Cody Schuffelen9fd95472019-10-04 13:49:57 -0700134 std::string initramfs_path() const;
135 void set_initramfs_path(const std::string& initramfs_path);
136
137 std::string final_ramdisk_path() const;
138 void set_final_ramdisk_path(const std::string& final_ramdisk_path);
139
Ram Muthiah1aa02f82019-10-22 20:26:28 +0000140 std::string vendor_ramdisk_image_path() const;
141 void set_vendor_ramdisk_image_path(const std::string&
142 vendor_ramdisk_image_path);
143
Cody Schuffelen3c99f5b2019-06-14 17:26:01 -0700144 std::vector<std::string> virtual_disk_paths() const;
145 void set_virtual_disk_paths(const std::vector<std::string>& disk_paths);
Cody Schuffelen88b82d52019-05-29 14:16:03 -0700146
Jorge E. Moreirab1ec4352019-06-04 11:43:08 -0700147 std::string kernel_log_pipe_name() const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700148
Jorge E. Moreira7207f4b2019-09-25 10:30:29 -0700149 std::string console_pipe_name() const;
Jorge E. Moreira7207f4b2019-09-25 10:30:29 -0700150
Jorge E. Moreira81afca12018-07-26 16:48:49 -0700151 bool deprecated_boot_completed() const;
152 void set_deprecated_boot_completed(bool deprecated_boot_completed);
153
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700154 std::string console_path() const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700155
156 std::string logcat_path() const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700157
Cody Schuffelen5de48652019-09-16 19:49:52 +0000158 std::string logcat_receiver_binary() const;
159 void set_logcat_receiver_binary(const std::string& binary);
160
Jorge E. Moreiraf1f7cb32019-04-15 18:44:41 -0700161 std::string config_server_binary() const;
162 void set_config_server_binary(const std::string& binary);
163
Jorge E. Moreira66f6ec82018-07-16 16:43:15 -0700164 std::string launcher_log_path() const;
Jorge E. Moreira66f6ec82018-07-16 16:43:15 -0700165
Jorge E. Moreira50a07752018-07-18 18:49:04 -0700166 std::string launcher_monitor_socket_path() const;
Jorge E. Moreira50a07752018-07-18 18:49:04 -0700167
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700168 std::string mobile_bridge_name() const;
169 void set_mobile_bridge_name(const std::string& mobile_bridge_name);
170
171 std::string mobile_tap_name() const;
172 void set_mobile_tap_name(const std::string& mobile_tap_name);
173
Cody Schuffelen975175a2018-06-14 18:20:02 -0700174 std::string wifi_tap_name() const;
175 void set_wifi_tap_name(const std::string& wifi_tap_name);
176
Cody Schuffelend946b5f2018-12-12 11:54:48 -0800177 void set_vsock_guest_cid(int vsock_guest_cid);
178 int vsock_guest_cid() const;
179
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700180 std::string uuid() const;
181 void set_uuid(const std::string& uuid);
182
Greg Hartman6abdbb92018-05-24 09:49:00 -0700183 void set_cuttlefish_env_path(const std::string& path);
184 std::string cuttlefish_env_path() const;
185
Cody Schuffelen90b2fb22019-02-28 18:55:21 -0800186 void set_adb_mode(const std::set<std::string>& modes);
Cody Schuffelenb6fa7362019-05-08 11:58:14 -0700187 std::set<AdbMode> adb_mode() const;
Ryan Haining4a1abea2018-07-10 16:20:19 -0700188
Cody Schuffelene0d0c462019-09-09 14:13:01 -0700189 void set_host_port(int host_port);
190 int host_port() const;
191
Ryan Haining7338d352018-10-24 17:41:52 -0700192 void set_adb_ip_and_port(const std::string& ip_port);
193 std::string adb_ip_and_port() const;
194
195 std::string adb_device_name() const;
196
Ryan Haining6d821ec2018-07-27 11:39:09 -0700197 void set_device_title(const std::string& title);
198 std::string device_title() const;
199
Greg Hartmanf1f28c52018-09-20 17:19:19 -0700200 void set_setupwizard_mode(const std::string& title);
201 std::string setupwizard_mode() const;
202
Cody Schuffelen58980032018-10-11 17:11:13 -0700203 void set_qemu_binary(const std::string& qemu_binary);
204 std::string qemu_binary() const;
205
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800206 void set_crosvm_binary(const std::string& crosvm_binary);
207 std::string crosvm_binary() const;
208
Jorge E. Moreira13cbd982019-06-06 16:06:34 -0700209 void set_console_forwarder_binary(const std::string& crosvm_binary);
210 std::string console_forwarder_binary() const;
211
Cody Schuffelen55676ca2019-01-28 22:00:05 -0800212 void set_kernel_log_monitor_binary(
213 const std::string& kernel_log_monitor_binary);
214 std::string kernel_log_monitor_binary() const;
215
Cody Schuffelen17b34722019-01-28 22:57:14 -0800216 void set_enable_vnc_server(bool enable_vnc_server);
217 bool enable_vnc_server() const;
218
219 void set_vnc_server_port(int vnc_server_port);
220 int vnc_server_port() const;
221
222 void set_vnc_server_binary(const std::string& vnc_server_binary);
223 std::string vnc_server_binary() const;
224
Cody Schuffelend12e0c92019-01-29 15:44:45 -0800225 void set_restart_subprocesses(bool restart_subprocesses);
226 bool restart_subprocesses() const;
227
Cody Schuffelen1f08d972019-01-29 16:21:12 -0800228 void set_run_adb_connector(bool run_adb_connector);
229 bool run_adb_connector() const;
230
231 void set_adb_connector_binary(const std::string& adb_connector_binary);
232 std::string adb_connector_binary() const;
233
Cody Schuffelen1f08d972019-01-29 16:21:12 -0800234 void set_socket_vsock_proxy_binary(const std::string& binary);
235 std::string socket_vsock_proxy_binary() const;
236
Cody Schuffelen50249732019-01-29 16:42:55 -0800237 void set_run_as_daemon(bool run_as_daemon);
238 bool run_as_daemon() const;
239
Cody Schuffelen2b51bab2019-01-29 18:14:48 -0800240 void set_data_policy(const std::string& data_policy);
241 std::string data_policy() const;
242
243 void set_blank_data_image_mb(int blank_data_image_mb);
244 int blank_data_image_mb() const;
245
246 void set_blank_data_image_fmt(const std::string& blank_data_image_fmt);
247 std::string blank_data_image_fmt() const;
248
Cody Schuffelen5de48652019-09-16 19:49:52 +0000249 void set_logcat_mode(const std::string& mode);
250 std::string logcat_mode() const;
251
Ram Muthiah792e2ad2019-04-19 11:19:46 -0700252 void set_enable_tombstone_receiver(bool enable_tombstone_receiver);
253 bool enable_tombstone_receiver() const;
254
255 void set_tombstone_receiver_binary(const std::string& binary);
256 std::string tombstone_receiver_binary() const;
257
Cody Schuffelen1300f122019-05-28 18:24:34 -0700258 void set_use_bootloader(bool use_bootloader);
259 bool use_bootloader() const;
260
261 void set_bootloader(const std::string& bootloader_path);
262 std::string bootloader() const;
263
David Anderson637bfd62019-09-26 13:23:21 -0700264 void set_boot_slot(const std::string& boot_slot);
265 std::string boot_slot() const;
266
Jorge E. Moreirac87c2c72019-03-06 16:12:23 -0800267 std::string touch_socket_path() const;
268 std::string keyboard_socket_path() const;
269
Cody Schuffelen2de6ead2019-12-04 16:16:47 -0800270 void set_loop_max_part(int loop_max_part);
271 int loop_max_part() const;
272
273 void set_guest_enforce_security(bool guest_enforce_security);
274 bool guest_enforce_security() const;
275
276 void set_guest_audit_security(bool guest_audit_security);
277 bool guest_audit_security() const;
278
279 void set_boot_image_kernel_cmdline(std::string boot_image_kernel_cmdline);
280 std::vector<std::string> boot_image_kernel_cmdline() const;
281
282 void set_extra_kernel_cmdline(std::string extra_cmdline);
283 std::vector<std::string> extra_kernel_cmdline() const;
284
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700285 private:
286 std::unique_ptr<Json::Value> dictionary_;
287
Ryan Hainingd3f185d2018-07-19 12:11:47 -0700288 void SetPath(const std::string& key, const std::string& path);
Jorge E. Moreira077d3002018-07-20 11:43:05 -0700289 bool LoadFromFile(const char* file);
290 static CuttlefishConfig* BuildConfigImpl();
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700291
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700292 CuttlefishConfig(const CuttlefishConfig&) = delete;
293 CuttlefishConfig& operator=(const CuttlefishConfig&) = delete;
294};
295
296// Returns the instance number as obtained from the CUTTLEFISH_INSTANCE
297// environment variable or the username.
298int GetInstance();
Jorge E. Moreira015c0002018-07-19 11:01:16 -0700299// Returns a path where the launhcer puts a link to the config file which makes
300// it easily discoverable regardless of what vm manager is in use
301std::string GetGlobalConfigFileLink();
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700302
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700303// These functions modify a given base value to make it different accross
304// different instances by appending the instance id in case of strings or adding
305// it in case of integers.
306std::string GetPerInstanceDefault(const char* prefix);
307int GetPerInstanceDefault(int base);
308
309std::string GetDefaultPerInstanceDir();
Jorge E. Moreira077d3002018-07-20 11:43:05 -0700310std::string GetDefaultMempath();
Cody Schuffelend946b5f2018-12-12 11:54:48 -0800311int GetDefaultPerInstanceVsockCid();
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700312
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -0700313std::string DefaultHostArtifactsPath(const std::string& file);
314std::string DefaultGuestImagePath(const std::string& file);
Greg Hartmana3c552d2019-03-28 18:20:48 -0700315std::string DefaultEnvironmentPath(const char* environment_key,
316 const char* default_value,
317 const char* path);
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -0700318
Jorge E. Moreirad9668372019-01-28 22:40:42 -0800319// Whether the host supports qemu
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -0700320bool HostSupportsQemuCli();
Cody Schuffelend946b5f2018-12-12 11:54:48 -0800321bool HostSupportsVsock();
Greg Hartmana3c552d2019-03-28 18:20:48 -0700322
323// GPU modes
Greg Hartmanbc1bed42019-04-05 20:02:00 -0700324extern const char* const kGpuModeGuestSwiftshader;
325extern const char* const kGpuModeDrmVirgl;
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700326} // namespace vsoc