blob: 689e9ce92bb113099421caf0aa27ccdcfc1f2d09 [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef HEARTD_DAEMON_ACTION_RUNNER_H_
#define HEARTD_DAEMON_ACTION_RUNNER_H_
#include <vector>
#include <base/time/time.h>
#include "heartd/daemon/boot_record.h"
#include "heartd/daemon/dbus_connector.h"
#include "heartd/mojom/heartd.mojom.h"
namespace heartd {
class ActionRunner {
public:
explicit ActionRunner(DbusConnector* dbus_connector);
ActionRunner(const ActionRunner&) = delete;
ActionRunner& operator=(const ActionRunner&) = delete;
~ActionRunner();
void SetupSysrq(int sysrq_fd);
// DryRuns the |action| for service |name|. Will be used by ping to give
// feedback to requester about rate limits and other errors.
::ash::heartd::mojom::HeartbeatResponse DryRun(
::ash::heartd::mojom::ServiceName name,
::ash::heartd::mojom::ActionType action);
// Run the |action| for service |name|.
void Run(::ash::heartd::mojom::ServiceName name,
::ash::heartd::mojom::ActionType action);
// Enables the normal reboot action.
void EnableNormalRebootAction();
// Enables the force reboot action.
void EnableForceRebootAction();
// Disable the normal reboot action.
void DisableNormalRebootAction();
// Disable the force reboot action.
void DisableForceRebootAction();
// Cache the BootRecord result to prevent unlimited reboot action.
void CacheBootRecord(const std::vector<BootRecord>& boot_records);
// Check if there are too many reboot. If it exceeds the threshold, we skip
// the reboot action.
bool IsNormalRebootTooManyTimes();
// Check if there are too many reboot. If it exceeds the threshold, we skip
// the reboot action.
bool IsForceRebootTooManyTimes();
// Configure sync flag.
void SetSyncFlag(bool sync_flag);
private:
// Returns the normal reboot count after a certain time.
int GetNormalRebootCount(const base::Time& time);
// Returns the force reboot count after a certain time.
int GetForceRebootCount(const base::Time& time);
private:
// Unowned pointer. Should outlive this instance.
// Used to communicate with other D-Bus services.
DbusConnector* const dbus_connector_;
// Allows to normal reboot or not.
bool allow_normal_reboot_ = false;
// Allows to force reboot or not.
bool allow_force_reboot_ = false;
// /proc/sysrq-trigger fd.
int sysrq_fd_ = -1;
// Cache the BootRecord result to prevent unlimited reboot action.
std::vector<BootRecord> boot_records_;
// Flag for whether sync before force reboot.
bool sync_flag_ = true;
};
} // namespace heartd
#endif // HEARTD_DAEMON_ACTION_RUNNER_H_