blob: 88bd90a94539b8daec99283677250d0a01acc5f5 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2010 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//
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070016
Gilad Arnoldcf175a02014-07-10 16:48:47 -070017#ifndef UPDATE_ENGINE_DBUS_SERVICE_H_
18#define UPDATE_ENGINE_DBUS_SERVICE_H_
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070019
20#include <inttypes.h>
Alex Vakulenko44cab302014-07-23 13:12:15 -070021
Alex Deymob7ca0962014-10-01 17:58:07 -070022#include <string>
23
24#include <base/memory/ref_counted.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070025#include <brillo/errors/error.h>
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070026
27#include "update_engine/update_attempter.h"
28
Alex Deymo6f20dd42015-08-18 16:42:46 -070029#include "dbus_bindings/org.chromium.UpdateEngineInterface.h"
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070030
Alex Deymob7ca0962014-10-01 17:58:07 -070031namespace chromeos_update_engine {
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070032
Alex Deymob7ca0962014-10-01 17:58:07 -070033class UpdateEngineService
34 : public org::chromium::UpdateEngineInterfaceInterface {
35 public:
36 explicit UpdateEngineService(SystemState* system_state);
37 virtual ~UpdateEngineService() = default;
38
39 // Implementation of org::chromium::UpdateEngineInterfaceInterface.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070040 bool AttemptUpdate(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -070041 const std::string& in_app_version,
42 const std::string& in_omaha_url) override;
43
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070044 bool AttemptUpdateWithFlags(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -070045 const std::string& in_app_version,
46 const std::string& in_omaha_url,
47 int32_t in_flags_as_int) override;
48
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070049 bool AttemptRollback(brillo::ErrorPtr* error, bool in_powerwash) override;
Alex Deymob7ca0962014-10-01 17:58:07 -070050
51 // Checks if the system rollback is available by verifying if the secondary
52 // system partition is valid and bootable.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070053 bool CanRollback(brillo::ErrorPtr* error, bool* out_can_rollback) override;
Alex Deymob7ca0962014-10-01 17:58:07 -070054
55 // Resets the status of the update_engine to idle, ignoring any applied
56 // update. This is used for development only.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070057 bool ResetStatus(brillo::ErrorPtr* error) override;
Alex Deymob7ca0962014-10-01 17:58:07 -070058
59 // Returns the current status of the Update Engine. If an update is in
60 // progress, the number of operations, size to download and overall progress
61 // is reported.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070062 bool GetStatus(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -070063 int64_t* out_last_checked_time,
64 double* out_progress,
65 std::string* out_current_operation,
66 std::string* out_new_version,
67 int64_t* out_new_size) override;
68
69 // Reboots the device if an update is applied and a reboot is required.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070070 bool RebootIfNeeded(brillo::ErrorPtr* error) override;
Alex Deymob7ca0962014-10-01 17:58:07 -070071
72 // Changes the current channel of the device to the target channel. If the
73 // target channel is a less stable channel than the current channel, then the
74 // channel change happens immediately (at the next update check). If the
75 // target channel is a more stable channel, then if is_powerwash_allowed is
76 // set to true, then also the change happens immediately but with a powerwash
77 // if required. Otherwise, the change takes effect eventually (when the
78 // version on the target channel goes above the version number of what the
79 // device currently has).
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070080 bool SetChannel(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -070081 const std::string& in_target_channel,
82 bool in_is_powerwash_allowed) override;
83
84 // If get_current_channel is set to true, populates |channel| with the name of
85 // the channel that the device is currently on. Otherwise, it populates it
86 // with the name of the channel the device is supposed to be (in case of a
87 // pending channel change).
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070088 bool GetChannel(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -070089 bool in_get_current_channel,
90 std::string* out_channel) override;
91
92 // Enables or disables the sharing and consuming updates over P2P feature
93 // according to the |enabled| argument passed.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070094 bool SetP2PUpdatePermission(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -070095 bool in_enabled) override;
96
97 // Returns the current value for the P2P enabled setting. This involves both
98 // sharing and consuming updates over P2P.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070099 bool GetP2PUpdatePermission(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -0700100 bool* out_enabled) override;
101
102 // If there's no device policy installed, sets the update over cellular
103 // networks permission to the |allowed| value. Otherwise, this method returns
104 // with an error since this setting is overridden by the applied policy.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700105 bool SetUpdateOverCellularPermission(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -0700106 bool in_allowed) override;
107
108 // Returns the current value of the update over cellular network setting,
109 // either forced by the device policy if the device is enrolled or the current
110 // user preference otherwise.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700111 bool GetUpdateOverCellularPermission(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -0700112 bool* out_allowed) override;
113
114 // Returns the duration since the last successful update, as the
115 // duration on the wallclock. Returns an error if the device has not
116 // updated.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700117 bool GetDurationSinceUpdate(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -0700118 int64_t* out_usec_wallclock) override;
119
120 // Returns the version string of OS that was used before the last reboot
121 // into an updated version. This is available only when rebooting into an
122 // update from previous version, otherwise an empty string is returned.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700123 bool GetPrevVersion(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -0700124 std::string* out_prev_version) override;
125
Alex Deymob7ca0962014-10-01 17:58:07 -0700126 // Returns the name of kernel partition that can be rolled back into.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700127 bool GetRollbackPartition(brillo::ErrorPtr* error,
Alex Deymob7ca0962014-10-01 17:58:07 -0700128 std::string* out_rollback_partition_name) override;
129
130 private:
131 SystemState* system_state_;
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700132};
133
Alex Deymob7ca0962014-10-01 17:58:07 -0700134// The UpdateEngineAdaptor class runs the UpdateEngineInterface in the fixed
135// object path, without an ObjectManager notifying the interfaces, since it is
136// all static and clients don't expect it to be implemented.
137class UpdateEngineAdaptor : public org::chromium::UpdateEngineInterfaceAdaptor {
138 public:
139 UpdateEngineAdaptor(SystemState* system_state,
140 const scoped_refptr<dbus::Bus>& bus);
141 ~UpdateEngineAdaptor() = default;
142
143 // Register the DBus object with the update engine service asynchronously.
144 // Calls |copmletion_callback| when done passing a boolean indicating if the
145 // registration succeeded.
146 void RegisterAsync(const base::Callback<void(bool)>& completion_callback);
147
148 // Takes ownership of the well-known DBus name and returns whether it
149 // succeeded.
150 bool RequestOwnership();
151
152 private:
153 scoped_refptr<dbus::Bus> bus_;
154 UpdateEngineService dbus_service_;
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700155 brillo::dbus_utils::DBusObject dbus_object_;
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700156};
157
Alex Deymob7ca0962014-10-01 17:58:07 -0700158} // namespace chromeos_update_engine
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700159
Gilad Arnoldcf175a02014-07-10 16:48:47 -0700160#endif // UPDATE_ENGINE_DBUS_SERVICE_H_