| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <tr1/memory> | 6 #include <tr1/memory> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include <gflags/gflags.h> | 9 #include <gflags/gflags.h> |
| 10 #include <glib.h> | 10 #include <glib.h> |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 gboolean UpdateBootFlags(void* arg) { | 39 gboolean UpdateBootFlags(void* arg) { |
| 40 // This purely best effort. Failures should be logged by Subprocess. | 40 // This purely best effort. Failures should be logged by Subprocess. |
| 41 int unused = 0; | 41 int unused = 0; |
| 42 vector<string> cmd(1, "/usr/sbin/chromeos-setgoodkernel"); | 42 vector<string> cmd(1, "/usr/sbin/chromeos-setgoodkernel"); |
| 43 Subprocess::SynchronousExec(cmd, &unused); | 43 Subprocess::SynchronousExec(cmd, &unused); |
| 44 return FALSE; // Don't call this callback again | 44 return FALSE; // Don't call this callback again |
| 45 } | 45 } |
| 46 | 46 |
| 47 namespace { | 47 namespace { |
| 48 | 48 |
| 49 const int kTimeoutOnce = 7 * 60; // at 7 minutes | |
| 50 const int kTimeoutPeriodic = 45 * 60; // every 45 minutes | |
| 51 const int kTimeoutFuzz = 10 * 60; // +/- 5 minutes | |
| 52 | |
| 53 // Schedules an update check |seconds| from now, while adding some fuzz. | |
| 54 void ScheduleUpdateCheck(int seconds, | |
| 55 GSourceFunc update_function, | |
| 56 UpdateAttempter* update_attempter) { | |
| 57 seconds = utils::FuzzInt(seconds, kTimeoutFuzz); | |
| 58 g_timeout_add_seconds(seconds, update_function, update_attempter); | |
| 59 } | |
| 60 | |
| 61 gboolean UpdateOnce(void* arg) { | |
| 62 UpdateAttempter* update_attempter = reinterpret_cast<UpdateAttempter*>(arg); | |
| 63 update_attempter->Update("", ""); | |
| 64 return FALSE; // Don't run again. | |
| 65 } | |
| 66 | |
| 67 gboolean UpdatePeriodically(void* arg) { | |
| 68 UpdateAttempter* update_attempter = reinterpret_cast<UpdateAttempter*>(arg); | |
| 69 update_attempter->Update("", ""); | |
| 70 ScheduleUpdateCheck(kTimeoutPeriodic, &UpdatePeriodically, update_attempter); | |
| 71 return FALSE; // Don't run again. | |
| 72 } | |
| 73 | |
| 74 void SchedulePeriodicUpdateChecks(UpdateAttempter* update_attempter) { | |
| 75 if (!utils::IsOfficialBuild()) { | |
| 76 LOG(WARNING) << "Non-official build: periodic update checks disabled."; | |
| 77 return; | |
| 78 } | |
| 79 if (utils::IsRemovableDevice(utils::RootDevice(utils::BootDevice()))) { | |
| 80 LOG(WARNING) << "Removable device boot: periodic update checks disabled."; | |
| 81 return; | |
| 82 } | |
| 83 // Kick off periodic updating. | |
| 84 ScheduleUpdateCheck(kTimeoutOnce, &UpdateOnce, update_attempter); | |
| 85 ScheduleUpdateCheck(kTimeoutPeriodic, &UpdatePeriodically, update_attempter); | |
| 86 } | |
| 87 | |
| 88 void SetupDbusService(UpdateEngineService* service) { | 49 void SetupDbusService(UpdateEngineService* service) { |
| 89 DBusGConnection *bus; | 50 DBusGConnection *bus; |
| 90 DBusGProxy *proxy; | 51 DBusGProxy *proxy; |
| 91 GError *error = NULL; | 52 GError *error = NULL; |
| 92 | 53 |
| 93 bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); | 54 bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); |
| 94 if (!bus) { | 55 if (!bus) { |
| 95 LOG(FATAL) << "Failed to get bus"; | 56 LOG(FATAL) << "Failed to get bus"; |
| 96 } | 57 } |
| 97 proxy = dbus_g_proxy_new_for_name(bus, | 58 proxy = dbus_g_proxy_new_for_name(bus, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 | 121 |
| 161 // Create the dbus service object: | 122 // Create the dbus service object: |
| 162 dbus_g_object_type_install_info(UPDATE_ENGINE_TYPE_SERVICE, | 123 dbus_g_object_type_install_info(UPDATE_ENGINE_TYPE_SERVICE, |
| 163 &dbus_glib_update_engine_service_object_info); | 124 &dbus_glib_update_engine_service_object_info); |
| 164 UpdateEngineService* service = | 125 UpdateEngineService* service = |
| 165 UPDATE_ENGINE_SERVICE(g_object_new(UPDATE_ENGINE_TYPE_SERVICE, NULL)); | 126 UPDATE_ENGINE_SERVICE(g_object_new(UPDATE_ENGINE_TYPE_SERVICE, NULL)); |
| 166 service->update_attempter_ = &update_attempter; | 127 service->update_attempter_ = &update_attempter; |
| 167 update_attempter.set_dbus_service(service); | 128 update_attempter.set_dbus_service(service); |
| 168 chromeos_update_engine::SetupDbusService(service); | 129 chromeos_update_engine::SetupDbusService(service); |
| 169 | 130 |
| 170 chromeos_update_engine::SchedulePeriodicUpdateChecks(&update_attempter); | 131 update_attempter.InitiatePeriodicUpdateChecks(); |
| 171 | 132 |
| 172 // Update boot flags after 45 seconds | 133 // Update boot flags after 45 seconds |
| 173 g_timeout_add_seconds(45, &chromeos_update_engine::UpdateBootFlags, NULL); | 134 g_timeout_add_seconds(45, &chromeos_update_engine::UpdateBootFlags, NULL); |
| 174 | 135 |
| 175 // Run the main loop until exit time: | 136 // Run the main loop until exit time: |
| 176 g_main_loop_run(loop); | 137 g_main_loop_run(loop); |
| 177 | 138 |
| 178 // Cleanup: | 139 // Cleanup: |
| 179 g_main_loop_unref(loop); | 140 g_main_loop_unref(loop); |
| 180 update_attempter.set_dbus_service(NULL); | 141 update_attempter.set_dbus_service(NULL); |
| 181 g_object_unref(G_OBJECT(service)); | 142 g_object_unref(G_OBJECT(service)); |
| 182 | 143 |
| 183 LOG(INFO) << "Chrome OS Update Engine terminating"; | 144 LOG(INFO) << "Chrome OS Update Engine terminating"; |
| 184 return 0; | 145 return 0; |
| 185 } | 146 } |
| OLD | NEW |