]> git.sur5r.net Git - bacula/bacula/commitdiff
Add "noautoparent" restore command option to disable the automatic parent directory...
authorEric Bollengier <eric@baculasystems.com>
Tue, 24 Oct 2017 12:10:43 +0000 (14:10 +0200)
committerKern Sibbald <kern@sibbald.com>
Sun, 12 Nov 2017 09:30:41 +0000 (10:30 +0100)
At this time, when we select a directory, we mark parent directories for
the restore automatically.

In the NDMP restore process, at this time, when we select a directory
entry, the entire content is restored recursively.

This option can be used to not select automatically parent directories
during a restore session.

bacula/src/dird/ua.h
bacula/src/dird/ua_cmds.c
bacula/src/dird/ua_restore.c
bacula/src/dird/ua_tree.c

index 6f8bc3718ca5b998990463f7e2fa27064e806c28..6e93966c7cf547eef354af0f7370855925d5bca2 100644 (file)
@@ -80,6 +80,7 @@ struct TREE_CTX {
    int cnt;                           /* count for user feedback */
    bool all;                          /* if set mark all as default */
    bool hardlinks_in_mem;             /* Set to optimize for speed */
+   bool no_auto_parent;               /* Set to not select parent directories */
    UAContext *ua;
    uint32_t FileEstimate;             /* estimate of number of files */
    uint32_t FileCount;                /* current count of files */
@@ -133,6 +134,7 @@ struct RESTORE_CTX {
    bool all;                          /* mark all as default */
    bool hardlinks_in_mem;             /* keep hard links in memory */
    bool fdcalled;                     /* True if we should reuse the FD socket */
+   bool no_auto_parent;               /* Select or not parent directories */
    NAME_LIST name_list;
    POOLMEM *component_fname;
    FILE *component_fd;
index 78b0bd66f9237279388f52b053802fec4d1c2afa..870cc7691c15065f39f7285f09acc50090627a1d 100644 (file)
@@ -143,7 +143,7 @@ static struct cmdstruct commands[] = {                                      /* C
  { NT_("query"),      query_cmd,     _("Query catalog"), NT_("[<query-item-number>]"),      false},
  { NT_("restore"),    restore_cmd,   _("Restore files"),
    NT_("where=</path> client=<client> storage=<storage> bootstrap=<file> "
-       "restorejob=<job> restoreclient=<cli>"
+       "restorejob=<job> restoreclient=<cli> noautoparent"
        "\n\tcomment=<text> jobid=<jobid> jobuser=<user> jobgroup=<grp> copies done select all"), false},
 
  { NT_("relabel"),    relabel_cmd,   _("Relabel a tape"),
index 29257625a7d4849beb27d1200bb73717a14c480b..892a20d8b74773b8cbb60e18280fa523b3721d21 100644 (file)
@@ -109,8 +109,10 @@ int restore_cmd(UAContext *ua, const char *cmd)
    for (i = 0; i < ua->argc ; i++) {
       if (strcasecmp(ua->argk[i], "fdcalled") == 0) {
          rx.fdcalled = true;
-      }
 
+      } else if (strcasecmp(ua->argk[i], "noautoparent") == 0) {
+         rx.no_auto_parent = true;
+      }
       if (!ua->argv[i]) {
          continue;           /* skip if no value given */
       }
@@ -537,7 +539,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
       "xxxxxxxxx",     /* 24 */
       "fdcalled",      /* 25 */
       "when",          /* 26 */
-
+      "noautoparent",  /* 27 */
       NULL
    };
 
@@ -1245,6 +1247,7 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx)
    tree.ua = ua;
    tree.all = rx->all;
    tree.hardlinks_in_mem = rx->hardlinks_in_mem;
+   tree.no_auto_parent = rx->no_auto_parent;
    last_JobId = 0;
    tree.last_dir_acl = NULL;
    /*
index 3ca5d517179e413faae62ecf772b3995c1073ca2..a03eb1b15845144e390f2850923317bfe800c894 100644 (file)
@@ -317,7 +317,7 @@ static int set_extract(UAContext *ua, TREE_NODE *node, TREE_CTX *tree, bool extr
        * Walk up tree marking any unextracted parent to be
        * extracted.
        */
-      if (extract) {
+      if (!tree->no_auto_parent && extract) {
          while (node->parent && !node->parent->extract_dir) {
             node = node->parent;
             node->extract_dir = true;