]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_dotcmds.c
update configure
[bacula/bacula] / bacula / src / dird / ua_dotcmds.c
index 6c7965453e4169f315da972ea5cbd9decee3bde3..2bd5f1f83503767e5880b5da1c60c393b0050571 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2002-2010 Free Software Foundation Europe e.V.
+   Copyright (C) 2002-2011 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -43,6 +43,8 @@
 #include "findlib/find.h"
 
 /* Imported variables */
+extern struct s_jl joblevels[];
+extern struct s_jt jobtypes[];
 
 /* Imported functions */
 extern void do_messages(UAContext *ua, const char *cmd);
@@ -69,23 +71,28 @@ static bool mediatypescmd(UAContext *ua, const char *cmd);
 static bool locationscmd(UAContext *ua, const char *cmd);
 static bool mediacmd(UAContext *ua, const char *cmd);
 static bool aopcmd(UAContext *ua, const char *cmd);
+static bool catalogscmd(UAContext *ua, const char *cmd);
 
 static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd);
 static bool dot_bvfs_lsfiles(UAContext *ua, const char *cmd);
 static bool dot_bvfs_update(UAContext *ua, const char *cmd);
 static bool dot_bvfs_get_jobids(UAContext *ua, const char *cmd);
 static bool dot_bvfs_versions(UAContext *ua, const char *cmd);
+static bool dot_bvfs_restore(UAContext *ua, const char *cmd);
+static bool dot_bvfs_cleanup(UAContext *ua, const char *cmd);
 
 static bool api_cmd(UAContext *ua, const char *cmd);
 static bool sql_cmd(UAContext *ua, const char *cmd);
 static bool dot_quit_cmd(UAContext *ua, const char *cmd);
 static bool dot_help_cmd(UAContext *ua, const char *cmd);
