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