| // Copyright 2022 The ChromiumOS Authors. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LVMD_LVMD_H_ |
| #define LVMD_LVMD_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include <base/callback.h> |
| #include <base/cancelable_callback.h> |
| #include <base/memory/weak_ptr.h> |
| #include <brillo/daemons/dbus_daemon.h> |
| #include <brillo/blkdev_utils/lvm.h> |
| #include <lvmd/proto_bindings/lvmd.pb.h> |
| #include <sysexits.h> |
| |
| #include "lvmd/dbus_adaptors/org.chromium.Lvmd.h" |
| |
| namespace lvmd { |
| |
| class Lvmd : public brillo::DBusServiceDaemon, |
| public org::chromium::LvmdInterface { |
| public: |
| explicit Lvmd(std::unique_ptr<brillo::LogicalVolumeManager> lvm); |
| Lvmd(const Lvmd&) = delete; |
| Lvmd& operator=(const Lvmd&) = delete; |
| ~Lvmd() = default; |
| |
| // org::chromium::LvmdInterface overrides. |
| |
| // Returns the physical volumes on device, if it exists. |
| bool GetPhysicalVolume(brillo::ErrorPtr* error, |
| const std::string& in_device_path, |
| lvmd::PhysicalVolume* out_physical_volume) override; |
| |
| // Returns the volume group on a physical volume, if it exists. |
| bool GetVolumeGroup(brillo::ErrorPtr* error, |
| const lvmd::PhysicalVolume& in_physical_volume, |
| lvmd::VolumeGroup* out_volume_group) override; |
| |
| // Returns the thinpool on a volume group, if it exists. |
| bool GetThinpool(brillo::ErrorPtr* error, |
| const lvmd::VolumeGroup& in_volume_group, |
| const std::string& in_thinpool_name, |
| lvmd::Thinpool* out_thinpool) override; |
| |
| // Returns the list of logical volumes, if any exists. |
| bool ListLogicalVolumes( |
| brillo::ErrorPtr* error, |
| const lvmd::VolumeGroup& in_volume_group, |
| lvmd::LogicalVolumeList* out_logical_volume_list) override; |
| |
| // Returns the logical volume, if it exists. |
| bool GetLogicalVolume(brillo::ErrorPtr* error, |
| const lvmd::VolumeGroup& in_volume_group, |
| const std::string& in_logical_volume_name, |
| lvmd::LogicalVolume* out_logical_volume) override; |
| |
| // Returns the logical volume created. |
| bool CreateLogicalVolume( |
| brillo::ErrorPtr* error, |
| const lvmd::Thinpool& in_thinpool, |
| const lvmd::LogicalVolumeConfiguration& in_logical_volume_configuration, |
| lvmd::LogicalVolume* out_logical_volume) override; |
| |
| // Removes the logical volume, if it exists. |
| bool RemoveLogicalVolume( |
| brillo::ErrorPtr* error, |
| const lvmd::LogicalVolume& in_logical_volume) override; |
| |
| protected: |
| int OnInit() override; |
| void RegisterDBusObjectsAsync( |
| brillo::dbus_utils::AsyncEventSequencer* sequencer) override; |
| void OnShutdown(int* return_code) override; |
| |
| private: |
| void PostponeShutdown(); |
| |
| // Daemon will automatically shutdown after this length of idle time. |
| static constexpr base::TimeDelta kShutdownTimeout = base::Seconds(30); |
| |
| // The shutdown callback so daemon can shutdown. |
| base::CancelableRepeatingClosure shutdown_callback_; |
| |
| // The brillo library implementation of managing logical volumes. |
| std::unique_ptr<brillo::LogicalVolumeManager> lvm_; |
| |
| // DBus related members. |
| std::unique_ptr<brillo::dbus_utils::DBusObject> dbus_object_; |
| org::chromium::LvmdAdaptor dbus_adaptor_{this}; |
| |
| base::WeakPtrFactory<Lvmd> weak_factory_{this}; |
| }; |
| |
| } // namespace lvmd |
| |
| #endif // LVMD_LVMD_H_ |