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