Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Unified Diff: chrome/installer/tools/validate_installation_main.cc

Issue 6490024: New installation validator machinery to check the machine state.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/installer/tools/validate_installation_main.cc
===================================================================
--- chrome/installer/tools/validate_installation_main.cc (revision 0)
+++ chrome/installer/tools/validate_installation_main.cc (revision 0)
@@ -0,0 +1,189 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// A command-line tool that inspects the current system, displaying information
+// about installed products. Violations are dumped to stderr. The process
+// exit code is 0 if there are no violations, or 1 otherwise.
+
+#include <cstdio>
+#include <cstdlib>
+
+#include "base/at_exit.h"
+#include "base/command_line.h"
+#include "base/file_util.h"
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "chrome/installer/util/installation_validator.h"
+
+using installer::InstallationValidator;
+
+namespace {
+
+// A helper class that initializes logging and installs a log message handler to
+// direct ERROR messages to stderr. Only one instance of this class may be live
+// at a time.
+class ConsoleLogHelper {
+ public:
+ ConsoleLogHelper();
+ ~ConsoleLogHelper();
+
+ private:
+ static FilePath GetLogFilePath();
+ static bool DumpLogMessage(int severity,
+ const char* file,
+ int line,
+ size_t message_start,
+ const std::string& str);
+
+ static const wchar_t kLogFileName_[];
+ static FILE* const kOutputStream_;
+ static const logging::LogSeverity kViolationSeverity_;
+ static logging::LogMessageHandlerFunction old_message_handler_;
+ FilePath log_file_path_;
+};
+
+// static
+const wchar_t ConsoleLogHelper::kLogFileName_[] = L"validate_installation.log";
+
+// Dump violations to stderr.
+// static
+FILE* const ConsoleLogHelper::kOutputStream_ = stderr;
+
+// InstallationValidator logs all violations at ERROR level.
+// static
+const logging::LogSeverity
+ ConsoleLogHelper::kViolationSeverity_ = logging::LOG_ERROR;
+
+// static
+logging::LogMessageHandlerFunction
+ ConsoleLogHelper::old_message_handler_ = NULL;
+
+ConsoleLogHelper::ConsoleLogHelper() : log_file_path_(GetLogFilePath()) {
+ LOG_ASSERT(old_message_handler_ == NULL);
+ logging::InitLogging(
+ log_file_path_.value().c_str(),
+ logging::LOG_ONLY_TO_FILE,
+ logging::DONT_LOCK_LOG_FILE,
+ logging::DELETE_OLD_LOG_FILE,
+ logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS);
+
+ old_message_handler_ = logging::GetLogMessageHandler();
+ logging::SetLogMessageHandler(&DumpLogMessage);
+}
+
+ConsoleLogHelper::~ConsoleLogHelper() {
+ logging::SetLogMessageHandler(old_message_handler_);
+ old_message_handler_ = NULL;
+
+ logging::CloseLogFile();
+
+ // Delete the log file if it wasn't written to (this is expected).
+ int64 file_size = 0;
+ if (file_util::GetFileSize(log_file_path_, &file_size) && file_size == 0)
+ file_util::Delete(log_file_path_, false);
+}
+
+// Returns the path to the log file to create. The file should be empty at
+// process exit since we redirect log messages to stderr.
+// static
+FilePath ConsoleLogHelper::GetLogFilePath() {
+ FilePath log_path;
+
+ if (PathService::Get(base::DIR_TEMP, &log_path))
+ return log_path.Append(kLogFileName_);
+ else
+ return FilePath(kLogFileName_);
+}
+
+// A logging::LogMessageHandlerFunction that sends the body of messages logged
+// at the severity of validation violations to stderr. All other messages are
+// sent through the default logging pipeline.
+// static
+bool ConsoleLogHelper::DumpLogMessage(int severity,
+ const char* file,
+ int line,
+ size_t message_start,
+ const std::string& str) {
+ if (severity == kViolationSeverity_) {
+ fprintf(kOutputStream_, "%s", str.c_str() + message_start);
+ return true;
+ }
+
+ if (old_message_handler_ != NULL)
+ return (old_message_handler_)(severity, file, line, message_start, str);
+
+ return false;
+}
+
+const char* LevelToString(bool system_level) {
+ return system_level ? "System-level" : "User-level";
+}
+
+std::string InstallationTypeToString(
+ InstallationValidator::InstallationType type) {
+ std::string result;
+
+ static const struct ProductData {
+ int bit;
+ const char* name;
+ } kProdBitToName[] = {
+ {
+ InstallationValidator::ProductBits::CHROME_SINGLE,
+ "Chrome"
+ }, {
+ InstallationValidator::ProductBits::CHROME_MULTI,
+ "Chrome (multi)"
+ }, {
+ InstallationValidator::ProductBits::CHROME_FRAME_SINGLE,
+ "Chrome Frame"
+ }, {
+ InstallationValidator::ProductBits::CHROME_FRAME_MULTI,
+ "Chrome Frame (multi)"
+ }, {
+ InstallationValidator::ProductBits::CHROME_FRAME_READY_MODE,
+ "Ready-mode Chrome Frame"
+ },
+ };
+
+ for (size_t i = 0; i < arraysize(kProdBitToName); ++i) {
+ const ProductData& product_data = kProdBitToName[i];
+ if ((type & product_data.bit) != 0) {
+ if (!result.empty())
+ result.append(", ");
+ result.append(product_data.name);
+ }
+ }
+
+ return result;
+}
+
+} // namespace
+
+// The main program.
+int wmain(int argc, wchar_t *argv[]) {
+ int result = EXIT_SUCCESS;
+ base::AtExitManager exit_manager;
+
+ CommandLine::Init(0, NULL);
+ ConsoleLogHelper log_helper;
+
+ // Check user-level and system-level for products.
+ for (int i = 0; i < 2; ++i) {
+ const bool system_level = (i != 0);
+ InstallationValidator::InstallationType type =
+ InstallationValidator::NO_PRODUCTS;
+ bool is_valid =
+ InstallationValidator::ValidateInstallationType(system_level, &type);
+ if (type != InstallationValidator::NO_PRODUCTS) {
+ FILE* stream = is_valid ? stdout : stderr;
+ fprintf(stream, "%s installations%s: %s\n", LevelToString(system_level),
+ (is_valid ? "" : " (with errors)"),
+ InstallationTypeToString(type).c_str());
+ }
+ if (!is_valid)
+ result = EXIT_FAILURE;
+ }
+
+ return result;
+}
Property changes on: chrome\installer\tools\validate_installation_main.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « chrome/installer/tools/validate_installation.rc ('k') | chrome/installer/tools/validate_installation_resource.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698