4 #include "package_manager/ostreemanager.h" 11 std::string base_url = (repo == RepositoryType::Director) ? config.uptane.director_server : config.uptane.repo_server;
12 std::string url = base_url +
"/" + version.RoleFileName(role);
14 if (!response.isOk()) {
17 *result = response.body;
21 static size_t DownloadHandler(
char* contents,
size_t size,
size_t nmemb,
void* userp) {
24 uint64_t downloaded = size * nmemb;
25 auto expected =
static_cast<uint64_t
>(ds->target.length());
26 if ((ds->downloaded_length + downloaded) > expected) {
27 return ds->downloaded_length + downloaded;
31 size_t written_size = ds->fhandle->wfeed(reinterpret_cast<uint8_t*>(contents), downloaded);
32 ds->hasher().update(reinterpret_cast<const unsigned char*>(contents), written_size);
33 unsigned int calculated = 0;
34 if (loggerGetSeverity() <= boost::log::trivial::severity_level::trace) {
35 if (ds->downloaded_length > 0) {
39 ds->downloaded_length += downloaded;
40 calculated =
static_cast<unsigned int>((ds->downloaded_length * 100) / expected);
41 if (loggerGetSeverity() <= boost::log::trivial::severity_level::trace) {
42 std::cout <<
"Downloading: " << calculated <<
"%";
43 if (ds->downloaded_length == expected) {
48 if (ds->events_channel) {
49 auto event = std::make_shared<event::DownloadProgressReport>(ds->target,
"Downloading", calculated);
50 (*(ds->events_channel))(
event);
55 bool Fetcher::fetchVerifyTarget(
const Target& target) {
58 if (!target.IsOstree()) {
59 DownloadMetaStruct ds(target, events_channel);
60 std::unique_ptr<StorageTargetWHandle> fhandle =
61 storage->allocateTargetFile(
false, target.filename(),
static_cast<size_t>(target.length()));
62 ds.fhandle = fhandle.get();
63 ds.downloaded_length = 0;
65 if (target.hashes().empty()) {
66 throw Exception(
"image",
"No hash defined for the target");
70 http->download(config.uptane.repo_server +
"/targets/" + target.filename(), DownloadHandler, &ds);
71 if (!response.isOk()) {
73 if (response.curl_code == CURLE_WRITE_ERROR) {
74 throw OversizedTarget(target.filename());
76 throw Exception(
"image",
"Could not download file, error: " + response.error_message);
80 if (!target.MatchWith(Hash(ds.hash_type, ds.hasher().getHexDigest()))) {
81 throw TargetHashMismatch(target.filename());
86 KeyManager keys(storage, config.keymanagerConfig());
88 data::InstallOutcome outcome =
89 OstreeManager::pull(config.pacman.sysroot, config.pacman.ostree_server, keys, target, events_channel);
93 LOG_ERROR <<
"Could not pull OSTree target. Aktualizr was built without OSTree support!";
96 }
catch (
const Exception& e) {
97 LOG_WARNING <<
"Error while downloading a target: " << e.what();
RepositoryType
This must match the repo_type table in sqlstorage.
Operation has already been processed.
Base data types that are used in The Update Framework (TUF), part of UPTANE.
Operation executed successfully.