[crashpad] support an override config

DX-707 #comment #done
DX-714 #comment #done

TESTED=`fx set --packages garnet/packages/config/crashpad_upload_to_prod_server ...` then `crasher` (report id a2c9dc128f7f1fb1)

Change-Id: I3ba118c8af03356ca2a51751eb4f15f46fc1b06b
diff --git a/bin/crashpad/BUILD.gn b/bin/crashpad/BUILD.gn
index bee8e93..f2a3d6d 100644
--- a/bin/crashpad/BUILD.gn
+++ b/bin/crashpad/BUILD.gn
@@ -42,6 +42,16 @@
   ]
 }
 
+package("upload_to_prod_server_config") {
+  deprecated_system_image = true
+  resources = [
+    {
+      path = "configs/upload_to_prod_server.json"
+      dest = "crashpad_analyzer/override_config.json"
+    },
+  ]
+}
+
 source_set("crashpad_analyzer_files") {
   sources = [
     "config.cc",
diff --git a/bin/crashpad/configs/upload_to_prod_server.json b/bin/crashpad/configs/upload_to_prod_server.json
new file mode 100644
index 0000000..524f7b3
--- /dev/null
+++ b/bin/crashpad/configs/upload_to_prod_server.json
@@ -0,0 +1,4 @@
+{
+    "local_crashpad_database_path": "/data/crashes",
+    "enable_upload_to_crash_server": true
+}
diff --git a/bin/crashpad/crashpad_analyzer_impl.cc b/bin/crashpad/crashpad_analyzer_impl.cc
index 3aa5871..921c30a 100644
--- a/bin/crashpad/crashpad_analyzer_impl.cc
+++ b/bin/crashpad/crashpad_analyzer_impl.cc
@@ -45,6 +45,9 @@
 namespace crash {
 namespace {
 
+const char kDefaultConfigPath[] = "/pkg/data/default_config.json";
+const char kOverrideConfigPath[] =
+    "/system/data/crashpad_analyzer/override_config.json";
 const char kURL[] = "https://clients2.google.com/cr/report";
 
 std::string GetPackageName(const zx::process& process) {
@@ -339,12 +342,12 @@
   if (!database) {
     FX_LOGS(ERROR) << "error initializing local crash report database at "
                    << config.local_crashpad_database_path;
+    FX_LOGS(FATAL) << "failed to set up crash analyzer";
     return nullptr;
   }
 
   // Today we enable uploads here. In the future, this will most likely be set
   // in some external settings.
-  // TODO(DX-714): re-enable upload once configurable.
   database->GetSettings()->SetUploadsEnabled(
       config.enable_upload_to_crash_server);
 
@@ -354,11 +357,20 @@
 
 std::unique_ptr<CrashpadAnalyzerImpl> CrashpadAnalyzerImpl::TryCreate() {
   Config config;
-  if (ParseConfig("/pkg/data/default_config.json", &config) != ZX_OK) {
-    return nullptr;
+
+  if (files::IsFile(kOverrideConfigPath) &&
+      ParseConfig(kOverrideConfigPath, &config) == ZX_OK) {
+    return CrashpadAnalyzerImpl::TryCreate(config);
   }
 
-  return CrashpadAnalyzerImpl::TryCreate(config);
+  // We try to load the default config included in the package if no override
+  // config was specified or we failed to parse it.
+  if (ParseConfig(kDefaultConfigPath, &config) == ZX_OK) {
+    return CrashpadAnalyzerImpl::TryCreate(config);
+  }
+
+  FX_LOGS(FATAL) << "failed to set up crash analyzer";
+  return nullptr;
 }
 
 }  // namespace crash
diff --git a/bin/crashpad/meta/crashpad_analyzer.cmx b/bin/crashpad/meta/crashpad_analyzer.cmx
index 5c47725..e4da952 100644
--- a/bin/crashpad/meta/crashpad_analyzer.cmx
+++ b/bin/crashpad/meta/crashpad_analyzer.cmx
@@ -14,6 +14,9 @@
         "services": [
             "fuchsia.logger.LogSink",
             "fuchsia.net.LegacySocketProvider"
+        ],
+        "system": [
+            "data/crashpad_analyzer"
         ]
     }
 }
diff --git a/packages/config/crashpad_upload_to_prod_server b/packages/config/crashpad_upload_to_prod_server
new file mode 100644
index 0000000..d0d516c
--- /dev/null
+++ b/packages/config/crashpad_upload_to_prod_server
@@ -0,0 +1,5 @@
+{
+    "packages": [
+        "//garnet/bin/crashpad:upload_to_prod_server_config"
+    ]
+}