blob: 8eb40c9a2f70968308a64fe6996194306fafee8e [file] [log] [blame]
// Copyright 2020 The Cobalt Authors. All Rights Reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
#include <string>
#include "base/files/file_path.h"
#include "base/version.h"
#include "cobalt/extension/installation_manager.h"
namespace update_client {
// Installation slot management logic for the Cobalt Updater.
// Multiple apps share the same installation slots on the file
// system but do keep individual metadata for the slot selection.
// Locking of the slots is performed through timestamped drain files.
// And each app marks the slot installation as good by using a
// good file.
class CobaltSlotManagement {
// Initialize with the |installation_api| extension.
bool Init(const CobaltExtensionInstallationManagerApi* installation_api);
// Selects the slot to use for the installation. The selected |dir| is
// populated if the selection was successful.
bool SelectSlot(base::FilePath* dir);
// The slot selection will be confirmed if the function returns true.
// The |dir| path will be used to perform the installation.
bool ConfirmSlot(const base::FilePath& dir);
CobaltSlotManagement(const CobaltSlotManagement&) = delete;
CobaltSlotManagement& operator=(CobaltSlotManagement&&) = delete;
void operator=(const CobaltSlotManagement&) = delete;
// Returns the selected index for the installation slot.
int GetInstallationIndex();
// Cleanup all drain files of the current app.
void CleanupAllDrainFiles();
int installation_index_ = IM_EXT_INVALID_INDEX;
const CobaltExtensionInstallationManagerApi* installation_api_;
std::string app_key_;
bool initialized_ = false;
// Creates a good file and rolls forward to the installation in
// the specified |installation_index| and |dir| for the app
// identified by |app_key|.
bool CobaltFinishInstallation(
const CobaltExtensionInstallationManagerApi* installation_api,
int installation_index,
const std::string& dir,
const std::string& app_key);
// Performs a quick installation for the current app by
// upgrading it locally to the latest Cobalt version successfully
// installed by a different app.
bool CobaltQuickUpdate(
const CobaltExtensionInstallationManagerApi* installation_api,
const base::Version& current_version);
// Computes whether Cobalt should skip the update based on the
// |min_free_space_bytes|, the |free_space_bytes| and the amount of
// space that can be recovered from |installation_cleanup_size|.
// The default behavior is to NOT skip unless the measurements
// show that there isn't enough space to perform the update.
bool CobaltSkipUpdate(
const CobaltExtensionInstallationManagerApi* installation_api,
uint64_t min_free_space_bytes,
int64_t free_space_bytes,
uint64_t installation_cleanup_size);
// Computes the installation cleanup size by taking the min space
// from all the installation slots excluding the system slot 0.
uint64_t CobaltInstallationCleanupSize(
const CobaltExtensionInstallationManagerApi* installation_api);
} // namespace update_client