import: make image root directory configurable, instead of hardcoding /var/lib/container

This commit is contained in:
Lennart Poettering 2014-12-26 19:21:09 +01:00
parent 5fc7f35842
commit 087682d103
5 changed files with 45 additions and 17 deletions

View file

@ -94,6 +94,7 @@ struct DkrImport {
CurlGlue *glue; CurlGlue *glue;
char *index_url; char *index_url;
char *image_root;
Hashmap *names; Hashmap *names;
Hashmap *jobs; Hashmap *jobs;
@ -406,8 +407,8 @@ static void dkr_import_name_maybe_finish(DkrImportName *name) {
assert(name->id); assert(name->id);
p = strappenda("/var/lib/container/", name->local); p = strappenda(name->import->image_root, "/", name->local);
q = strappenda("/var/lib/container/.dkr-", name->id); q = strappenda(name->import->image_root, "/.dkr-", name->id);
if (name->force_local) { if (name->force_local) {
(void) btrfs_subvol_remove(p); (void) btrfs_subvol_remove(p);
@ -534,7 +535,7 @@ static int dkr_import_name_pull_layer(DkrImportName *name) {
return 0; return 0;
} }
path = strjoin("/var/lib/container/.dkr-", layer, NULL); path = strjoin(name->import->image_root, "/.dkr-", layer, NULL);
if (!path) if (!path)
return log_oom(); return log_oom();
@ -575,7 +576,7 @@ static int dkr_import_name_pull_layer(DkrImportName *name) {
if (base) { if (base) {
const char *base_path; const char *base_path;
base_path = strappend("/var/lib/container/.dkr-", base); base_path = strappenda(name->import->image_root, "/.dkr-", base);
r = btrfs_subvol_snapshot(base_path, temp, false, true); r = btrfs_subvol_snapshot(base_path, temp, false, true);
} else } else
r = btrfs_subvol_make(temp); r = btrfs_subvol_make(temp);
@ -1021,13 +1022,21 @@ static int dkr_import_name_begin(DkrImportName *name) {
return dkr_import_name_add_job(name, DKR_IMPORT_JOB_IMAGES, url, &name->job_images); return dkr_import_name_add_job(name, DKR_IMPORT_JOB_IMAGES, url, &name->job_images);
} }
int dkr_import_new(DkrImport **import, sd_event *event, const char *index_url, dkr_import_on_finished on_finished, void *userdata) { int dkr_import_new(
DkrImport **import,
sd_event *event,
const char *index_url,
const char *image_root,
dkr_import_on_finished on_finished,
void *userdata) {
_cleanup_(dkr_import_unrefp) DkrImport *i = NULL; _cleanup_(dkr_import_unrefp) DkrImport *i = NULL;
char *e; char *e;
int r; int r;
assert(import); assert(import);
assert(dkr_url_is_valid(index_url)); assert(dkr_url_is_valid(index_url));
assert(image_root);
i = new0(DkrImport, 1); i = new0(DkrImport, 1);
if (!i) if (!i)
@ -1040,6 +1049,10 @@ int dkr_import_new(DkrImport **import, sd_event *event, const char *index_url, d
if (!i->index_url) if (!i->index_url)
return -ENOMEM; return -ENOMEM;
i->image_root = strdup(image_root);
if (!i->image_root)
return -ENOMEM;
e = endswith(i->index_url, "/"); e = endswith(i->index_url, "/");
if (e) if (e)
*e = 0; *e = 0;
@ -1084,7 +1097,7 @@ DkrImport* dkr_import_unref(DkrImport *import) {
sd_event_unref(import->event); sd_event_unref(import->event);
free(import->index_url); free(import->index_url);
free(import->image_root);
free(import); free(import);
return NULL; return NULL;

View file

@ -26,7 +26,7 @@ typedef struct DkrImport DkrImport;
typedef void (*dkr_import_on_finished)(DkrImport *import, int error, void *userdata); typedef void (*dkr_import_on_finished)(DkrImport *import, int error, void *userdata);
int dkr_import_new(DkrImport **import, sd_event *event, const char *index_url, dkr_import_on_finished on_finished, void *userdata); int dkr_import_new(DkrImport **import, sd_event *event, const char *index_url, const char *image_root, dkr_import_on_finished on_finished, void *userdata);
DkrImport* dkr_import_unref(DkrImport *import); DkrImport* dkr_import_unref(DkrImport *import);
DEFINE_TRIVIAL_CLEANUP_FUNC(DkrImport*, dkr_import_unref); DEFINE_TRIVIAL_CLEANUP_FUNC(DkrImport*, dkr_import_unref);

View file

@ -60,6 +60,7 @@ struct GptImport {
sd_event *event; sd_event *event;
CurlGlue *glue; CurlGlue *glue;
char *image_root;
Hashmap *files; Hashmap *files;
gpt_import_on_finished on_finished; gpt_import_on_finished on_finished;
@ -129,9 +130,9 @@ static int gpt_import_file_make_final_path(GptImportFile *f) {
if (!escaped_etag) if (!escaped_etag)
return -ENOMEM; return -ENOMEM;
f->final_path = strjoin("/var/lib/container/.gpt-", escaped_url, ".", escaped_etag, ".gpt", NULL); f->final_path = strjoin(f->import->image_root, "/.gpt-", escaped_url, ".", escaped_etag, ".gpt", NULL);
} else } else
f->final_path = strjoin("/var/lib/container/.gpt-", escaped_url, ".gpt", NULL); f->final_path = strjoin(f->import->image_root, "/.gpt-", escaped_url, ".gpt", NULL);
if (!f->final_path) if (!f->final_path)
return -ENOMEM; return -ENOMEM;
@ -169,7 +170,7 @@ static void gpt_import_file_success(GptImportFile *f) {
} }
} }
p = strappenda("/var/lib/container/", f->local, ".gpt"); p = strappenda(f->import->image_root, "/", f->local, ".gpt");
if (f->force_local) if (f->force_local)
(void) rm_rf_dangerous(p, false, true, false); (void) rm_rf_dangerous(p, false, true, false);
@ -469,7 +470,7 @@ static int gpt_import_file_find_old_etags(GptImportFile *f) {
if (!escaped_url) if (!escaped_url)
return -ENOMEM; return -ENOMEM;
d = opendir("/var/lib/container/"); d = opendir(f->import->image_root);
if (!d) { if (!d) {
if (errno == ENOENT) if (errno == ENOENT)
return 0; return 0;
@ -575,11 +576,12 @@ static int gpt_import_file_begin(GptImportFile *f) {
return 0; return 0;
} }
int gpt_import_new(GptImport **import, sd_event *event, gpt_import_on_finished on_finished, void *userdata) { int gpt_import_new(GptImport **import, sd_event *event, const char *image_root, gpt_import_on_finished on_finished, void *userdata) {
_cleanup_(gpt_import_unrefp) GptImport *i = NULL; _cleanup_(gpt_import_unrefp) GptImport *i = NULL;
int r; int r;
assert(import); assert(import);
assert(image_root);
i = new0(GptImport, 1); i = new0(GptImport, 1);
if (!i) if (!i)
@ -588,6 +590,10 @@ int gpt_import_new(GptImport **import, sd_event *event, gpt_import_on_finished o
i->on_finished = on_finished; i->on_finished = on_finished;
i->userdata = userdata; i->userdata = userdata;
i->image_root = strdup(image_root);
if (!i->image_root)
return -ENOMEM;
if (event) if (event)
i->event = sd_event_ref(event); i->event = sd_event_ref(event);
else { else {
@ -622,6 +628,7 @@ GptImport* gpt_import_unref(GptImport *import) {
curl_glue_unref(import->glue); curl_glue_unref(import->glue);
sd_event_unref(import->event); sd_event_unref(import->event);
free(import->image_root);
free(import); free(import);
return NULL; return NULL;

View file

@ -26,7 +26,7 @@ typedef struct GptImport GptImport;
typedef void (*gpt_import_on_finished)(GptImport *import, int error, void *userdata); typedef void (*gpt_import_on_finished)(GptImport *import, int error, void *userdata);
int gpt_import_new(GptImport **import, sd_event *event, gpt_import_on_finished on_finished, void *userdata); int gpt_import_new(GptImport **import, sd_event *event, const char *image_root, gpt_import_on_finished on_finished, void *userdata);
GptImport* gpt_import_unref(GptImport *import); GptImport* gpt_import_unref(GptImport *import);
DEFINE_TRIVIAL_CLEANUP_FUNC(GptImport*, gpt_import_unref); DEFINE_TRIVIAL_CLEANUP_FUNC(GptImport*, gpt_import_unref);

View file

@ -29,6 +29,7 @@
#include "import-dkr.h" #include "import-dkr.h"
static bool arg_force = false; static bool arg_force = false;
static const char *arg_image_root = "/var/lib/container";
static const char* arg_dkr_index_url = DEFAULT_DKR_INDEX_URL; static const char* arg_dkr_index_url = DEFAULT_DKR_INDEX_URL;
@ -87,7 +88,7 @@ static int pull_gpt(int argc, char *argv[], void *userdata) {
return -EINVAL; return -EINVAL;
} }
p = strappenda("/var/lib/container/", local, ".gpt"); p = strappenda(arg_image_root, "/", local, ".gpt");
if (laccess(p, F_OK) >= 0) { if (laccess(p, F_OK) >= 0) {
if (!arg_force) { if (!arg_force) {
log_info("Image '%s' already exists.", local); log_info("Image '%s' already exists.", local);
@ -108,7 +109,7 @@ static int pull_gpt(int argc, char *argv[], void *userdata) {
sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
r = gpt_import_new(&import, event, on_gpt_finished, event); r = gpt_import_new(&import, event, arg_image_root, on_gpt_finished, event);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to allocate importer: %m"); return log_error_errno(r, "Failed to allocate importer: %m");
@ -188,7 +189,7 @@ static int pull_dkr(int argc, char *argv[], void *userdata) {
return -EINVAL; return -EINVAL;
} }
p = strappenda("/var/lib/container/", local); p = strappenda(arg_image_root, "/", local);
if (laccess(p, F_OK) >= 0) { if (laccess(p, F_OK) >= 0) {
if (!arg_force) { if (!arg_force) {
log_info("Image '%s' already exists.", local); log_info("Image '%s' already exists.", local);
@ -209,7 +210,7 @@ static int pull_dkr(int argc, char *argv[], void *userdata) {
sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
r = dkr_import_new(&import, event, arg_dkr_index_url, on_dkr_finished, event); r = dkr_import_new(&import, event, arg_dkr_index_url, arg_image_root, on_dkr_finished, event);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to allocate importer: %m"); return log_error_errno(r, "Failed to allocate importer: %m");
@ -233,6 +234,7 @@ static int help(int argc, char *argv[], void *userdata) {
" -h --help Show this help\n" " -h --help Show this help\n"
" --version Show package version\n" " --version Show package version\n"
" --force Force creation of image\n" " --force Force creation of image\n"
" --image-root= Image root directory\n"
" --dkr-index-url=URL Specify index URL to use for downloads\n\n" " --dkr-index-url=URL Specify index URL to use for downloads\n\n"
"Commands:\n" "Commands:\n"
" pull-dkr REMOTE [NAME] Download a DKR image\n" " pull-dkr REMOTE [NAME] Download a DKR image\n"
@ -248,6 +250,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_VERSION = 0x100, ARG_VERSION = 0x100,
ARG_FORCE, ARG_FORCE,
ARG_DKR_INDEX_URL, ARG_DKR_INDEX_URL,
ARG_IMAGE_ROOT,
}; };
static const struct option options[] = { static const struct option options[] = {
@ -255,6 +258,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "version", no_argument, NULL, ARG_VERSION }, { "version", no_argument, NULL, ARG_VERSION },
{ "force", no_argument, NULL, ARG_FORCE }, { "force", no_argument, NULL, ARG_FORCE },
{ "dkr-index-url", required_argument, NULL, ARG_DKR_INDEX_URL }, { "dkr-index-url", required_argument, NULL, ARG_DKR_INDEX_URL },
{ "image-root", required_argument, NULL, ARG_IMAGE_ROOT },
{} {}
}; };
@ -288,6 +292,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_dkr_index_url = optarg; arg_dkr_index_url = optarg;
break; break;
case ARG_IMAGE_ROOT:
arg_image_root = optarg;
break;
case '?': case '?':
return -EINVAL; return -EINVAL;