char *ask_password(const char *question) { if (is_slave_mode()) printf(REPORT_PREFIX_ASK_PASSWORD "%s\n", question); else printf("%s ", question); fflush(stdout); if (!is_slave_mode() && is_noninteractive_mode()) { putchar('\n'); fflush(stdout); return xstrdup(""); } bool changed = set_echo(false); char *result = xmalloc_fgets(stdin); strtrimch(result, '\n'); if (changed) set_echo(true); return result; }
char *ask(const char *question) { if (is_slave_mode()) printf(REPORT_PREFIX_ASK "%s\n", question); else printf("%s ", question); fflush(stdout); if (!is_slave_mode() && is_noninteractive_mode()) { putchar('\n'); fflush(stdout); return xstrdup(""); } char *result = xmalloc_fgets(stdin); strtrimch(result, '\n'); return result; }
static void bodhi_read_value(json_object *json, const char *item_name, void *value, int flags) { json_object *j = json_object_object_get(json, item_name); if (!j) { error_msg("'%s' section is not available", item_name); return; } switch (flags) { case BODHI_READ_INT: *(int *) value = json_object_get_int(j); break; case BODHI_READ_STR: *(char **) value = (char *) strtrimch(xstrdup(json_object_to_json_string(j)), '"'); break; case BODHI_READ_JSON_OBJ: *(json_object **) value = (json_object *) j; break; }; }
void dump_docker_info(struct dump_dir *dd, const char *root_dir) { if (!dd_exist(dd, FILENAME_CONTAINER)) dd_save_text(dd, FILENAME_CONTAINER, "docker"); json_object *json = NULL; char *mntnf_path = concat_path_file(dd->dd_dirname, FILENAME_MOUNTINFO); FILE *mntnf_file = fopen(mntnf_path, "r"); free(mntnf_path); struct mount_point { const char *name; enum mountinfo_fields { MOUNTINFO_ROOT, MOUNTINFO_SOURCE, } field; } mount_points[] = { { "/sys/fs/cgroup/memory", MOUNTINFO_ROOT }, { "/", MOUNTINFO_SOURCE }, }; char *container_id = NULL; char *output = NULL; /* initialized to 0 because we call mountinfo_destroy below */ struct mountinfo mntnf = {0}; for (size_t i = 0; i < ARRAY_SIZE(mount_points); ++i) { log_debug("Parsing container ID from mount point '%s'", mount_points[i].name); rewind(mntnf_file); /* get_mountinfo_for_mount_point() re-initializes &mntnf */ mountinfo_destroy(&mntnf); int r = get_mountinfo_for_mount_point(mntnf_file, &mntnf, mount_points[i].name); if (r != 0) { log_debug("Mount poin not found"); continue; } const char *mnt_info = NULL; switch(mount_points[i].field) { case MOUNTINFO_ROOT: mnt_info = MOUNTINFO_ROOT(mntnf); break; case MOUNTINFO_SOURCE: mnt_info = MOUNTINFO_MOUNT_SOURCE(mntnf); break; default: error_msg("BUG: forgotten MOUNTINFO field type"); abort(); } const char *last = strrchr(mnt_info, '/'); if (last == NULL || strncmp("/docker-", last, strlen("/docker-")) != 0) { log_debug("Mounted source is not a docker mount source: '%s'", mnt_info); continue; } last = strrchr(last, '-'); if (last == NULL) { log_debug("The docker mount point has unknown format"); continue; } ++last; /* Why we copy only 12 bytes here? * Because only the first 12 characters are used by docker as ID of the * container. */ container_id = xstrndup(last, 12); if (strlen(container_id) != 12) { log_debug("Failed to get container ID"); continue; } char *docker_inspect_cmdline = NULL; if (root_dir != NULL) docker_inspect_cmdline = xasprintf("chroot %s /bin/sh -c \"docker inspect %s\"", root_dir, container_id); else docker_inspect_cmdline = xasprintf("docker inspect %s", container_id); log_debug("Executing: '%s'", docker_inspect_cmdline); output = run_in_shell_and_save_output(0, docker_inspect_cmdline, "/", NULL); free(docker_inspect_cmdline); if (output == NULL || strcmp(output, "[]\n") == 0) { log_debug("Unsupported container ID: '%s'", container_id); free(container_id); container_id = NULL; free(output); output = NULL; continue; } break; } fclose(mntnf_file); if (container_id == NULL) { error_msg("Could not inspect the container"); goto dump_docker_info_cleanup; } dd_save_text(dd, FILENAME_CONTAINER_ID, container_id); dd_save_text(dd, FILENAME_DOCKER_INSPECT, output); json = json_tokener_parse(output); free(output); if (is_error(json)) { error_msg("Unable parse response from docker"); goto dump_docker_info_cleanup; } json_object *container = json_object_array_get_idx(json, 0); if (container == NULL) { error_msg("docker does not contain array of containers"); goto dump_docker_info_cleanup; } json_object *config = NULL; if (!json_object_object_get_ex(container, "Config", &config)) { error_msg("container does not have 'Config' member"); goto dump_docker_info_cleanup; } json_object *image = NULL; if (!json_object_object_get_ex(config, "Image", &image)) { error_msg("Config does not have 'Image' member"); goto dump_docker_info_cleanup; } char *name = strtrimch(xstrdup(json_object_to_json_string(image)), '"'); dd_save_text(dd, FILENAME_CONTAINER_IMAGE, name); free(name); dump_docker_info_cleanup: if (json != NULL) json_object_put(json); mountinfo_destroy(&mntnf); return; }