summaryrefslogtreecommitdiff
path: root/src/import/import-tar.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-01-23 01:16:31 +0100
committerLennart Poettering <lennart@poettering.net>2015-01-23 01:17:55 +0100
commit7079cfeffb6d520f20ddff53fd78467e72e6cc94 (patch)
tree4762322f62febd444e01def3e6bfb771d2887422 /src/import/import-tar.c
parenta92ccc5ba22ec40fee560a46c478321d1c5df5af (diff)
importd: when listing transfers, show progress percentage
With this change the pull protocol implementation processes will pass progress data to importd which then passes this information on via the bus. We use sd_notify() as generic transport for this communication, making importd listen to them, while matching the incoming messages to the right transfer.
Diffstat (limited to 'src/import/import-tar.c')
-rw-r--r--src/import/import-tar.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/import/import-tar.c b/src/import/import-tar.c
index 80ae83971e..999aa8ab5e 100644
--- a/src/import/import-tar.c
+++ b/src/import/import-tar.c
@@ -22,6 +22,7 @@
#include <sys/prctl.h>
#include <curl/curl.h>
+#include "sd-daemon.h"
#include "utf8.h"
#include "strv.h"
#include "copy.h"
@@ -35,6 +36,13 @@
#include "import-common.h"
#include "import-tar.h"
+typedef enum TarProgress {
+ TAR_DOWNLOADING,
+ TAR_VERIFYING,
+ TAR_FINALIZING,
+ TAR_COPYING,
+} TarProgress;
+
struct TarImport {
sd_event *event;
CurlGlue *glue;
@@ -134,6 +142,53 @@ int tar_import_new(
return 0;
}
+static void tar_import_report_progress(TarImport *i, TarProgress p) {
+ unsigned percent;
+
+ assert(i);
+
+ switch (p) {
+
+ case TAR_DOWNLOADING: {
+ unsigned remain = 85;
+
+ percent = 0;
+
+ if (i->checksum_job) {
+ percent += i->checksum_job->progress_percent * 5 / 100;
+ remain -= 5;
+ }
+
+ if (i->signature_job) {
+ percent += i->signature_job->progress_percent * 5 / 100;
+ remain -= 5;
+ }
+
+ if (i->tar_job)
+ percent += i->tar_job->progress_percent * remain / 100;
+ break;
+ }
+
+ case TAR_VERIFYING:
+ percent = 85;
+ break;
+
+ case TAR_FINALIZING:
+ percent = 90;
+ break;
+
+ case TAR_COPYING:
+ percent = 95;
+ break;
+
+ default:
+ assert_not_reached("Unknown progress state");
+ }
+
+ sd_notifyf(false, "X_IMPORT_PROGRESS=%u", percent);
+ log_debug("Combined progress %u%%", percent);
+}
+
static int tar_import_make_local_copy(TarImport *i) {
int r;
@@ -209,10 +264,14 @@ static void tar_import_job_on_finished(ImportJob *j) {
if (!i->tar_job->etag_exists) {
/* This is a new download, verify it, and move it into place */
+ tar_import_report_progress(i, TAR_VERIFYING);
+
r = import_verify(i->tar_job, i->checksum_job, i->signature_job);
if (r < 0)
goto finish;
+ tar_import_report_progress(i, TAR_FINALIZING);
+
r = import_make_read_only(i->temp_path);
if (r < 0)
goto finish;
@@ -226,6 +285,8 @@ static void tar_import_job_on_finished(ImportJob *j) {
i->temp_path = NULL;
}
+ tar_import_report_progress(i, TAR_COPYING);
+
r = tar_import_make_local_copy(i);
if (r < 0)
goto finish;
@@ -277,6 +338,17 @@ static int tar_import_job_on_open_disk(ImportJob *j) {
return 0;
}
+static void tar_import_job_on_progress(ImportJob *j) {
+ TarImport *i;
+
+ assert(j);
+ assert(j->userdata);
+
+ i = j->userdata;
+
+ tar_import_report_progress(i, TAR_DOWNLOADING);
+}
+
int tar_import_pull(TarImport *i, const char *url, const char *local, bool force_local, ImportVerify verify) {
int r;
@@ -303,6 +375,7 @@ int tar_import_pull(TarImport *i, const char *url, const char *local, bool force
i->tar_job->on_finished = tar_import_job_on_finished;
i->tar_job->on_open_disk = tar_import_job_on_open_disk;
+ i->tar_job->on_progress = tar_import_job_on_progress;
i->tar_job->calc_checksum = verify != IMPORT_VERIFY_NO;
r = import_find_old_etags(url, i->image_root, DT_DIR, ".tar-", NULL, &i->tar_job->old_etags);
@@ -318,12 +391,16 @@ int tar_import_pull(TarImport *i, const char *url, const char *local, bool force
return r;
if (i->checksum_job) {
+ i->checksum_job->on_progress = tar_import_job_on_progress;
+
r = import_job_begin(i->checksum_job);
if (r < 0)
return r;
}
if (i->signature_job) {
+ i->signature_job->on_progress = tar_import_job_on_progress;
+
r = import_job_begin(i->signature_job);
if (r < 0)
return r;