1 //
2 // Copyright (C) 2015 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/daemon.h"
18
19 #include <sysexits.h>
20
21 #include <base/bind.h>
22 #include <base/location.h>
23 #if USE_BINDER
24 #include <binderwrapper/binder_wrapper.h>
25 #endif // USE_BINDER
26
27 #if USE_OMAHA
28 #include "update_engine/real_system_state.h"
29 #else // !USE_OMAHA
30 #include "update_engine/daemon_state_android.h"
31 #endif // USE_OMAHA
32
33 namespace chromeos_update_engine {
34
OnInit()35 int UpdateEngineDaemon::OnInit() {
36 // Register the |subprocess_| singleton with this Daemon as the signal
37 // handler.
38 subprocess_.Init(this);
39
40 int exit_code = Daemon::OnInit();
41 if (exit_code != EX_OK)
42 return exit_code;
43
44 #if USE_BINDER
45 android::BinderWrapper::Create();
46 binder_watcher_.Init();
47 #endif // USE_BINDER
48
49 #if USE_OMAHA
50 // Initialize update engine global state but continue if something fails.
51 // TODO(deymo): Move the daemon_state_ initialization to a factory method
52 // avoiding the explicit re-usage of the |bus| instance, shared between
53 // D-Bus service and D-Bus client calls.
54 RealSystemState* real_system_state = new RealSystemState();
55 daemon_state_.reset(real_system_state);
56 LOG_IF(ERROR, !real_system_state->Initialize())
57 << "Failed to initialize system state.";
58 #else // !USE_OMAHA
59 DaemonStateAndroid* daemon_state_android = new DaemonStateAndroid();
60 daemon_state_.reset(daemon_state_android);
61 LOG_IF(ERROR, !daemon_state_android->Initialize())
62 << "Failed to initialize system state.";
63 #endif // USE_OMAHA
64
65 #if USE_BINDER
66 // Create the Binder Service.
67 #if USE_OMAHA
68 binder_service_ = new BinderUpdateEngineBrilloService{real_system_state};
69 #else // !USE_OMAHA
70 binder_service_ = new BinderUpdateEngineAndroidService{
71 daemon_state_android->service_delegate()};
72 #endif // USE_OMAHA
73 auto binder_wrapper = android::BinderWrapper::Get();
74 if (!binder_wrapper->RegisterService(binder_service_->ServiceName(),
75 binder_service_)) {
76 LOG(ERROR) << "Failed to register binder service.";
77 }
78
79 daemon_state_->AddObserver(binder_service_.get());
80 #endif // USE_BINDER
81
82 #if USE_DBUS
83 // Create the DBus service.
84 dbus_adaptor_.reset(new UpdateEngineAdaptor(real_system_state));
85 daemon_state_->AddObserver(dbus_adaptor_.get());
86
87 dbus_adaptor_->RegisterAsync(base::Bind(&UpdateEngineDaemon::OnDBusRegistered,
88 base::Unretained(this)));
89 LOG(INFO) << "Waiting for DBus object to be registered.";
90 #else // !USE_DBUS
91 daemon_state_->StartUpdater();
92 #endif // USE_DBUS
93 return EX_OK;
94 }
95
96 #if USE_DBUS
OnDBusRegistered(bool succeeded)97 void UpdateEngineDaemon::OnDBusRegistered(bool succeeded) {
98 if (!succeeded) {
99 LOG(ERROR) << "Registering the UpdateEngineAdaptor";
100 QuitWithExitCode(1);
101 return;
102 }
103
104 // Take ownership of the service now that everything is initialized. We need
105 // to this now and not before to avoid exposing a well known DBus service
106 // path that doesn't have the service it is supposed to implement.
107 if (!dbus_adaptor_->RequestOwnership()) {
108 LOG(ERROR) << "Unable to take ownership of the DBus service, is there "
109 << "other update_engine daemon running?";
110 QuitWithExitCode(1);
111 return;
112 }
113 daemon_state_->StartUpdater();
114 }
115 #endif // USE_DBUS
116
117 } // namespace chromeos_update_engine
118