]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_cmds.c
Final changes
[bacula/bacula] / bacula / src / dird / ua_cmds.c
index b17df2582d85c0680cfc1a72c8f6d83051e97092..2baa3438e3d8a62facca795c3cee1639ab0c0315 100644 (file)
@@ -565,19 +565,20 @@ static int setip_cmd(UAContext *ua, char *cmd)
       bsendmsg(ua, _("Illegal command from this console.\n"));
       return 1;
    }
+   LockRes();
    client = (CLIENT *)GetResWithName(R_CLIENT, ua->cons->hdr.name);
 
    if (!client) {
       bsendmsg(ua, _("Client \"%s\" not found.\n"), ua->cons->hdr.name);
-      return 1;
+      goto get_out;
    }
-   LockRes();
    if (client->address) {
       free(client->address);
    }
    client->address = bstrdup(inet_ntoa(ua->UA_sock->client_addr.sin_addr));
    bsendmsg(ua, _("Client \"%s\" address set to %s\n"),
            client->hdr.name, client->address);
+get_out:
    UnlockRes();
    return 1;
 }
@@ -591,6 +592,8 @@ static int setip_cmd(UAContext *ua, char *cmd)
  *        updates pool from Pool resource
  *    update media pool=<pool-name> volume=<volume-name>
  *        changes pool info for volume
+ *    update slots [scan=...]
+ *        updates autochanger slots
  */
 static int update_cmd(UAContext *ua, char *cmd) 
 {
@@ -793,6 +796,7 @@ static void update_volrecycle(UAContext *ua, char *val, MEDIA_DBR *mr)
 static void update_volpool(UAContext *ua, char *val, MEDIA_DBR *mr)
 {
    POOL_DBR pr;
+   POOLMEM *query;
 
    memset(&pr, 0, sizeof(pr));
    bstrncpy(pr.Name, val, sizeof(pr.Name));
@@ -801,13 +805,38 @@ static void update_volpool(UAContext *ua, char *val, MEDIA_DBR *mr)
    }
    mr->PoolId = pr.PoolId;           /* set new PoolId */
    /*
-    * Make sure to use db_update... rather than doing this directly,
-    *  so that any Slot is handled correctly. 
     */
+   query = get_pool_memory(PM_MESSAGE);
+   db_lock(ua->db);
+   Mmsg(&query, "UPDATE Media SET PoolId=%d WHERE MediaId=%u",
+      mr->PoolId, mr->MediaId);
+   if (!db_sql_query(ua->db, query, NULL, NULL)) {  
+      bsendmsg(ua, "%s", db_strerror(ua->db));
+   } else {      
+      bsendmsg(ua, _("New Pool is: %s\n"), pr.Name);
+   }
+   db_make_inchanger_unique(ua->jcr, ua->db, mr);
+   db_unlock(ua->db);
+   free_pool_memory(query);
+}
+
+static void update_volfrompool(UAContext *ua, MEDIA_DBR *mr)
+{
+   POOL_DBR pr;
+   char VolStatus[50];
+
+   memset(&pr, 0, sizeof(pr));
+   pr.PoolId = mr->PoolId;
+   if (!get_pool_dbr(ua, &pr)) {
+      return;
+   }
+   bstrncpy(VolStatus, mr->VolStatus, sizeof(VolStatus));
+   set_pool_dbr_defaults_in_media_dbr(mr, &pr);
+   bstrncpy(mr->VolStatus, VolStatus, sizeof(mr->VolStatus));
    if (!db_update_media_record(ua->jcr, ua->db, mr)) {
-      bsendmsg(ua, _("Error updating media record Pool: ERR=%s"), db_strerror(ua->db));
+      bsendmsg(ua, _("Error updating Volume record: ERR=%s"), db_strerror(ua->db));
    } else {
-      bsendmsg(ua, _("New Pool is: %s\n"), pr.Name);
+      bsendmsg(ua, _("Volume defaults updated from Pool record.\n"));
    }
 }
 
@@ -833,6 +862,7 @@ static int update_volume(UAContext *ua)
       N_("MaxVolBytes"),              /* 5 */
       N_("Recycle"),                  /* 6 */
       N_("Pool"),                     /* 7 */
+      N_("FromPool"),                 /* 8 */
       NULL };
 
    for (int i=0; kw[i]; i++) {
@@ -865,6 +895,10 @@ static int update_volume(UAContext *ua)
            break;
         case 7:
            update_volpool(ua, ua->argv[j], &mr);
+           break;
+        case 8:
+           update_volfrompool(ua, &mr);
+           break;
         }
         done = true;
       }
@@ -1495,6 +1529,7 @@ extern void reload_config(int sig);
 static int reload_cmd(UAContext *ua, char *cmd)
 {
    reload_config(1);   
+   return 1;
 }
 
 
@@ -1512,6 +1547,7 @@ static int delete_cmd(UAContext *ua, char *cmd)
       N_("volume"),
       N_("pool"),
       N_("job"),
+      N_("jobid"),
       NULL};
 
    if (!open_db(ua)) {
@@ -1526,6 +1562,7 @@ static int delete_cmd(UAContext *ua, char *cmd)
       delete_pool(ua);
       return 1;
    case 2:
+   case 3:
       int i;
       while ((i=find_arg(ua, _("jobid"))) > 0) {
         delete_job(ua);