main.cc revision 73520670492f3358c496698767879adcf6c03aea
14e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes// Copyright (c) 2010 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> 104e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include "base/command_line.h" 114fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes#include "chromeos/obsolete_logging.h" 124e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include "update_engine/dbus_constants.h" 134e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include "update_engine/dbus_service.h" 144e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include "update_engine/update_attempter.h" 154e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 164e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyesextern "C" { 174e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include "update_engine/update_engine.dbusserver.h" 184e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes} 194e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 204e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los ReyesDEFINE_bool(logtostderr, false, 214e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes "Write logs to stderr instead of to a file in log_dir."); 224fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 234fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesusing std::string; 244fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesusing std::tr1::shared_ptr; 254fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesusing std::vector; 264fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 274fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyesnamespace chromeos_update_engine { 284fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 2973520670492f3358c496698767879adcf6c03aeaAndrew de los Reyesnamespace { 3073520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes 3173520670492f3358c496698767879adcf6c03aeaAndrew de los Reyesstruct PeriodicallyUpdateArgs { 3273520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes UpdateAttempter* update_attempter; 3373520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes gboolean should_repeat; 3473520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes}; 3573520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes 3673520670492f3358c496698767879adcf6c03aeaAndrew de los Reyesgboolean PeriodicallyUpdate(void* arg) { 3773520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes PeriodicallyUpdateArgs* args = reinterpret_cast<PeriodicallyUpdateArgs*>(arg); 3873520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes args->update_attempter->Update(false); 3973520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes return args->should_repeat; 4073520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes} 4173520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes 424e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyesvoid SetupDbusService(UpdateEngineService* service) { 434e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes DBusGConnection *bus; 444e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes DBusGProxy *proxy; 454e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes GError *error = NULL; 464e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 474e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); 484e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes if (!bus) { 494e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes LOG(FATAL) << "Failed to get bus"; 504fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes } 514e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes proxy = dbus_g_proxy_new_for_name(bus, 524e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes DBUS_SERVICE_DBUS, 534e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes DBUS_PATH_DBUS, 544e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes DBUS_INTERFACE_DBUS); 554e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 564e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes guint32 request_name_ret; 574e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes if (!org_freedesktop_DBus_request_name(proxy, 584e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes kUpdateEngineServiceName, 594e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 0, 604e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes &request_name_ret, 614e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes &error)) { 624e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes LOG(FATAL) << "Failed to get name: " << error->message; 634fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes } 644e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes if (request_name_ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { 654e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes g_warning("Got result code %u from requesting name", request_name_ret); 664e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes g_error_free(error); 674e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes LOG(FATAL) << "Got result code " << request_name_ret 684e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes << " from requesting name, but expected " 694e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes << DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER; 704e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes } 714e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes dbus_g_connection_register_g_object(bus, 724e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes "/org/chromium/UpdateEngine", 734e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes G_OBJECT(service)); 744fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes} 754fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 7673520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes} // namespace {} 7773520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes 784fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes} // namespace chromeos_update_engine 7949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 80c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#include "update_engine/subprocess.h" 8149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 8249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comint main(int argc, char** argv) { 834e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes ::g_type_init(); 84c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com g_thread_init(NULL); 854e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes dbus_g_thread_init(); 86c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com chromeos_update_engine::Subprocess::Init(); 874fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes google::ParseCommandLineFlags(&argc, &argv, true); 884e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes CommandLine::Init(argc, argv); 8973520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes logging::InitLogging("/var/log/update_engine.log", 9063b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes (FLAGS_logtostderr ? 9163b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG : 9263b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes logging::LOG_ONLY_TO_FILE), 934fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes logging::DONT_LOCK_LOG_FILE, 944fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes logging::APPEND_TO_OLD_LOG_FILE); 954fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes LOG(INFO) << "Chrome OS Update Engine starting"; 964fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 974fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes // Create the single GMainLoop 9863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 994fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 1004e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes // Create the update attempter: 10163b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes chromeos_update_engine::UpdateAttempter update_attempter; 1024fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 1034e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes // Create the dbus service object: 1044e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes dbus_g_object_type_install_info(UPDATE_ENGINE_TYPE_SERVICE, 1054e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes &dbus_glib_update_engine_service_object_info); 1064e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes UpdateEngineService* service = 1074e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes UPDATE_ENGINE_SERVICE(g_object_new(UPDATE_ENGINE_TYPE_SERVICE, NULL)); 1084e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes service->update_attempter_ = &update_attempter; 10963b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes update_attempter.set_dbus_service(service); 1104e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes chromeos_update_engine::SetupDbusService(service); 1114e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 11273520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes // Kick off periodic updating. First, update after 2 minutes. Also, update 11373520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes // every 30 minutes. 11473520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes chromeos_update_engine::PeriodicallyUpdateArgs two_min_args = 11573520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes {&update_attempter, FALSE}; 11673520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes g_timeout_add(2 * 60 * 1000, 11773520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes &chromeos_update_engine::PeriodicallyUpdate, 11873520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes &two_min_args); 11973520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes 12073520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes chromeos_update_engine::PeriodicallyUpdateArgs thirty_min_args = 12173520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes {&update_attempter, TRUE}; 12273520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes g_timeout_add(30 * 60 * 1000, 12373520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes &chromeos_update_engine::PeriodicallyUpdate, 12473520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes &thirty_min_args); 12573520670492f3358c496698767879adcf6c03aeaAndrew de los Reyes 1264e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes // Run the main loop until exit time: 1274fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes g_main_loop_run(loop); 1284e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 1294e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes // Cleanup: 1304fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes g_main_loop_unref(loop); 13163b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes update_attempter.set_dbus_service(NULL); 1324e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes g_object_unref(G_OBJECT(service)); 1334fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes 1344fe15d017c145aca449c2248420c1b4ec8c23758Andrew de los Reyes LOG(INFO) << "Chrome OS Update Engine terminating"; 13549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return 0; 13649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 137