Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Unified Diff: update_engine_client.cc

Issue 3110012: Provide a -update option to the AU client to allow synchronous updates. (Closed) Base URL: http://src.chromium.org/git/update_engine.git
Patch Set: Remove redundant checks for FLAGS_update. Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: update_engine_client.cc
diff --git a/update_engine_client.cc b/update_engine_client.cc
index c8dda0717c4784f96441ea7f17faddf4a93afed7..e25d313ddabcdd30a58c8e15bf169370c8a9fbe2 100644
--- a/update_engine_client.cc
+++ b/update_engine_client.cc
@@ -24,11 +24,11 @@ using std::string;
DEFINE_string(app_version, "", "Force the current app version.");
DEFINE_bool(check_for_update, false, "Initiate check for updates.");
-DEFINE_bool(force_update, false,
- "Force an update, even over an expensive network.");
DEFINE_string(omaha_url, "", "The URL of the Omaha update server.");
DEFINE_bool(reboot, false, "Initiate a reboot if needed.");
DEFINE_bool(status, false, "Print the status to stdout.");
+DEFINE_bool(update, false, "Forces an update and waits for its completion. "
+ "Exit status is 0 if the update succeeded, and 1 otherwise.");
DEFINE_bool(watch_for_updates, false,
"Listen for status updates and print them to the screen.");
@@ -70,7 +70,9 @@ static void StatusUpdateSignalHandler(DBusGProxy* proxy,
LOG(INFO) << " new_size: " << new_size;
}
-bool GetStatus() {
+// If |op| is non-NULL, sets it to the current operation string or an
+// empty string if unable to obtain the current status.
+bool GetStatus(string* op) {
DBusGProxy* proxy;
GError* error = NULL;
@@ -100,6 +102,9 @@ bool GetStatus() {
current_op,
new_version,
new_size);
+ if (op) {
+ *op = current_op ? current_op : "";
+ }
return true;
}
@@ -139,8 +144,7 @@ void WatchForUpdates() {
g_main_loop_unref(loop);
}
-bool CheckForUpdates(bool force, const string& app_version,
- const string& omaha_url) {
+bool CheckForUpdates(const string& app_version, const string& omaha_url) {
DBusGProxy* proxy;
GError* error = NULL;
@@ -171,6 +175,29 @@ bool RebootIfNeeded() {
return true;
}
+static gboolean CompleteUpdateSource(gpointer data) {
+ string current_op;
+ if (!GetStatus(&current_op) || current_op == "UPDATE_STATUS_IDLE") {
+ LOG(ERROR) << "Update failed.";
+ exit(1);
+ }
+ if (current_op == "UPDATE_STATUS_UPDATED_NEED_REBOOT") {
+ LOG(INFO) << "Update succeeded -- reboot needed.";
+ exit(0);
+ }
+ return TRUE;
+}
+
+// This is similar to watching for updates but rather than registering
+// a signal watch, activelly poll the daemon just in case it stops
+// sending notifications.
+void CompleteUpdate() {
+ GMainLoop* loop = g_main_loop_new (NULL, TRUE);
+ g_timeout_add_seconds(5, CompleteUpdateSource, NULL);
+ g_main_loop_run(loop);
+ g_main_loop_unref(loop);
+}
+
} // namespace {}
int main(int argc, char** argv) {
@@ -183,29 +210,45 @@ int main(int argc, char** argv) {
if (FLAGS_status) {
LOG(INFO) << "Querying Update Engine status...";
- if (!GetStatus()) {
- LOG(FATAL) << "GetStatus() failed.";
+ if (!GetStatus(NULL)) {
+ LOG(FATAL) << "GetStatus failed.";
+ return 1;
}
return 0;
}
- if (FLAGS_force_update || FLAGS_check_for_update ||
- !FLAGS_app_version.empty() || !FLAGS_omaha_url.empty()) {
+
+ // Initiate an update check, if necessary.
+ if (FLAGS_check_for_update ||
+ FLAGS_update ||
+ !FLAGS_app_version.empty() ||
+ !FLAGS_omaha_url.empty()) {
LOG_IF(WARNING, FLAGS_reboot) << "-reboot flag ignored.";
- LOG(INFO) << "Initiating update check and install.";
- if (FLAGS_force_update) {
- LOG(INFO) << "Will not abort due to being on expensive network.";
+ string app_version = FLAGS_app_version;
+ if (FLAGS_update && app_version.empty()) {
+ app_version = "ForcedUpdate";
+ LOG(INFO) << "Forcing an update by setting app_version to ForcedUpdate.";
}
- CHECK(CheckForUpdates(FLAGS_force_update, FLAGS_app_version,
- FLAGS_omaha_url))
+ LOG(INFO) << "Initiating update check and install.";
+ CHECK(CheckForUpdates(app_version, FLAGS_omaha_url))
<< "Update check/initiate update failed.";
+
+ // Wait for an update to complete.
+ if (FLAGS_update) {
+ LOG(INFO) << "Waiting for update the complete.";
+ CompleteUpdate(); // Should never return.
+ return 1;
+ }
return 0;
}
+
+ // Start watching for updates.
if (FLAGS_watch_for_updates) {
LOG_IF(WARNING, FLAGS_reboot) << "-reboot flag ignored.";
LOG(INFO) << "Watching for status updates.";
WatchForUpdates(); // Should never return.
return 1;
}
+
if (FLAGS_reboot) {
LOG(INFO) << "Requesting a reboot...";
CHECK(RebootIfNeeded());
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698