1*20733378SAndroid Build Coastguard Worker /* 2*20733378SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*20733378SAndroid Build Coastguard Worker * 4*20733378SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*20733378SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*20733378SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*20733378SAndroid Build Coastguard Worker * 8*20733378SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*20733378SAndroid Build Coastguard Worker * 10*20733378SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*20733378SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*20733378SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*20733378SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*20733378SAndroid Build Coastguard Worker * limitations under the License. 15*20733378SAndroid Build Coastguard Worker */ 16*20733378SAndroid Build Coastguard Worker 17*20733378SAndroid Build Coastguard Worker #pragma once 18*20733378SAndroid Build Coastguard Worker 19*20733378SAndroid Build Coastguard Worker #include <string> 20*20733378SAndroid Build Coastguard Worker #include <android-base/result.h> 21*20733378SAndroid Build Coastguard Worker #include <aconfigd.pb.h> 22*20733378SAndroid Build Coastguard Worker 23*20733378SAndroid Build Coastguard Worker #include "storage_files_manager.h" 24*20733378SAndroid Build Coastguard Worker 25*20733378SAndroid Build Coastguard Worker namespace android { 26*20733378SAndroid Build Coastguard Worker namespace aconfigd { 27*20733378SAndroid Build Coastguard Worker 28*20733378SAndroid Build Coastguard Worker /// Aconfigd socket name 29*20733378SAndroid Build Coastguard Worker static constexpr char kAconfigdSocket[] = "aconfigd"; 30*20733378SAndroid Build Coastguard Worker 31*20733378SAndroid Build Coastguard Worker /// Aconfigd root dir 32*20733378SAndroid Build Coastguard Worker static constexpr char kAconfigdRootDir[] = "/metadata/aconfig"; 33*20733378SAndroid Build Coastguard Worker 34*20733378SAndroid Build Coastguard Worker /// Persistent storage records pb file full path 35*20733378SAndroid Build Coastguard Worker static constexpr char kPersistentStorageRecordsFileName[] = 36*20733378SAndroid Build Coastguard Worker "/metadata/aconfig/storage_records.pb"; 37*20733378SAndroid Build Coastguard Worker 38*20733378SAndroid Build Coastguard Worker class Aconfigd { 39*20733378SAndroid Build Coastguard Worker public: 40*20733378SAndroid Build Coastguard Worker 41*20733378SAndroid Build Coastguard Worker /// constructor Aconfigd(const std::string & root_dir,const std::string & persist_storage_records)42*20733378SAndroid Build Coastguard Worker Aconfigd(const std::string& root_dir, 43*20733378SAndroid Build Coastguard Worker const std::string& persist_storage_records) 44*20733378SAndroid Build Coastguard Worker : root_dir_(root_dir) 45*20733378SAndroid Build Coastguard Worker , persist_storage_records_(persist_storage_records) 46*20733378SAndroid Build Coastguard Worker , storage_files_manager_(nullptr) { 47*20733378SAndroid Build Coastguard Worker storage_files_manager_.reset(new StorageFilesManager(root_dir_)); 48*20733378SAndroid Build Coastguard Worker } 49*20733378SAndroid Build Coastguard Worker 50*20733378SAndroid Build Coastguard Worker /// destructor 51*20733378SAndroid Build Coastguard Worker ~Aconfigd() = default; 52*20733378SAndroid Build Coastguard Worker 53*20733378SAndroid Build Coastguard Worker /// no copy 54*20733378SAndroid Build Coastguard Worker Aconfigd(const Aconfigd&) = delete; 55*20733378SAndroid Build Coastguard Worker Aconfigd& operator=(const Aconfigd&) = delete; 56*20733378SAndroid Build Coastguard Worker 57*20733378SAndroid Build Coastguard Worker /// move constructor and assignment Aconfigd(Aconfigd && rhs)58*20733378SAndroid Build Coastguard Worker Aconfigd(Aconfigd&& rhs) 59*20733378SAndroid Build Coastguard Worker : root_dir_(rhs.root_dir_) 60*20733378SAndroid Build Coastguard Worker , persist_storage_records_(rhs.persist_storage_records_) 61*20733378SAndroid Build Coastguard Worker , storage_files_manager_(std::move(rhs.storage_files_manager_)) 62*20733378SAndroid Build Coastguard Worker {} 63*20733378SAndroid Build Coastguard Worker Aconfigd& operator=(Aconfigd&& rhs) = delete; 64*20733378SAndroid Build Coastguard Worker 65*20733378SAndroid Build Coastguard Worker public: 66*20733378SAndroid Build Coastguard Worker 67*20733378SAndroid Build Coastguard Worker /// Initialize in memory aconfig storage records 68*20733378SAndroid Build Coastguard Worker base::Result<void> InitializeInMemoryStorageRecords(); 69*20733378SAndroid Build Coastguard Worker 70*20733378SAndroid Build Coastguard Worker /// Initialize platform RO partition flag storage 71*20733378SAndroid Build Coastguard Worker base::Result<void> InitializePlatformStorage(); 72*20733378SAndroid Build Coastguard Worker 73*20733378SAndroid Build Coastguard Worker /// Initialize mainline flag storage 74*20733378SAndroid Build Coastguard Worker base::Result<void> InitializeMainlineStorage(); 75*20733378SAndroid Build Coastguard Worker 76*20733378SAndroid Build Coastguard Worker /// Handle incoming messages to aconfigd socket 77*20733378SAndroid Build Coastguard Worker base::Result<void> HandleSocketRequest(const StorageRequestMessage& message, 78*20733378SAndroid Build Coastguard Worker StorageReturnMessage& return_message); 79*20733378SAndroid Build Coastguard Worker 80*20733378SAndroid Build Coastguard Worker private: 81*20733378SAndroid Build Coastguard Worker 82*20733378SAndroid Build Coastguard Worker /// Handle a flag override request 83*20733378SAndroid Build Coastguard Worker base::Result<void> HandleFlagOverride( 84*20733378SAndroid Build Coastguard Worker const StorageRequestMessage::FlagOverrideMessage& msg, 85*20733378SAndroid Build Coastguard Worker StorageReturnMessage& return_msg); 86*20733378SAndroid Build Coastguard Worker 87*20733378SAndroid Build Coastguard Worker /// Handle OTA flag staging request 88*20733378SAndroid Build Coastguard Worker base::Result<void> HandleOTAStaging( 89*20733378SAndroid Build Coastguard Worker const StorageRequestMessage::OTAFlagStagingMessage& msg, 90*20733378SAndroid Build Coastguard Worker StorageReturnMessage& return_msg); 91*20733378SAndroid Build Coastguard Worker 92*20733378SAndroid Build Coastguard Worker /// Handle new storage request 93*20733378SAndroid Build Coastguard Worker base::Result<void> HandleNewStorage( 94*20733378SAndroid Build Coastguard Worker const StorageRequestMessage::NewStorageMessage& msg, 95*20733378SAndroid Build Coastguard Worker StorageReturnMessage& return_msg); 96*20733378SAndroid Build Coastguard Worker 97*20733378SAndroid Build Coastguard Worker /// Handle a flag query request 98*20733378SAndroid Build Coastguard Worker base::Result<void> HandleFlagQuery( 99*20733378SAndroid Build Coastguard Worker const StorageRequestMessage::FlagQueryMessage& msg, 100*20733378SAndroid Build Coastguard Worker StorageReturnMessage& return_msg); 101*20733378SAndroid Build Coastguard Worker 102*20733378SAndroid Build Coastguard Worker /// Handle override removal request 103*20733378SAndroid Build Coastguard Worker base::Result<void> HandleLocalOverrideRemoval( 104*20733378SAndroid Build Coastguard Worker const StorageRequestMessage::RemoveLocalOverrideMessage& msg, 105*20733378SAndroid Build Coastguard Worker StorageReturnMessage& return_msg); 106*20733378SAndroid Build Coastguard Worker 107*20733378SAndroid Build Coastguard Worker /// Handle storage reset 108*20733378SAndroid Build Coastguard Worker base::Result<void> HandleStorageReset(StorageReturnMessage& return_msg); 109*20733378SAndroid Build Coastguard Worker 110*20733378SAndroid Build Coastguard Worker /// Handle list storage 111*20733378SAndroid Build Coastguard Worker base::Result<void> HandleListStorage( 112*20733378SAndroid Build Coastguard Worker const StorageRequestMessage::ListStorageMessage& msg, 113*20733378SAndroid Build Coastguard Worker StorageReturnMessage& return_message); 114*20733378SAndroid Build Coastguard Worker 115*20733378SAndroid Build Coastguard Worker /// Read OTA flag overrides to be applied for current build 116*20733378SAndroid Build Coastguard Worker base::Result<std::vector<FlagOverride>> ReadOTAFlagOverridesToApply(); 117*20733378SAndroid Build Coastguard Worker 118*20733378SAndroid Build Coastguard Worker private: 119*20733378SAndroid Build Coastguard Worker 120*20733378SAndroid Build Coastguard Worker /// root storage dir 121*20733378SAndroid Build Coastguard Worker const std::string root_dir_; 122*20733378SAndroid Build Coastguard Worker 123*20733378SAndroid Build Coastguard Worker /// persist storage records pb file 124*20733378SAndroid Build Coastguard Worker const std::string persist_storage_records_; 125*20733378SAndroid Build Coastguard Worker 126*20733378SAndroid Build Coastguard Worker /// storage files manager 127*20733378SAndroid Build Coastguard Worker std::unique_ptr<StorageFilesManager> storage_files_manager_; 128*20733378SAndroid Build Coastguard Worker }; 129*20733378SAndroid Build Coastguard Worker 130*20733378SAndroid Build Coastguard Worker } // namespace aconfigd 131*20733378SAndroid Build Coastguard Worker } // namespace android 132