blob: 85debb4d87a72b0527d6b4a97b99b5440c0e61ac [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_FORENSICS_CRASH_REPORTS_INFO_INSPECT_MANAGER_H_
#define SRC_DEVELOPER_FORENSICS_CRASH_REPORTS_INFO_INSPECT_MANAGER_H_
#include <lib/inspect/cpp/vmo/types.h>
#include <cstdint>
#include <map>
#include <string>
#include <vector>
#include "src/developer/forensics/crash_reports/config.h"
#include "src/developer/forensics/crash_reports/product.h"
#include "src/developer/forensics/crash_reports/reporting_policy_watcher.h"
#include "src/developer/forensics/utils/inspect_node_manager.h"
#include "src/developer/forensics/utils/storage_size.h"
#include "src/lib/fxl/macros.h"
#include "src/lib/timekeeper/clock.h"
namespace forensics {
namespace crash_reports {
// Encapsulates the global state exposed through Inspect.
class InspectManager {
public:
InspectManager(inspect::Node* root_node, timekeeper::Clock* clock);
// Exposes the static configuration of the crash reporter.
void ExposeConfig(const crash_reports::Config& config);
// Exposes the reporting policy of the crash reporter.
void ExposeReportingPolicy(ReportingPolicyWatcher* watcher);
// Exposes the static properties of the report store.
void ExposeStore(StorageSize max_size);
// Records the current size of the queue of pending reports.
void SetQueueSize(uint64_t size);
// Upserts the mapping component URL to Product that a client registered.
void UpsertComponentToProductMapping(const std::string& component_url, const Product& product);
// Increase the total number of garbage collected reports by |num_reports|.
void IncreaseReportsGarbageCollectedBy(uint64_t num_reports);
// Adds a new report under the given program.
//
// Returns false if there is already a report with |local_report_id| as ID (for the given program
// or another).
// TODO(fxbug.dev/57903) Revisit this when refactoring Queue related Inspect.
bool AddReport(const std::string& program_name, const std::string& local_report_id);
// Sets the number of upload attempts for an existing report.
//
// Returns false if there are no reports with |local_report_id| as ID.
// TODO(fxbug.dev/57903) Revisit this when refactoring Queue related Inspect.
bool SetUploadAttempt(const std::string& local_report_id, uint64_t upload_attempt);
// Marks an existing report as uploaded, storing its server report ID.
//
// Returns false if there are no reports with |local_report_id| as ID.
// TODO(fxbug.dev/57903) Revisit this when refactoring Queue related Inspect.
bool MarkReportAsUploaded(const std::string& local_report_id,
const std::string& server_report_id);
// Mark an existing report as archived.
//
// Returns false if there are no reports with |local_report_id| as ID.
// TODO(fxbug.dev/57903) Revisit this when refactoring Queue related Inspect.
bool MarkReportAsArchived(const std::string& local_report_id);
// Mark an existing report as garbage collected.
//
// Returns false if there are no report with |local_report_id| as ID.
// TODO(fxbug.dev/57903) Revisit this when refactoring Queue related Inspect.
bool MarkReportAsGarbageCollected(const std::string& local_report_id);
private:
bool Contains(const std::string& local_report_id);
// Inspect node containing the static configuration.
struct Config {
// Inspect node containing the crash server configuration.
struct CrashServerConfig {
inspect::StringProperty upload_policy;
};
CrashServerConfig crash_server;
};
// Inspect node containing the mutable settings.
struct Settings {
inspect::StringProperty upload_policy;
};
// Inspect node containing the store properties.
struct Store {
inspect::UintProperty max_size_in_kb;
inspect::UintProperty num_garbage_collected;
};
// Inspect node containing the queue properties.
// TODO(fxbug.dev/57903) Revisit this when refactoring Queue related Inspect.
struct Queue {
inspect::UintProperty size;
};
// Inspect node for a single report.
// TODO(fxbug.dev/57903) Revisit this when refactoring Queue related Inspect.
struct Report {
Report(const std::string& program_name, const std::string& local_report_id);
const std::string& Path() { return path_; }
inspect::StringProperty creation_time_;
inspect::UintProperty upload_attempts_;
inspect::StringProperty final_state_;
inspect::StringProperty server_id_;
inspect::StringProperty server_creation_time_;
private:
// A |Report|'s path is its location relative to the root Inspect node in the Inspect tree.
//
// E.g., "/reports/$program_name/$local_report_id"
//
// Backslashes in $program_name are replaced with (char)0x07, the ASCII bell character.
std ::string path_;
};
// Inspect node for a single product.
struct Product {
inspect::StringProperty name;
inspect::StringProperty version;
inspect::StringProperty channel;
};
InspectNodeManager node_manager_;
timekeeper::Clock* clock_;
Config config_;
Settings settings_;
Store store_;
Queue queue_;
// Maps a local report ID to a |Report|.
std::map<std::string, Report> reports_;
// Maps a component URL to a |Product|.
std::map<std::string, Product> component_to_products_;
FXL_DISALLOW_COPY_AND_ASSIGN(InspectManager);
};
} // namespace crash_reports
} // namespace forensics
#endif // SRC_DEVELOPER_FORENSICS_CRASH_REPORTS_INFO_INSPECT_MANAGER_H_