X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_restore.c;h=1ae783b8ee9e3830a12706266799d2d7c0974246;hb=44566f589dd96e4414e38ec4bf7d76b22fbcd9aa;hp=78889be8ff40952ff00380dd3b4ce9a558c379a3;hpb=8e1a4eeb2bdc80c9ab45a822a8da1cfa0ece1a6d;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_restore.c b/bacula/src/dird/ua_restore.c index 78889be8ff..1ae783b8ee 100644 --- a/bacula/src/dird/ua_restore.c +++ b/bacula/src/dird/ua_restore.c @@ -35,17 +35,6 @@ /* Imported functions */ extern void print_bsr(UAContext *ua, RBSR *bsr); -/* Imported variables */ -extern const char *uar_list_jobs, *uar_file, *uar_sel_files; -extern const char *uar_del_temp, *uar_del_temp1, *uar_create_temp; -extern const char *uar_create_temp1, *uar_last_full, *uar_full; -extern const char *uar_inc, *uar_list_temp, *uar_sel_jobid_temp; -extern const char *uar_sel_all_temp1, *uar_sel_fileset, *uar_mediatype; -extern const char *uar_jobid_fileindex, *uar_dif, *uar_sel_all_temp; -extern const char *uar_count_files, *uar_jobids_fileindex; -extern const char *uar_jobid_fileindex_from_dir; -extern const char *uar_jobid_fileindex_from_table; - /* Forward referenced functions */ @@ -53,10 +42,7 @@ static int last_full_handler(void *ctx, int num_fields, char **row); static int jobid_handler(void *ctx, int num_fields, char **row); static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx); static int fileset_handler(void *ctx, int num_fields, char **row); -static void print_name_list(UAContext *ua, NAME_LIST *name_list); -static int unique_name_list_handler(void *ctx, int num_fields, char **row); static void free_name_list(NAME_LIST *name_list); -static void get_storage_from_mediatype(UAContext *ua, NAME_LIST *name_list, RESTORE_CTX *rx); static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *date); static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx); static void free_rx(RESTORE_CTX *rx); @@ -93,6 +79,10 @@ int restore_cmd(UAContext *ua, const char *cmd) i = find_arg_with_value(ua, "where"); if (i >= 0) { rx.where = ua->argv[i]; + if (!acl_access_ok(ua, Where_ACL, rx.where)) { + bsendmsg(ua, _("Forbidden \"where\" specified.\n")); + goto bail_out; + } } if (!open_db(ua)) { @@ -178,22 +168,26 @@ int restore_cmd(UAContext *ua, const char *cmd) /* Build run command */ if (rx.where) { + if (!acl_access_ok(ua, Where_ACL, rx.where)) { + bsendmsg(ua, _("Forbidden \"where\" specified.\n")); + goto bail_out; + } Mmsg(ua->cmd, "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s\"" " where=\"%s\" files=%d catalog=\"%s\"", - job->hdr.name, rx.ClientName, rx.store?rx.store->hdr.name:"", - jcr->RestoreBootstrap, rx.where, rx.selected_files, ua->catalog->hdr.name); + job->name(), rx.ClientName, rx.store?rx.store->name():"", + jcr->RestoreBootstrap, rx.where, rx.selected_files, ua->catalog->name()); } else { Mmsg(ua->cmd, "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s\"" " files=%d catalog=\"%s\"", - job->hdr.name, rx.ClientName, rx.store?rx.store->hdr.name:"", - jcr->RestoreBootstrap, rx.selected_files, ua->catalog->hdr.name); + job->name(), rx.ClientName, rx.store?rx.store->name():"", + jcr->RestoreBootstrap, rx.selected_files, ua->catalog->name()); } if (find_arg(ua, NT_("yes")) > 0) { pm_strcat(ua->cmd, " yes"); /* pass it on to the run command */ } - Dmsg1(100, "Submitting: %s\n", ua->cmd); + Dmsg1(200, "Submitting: %s\n", ua->cmd); parse_ua_args(ua); run_cmd(ua, ua->cmd); free_rx(&rx); @@ -370,12 +364,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) } pm_strcpy(ua->cmd, ua->argv[i]); insert_one_file_or_dir(ua, rx, date, j==4); - if (rx->name_list.num_ids) { - /* Check MediaType and select storage that corresponds */ - get_storage_from_mediatype(ua, &rx->name_list, rx); - done = true; - } - break; + return 2; case 5: /* select */ if (!have_date) { bstrutime(date, sizeof(date), time(NULL)); @@ -410,9 +399,6 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) break; } } - if (rx->name_list.num_ids) { - return 2; /* filename list made */ - } if (!done) { bsendmsg(ua, _("\nFirst you select one or more JobIds that contain files\n" @@ -436,6 +422,10 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) case -1: /* error or cancel */ return 0; case 0: /* list last 20 Jobs run */ + if (!acl_access_ok(ua, Command_ACL, NT_("sqlquery"), 8)) { + bsendmsg(ua, _("SQL query not authorized.\n")); + return 0; + } gui_save = ua->jcr->gui; ua->jcr->gui = true; db_list_sql_query(ua->jcr, ua->db, uar_list_jobs, prtit, ua, 1, HORZ_LIST); @@ -467,6 +457,10 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) pm_strcpy(rx->JobIds, ua->cmd); break; case 3: /* Enter an SQL list command */ + if (!acl_access_ok(ua, Command_ACL, NT_("sqlquery"), 8)) { + bsendmsg(ua, _("SQL query not authorized.\n")); + return 0; + } if (!get_cmd(ua, _("Enter SQL list command: "))) { return 0; } @@ -508,10 +502,6 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) } insert_one_file_or_dir(ua, rx, date, false); } - /* Check MediaType and select storage that corresponds */ - if (rx->name_list.num_ids) { - get_storage_from_mediatype(ua, &rx->name_list, rx); - } return 2; case 7: /* enter files backed up before specified time */ if (!get_date(ua, date, sizeof(date))) { @@ -533,10 +523,6 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) } insert_one_file_or_dir(ua, rx, date, false); } - /* Check MediaType and select storage that corresponds */ - if (rx->name_list.num_ids) { - get_storage_from_mediatype(ua, &rx->name_list, rx); - } return 2; case 8: /* Find JobIds for current backup */ @@ -591,10 +577,6 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) } insert_one_file_or_dir(ua, rx, date, true); } - /* Check MediaType and select storage that corresponds */ - if (rx->name_list.num_ids) { - get_storage_from_mediatype(ua, &rx->name_list, rx); - } return 2; case 11: /* Cancel or quit */ @@ -720,8 +702,6 @@ static void insert_one_file_or_dir(UAContext *ua, RESTORE_CTX *rx, char *date, b static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *file, char *date) { - char ed1[50]; - strip_trailing_newline(file); split_path_and_filename(rx, file); if (*rx->JobIds == 0) { @@ -741,14 +721,6 @@ static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *f bsendmsg(ua, _("No database record found for: %s\n"), file); return true; } - /* - * Find the MediaTypes for this JobId and add to the name_list - */ - Mmsg(rx->query, uar_mediatype, edit_int64(rx->JobId, ed1)); - if (!db_sql_query(ua->db, rx->query, unique_name_list_handler, (void *)&rx->name_list)) { - bsendmsg(ua, "%s", db_strerror(ua->db)); - return false; - } return true; } @@ -759,8 +731,6 @@ static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *f static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *dir, char *date) { - char ed1[50]; - strip_trailing_junk(dir); if (*rx->JobIds == 0) { bsendmsg(ua, _("No JobId specified cannot continue.\n")); @@ -779,14 +749,6 @@ static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *di bsendmsg(ua, _("No database record found for: %s\n"), dir); return true; } - /* - * Find the MediaTypes for this JobId and add to the name_list - */ - Mmsg(rx->query, uar_mediatype, edit_int64(rx->JobId, ed1)); - if (!db_sql_query(ua->db, rx->query, unique_name_list_handler, (void *)&rx->name_list)) { - bsendmsg(ua, "%s", db_strerror(ua->db)); - return false; - } return true; } @@ -795,8 +757,6 @@ static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *di */ static bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *table) { - char ed1[50]; - strip_trailing_junk(table); Mmsg(rx->query, uar_jobid_fileindex_from_table, table); @@ -810,14 +770,6 @@ static bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char * bsendmsg(ua, _("No table found: %s\n"), table); return true; } - /* - * Find the MediaTypes for this JobId and add to the name_list - */ - Mmsg(rx->query, uar_mediatype, edit_int64(rx->JobId, ed1)); - if (!db_sql_query(ua->db, rx->query, unique_name_list_handler, (void *)&rx->name_list)) { - bsendmsg(ua, "%s", db_strerror(ua->db)); - return false; - } return true; } @@ -867,7 +819,7 @@ static void split_path_and_filename(RESTORE_CTX *rx, char *name) rx->pnl = 0; } - Dmsg2(100, "sllit path=%s file=%s\n", rx->path, rx->fname); + Dmsg2(100, "split path=%s file=%s\n", rx->path, rx->fname); } static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) @@ -922,13 +874,6 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) if (!db_sql_query(ua->db, rx->query, insert_tree_handler, (void *)&tree)) { bsendmsg(ua, "%s", db_strerror(ua->db)); } - /* - * Find the MediaTypes for this JobId and add to the name_list - */ - Mmsg(rx->query, uar_mediatype, edit_int64(JobId, ed1)); - if (!db_sql_query(ua->db, rx->query, unique_name_list_handler, (void *)&rx->name_list)) { - bsendmsg(ua, "%s", db_strerror(ua->db)); - } } if (tree.FileCount == 0) { bsendmsg(ua, _("\nThere were no files inserted into the tree, so file selection\n" @@ -968,9 +913,6 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) } } - /* Check MediaType and select storage that corresponds */ - get_storage_from_mediatype(ua, &rx->name_list, rx); - if (find_arg(ua, NT_("done")) < 0) { /* Let the user interact in selecting which files to restore */ OK = user_select_files_from_tree(&tree); @@ -1070,7 +1012,7 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat if (rx->pool) { POOL_DBR pr; memset(&pr, 0, sizeof(pr)); - bstrncpy(pr.Name, rx->pool->hdr.name, sizeof(pr.Name)); + bstrncpy(pr.Name, rx->pool->name(), sizeof(pr.Name)); if (db_get_pool_record(ua->jcr, ua->db, &pr)) { bsnprintf(pool_select, sizeof(pool_select), "AND Media.PoolId=%s ", edit_int64(pr.PoolId, ed1)); @@ -1248,50 +1190,6 @@ static int fileset_handler(void *ctx, int num_fields, char **row) return 0; } -/* - * Called here with each name to be added to the list. The name is - * added to the list if it is not already in the list. - * - * Used to make unique list of FileSets and MediaTypes - */ -static int unique_name_list_handler(void *ctx, int num_fields, char **row) -{ - NAME_LIST *name = (NAME_LIST *)ctx; - - if (name->num_ids == MAX_ID_LIST_LEN) { - return 1; - } - if (name->num_ids == name->max_ids) { - if (name->max_ids == 0) { - name->max_ids = 1000; - name->name = (char **)bmalloc(sizeof(char *) * name->max_ids); - } else { - name->max_ids = (name->max_ids * 3) / 2; - name->name = (char **)brealloc(name->name, sizeof(char *) * name->max_ids); - } - } - for (int i=0; inum_ids; i++) { - if (strcmp(name->name[i], row[0]) == 0) { - return 0; /* already in list, return */ - } - } - /* Add new name to list */ - name->name[name->num_ids++] = bstrdup(row[0]); - return 0; -} - - -/* - * Print names in the list - */ -static void print_name_list(UAContext *ua, NAME_LIST *name_list) -{ - for (int i=0; i < name_list->num_ids; i++) { - bsendmsg(ua, "%s\n", name_list->name[i]); - } -} - - /* * Free names in the list */ @@ -1308,65 +1206,69 @@ static void free_name_list(NAME_LIST *name_list) name_list->num_ids = 0; } -static void get_storage_from_mediatype(UAContext *ua, NAME_LIST *name_list, RESTORE_CTX *rx) +void find_storage_resource(UAContext *ua, RESTORE_CTX &rx, char *Storage, char *MediaType) { STORE *store; - if (name_list->num_ids > 1) { - bsendmsg(ua, _("Warning, the JobIds that you selected refer to more than one MediaType.\n" - "Restore is not possible. The MediaTypes used are:\n")); - print_name_list(ua, name_list); - rx->store = select_storage_resource(ua); - return; - } - - if (name_list->num_ids == 0) { - bsendmsg(ua, _("No MediaType found for your JobIds.\n")); - rx->store = select_storage_resource(ua); - return; - } - if (rx->store) { + if (rx.store) { + Dmsg1(200, "Already have store=%s\n", rx.store->name()); return; } /* - * We have a single MediaType, look it up in our Storage resource + * Try looking up Storage by name */ LockRes(); foreach_res(store, R_STORAGE) { - if (strcmp(name_list->name[0], store->media_type) == 0) { - if (acl_access_ok(ua, Storage_ACL, store->hdr.name)) { - rx->store = store; + if (strcmp(Storage, store->name()) == 0) { + if (acl_access_ok(ua, Storage_ACL, store->name())) { + rx.store = store; } break; } } UnlockRes(); - if (rx->store) { + if (rx.store) { /* Check if an explicit storage resource is given */ store = NULL; int i = find_arg_with_value(ua, "storage"); if (i > 0) { store = (STORE *)GetResWithName(R_STORAGE, ua->argv[i]); - if (store && !acl_access_ok(ua, Storage_ACL, store->hdr.name)) { + if (store && !acl_access_ok(ua, Storage_ACL, store->name())) { store = NULL; } } - if (store && (store != rx->store)) { - bsendmsg(ua, _("Warning default storage overridden by %s on command line.\n"), - store->hdr.name); - rx->store = store; + if (store && (store != rx.store)) { + bsendmsg(ua, _("Warning default storage overridden by \"%s\" on command line.\n"), + store->name()); + rx.store = store; + Dmsg1(200, "Set store=%s\n", rx.store->name()); } return; } + /* If no storage resource, try to find one from MediaType */ + if (!rx.store) { + LockRes(); + foreach_res(store, R_STORAGE) { + if (strcmp(MediaType, store->media_type) == 0) { + if (acl_access_ok(ua, Storage_ACL, store->name())) { + rx.store = store; + Dmsg1(200, "Set store=%s\n", rx.store->name()); + bsendmsg(ua, _("Storage \"%s\" not found, using Storage \"%s\" from MediaType \"%s\".\n"), + Storage, store->name(), MediaType); + } + UnlockRes(); + return; + } + } + UnlockRes(); + bsendmsg(ua, _("\nUnable to find Storage resource for\n" + "MediaType \"%s\", needed by the Jobs you selected.\n"), MediaType); + } + /* Take command line arg, or ask user if none */ - rx->store = get_storage_resource(ua, false /* don't use default */); + rx.store = get_storage_resource(ua, false /* don't use default */); + Dmsg1(200, "Set store=%s\n", rx.store->name()); - if (!rx->store) { - bsendmsg(ua, _("\nWarning. Unable to find Storage resource for\n" - "MediaType \"%s\", needed by the Jobs you selected.\n" - "You will be allowed to select a Storage device later.\n"), - name_list->name[0]); - } }