michael@0: // Copyright (c) 2009, Google Inc. michael@0: // All rights reserved. michael@0: // michael@0: // Redistribution and use in source and binary forms, with or without michael@0: // modification, are permitted provided that the following conditions are michael@0: // met: michael@0: // michael@0: // * Redistributions of source code must retain the above copyright michael@0: // notice, this list of conditions and the following disclaimer. michael@0: // * Redistributions in binary form must reproduce the above michael@0: // copyright notice, this list of conditions and the following disclaimer michael@0: // in the documentation and/or other materials provided with the michael@0: // distribution. michael@0: // * Neither the name of Google Inc. nor the names of its michael@0: // contributors may be used to endorse or promote products derived from michael@0: // this software without specific prior written permission. michael@0: // michael@0: // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS michael@0: // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT michael@0: // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR michael@0: // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT michael@0: // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, michael@0: // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT michael@0: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, michael@0: // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY michael@0: // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT michael@0: // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE michael@0: // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. michael@0: michael@0: michael@0: #include "common/linux/google_crashdump_uploader.h" michael@0: #include "common/linux/libcurl_wrapper.h" michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: michael@0: #include michael@0: michael@0: #include "common/using_std_string.h" michael@0: michael@0: namespace google_breakpad { michael@0: michael@0: GoogleCrashdumpUploader::GoogleCrashdumpUploader(const string& product, michael@0: const string& version, michael@0: const string& guid, michael@0: const string& ptime, michael@0: const string& ctime, michael@0: const string& email, michael@0: const string& comments, michael@0: const string& minidump_pathname, michael@0: const string& crash_server, michael@0: const string& proxy_host, michael@0: const string& proxy_userpassword) { michael@0: LibcurlWrapper* http_layer = new LibcurlWrapper(); michael@0: Init(product, michael@0: version, michael@0: guid, michael@0: ptime, michael@0: ctime, michael@0: email, michael@0: comments, michael@0: minidump_pathname, michael@0: crash_server, michael@0: proxy_host, michael@0: proxy_userpassword, michael@0: http_layer); michael@0: } michael@0: michael@0: GoogleCrashdumpUploader::GoogleCrashdumpUploader(const string& product, michael@0: const string& version, michael@0: const string& guid, michael@0: const string& ptime, michael@0: const string& ctime, michael@0: const string& email, michael@0: const string& comments, michael@0: const string& minidump_pathname, michael@0: const string& crash_server, michael@0: const string& proxy_host, michael@0: const string& proxy_userpassword, michael@0: LibcurlWrapper* http_layer) { michael@0: Init(product, michael@0: version, michael@0: guid, michael@0: ptime, michael@0: ctime, michael@0: email, michael@0: comments, michael@0: minidump_pathname, michael@0: crash_server, michael@0: proxy_host, michael@0: proxy_userpassword, michael@0: http_layer); michael@0: } michael@0: michael@0: void GoogleCrashdumpUploader::Init(const string& product, michael@0: const string& version, michael@0: const string& guid, michael@0: const string& ptime, michael@0: const string& ctime, michael@0: const string& email, michael@0: const string& comments, michael@0: const string& minidump_pathname, michael@0: const string& crash_server, michael@0: const string& proxy_host, michael@0: const string& proxy_userpassword, michael@0: LibcurlWrapper* http_layer) { michael@0: product_ = product; michael@0: version_ = version; michael@0: guid_ = guid; michael@0: ptime_ = ptime; michael@0: ctime_ = ctime; michael@0: email_ = email; michael@0: comments_ = comments; michael@0: http_layer_ = http_layer; michael@0: michael@0: crash_server_ = crash_server; michael@0: proxy_host_ = proxy_host; michael@0: proxy_userpassword_ = proxy_userpassword; michael@0: minidump_pathname_ = minidump_pathname; michael@0: std::cout << "Uploader initializing"; michael@0: std::cout << "\tProduct: " << product_; michael@0: std::cout << "\tVersion: " << version_; michael@0: std::cout << "\tGUID: " << guid_; michael@0: if (!ptime_.empty()) { michael@0: std::cout << "\tProcess uptime: " << ptime_; michael@0: } michael@0: if (!ctime_.empty()) { michael@0: std::cout << "\tCumulative Process uptime: " << ctime_; michael@0: } michael@0: if (!email_.empty()) { michael@0: std::cout << "\tEmail: " << email_; michael@0: } michael@0: if (!comments_.empty()) { michael@0: std::cout << "\tComments: " << comments_; michael@0: } michael@0: } michael@0: michael@0: bool GoogleCrashdumpUploader::CheckRequiredParametersArePresent() { michael@0: string error_text; michael@0: if (product_.empty()) { michael@0: error_text.append("\nProduct name must be specified."); michael@0: } michael@0: michael@0: if (version_.empty()) { michael@0: error_text.append("\nProduct version must be specified."); michael@0: } michael@0: michael@0: if (guid_.empty()) { michael@0: error_text.append("\nClient ID must be specified."); michael@0: } michael@0: michael@0: if (minidump_pathname_.empty()) { michael@0: error_text.append("\nMinidump pathname must be specified."); michael@0: } michael@0: michael@0: if (!error_text.empty()) { michael@0: std::cout << error_text; michael@0: return false; michael@0: } michael@0: return true; michael@0: michael@0: } michael@0: michael@0: bool GoogleCrashdumpUploader::Upload() { michael@0: bool ok = http_layer_->Init(); michael@0: if (!ok) { michael@0: std::cout << "http layer init failed"; michael@0: return ok; michael@0: } michael@0: michael@0: if (!CheckRequiredParametersArePresent()) { michael@0: return false; michael@0: } michael@0: michael@0: struct stat st; michael@0: int err = stat(minidump_pathname_.c_str(), &st); michael@0: if (err) { michael@0: std::cout << minidump_pathname_ << " could not be found"; michael@0: return false; michael@0: } michael@0: michael@0: parameters_["prod"] = product_; michael@0: parameters_["ver"] = version_; michael@0: parameters_["guid"] = guid_; michael@0: parameters_["ptime"] = ptime_; michael@0: parameters_["ctime"] = ctime_; michael@0: parameters_["email"] = email_; michael@0: parameters_["comments_"] = comments_; michael@0: if (!http_layer_->AddFile(minidump_pathname_, michael@0: "upload_file_minidump")) { michael@0: return false; michael@0: } michael@0: std::cout << "Sending request to " << crash_server_; michael@0: return http_layer_->SendRequest(crash_server_, michael@0: parameters_, michael@0: NULL); michael@0: } michael@0: }