| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <tr1/memory> | |
| 7 #include <vector> | 6 #include <vector> |
| 8 | 7 |
| 9 #include <base/at_exit.h> | 8 #include <base/at_exit.h> |
| 10 #include <base/command_line.h> | 9 #include <base/command_line.h> |
| 10 #include <base/file_util.h> |
| 11 #include <base/logging.h> | 11 #include <base/logging.h> |
| 12 #include <base/string_util.h> | 12 #include <base/string_util.h> |
| 13 #include <gflags/gflags.h> | 13 #include <gflags/gflags.h> |
| 14 #include <glib.h> | 14 #include <glib.h> |
| 15 #include <metrics/metrics_library.h> | 15 #include <metrics/metrics_library.h> |
| 16 #include <sys/types.h> | 16 #include <sys/types.h> |
| 17 #include <sys/stat.h> | 17 #include <sys/stat.h> |
| 18 | 18 |
| 19 #include "update_engine/dbus_constants.h" | 19 #include "update_engine/dbus_constants.h" |
| 20 #include "update_engine/dbus_service.h" | 20 #include "update_engine/dbus_service.h" |
| 21 #include "update_engine/prefs.h" | 21 #include "update_engine/prefs.h" |
| 22 #include "update_engine/subprocess.h" | 22 #include "update_engine/subprocess.h" |
| 23 #include "update_engine/terminator.h" | 23 #include "update_engine/terminator.h" |
| 24 #include "update_engine/update_attempter.h" | 24 #include "update_engine/update_attempter.h" |
| 25 #include "update_engine/update_check_scheduler.h" | 25 #include "update_engine/update_check_scheduler.h" |
| 26 | 26 |
| 27 extern "C" { | 27 extern "C" { |
| 28 #include "update_engine/update_engine.dbusserver.h" | 28 #include "update_engine/update_engine.dbusserver.h" |
| 29 } | 29 } |
| 30 | 30 |
| 31 DEFINE_bool(logtostderr, false, | 31 DEFINE_bool(logtostderr, false, |
| 32 "Write logs to stderr instead of to a file in log_dir."); | 32 "Write logs to stderr instead of to a file in log_dir."); |
| 33 DEFINE_bool(foreground, false, | 33 DEFINE_bool(foreground, false, |
| 34 "Don't daemon()ize; run in foreground."); | 34 "Don't daemon()ize; run in foreground."); |
| 35 | 35 |
| 36 using std::string; | 36 using std::string; |
| 37 using std::tr1::shared_ptr; | |
| 38 using std::vector; | 37 using std::vector; |
| 39 | 38 |
| 40 namespace chromeos_update_engine { | 39 namespace chromeos_update_engine { |
| 41 | 40 |
| 42 gboolean UpdateBootFlags(void* arg) { | 41 gboolean UpdateBootFlags(void* arg) { |
| 43 UpdateAttempter* attempter = reinterpret_cast<UpdateAttempter*>(arg); | 42 UpdateAttempter* attempter = reinterpret_cast<UpdateAttempter*>(arg); |
| 44 if (attempter->status() == UPDATE_STATUS_UPDATED_NEED_REBOOT) { | 43 if (attempter->status() == UPDATE_STATUS_UPDATED_NEED_REBOOT) { |
| 45 // Don't update the flags if there's an update that's just been applied and | 44 // Don't update the flags if there's an update that's just been applied and |
| 46 // we're waiting for reboot because we may end up reverting the update. | 45 // we're waiting for reboot because we may end up reverting the update. |
| 47 return FALSE; // Don't call this callback again. | 46 return FALSE; // Don't call this callback again. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 g_error_free(error); | 87 g_error_free(error); |
| 89 LOG(FATAL) << "Got result code " << request_name_ret | 88 LOG(FATAL) << "Got result code " << request_name_ret |
| 90 << " from requesting name, but expected " | 89 << " from requesting name, but expected " |
| 91 << DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER; | 90 << DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER; |
| 92 } | 91 } |
| 93 dbus_g_connection_register_g_object(bus, | 92 dbus_g_connection_register_g_object(bus, |
| 94 "/org/chromium/UpdateEngine", | 93 "/org/chromium/UpdateEngine", |
| 95 G_OBJECT(service)); | 94 G_OBJECT(service)); |
| 96 } | 95 } |
| 97 | 96 |
| 97 void SetupLogSymlink(const string& symlink_path, const string& log_path) { |
| 98 // TODO(petkov): To ensure a smooth transition between non-timestamped and |
| 99 // timestamped logs, move an existing log to start the first timestamped |
| 100 // one. This code can go away once all clients are switched to this version or |
| 101 // we stop caring about the old-style logs. |
| 102 if (utils::FileExists(symlink_path.c_str()) && |
| 103 !utils::IsSymlink(symlink_path.c_str())) { |
| 104 file_util::ReplaceFile(FilePath(symlink_path), FilePath(log_path)); |
| 105 } |
| 106 file_util::Delete(FilePath(symlink_path), true); |
| 107 if (symlink(log_path.c_str(), symlink_path.c_str()) == -1) { |
| 108 PLOG(ERROR) << "Unable to create symlink " << symlink_path |
| 109 << " pointing at " << log_path; |
| 110 } |
| 111 } |
| 112 |
| 113 string GetTimeAsString(time_t utime) { |
| 114 struct tm tm; |
| 115 CHECK(localtime_r(&utime, &tm) == &tm); |
| 116 char str[16]; |
| 117 CHECK(strftime(str, sizeof(str), "%Y%m%d-%H%M%S", &tm) == 15); |
| 118 return str; |
| 119 } |
| 120 |
| 121 string SetupLogFile(const string& kLogsRoot) { |
| 122 const string kLogSymlink = kLogsRoot + "/update_engine.log"; |
| 123 const string kLogsDir = kLogsRoot + "/update_engine"; |
| 124 const string kLogPath = |
| 125 StringPrintf("%s/update_engine.%s", |
| 126 kLogsDir.c_str(), |
| 127 GetTimeAsString(::time(NULL)).c_str()); |
| 128 mkdir(kLogsDir.c_str(), 0755); |
| 129 SetupLogSymlink(kLogSymlink, kLogPath); |
| 130 return kLogSymlink; |
| 131 } |
| 132 |
| 133 void SetupLogging() { |
| 134 // Log to stderr initially. |
| 135 logging::InitLogging(NULL, |
| 136 logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG, |
| 137 logging::DONT_LOCK_LOG_FILE, |
| 138 logging::APPEND_TO_OLD_LOG_FILE); |
| 139 if (FLAGS_logtostderr) { |
| 140 return; |
| 141 } |
| 142 const string log_file = SetupLogFile("/var/log"); |
| 143 logging::InitLogging(log_file.c_str(), |
| 144 logging::LOG_ONLY_TO_FILE, |
| 145 logging::DONT_LOCK_LOG_FILE, |
| 146 logging::APPEND_TO_OLD_LOG_FILE); |
| 147 } |
| 98 } // namespace {} | 148 } // namespace {} |
| 99 | |
| 100 } // namespace chromeos_update_engine | 149 } // namespace chromeos_update_engine |
| 101 | 150 |
| 102 #include "update_engine/subprocess.h" | |
| 103 | |
| 104 int main(int argc, char** argv) { | 151 int main(int argc, char** argv) { |
| 105 ::g_type_init(); | 152 ::g_type_init(); |
| 106 g_thread_init(NULL); | 153 g_thread_init(NULL); |
| 107 dbus_g_thread_init(); | 154 dbus_g_thread_init(); |
| 108 base::AtExitManager exit_manager; // Required for base/rand_util.h. | 155 base::AtExitManager exit_manager; // Required for base/rand_util.h. |
| 109 chromeos_update_engine::Terminator::Init(); | 156 chromeos_update_engine::Terminator::Init(); |
| 110 chromeos_update_engine::Subprocess::Init(); | 157 chromeos_update_engine::Subprocess::Init(); |
| 111 google::ParseCommandLineFlags(&argc, &argv, true); | 158 google::ParseCommandLineFlags(&argc, &argv, true); |
| 112 CommandLine::Init(argc, argv); | 159 CommandLine::Init(argc, argv); |
| 113 logging::InitLogging("/var/log/update_engine.log", | 160 chromeos_update_engine::SetupLogging(); |
| 114 (FLAGS_logtostderr ? | |
| 115 logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG : | |
| 116 logging::LOG_ONLY_TO_FILE), | |
| 117 logging::DONT_LOCK_LOG_FILE, | |
| 118 logging::APPEND_TO_OLD_LOG_FILE); | |
| 119 if (!FLAGS_foreground) | 161 if (!FLAGS_foreground) |
| 120 PLOG_IF(FATAL, daemon(0, 0) == 1) << "daemon() failed"; | 162 PLOG_IF(FATAL, daemon(0, 0) == 1) << "daemon() failed"; |
| 121 | 163 |
| 122 LOG(INFO) << "Chrome OS Update Engine starting"; | 164 LOG(INFO) << "Chrome OS Update Engine starting"; |
| 123 | 165 |
| 124 // Ensure that all written files have safe permissions. | 166 // Ensure that all written files have safe permissions. |
| 125 // This is a mask, so we _block_ execute for the owner, and ALL | 167 // This is a mask, so we _block_ execute for the owner, and ALL |
| 126 // permissions for other users. | 168 // permissions for other users. |
| 127 // Done _after_ log file creation. | 169 // Done _after_ log file creation. |
| 128 umask(S_IXUSR | S_IRWXG | S_IRWXO); | 170 umask(S_IXUSR | S_IRWXG | S_IRWXO); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 g_main_loop_run(loop); | 205 g_main_loop_run(loop); |
| 164 | 206 |
| 165 // Cleanup: | 207 // Cleanup: |
| 166 g_main_loop_unref(loop); | 208 g_main_loop_unref(loop); |
| 167 update_attempter.set_dbus_service(NULL); | 209 update_attempter.set_dbus_service(NULL); |
| 168 g_object_unref(G_OBJECT(service)); | 210 g_object_unref(G_OBJECT(service)); |
| 169 | 211 |
| 170 LOG(INFO) << "Chrome OS Update Engine terminating"; | 212 LOG(INFO) << "Chrome OS Update Engine terminating"; |
| 171 return 0; | 213 return 0; |
| 172 } | 214 } |
| OLD | NEW |