1 //
2 // Copyright (C) 2017 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "update_engine/update_manager/interactive_update_policy_impl.h"
18 
19 using chromeos_update_engine::ErrorCode;
20 using chromeos_update_engine::InstallPlan;
21 
22 namespace chromeos_update_manager {
23 
24 // Check to see if an interactive update was requested.
25 EvalStatus InteractiveUpdatePolicyImpl::UpdateCheckAllowed(
26     EvaluationContext* ec,
27     State* state,
28     std::string* error,
29     UpdateCheckParams* result) const {
30   bool interactive;
31   if (CheckInteractiveUpdateRequested(
32           ec, state->updater_provider(), &interactive)) {
33     result->interactive = interactive;
34     LOG(INFO) << "Forced update signaled ("
35               << (interactive ? "interactive" : "periodic")
36               << "), allowing update check.";
37     return EvalStatus::kSucceeded;
38   }
39   return EvalStatus::kContinue;
40 }
41 
42 EvalStatus InteractiveUpdatePolicyImpl::UpdateCanBeApplied(
43     EvaluationContext* ec,
44     State* state,
45     std::string* error,
46     ErrorCode* result,
47     InstallPlan* install_plan) const {
48   bool interactive;
49   if (CheckInteractiveUpdateRequested(
50           ec, state->updater_provider(), &interactive)) {
51     LOG(INFO) << "Forced update signaled ("
52               << (interactive ? "interactive" : "periodic")
53               << "), allowing update to be applied.";
54     *result = ErrorCode::kSuccess;
55     return EvalStatus::kSucceeded;
56   }
57   return EvalStatus::kContinue;
58 }
59 
60 bool InteractiveUpdatePolicyImpl::CheckInteractiveUpdateRequested(
61     EvaluationContext* ec,
62     UpdaterProvider* const updater_provider,
63     bool* interactive_out) const {
64   // First, check to see if an interactive update was requested.
65   const UpdateRequestStatus* forced_update_requested_p =
66       ec->GetValue(updater_provider->var_forced_update_requested());
67   if (forced_update_requested_p != nullptr &&
68       *forced_update_requested_p != UpdateRequestStatus::kNone) {
69     if (interactive_out)
70       *interactive_out =
71           (*forced_update_requested_p == UpdateRequestStatus::kInteractive);
72     return true;
73   }
74   return false;
75 }
76 
77 }  // namespace chromeos_update_manager
78