blob: 52ace9a42ae34c917caee13e0ef2b351d859cda8 [file] [log] [blame]
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -07001// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
rspangler@google.com49fdf182009-10-10 00:57:34 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -08005#include <string>
6#include <tr1/memory>
7#include <vector>
8#include <gflags/gflags.h>
rspangler@google.com49fdf182009-10-10 00:57:34 +00009#include <glib.h>
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070010#include "base/command_line.h"
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080011#include "chromeos/obsolete_logging.h"
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070012#include "update_engine/dbus_constants.h"
13#include "update_engine/dbus_service.h"
14#include "update_engine/update_attempter.h"
15
16extern "C" {
17#include "update_engine/update_engine.dbusserver.h"
18}
19
20DEFINE_bool(logtostderr, false,
21 "Write logs to stderr instead of to a file in log_dir.");
Andrew de los Reyes6b78e292010-05-10 15:54:39 -070022DEFINE_bool(foreground, false,
23 "Don't daemon()ize; run in foreground.");
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080024
25using std::string;
26using std::tr1::shared_ptr;
27using std::vector;
28
29namespace chromeos_update_engine {
30
Andrew de los Reyes73520672010-05-10 13:44:58 -070031namespace {
32
33struct PeriodicallyUpdateArgs {
34 UpdateAttempter* update_attempter;
35 gboolean should_repeat;
36};
37
38gboolean PeriodicallyUpdate(void* arg) {
39 PeriodicallyUpdateArgs* args = reinterpret_cast<PeriodicallyUpdateArgs*>(arg);
Darin Petkova4a8a8c2010-07-15 22:21:12 -070040 args->update_attempter->Update();
Andrew de los Reyes73520672010-05-10 13:44:58 -070041 return args->should_repeat;
42}
43
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070044void SetupDbusService(UpdateEngineService* service) {
45 DBusGConnection *bus;
46 DBusGProxy *proxy;
47 GError *error = NULL;
48
49 bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
50 if (!bus) {
51 LOG(FATAL) << "Failed to get bus";
52 }
53 proxy = dbus_g_proxy_new_for_name(bus,
54 DBUS_SERVICE_DBUS,
55 DBUS_PATH_DBUS,
56 DBUS_INTERFACE_DBUS);
57
58 guint32 request_name_ret;
59 if (!org_freedesktop_DBus_request_name(proxy,
60 kUpdateEngineServiceName,
61 0,
62 &request_name_ret,
63 &error)) {
64 LOG(FATAL) << "Failed to get name: " << error->message;
65 }
66 if (request_name_ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
67 g_warning("Got result code %u from requesting name", request_name_ret);
68 g_error_free(error);
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070069 LOG(FATAL) << "Got result code " << request_name_ret
70 << " from requesting name, but expected "
71 << DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER;
72 }
73 dbus_g_connection_register_g_object(bus,
74 "/org/chromium/UpdateEngine",
75 G_OBJECT(service));
76}
77
Andrew de los Reyes73520672010-05-10 13:44:58 -070078} // namespace {}
79
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080080} // namespace chromeos_update_engine
rspangler@google.com49fdf182009-10-10 00:57:34 +000081
adlr@google.comc98a7ed2009-12-04 18:54:03 +000082#include "update_engine/subprocess.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000083
84int main(int argc, char** argv) {
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070085 ::g_type_init();
adlr@google.comc98a7ed2009-12-04 18:54:03 +000086 g_thread_init(NULL);
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070087 dbus_g_thread_init();
adlr@google.comc98a7ed2009-12-04 18:54:03 +000088 chromeos_update_engine::Subprocess::Init();
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080089 google::ParseCommandLineFlags(&argc, &argv, true);
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070090 CommandLine::Init(argc, argv);
Andrew de los Reyes73520672010-05-10 13:44:58 -070091 logging::InitLogging("/var/log/update_engine.log",
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070092 (FLAGS_logtostderr ?
93 logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG :
94 logging::LOG_ONLY_TO_FILE),
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080095 logging::DONT_LOCK_LOG_FILE,
96 logging::APPEND_TO_OLD_LOG_FILE);
Andrew de los Reyes6b78e292010-05-10 15:54:39 -070097 if (!FLAGS_foreground)
98 PLOG_IF(FATAL, daemon(0, 0) == 1) << "daemon() failed";
99
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800100 LOG(INFO) << "Chrome OS Update Engine starting";
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700101
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800102 // Create the single GMainLoop
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700103 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800104
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700105 // Create the update attempter:
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700106 chromeos_update_engine::UpdateAttempter update_attempter;
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800107
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700108 // Create the dbus service object:
109 dbus_g_object_type_install_info(UPDATE_ENGINE_TYPE_SERVICE,
110 &dbus_glib_update_engine_service_object_info);
111 UpdateEngineService* service =
112 UPDATE_ENGINE_SERVICE(g_object_new(UPDATE_ENGINE_TYPE_SERVICE, NULL));
113 service->update_attempter_ = &update_attempter;
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700114 update_attempter.set_dbus_service(service);
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700115 chromeos_update_engine::SetupDbusService(service);
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800116
Andrew de los Reyes73520672010-05-10 13:44:58 -0700117 // Kick off periodic updating. First, update after 2 minutes. Also, update
118 // every 30 minutes.
119 chromeos_update_engine::PeriodicallyUpdateArgs two_min_args =
120 {&update_attempter, FALSE};
121 g_timeout_add(2 * 60 * 1000,
122 &chromeos_update_engine::PeriodicallyUpdate,
123 &two_min_args);
124
125 chromeos_update_engine::PeriodicallyUpdateArgs thirty_min_args =
126 {&update_attempter, TRUE};
127 g_timeout_add(30 * 60 * 1000,
128 &chromeos_update_engine::PeriodicallyUpdate,
129 &thirty_min_args);
130
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700131 // Run the main loop until exit time:
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800132 g_main_loop_run(loop);
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700133
134 // Cleanup:
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800135 g_main_loop_unref(loop);
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700136 update_attempter.set_dbus_service(NULL);
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700137 g_object_unref(G_OBJECT(service));
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800138
139 LOG(INFO) << "Chrome OS Update Engine terminating";
rspangler@google.com49fdf182009-10-10 00:57:34 +0000140 return 0;
141}