1 /* 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> 20 #include <set> 21 22 namespace Json { 23 class Value; 24 } 25 26 namespace vsoc { 27 28 constexpr char kDefaultUuidPrefix[] = "699acfc4-c8c4-11e7-882b-5065f31dc1"; 29 constexpr char kCuttlefishConfigEnvVarName[] = "CUTTLEFISH_CONFIG_FILE"; 30 constexpr char kVsocUserPrefix[] = "vsoc-"; 31 32 // Holds the configuration of the cuttlefish instances. 33 class CuttlefishConfig { 34 public: 35 static CuttlefishConfig* Get(); 36 37 CuttlefishConfig(); 38 ~CuttlefishConfig(); 39 40 // Saves the configuration object in a file, it can then be read in other 41 // processes by passing the --config_file option. 42 bool SaveToFile(const std::string& file) const; 43 44 // Returns the path to a file with the given name in the instance directory.. 45 std::string PerInstancePath(const char* file_name) const; 46 47 std::string instance_name() const; 48 49 void disable_usb_adb() { 50 // This seems to be the way usb is being disbled in the launcher 51 set_usb_v1_socket_name(""); 52 } 53 54 std::string instance_dir() const; 55 void set_instance_dir(const std::string& instance_dir); 56 57 std::string vm_manager() const; 58 void set_vm_manager(const std::string& name); 59 60 std::string hardware_name() const; 61 void set_hardware_name(const std::string& name); 62 63 std::string serial_number() const; 64 void set_serial_number(const std::string& serial_number); 65 66 int cpus() const; 67 void set_cpus(int cpus); 68 69 int memory_mb() const; 70 void set_memory_mb(int memory_mb); 71 72 int dpi() const; 73 void set_dpi(int dpi); 74 75 int x_res() const; 76 void set_x_res(int x_res); 77 78 int y_res() const; 79 void set_y_res(int y_res); 80 81 int num_screen_buffers() const; 82 void set_num_screen_buffers(int num_screen_buffers); 83 84 int refresh_rate_hz() const; 85 void set_refresh_rate_hz(int refresh_rate_hz); 86 87 // Returns kernel image extracted from the boot image or the user-provided one 88 // if given by command line to the launcher. This function should not be used 89 // to get the kernel image the vmm should boot, GetKernelImageToUse() should 90 // be used instead. 91 std::string kernel_image_path() const; 92 void set_kernel_image_path(const std::string& kernel_image_path); 93 94 bool decompress_kernel() const; 95 void set_decompress_kernel(bool decompress_kernel); 96 97 // Returns the path to the kernel image that should be given to the vm manager 98 // to boot, takes into account whether the original image was decompressed or 99 // not. 100 std::string GetKernelImageToUse() const { 101 return decompress_kernel() ? decompressed_kernel_image_path() 102 : kernel_image_path(); 103 } 104 105 std::string decompressed_kernel_image_path() const; 106 void set_decompressed_kernel_image_path(const std::string& path); 107 108 bool use_unpacked_kernel() const; 109 void set_use_unpacked_kernel(bool use_unpacked_kernel); 110 111 std::set<std::string> kernel_cmdline() const; 112 void set_kernel_cmdline(const std::set<std::string>& kernel_cmdline); 113 void add_kernel_cmdline(const std::string& arg); 114 void add_kernel_cmdline(const std::set<std::string>& kernel_cmdline); 115 std::string kernel_cmdline_as_string() const; 116 117 std::string gdb_flag() const; 118 void set_gdb_flag(const std::string& gdb); 119 120 std::string ramdisk_image_path() const; 121 void set_ramdisk_image_path(const std::string& ramdisk_image_path); 122 123 std::string system_image_path() const; 124 void set_system_image_path(const std::string& system_image_path); 125 126 std::string cache_image_path() const; 127 void set_cache_image_path(const std::string& cache_image_path); 128 129 std::string data_image_path() const; 130 void set_data_image_path(const std::string& data_image_path); 131 132 std::string vendor_image_path() const; 133 void set_vendor_image_path(const std::string& vendor_image_path); 134 135 std::string metadata_image_path() const; 136 void set_metadata_image_path(const std::string& metadata_image_path); 137 138 std::string product_image_path() const; 139 void set_product_image_path(const std::string& product_image_path); 140 141 std::string super_image_path() const; 142 void set_super_image_path(const std::string& super_image_path); 143 144 std::string dtb_path() const; 145 void set_dtb_path(const std::string& dtb_path); 146 147 std::string gsi_fstab_path() const; 148 void set_gsi_fstab_path(const std::string& path); 149 150 std::string mempath() const; 151 void set_mempath(const std::string& mempath); 152 153 std::string ivshmem_qemu_socket_path() const; 154 void set_ivshmem_qemu_socket_path( 155 const std::string& ivshmem_qemu_socket_path); 156 157 std::string ivshmem_client_socket_path() const; 158 void set_ivshmem_client_socket_path( 159 const std::string& ivshmem_client_socket_path); 160 161 int ivshmem_vector_count() const; 162 void set_ivshmem_vector_count(int ivshmem_vector_count); 163 164 // The name of the socket that will be used to forward access to USB gadget. 165 // This is for V1 of the USB bus. 166 std::string usb_v1_socket_name() const; 167 void set_usb_v1_socket_name(const std::string& usb_v1_socket_name); 168 169 int vhci_port() const; 170 void set_vhci_port(int vhci_port); 171 172 std::string usb_ip_socket_name() const; 173 void set_usb_ip_socket_name(const std::string& usb_ip_socket_name); 174 175 std::string kernel_log_socket_name() const; 176 void set_kernel_log_socket_name(const std::string& kernel_log_socket_name); 177 178 bool deprecated_boot_completed() const; 179 void set_deprecated_boot_completed(bool deprecated_boot_completed); 180 181 std::string console_path() const; 182 void set_console_path(const std::string& console_path); 183 184 std::string logcat_path() const; 185 void set_logcat_path(const std::string& logcat_path); 186 187 std::string logcat_receiver_binary() const; 188 void set_logcat_receiver_binary(const std::string& binary); 189 190 std::string launcher_log_path() const; 191 void set_launcher_log_path(const std::string& launcher_log_path); 192 193 std::string launcher_monitor_socket_path() const; 194 void set_launcher_monitor_socket_path( 195 const std::string& launhcer_monitor_path); 196 197 std::string mobile_bridge_name() const; 198 void set_mobile_bridge_name(const std::string& mobile_bridge_name); 199 200 std::string mobile_tap_name() const; 201 void set_mobile_tap_name(const std::string& mobile_tap_name); 202 203 std::string wifi_tap_name() const; 204 void set_wifi_tap_name(const std::string& wifi_tap_name); 205 206 std::string wifi_guest_mac_addr() const; 207 void set_wifi_guest_mac_addr(const std::string& wifi_guest_mac_addr); 208 209 std::string wifi_host_mac_addr() const; 210 void set_wifi_host_mac_addr(const std::string& wifi_host_mac_addr); 211 212 std::string entropy_source() const; 213 void set_entropy_source(const std::string& entropy_source); 214 215 void set_vsock_guest_cid(int vsock_guest_cid); 216 int vsock_guest_cid() const; 217 218 std::string uuid() const; 219 void set_uuid(const std::string& uuid); 220 221 void set_cuttlefish_env_path(const std::string& path); 222 std::string cuttlefish_env_path() const; 223 224 void set_adb_mode(const std::set<std::string>& modes); 225 std::set<std::string> adb_mode() const; 226 227 void set_adb_ip_and_port(const std::string& ip_port); 228 std::string adb_ip_and_port() const; 229 230 std::string adb_device_name() const; 231 232 void set_device_title(const std::string& title); 233 std::string device_title() const; 234 235 void set_setupwizard_mode(const std::string& title); 236 std::string setupwizard_mode() const; 237 238 void set_qemu_binary(const std::string& qemu_binary); 239 std::string qemu_binary() const; 240 241 void set_crosvm_binary(const std::string& crosvm_binary); 242 std::string crosvm_binary() const; 243 244 void set_ivserver_binary(const std::string& ivserver_binary); 245 std::string ivserver_binary() const; 246 247 void set_kernel_log_monitor_binary( 248 const std::string& kernel_log_monitor_binary); 249 std::string kernel_log_monitor_binary() const; 250 251 void set_enable_vnc_server(bool enable_vnc_server); 252 bool enable_vnc_server() const; 253 254 void set_vnc_server_port(int vnc_server_port); 255 int vnc_server_port() const; 256 257 void set_vnc_server_binary(const std::string& vnc_server_binary); 258 std::string vnc_server_binary() const; 259 260 void set_enable_stream_audio(bool enable_stream_audio); 261 bool enable_stream_audio() const; 262 263 void set_stream_audio_port(int stream_audio_port); 264 int stream_audio_port() const; 265 266 void set_stream_audio_binary(const std::string& stream_audio_binary); 267 std::string stream_audio_binary() const; 268 269 void set_restart_subprocesses(bool restart_subprocesses); 270 bool restart_subprocesses() const; 271 272 void set_run_adb_connector(bool run_adb_connector); 273 bool run_adb_connector() const; 274 275 void set_adb_connector_binary(const std::string& adb_connector_binary); 276 std::string adb_connector_binary() const; 277 278 void set_virtual_usb_manager_binary(const std::string& binary); 279 std::string virtual_usb_manager_binary() const; 280 281 void set_socket_forward_proxy_binary(const std::string& binary); 282 std::string socket_forward_proxy_binary() const; 283 284 void set_socket_vsock_proxy_binary(const std::string& binary); 285 std::string socket_vsock_proxy_binary() const; 286 287 void set_run_as_daemon(bool run_as_daemon); 288 bool run_as_daemon() const; 289 290 void set_run_e2e_test(bool run_e2e_test); 291 bool run_e2e_test() const; 292 293 void set_e2e_test_binary(const std::string& e2e_test_binary); 294 std::string e2e_test_binary() const; 295 296 void set_data_policy(const std::string& data_policy); 297 std::string data_policy() const; 298 299 void set_blank_data_image_mb(int blank_data_image_mb); 300 int blank_data_image_mb() const; 301 302 void set_blank_data_image_fmt(const std::string& blank_data_image_fmt); 303 std::string blank_data_image_fmt() const; 304 305 void set_logcat_mode(const std::string& mode); 306 std::string logcat_mode() const; 307 308 void set_logcat_vsock_port(int port); 309 int logcat_vsock_port() const; 310 311 void set_frames_vsock_port(int port); 312 int frames_vsock_port() const; 313 314 bool enable_ivserver() const; 315 316 std::string touch_socket_path() const; 317 std::string keyboard_socket_path() const; 318 319 private: 320 std::unique_ptr<Json::Value> dictionary_; 321 322 void SetPath(const std::string& key, const std::string& path); 323 bool LoadFromFile(const char* file); 324 static CuttlefishConfig* BuildConfigImpl(); 325 326 CuttlefishConfig(const CuttlefishConfig&) = delete; 327 CuttlefishConfig& operator=(const CuttlefishConfig&) = delete; 328 }; 329 330 // Returns the instance number as obtained from the CUTTLEFISH_INSTANCE 331 // environment variable or the username. 332 int GetInstance(); 333 // Returns a path where the launhcer puts a link to the config file which makes 334 // it easily discoverable regardless of what vm manager is in use 335 std::string GetGlobalConfigFileLink(); 336 337 // Returns the path to the ivserver's client socket. 338 std::string GetDomain(); 339 340 // These functions modify a given base value to make it different accross 341 // different instances by appending the instance id in case of strings or adding 342 // it in case of integers. 343 std::string GetPerInstanceDefault(const char* prefix); 344 int GetPerInstanceDefault(int base); 345 346 std::string GetDefaultPerInstanceDir(); 347 std::string GetDefaultMempath(); 348 int GetDefaultPerInstanceVsockCid(); 349 350 std::string DefaultHostArtifactsPath(const std::string& file); 351 std::string DefaultGuestImagePath(const std::string& file); 352 353 // Whether the host supports qemu 354 bool HostSupportsQemuCli(); 355 bool HostSupportsVsock(); 356 } // namespace vsoc 357