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