main.cc revision 4fe15d017c145aca449c2248420c1b4ec8c23758
149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Use of this source code is governed by a BSD-style license that can be
349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// found in the LICENSE file.
449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
54fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include <string>
64fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include <tr1/memory>
74fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include <vector>
84fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include <gflags/gflags.h>
949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <glib.h>
104fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "chromeos/obsolete_logging.h"
114fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/action_processor.h"
124fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/download_action.h"
134fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/filesystem_copier_action.h"
144fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/install_action.h"
154fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/libcurl_http_fetcher.h"
164fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/omaha_request_prep_action.h"
174fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/omaha_response_handler_action.h"
184fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/postinstall_runner_action.h"
194fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/set_bootable_flag_action.h"
204fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "update_engine/update_check_action.h"
214fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
224fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesusing std::string;
234fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesusing std::tr1::shared_ptr;
244fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesusing std::vector;
254fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
264fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesnamespace chromeos_update_engine {
274fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
284fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesclass UpdateAttempter : public ActionProcessorDelegate {
294fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes public:
304fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  UpdateAttempter(GMainLoop *loop)
314fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      : full_update_(false),
324fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes        loop_(loop) {}
334fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  void Update(bool force_full_update);
344fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
354fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // Delegate method:
364fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  void ProcessingDone(const ActionProcessor* processor, bool success);
374fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes private:
384fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  bool full_update_;
394fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  vector<shared_ptr<AbstractAction> > actions_;
404fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  ActionProcessor processor_;
414fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  GMainLoop *loop_;
424fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
434fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // pointer to the OmahaResponseHandlerAction in the actions_ vector;
444fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<OmahaResponseHandlerAction> response_handler_action_;
454fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  DISALLOW_COPY_AND_ASSIGN(UpdateAttempter);
464fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes};
474fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
484fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes// Returns true on success. If there was no update available, that's still
494fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes// success.
504fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes// If force_full is true, try to force a full update.
514fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesvoid UpdateAttempter::Update(bool force_full_update) {
524fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  full_update_ = force_full_update;
534fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  CHECK(!processor_.IsRunning());
544fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  processor_.set_delegate(this);
554fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
564fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // Actions:
574fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<OmahaRequestPrepAction> request_prep_action(
584fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new OmahaRequestPrepAction(force_full_update));
594fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<UpdateCheckAction> update_check_action(
604fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new UpdateCheckAction(new LibcurlHttpFetcher));
614fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<OmahaResponseHandlerAction> response_handler_action(
624fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new OmahaResponseHandlerAction);
634fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<FilesystemCopierAction> filesystem_copier_action(
644fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new FilesystemCopierAction);
654fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<DownloadAction> download_action(
664fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new DownloadAction(new LibcurlHttpFetcher));
674fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<InstallAction> install_action(
684fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new InstallAction);
694fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<PostinstallRunnerAction> postinstall_runner_action(
704fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new PostinstallRunnerAction);
714fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  shared_ptr<SetBootableFlagAction> set_bootable_flag_action(
724fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      new SetBootableFlagAction);
734fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
744fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  response_handler_action_ = response_handler_action;
754fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
764fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(request_prep_action));
774fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(update_check_action));
784fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(response_handler_action));
794fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(filesystem_copier_action));
804fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(download_action));
814fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(install_action));
824fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(postinstall_runner_action));
834fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  actions_.push_back(shared_ptr<AbstractAction>(set_bootable_flag_action));
844fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
854fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // Enqueue the actions
864fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  for (vector<shared_ptr<AbstractAction> >::iterator it = actions_.begin();
874fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes       it != actions_.end(); ++it) {
884fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes    processor_.EnqueueAction(it->get());
894fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  }
904fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
914fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // Bond them together. We have to use the leaf-types when calling
924fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // BondActions().
934fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  BondActions(request_prep_action.get(), update_check_action.get());
944fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  BondActions(update_check_action.get(), response_handler_action.get());
954fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  BondActions(response_handler_action.get(), filesystem_copier_action.get());
964fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  BondActions(filesystem_copier_action.get(), download_action.get());
974fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  BondActions(download_action.get(), install_action.get());
984fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  BondActions(install_action.get(), postinstall_runner_action.get());
994fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  BondActions(postinstall_runner_action.get(), set_bootable_flag_action.get());
1004fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1014fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  processor_.StartProcessing();
1024fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes}
1034fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1044fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesvoid UpdateAttempter::ProcessingDone(const ActionProcessor* processor,
1054fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes                                     bool success) {
1064fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  CHECK(response_handler_action_);
1074fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  if (response_handler_action_->GotNoUpdateResponse()) {
1084fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes    // All done.
1094fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes    g_main_loop_quit(loop_);
1104fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes    return;
1114fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  }
1124fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  if (!success) {
1134fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes    if (!full_update_) {
1144fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      LOG(ERROR) << "Update failed. Attempting full update";
1154fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      actions_.clear();
1164fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      response_handler_action_.reset();
1174fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      Update(true);
1184fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      return;
1194fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes    } else {
1204fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes      LOG(ERROR) << "Full update failed. Aborting";
1214fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes    }
1224fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  }
1234fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  g_main_loop_quit(loop_);
1244fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes}
1254fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1264fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesgboolean UpdateInMainLoop(void* arg) {
1274fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  UpdateAttempter* update_attempter = reinterpret_cast<UpdateAttempter*>(arg);
1284fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  update_attempter->Update(false);
1294fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  return FALSE;  // Don't call this callback function again
1304fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes}
1314fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1324fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes}  // namespace chromeos_update_engine
13349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
134c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#include "update_engine/subprocess.h"
13549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
13649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comint main(int argc, char** argv) {
137c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  g_thread_init(NULL);
138c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  chromeos_update_engine::Subprocess::Init();
1394fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  google::ParseCommandLineFlags(&argc, &argv, true);
1404fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // TODO(adlr): figure out log file
1414fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  logging::InitLogging("",
1424fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes                       logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG,
1434fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes                       logging::DONT_LOCK_LOG_FILE,
1444fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes                       logging::APPEND_TO_OLD_LOG_FILE);
1454fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  LOG(INFO) << "Chrome OS Update Engine starting";
1464fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1474fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  // Create the single GMainLoop
1484fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1494fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1504fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  chromeos_update_engine::UpdateAttempter update_attempter(loop);
1514fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1524fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  g_timeout_add(0, &chromeos_update_engine::UpdateInMainLoop,
1534fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes                &update_attempter);
1544fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1554fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  g_main_loop_run(loop);
1564fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  g_main_loop_unref(loop);
1574fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes
1584fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes  LOG(INFO) << "Chrome OS Update Engine terminating";
15949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  return 0;
16049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}
161