blob: 3d5edb1d0d13c9304592ac58321ac844d8f168d3 [file] [log] [blame]
// 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 INIT_STARTUP_STATEFUL_MOUNT_H_
#define INIT_STARTUP_STATEFUL_MOUNT_H_
#include <memory>
#include <stack>
#include <string>
#include <vector>
#include <base/files/file_path.h>
#include <base/values.h>
#include <metrics/bootstat.h>
#include "init/startup/flags.h"
#include "init/startup/mount_helper.h"
#include "init/startup/startup_dep_impl.h"
namespace startup {
// This is the class for stateful mount functionality. It contains
// the logic and functions used for mounting the stateful partition,
// as well as other functionality related to the stateful partition.
class StatefulMount {
public:
std::vector<std::string> GenerateExt4Features();
StatefulMount(const Flags& flags,
const base::FilePath& root,
const base::FilePath& stateful,
libstorage::Platform* platform,
StartupDep* startup_dep,
MountHelper* mount_helper);
virtual ~StatefulMount() = default;
std::optional<base::Value> GetImageVars(base::FilePath json_file,
std::string key);
base::FilePath GetStateDev();
void ClobberStateful(const std::vector<std::string>& clobber_args,
const std::string& clobber_message);
bool AttemptStatefulMigration();
void MountStateful();
// For testing purposes, allow injecting partition variables,
// instead of gathering them from the local .json file.
void MountStateful(const base::FilePath& root_dev,
const base::Value& image_vars);
bool DevUpdateStatefulPartition(const std::string& args);
void DevGatherLogs(const base::FilePath& base_dir);
void DevMountPackages();
private:
void AppendQuotaFeaturesAndOptions(std::vector<std::string>* sb_options,
std::vector<std::string>* sb_features);
const Flags flags_;
const base::FilePath root_;
const base::FilePath stateful_;
raw_ptr<libstorage::Platform> platform_;
raw_ptr<StartupDep> startup_dep_;
raw_ptr<MountHelper> mount_helper_;
bootstat::BootStat bootstat_;
base::FilePath root_device_;
base::FilePath state_dev_;
std::optional<brillo::VolumeGroup> volume_group_;
std::unique_ptr<libstorage::StorageContainerFactory>
storage_container_factory_;
};
} // namespace startup
#endif // INIT_STARTUP_STATEFUL_MOUNT_H_