xref: /aosp_15_r20/system/server_configurable_flags/aconfigd/include/aconfigd.h (revision 207333786ba243bc7d4d69ef6b05487aa7071806)
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