+static int one_handler(void *ctx, int num_field, char **row);
 
 struct cmdstruct { const char *key; bool (*func)(UAContext *ua, const char *cmd); const char *help;const bool use_in_rs;};
 static struct cmdstruct commands[] = { /* help */  /* can be used in runscript */
  { NT_(".api"),        api_cmd,                  NULL,       false},
  { NT_(".backups"),    backupscmd,               NULL,       false},
  { NT_(".clients"),    clientscmd,               NULL,       true},
+ { NT_(".catalogs"),   catalogscmd,              NULL,       false},
  { NT_(".defaults"),   defaultscmd,              NULL,       false},
  { NT_(".die"),        admin_cmds,               NULL,       false},
  { NT_(".dump"),       admin_cmds,               NULL,       false},
@@ -111,7 +118,9 @@ static struct cmdstruct commands[] = { /* help */  /* can be used in runscript *
  { NT_(".bvfs_update"), dot_bvfs_update,         NULL,       true},
  { NT_(".bvfs_get_jobids"), dot_bvfs_get_jobids, NULL,       true},
  { NT_(".bvfs_versions"), dot_bvfs_versions,     NULL,       true},
- { NT_(".types"),      typescmd,         NULL,       false}
+ { NT_(".bvfs_restore"), dot_bvfs_restore,       NULL,       true},
+ { NT_(".bvfs_cleanup"), dot_bvfs_cleanup,       NULL,       true},
+ { NT_(".types"),      typescmd,                 NULL,       false}
              };
 #define comsize ((int)(sizeof(commands)/sizeof(struct cmdstruct)))
 
@@ -161,8 +170,7 @@ bool do_a_dot_command(UAContext *ua)
       }
    }
    if (!found) {
-      pm_strcat(user->msg, _(": is an invalid command.\n"));
-      ua->error_msg("%s", user->msg);
+      ua->error_msg("%s%s", ua->argk[0], _(": is an invalid command.\n"));
       ok = false;
    }
    return ok;
@@ -176,9 +184,7 @@ static bool dot_bvfs_update(UAContext *ua, const char *cmd)
 
    int pos = find_arg_with_value(ua, "jobid");
    if (pos != -1 && is_a_number_list(ua->argv[pos])) {
-      POOL_MEM jobids;
-      pm_strcpy(jobids, ua->argv[pos]);
-      bvfs_update_path_hierarchy_cache(ua->jcr, ua->db, jobids.c_str());
+      bvfs_update_path_hierarchy_cache(ua->jcr, ua->db, ua->argv[pos]);
    } else {
       /* update cache for all jobids */
       bvfs_update_cache(ua->jcr, ua->db);
@@ -208,7 +214,7 @@ static int bvfs_result_handler(void *ctx, int fields, char **row)
    }
 
    memset(&statp, 0, sizeof(struct stat));
-   decode_stat(lstat, &statp, &LinkFI);
+   decode_stat(lstat, &statp, sizeof(statp), &LinkFI);
 
    Dmsg1(100, "type=%s\n", row[0]);
    if (bvfs_is_dir(row)) {
@@ -266,6 +272,7 @@ static bool bvfs_parse_arg_version(UAContext *ua,
 
 static bool bvfs_parse_arg(UAContext *ua, 
                            DBId_t *pathid, char **path, char **jobid,
+                           char **username,
                            int *limit, int *offset)
 {
    *pathid=0;
@@ -273,6 +280,7 @@ static bool bvfs_parse_arg(UAContext *ua,
    *offset=0;
    *path=NULL;
    *jobid=NULL;
+   *username=NULL;
 
    for (int i=1; i<ua->argc; i++) {
       if (strcasecmp(ua->argk[i], NT_("pathid")) == 0) {
@@ -284,6 +292,10 @@ static bool bvfs_parse_arg(UAContext *ua,
       if (strcasecmp(ua->argk[i], NT_("path")) == 0) {
          *path = ua->argv[i];
       }
+
+      if (strcasecmp(ua->argk[i], NT_("username")) == 0) {
+         *username = ua->argv[i];
+      }
       
       if (strcasecmp(ua->argk[i], NT_("jobid")) == 0) {
          if (is_a_number_list(ua->argv[i])) {
@@ -315,6 +327,59 @@ static bool bvfs_parse_arg(UAContext *ua,
    return true;
 }
 
+/* .bvfs_cleanup path=b2XXXXX
+ */
+static bool dot_bvfs_cleanup(UAContext *ua, const char *cmd)
+{
+   int i;
+   if ((i = find_arg_with_value(ua, "path")) >= 0) {
+      open_client_db(ua);
+      Bvfs fs(ua->jcr, ua->db);
+      fs.drop_restore_list(ua->argv[i]);
+   }
+   return true;
+}
+
+/* .bvfs_restore path=b2XXXXX jobid=1,2 fileid=1,2 dirid=1,2 hardlink=1,2,3,4
+ */
+static bool dot_bvfs_restore(UAContext *ua, const char *cmd)
+{
+   DBId_t pathid=0;
+   int limit=2000, offset=0, i;
+   char *path=NULL, *jobid=NULL, *username=NULL;
+   char *empty = (char *)"";
+   char *fileid, *dirid, *hardlink;
+   fileid = dirid = hardlink = empty;
+
+   if (!bvfs_parse_arg(ua, &pathid, &path, &jobid, &username,
+                       &limit, &offset))
+   {
+      ua->error_msg("Can't find jobid, pathid or path argument\n");
+      return true;              /* not enough param */
+   }
+
+   Bvfs fs(ua->jcr, ua->db);
+   fs.set_username(username);
+   fs.set_jobids(jobid);
+
+   if ((i = find_arg_with_value(ua, "fileid")) >= 0) {
+      fileid = ua->argv[i];
+   }
+   if ((i = find_arg_with_value(ua, "dirid")) >= 0) {
+      dirid = ua->argv[i];
+   }
+   if ((i = find_arg_with_value(ua, "hardlink")) >= 0) {
+      hardlink = ua->argv[i];
+   }
+
+   if (fs.compute_restore_list(fileid, dirid, hardlink, path)) {
+      ua->send_msg("OK\n");
+   } else {
+      ua->error_msg("Can't create restore list\n");
+   }
+   return true;
+}
+
 /* 
  * .bvfs_lsfiles jobid=1,2,3,4 pathid=10
  * .bvfs_lsfiles jobid=1,2,3,4 path=/
@@ -323,20 +388,28 @@ static bool dot_bvfs_lsfiles(UAContext *ua, const char *cmd)
 {
    DBId_t pathid=0;
    int limit=2000, offset=0;
-   char *path=NULL, *jobid=NULL;
+   char *path=NULL, *jobid=NULL, *username=NULL;
+   char *pattern=NULL;
+   int i;
 
-   if (!bvfs_parse_arg(ua, &pathid, &path, &jobid,
+   if (!bvfs_parse_arg(ua, &pathid, &path, &jobid, &username,
                        &limit, &offset))
    {
       ua->error_msg("Can't find jobid, pathid or path argument\n");
       return true;              /* not enough param */
    }
+   if ((i = find_arg_with_value(ua, "pattern")) >= 0) {
+      pattern = ua->argv[i];
+   }
 
    Bvfs fs(ua->jcr, ua->db);
+   fs.set_username(username);
    fs.set_jobids(jobid);   
    fs.set_handler(bvfs_result_handler, ua);
    fs.set_limit(limit);
-
+   if (pattern) {
+      fs.set_pattern(pattern);
+   }
    if (pathid) {
       fs.ch_dir(pathid);
    } else {
@@ -359,9 +432,9 @@ static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd)
 {
    DBId_t pathid=0;
    int limit=2000, offset=0;
-   char *path=NULL, *jobid=NULL;
+   char *path=NULL, *jobid=NULL, *username=NULL;
 
-   if (!bvfs_parse_arg(ua, &pathid, &path, &jobid,
+   if (!bvfs_parse_arg(ua, &pathid, &path, &jobid, &username,
                        &limit, &offset))
    {
       ua->error_msg("Can't find jobid, pathid or path argument\n");
@@ -369,6 +442,7 @@ static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd)
    }
 
    Bvfs fs(ua->jcr, ua->db);
+   fs.set_username(username);
    fs.set_jobids(jobid);   
    fs.set_limit(limit);
    fs.set_handler(bvfs_result_handler, ua);
@@ -388,16 +462,16 @@ static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd)
 }
 
 /* 
- * .bvfs_versions jobid=x filenameid=10 pathid=10 copies versions
+ * .bvfs_versions jobid=x fnid=10 pathid=10 copies versions
  * (jobid isn't used)
  */
 static bool dot_bvfs_versions(UAContext *ua, const char *cmd)
 {
    DBId_t pathid=0, fnid=0;
    int limit=2000, offset=0;
-   char *path=NULL, *jobid=NULL, *client=NULL;
+   char *path=NULL, *jobid=NULL, *client=NULL, *username=NULL;
    bool copies=false, versions=false;
-   if (!bvfs_parse_arg(ua, &pathid, &path, &jobid,
+   if (!bvfs_parse_arg(ua, &pathid, &path, &jobid, &username,
                        &limit, &offset))
    {
       ua->error_msg("Can't find jobid, pathid or path argument\n");
@@ -406,7 +480,7 @@ static bool dot_bvfs_versions(UAContext *ua, const char *cmd)
 
    if (!bvfs_parse_arg_version(ua, &client, &fnid, &versions, &copies))
    {
-      ua->error_msg("Can't find client or filenameid argument\n");
+      ua->error_msg("Can't find client or fnid argument\n");
       return true;              /* not enough param */
    }
 
@@ -470,7 +544,7 @@ static bool dot_bvfs_get_jobids(UAContext *ua, const char *cmd)
       if (!db_accurate_get_jobids(ua->jcr, ua->db, &jr, &tempids)) {
          return true;
       }
-      jobids.cat(tempids);
+      jobids.add(tempids);
    }
 
    ua->send_msg("%s\n", jobids.list);
@@ -716,6 +790,19 @@ static bool filesetscmd(UAContext *ua, const char *cmd)
    return true;
 }
 
+static bool catalogscmd(UAContext *ua, const char *cmd)
+{
+   CAT *cat;
+   LockRes();
+   foreach_res(cat, R_CATALOG) {
+      if (acl_access_ok(ua, Catalog_ACL, cat->name())) {
+         ua->send_msg("%s\n", cat->name());
+      }
+   }
+   UnlockRes();
+   return true;
+}
+
 static bool clientscmd(UAContext *ua, const char *cmd)
 {
    CLIENT *client;       
@@ -933,14 +1020,30 @@ static bool locationscmd(UAContext *ua, const char *cmd)
 
 static bool levelscmd(UAContext *ua, const char *cmd)
 {
-   ua->send_msg("Incremental\n");
-   ua->send_msg("Full\n");
-   ua->send_msg("Differential\n");
-   ua->send_msg("VirtualFull\n");
-   ua->send_msg("Catalog\n");
-   ua->send_msg("InitCatalog\n");
-   ua->send_msg("VolumeToCatalog\n");
-   ua->send_msg("Base\n");
+   int i;
+   /* Note some levels are blank, which means none is needed */
+   if (ua->argc == 1) {
+      for (i=0; joblevels[i].level_name; i++) {
+         if (joblevels[i].level_name[0] != ' ') {
+            ua->send_msg("%s\n", joblevels[i].level_name);
+         }
+      }
+   } else if (ua->argc == 2) {
+      int jobtype = 0;
+      /* Assume that first argument is the Job Type */
+      for (i=0; jobtypes[i].type_name; i++) {
+         if (strcasecmp(ua->argk[1], jobtypes[i].type_name) == 0) {
+            jobtype = jobtypes[i].job_type;
+            break;
+         }
+      }
+      for (i=0; joblevels[i].level_name; i++) {
+         if ((joblevels[i].job_type == jobtype) && (joblevels[i].level_name[0] != ' ')) {
+            ua->send_msg("%s\n", joblevels[i].level_name);
+         }
+      }
+   }
+
    return true;
 }