X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fimport%2Fimport-tar.c;h=999aa8ab5e8c5dd9924402e7fe36b64e9cc97a47;hb=1433efd219a6df414a1821b3d3d70d86201ed3e4;hp=80ae83971efb93dd03164584bda76dff2c4d1797;hpb=2c140ded48fc31e3c80a92a1f755a2b1ab6e1a30;p=elogind.git diff --git a/src/import/import-tar.c b/src/import/import-tar.c index 80ae83971..999aa8ab5 100644 --- a/src/import/import-tar.c +++ b/src/import/import-tar.c @@ -22,6 +22,7 @@ #include #include +#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;