xref: /aosp_15_r20/system/apex/apexd/apexd_session.h (revision 33f3758387333dbd2962d7edbd98681940d895da)
1*33f37583SAndroid Build Coastguard Worker /*
2*33f37583SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*33f37583SAndroid Build Coastguard Worker  *
4*33f37583SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*33f37583SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*33f37583SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*33f37583SAndroid Build Coastguard Worker  *
8*33f37583SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*33f37583SAndroid Build Coastguard Worker  *
10*33f37583SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*33f37583SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*33f37583SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33f37583SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*33f37583SAndroid Build Coastguard Worker  * limitations under the License.
15*33f37583SAndroid Build Coastguard Worker  */
16*33f37583SAndroid Build Coastguard Worker 
17*33f37583SAndroid Build Coastguard Worker #ifndef ANDROID_APEXD_APEXD_SESSION_H_
18*33f37583SAndroid Build Coastguard Worker #define ANDROID_APEXD_APEXD_SESSION_H_
19*33f37583SAndroid Build Coastguard Worker 
20*33f37583SAndroid Build Coastguard Worker #include <android-base/result.h>
21*33f37583SAndroid Build Coastguard Worker 
22*33f37583SAndroid Build Coastguard Worker #include "apex_constants.h"
23*33f37583SAndroid Build Coastguard Worker 
24*33f37583SAndroid Build Coastguard Worker #include "session_state.pb.h"
25*33f37583SAndroid Build Coastguard Worker 
26*33f37583SAndroid Build Coastguard Worker #include <optional>
27*33f37583SAndroid Build Coastguard Worker 
28*33f37583SAndroid Build Coastguard Worker namespace android {
29*33f37583SAndroid Build Coastguard Worker namespace apex {
30*33f37583SAndroid Build Coastguard Worker 
31*33f37583SAndroid Build Coastguard Worker // Starting from R, apexd prefers /metadata partition (kNewApexSessionsDir) as
32*33f37583SAndroid Build Coastguard Worker // location for sessions-related information. For devices that don't have
33*33f37583SAndroid Build Coastguard Worker // /metadata partition, apexd will fallback to the /data one
34*33f37583SAndroid Build Coastguard Worker // (kOldApexSessionsDir).
35*33f37583SAndroid Build Coastguard Worker static constexpr const char* kOldApexSessionsDir = "/data/apex/sessions";
36*33f37583SAndroid Build Coastguard Worker static constexpr const char* kNewApexSessionsDir = "/metadata/apex/sessions";
37*33f37583SAndroid Build Coastguard Worker 
38*33f37583SAndroid Build Coastguard Worker // Returns top-level directory to store sessions metadata in.
39*33f37583SAndroid Build Coastguard Worker // If device has /metadata partition, this will return
40*33f37583SAndroid Build Coastguard Worker // /metadata/apex/sessions, on all other devices it will return
41*33f37583SAndroid Build Coastguard Worker // /data/apex/sessions.
42*33f37583SAndroid Build Coastguard Worker std::string GetSessionsDir();
43*33f37583SAndroid Build Coastguard Worker 
44*33f37583SAndroid Build Coastguard Worker // TODO(b/288309411): remove static functions in this class.
45*33f37583SAndroid Build Coastguard Worker class ApexSession {
46*33f37583SAndroid Build Coastguard Worker  public:
47*33f37583SAndroid Build Coastguard Worker   ApexSession() = delete;
48*33f37583SAndroid Build Coastguard Worker 
49*33f37583SAndroid Build Coastguard Worker   const google::protobuf::RepeatedField<int> GetChildSessionIds() const;
50*33f37583SAndroid Build Coastguard Worker   ::apex::proto::SessionState::State GetState() const;
51*33f37583SAndroid Build Coastguard Worker   int GetId() const;
52*33f37583SAndroid Build Coastguard Worker   const std::string& GetBuildFingerprint() const;
53*33f37583SAndroid Build Coastguard Worker   const std::string& GetCrashingNativeProcess() const;
54*33f37583SAndroid Build Coastguard Worker   const std::string& GetErrorMessage() const;
55*33f37583SAndroid Build Coastguard Worker   bool IsFinalized() const;
56*33f37583SAndroid Build Coastguard Worker   bool HasRollbackEnabled() const;
57*33f37583SAndroid Build Coastguard Worker   bool IsRollback() const;
58*33f37583SAndroid Build Coastguard Worker   int GetRollbackId() const;
59*33f37583SAndroid Build Coastguard Worker   const google::protobuf::RepeatedPtrField<std::string> GetApexNames() const;
60*33f37583SAndroid Build Coastguard Worker   const google::protobuf::RepeatedPtrField<std::string> GetApexFileHashes()
61*33f37583SAndroid Build Coastguard Worker       const;
62*33f37583SAndroid Build Coastguard Worker   const std::string& GetSessionDir() const;
63*33f37583SAndroid Build Coastguard Worker 
64*33f37583SAndroid Build Coastguard Worker   void SetChildSessionIds(const std::vector<int>& child_session_ids);
65*33f37583SAndroid Build Coastguard Worker   void SetBuildFingerprint(const std::string& fingerprint);
66*33f37583SAndroid Build Coastguard Worker   void SetHasRollbackEnabled(const bool enabled);
67*33f37583SAndroid Build Coastguard Worker   void SetIsRollback(const bool is_rollback);
68*33f37583SAndroid Build Coastguard Worker   void SetRollbackId(const int rollback_id);
69*33f37583SAndroid Build Coastguard Worker   void SetCrashingNativeProcess(const std::string& crashing_process);
70*33f37583SAndroid Build Coastguard Worker   void SetErrorMessage(const std::string& error_message);
71*33f37583SAndroid Build Coastguard Worker   void AddApexName(const std::string& apex_name);
72*33f37583SAndroid Build Coastguard Worker   void SetApexFileHashes(const std::vector<std::string>& hashes);
73*33f37583SAndroid Build Coastguard Worker 
74*33f37583SAndroid Build Coastguard Worker   android::base::Result<void> UpdateStateAndCommit(
75*33f37583SAndroid Build Coastguard Worker       const ::apex::proto::SessionState::State& state);
76*33f37583SAndroid Build Coastguard Worker 
77*33f37583SAndroid Build Coastguard Worker   android::base::Result<void> DeleteSession() const;
78*33f37583SAndroid Build Coastguard Worker 
79*33f37583SAndroid Build Coastguard Worker   // Returns the directories containing the apexes staged for this session.
80*33f37583SAndroid Build Coastguard Worker   std::vector<std::string> GetStagedApexDirs(
81*33f37583SAndroid Build Coastguard Worker       const std::string& staged_session_dir) const;
82*33f37583SAndroid Build Coastguard Worker 
83*33f37583SAndroid Build Coastguard Worker   friend class ApexSessionManager;
84*33f37583SAndroid Build Coastguard Worker 
85*33f37583SAndroid Build Coastguard Worker  private:
86*33f37583SAndroid Build Coastguard Worker   ApexSession(::apex::proto::SessionState state, std::string session_dir);
87*33f37583SAndroid Build Coastguard Worker   ::apex::proto::SessionState state_;
88*33f37583SAndroid Build Coastguard Worker   std::string session_dir_;
89*33f37583SAndroid Build Coastguard Worker };
90*33f37583SAndroid Build Coastguard Worker 
91*33f37583SAndroid Build Coastguard Worker class ApexSessionManager {
92*33f37583SAndroid Build Coastguard Worker  public:
93*33f37583SAndroid Build Coastguard Worker   ApexSessionManager(ApexSessionManager&&) noexcept;
94*33f37583SAndroid Build Coastguard Worker   ApexSessionManager& operator=(ApexSessionManager&&) noexcept;
95*33f37583SAndroid Build Coastguard Worker 
96*33f37583SAndroid Build Coastguard Worker   static std::unique_ptr<ApexSessionManager> Create(
97*33f37583SAndroid Build Coastguard Worker       std::string sessions_base_dir);
98*33f37583SAndroid Build Coastguard Worker 
99*33f37583SAndroid Build Coastguard Worker   android::base::Result<ApexSession> CreateSession(int session_id);
100*33f37583SAndroid Build Coastguard Worker   android::base::Result<ApexSession> GetSession(int session_id) const;
101*33f37583SAndroid Build Coastguard Worker   std::vector<ApexSession> GetSessions() const;
102*33f37583SAndroid Build Coastguard Worker   std::vector<ApexSession> GetSessionsInState(
103*33f37583SAndroid Build Coastguard Worker       const ::apex::proto::SessionState::State& state) const;
104*33f37583SAndroid Build Coastguard Worker 
105*33f37583SAndroid Build Coastguard Worker   android::base::Result<void> MigrateFromOldSessionsDir(
106*33f37583SAndroid Build Coastguard Worker       const std::string& old_sessions_base_dir);
107*33f37583SAndroid Build Coastguard Worker 
108*33f37583SAndroid Build Coastguard Worker   bool HasActiveSession();
109*33f37583SAndroid Build Coastguard Worker   void DeleteFinalizedSessions();
110*33f37583SAndroid Build Coastguard Worker 
111*33f37583SAndroid Build Coastguard Worker  private:
112*33f37583SAndroid Build Coastguard Worker   explicit ApexSessionManager(std::string sessions_base_dir);
113*33f37583SAndroid Build Coastguard Worker   ApexSessionManager(const ApexSessionManager&) = delete;
114*33f37583SAndroid Build Coastguard Worker   ApexSessionManager& operator=(const ApexSessionManager&) = delete;
115*33f37583SAndroid Build Coastguard Worker 
116*33f37583SAndroid Build Coastguard Worker   std::string sessions_base_dir_;
117*33f37583SAndroid Build Coastguard Worker };
118*33f37583SAndroid Build Coastguard Worker 
119*33f37583SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const ApexSession& session);
120*33f37583SAndroid Build Coastguard Worker 
121*33f37583SAndroid Build Coastguard Worker }  // namespace apex
122*33f37583SAndroid Build Coastguard Worker }  // namespace android
123*33f37583SAndroid Build Coastguard Worker 
124*33f37583SAndroid Build Coastguard Worker #endif  // ANDROID_APEXD_APEXD_SESSION_H
125