sc3dev/src/Utility.cc

180 lines
4.3 KiB
C++

///
/// \file Utility.cc
/// \author K. Isom <kyle@imap.cc>
/// \date 2023-10-24
/// \brief Common utility functions for packaging.
///
/// Copyright 2023 K. Isom <kyle@imap.cc>
///
/// Permission to use, copy, modify, and/or distribute this software for
/// any purpose with or without fee is hereby granted, provided that
/// the above copyright notice and this permission notice appear in all /// copies.
///
/// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
/// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
/// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
/// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
/// DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
/// OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
/// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
/// PERFORMANCE OF THIS SOFTWARE.
///
#include <curlpp/Easy.hpp>
#include <curlpp/Infos.hpp>
#include <curlpp/Options.hpp>
#include <curlpp/cURLpp.hpp>
#include <filesystem>
#include <fstream>
#include <list>
#include <scsl/SimpleConfig.h>
#include "Utility.h"
namespace {
std::string
getUserPass()
{
return scsl::SimpleConfig::GetGlobal("http_user") + ":" +
scsl::SimpleConfig::GetGlobal("http_password");
}
}
Result
PutFile(std::string url, std::string path)
{
const curlpp::Cleanup clearerr;
static std::string userPass;
auto verbose = false;
curlpp::Easy request;
if (scsl::SimpleConfig::GetGlobal("verbose") == "true") {
verbose = true;
}
if (userPass.empty()) {
userPass = getUserPass();
}
try {
std::list<std::string> header;
header.emplace_back("Content-Type: application/octet-stream");
if (!std::filesystem::exists(path)) {
std::cerr << "[!] " << path << " does not exist!\n";
return Result::CurlFailed;
}
auto fileSize = static_cast<int64_t>(std::filesystem::file_size(path));
std::ifstream uploadFile(path);
if (!uploadFile.good()) {
std::cerr << "[!] " << path << " does not exist!\n";
return Result::CurlFailed;
}
request.setOpt(new curlpp::options::Url(url));
if (verbose) {
request.setOpt(new curlpp::options::Verbose(true));
} request.setOpt(new curlpp::options::UserPwd(userPass));
request.setOpt(new curlpp::Options::ReadStream(&uploadFile));
request.setOpt(new curlpp::Options::InfileSize(fileSize));
request.setOpt(new curlpp::Options::Upload(true));
request.perform();
} catch (curlpp::LogicError &e) {
std::cerr << e.what() << "\n";
return Result::CurlFailed;
} catch (curlpp::RuntimeError &e) {
std::cerr << e.what() << "\n";
return Result::CurlFailed;
}
auto httpStatus = curlpp::infos::ResponseCode::get(request);
switch (httpStatus) {
case 201:
return Result::Created;
case 400:
return Result::BadPackage;
case 409:
return Result::DuplicatePackage;
default:
return Result::CurlFailed;
}
}
Result
DeleteFile(std::string url)
{
const curlpp::Cleanup clearerr;
static std::string userPass;
bool verbose = false;
curlpp::Easy request;
if (scsl::SimpleConfig::GetGlobal("verbose") == "true") {
verbose = true;
}
if (userPass.empty()) {
userPass = getUserPass();
}
try {
request.setOpt(new curlpp::options::Url(url));
if (verbose) {
request.setOpt(new curlpp::options::Verbose(true));
}
request.setOpt(new curlpp::options::UserPwd(userPass));
request.setOpt(new curlpp::Options::CustomRequest ("DELETE"));
request.perform();
} catch (curlpp::LogicError &e) {
std::cerr << e.what() << "\n";
return Result::CurlFailed;
} catch (curlpp::RuntimeError &e) {
std::cerr << e.what() << "\n";
return Result::CurlFailed;
}
auto httpStatus = curlpp::infos::ResponseCode::get(request);
switch (httpStatus) {
case 204:
return Result::Deleted;
case 404:
return Result::NotFound;
default:
return Result::CurlFailed;
}
}
std::string
ResultToString(Result result)
{
switch (result) {
case Result::Created:
return "OK: created";
case Result::BadPackage:
return "FAILED: bad package";
case Result::DuplicatePackage:
return "FAILED: duplicate package?";
case Result::Deleted:
return "OK: deleted";
case Result::NotFound:
return "FAILED: not found";
case Result::CurlFailed:
return "FAILED: curl failed";
default:
return "FAILED: unhandled error";
}
}
bool
ResultSuccess(Result result)
{
return (result == Result::Created || result == Result::Deleted);
}