*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
extern int r_first;
extern int r_last;
extern struct s_res resources[];
-extern int console_msg_pending;
extern char my_name[];
/* Imported functions */
extern int retentioncmd(UAContext *ua, char *cmd);
extern int prunecmd(UAContext *ua, char *cmd);
extern int purgecmd(UAContext *ua, char *cmd);
+extern int restorecmd(UAContext *ua, char *cmd);
/* Forward referenced functions */
static int addcmd(UAContext *ua, char *cmd), createcmd(UAContext *ua, char *cmd), cancelcmd(UAContext *ua, char *cmd);
{ N_("list"), listcmd, _("list [pools | jobs | jobtotals | media <pool> | files job=<nn>]; from catalog")},
{ N_("messages"), messagescmd, _("messages")},
{ N_("mount"), mountcmd, _("mount <storage-name>")},
+ { N_("restore"), restorecmd, _("restore files")},
{ N_("prune"), prunecmd, _("prune expired records from catalog")},
{ N_("purge"), purgecmd, _("purge records from catalog")},
{ N_("run"), runcmd, _("run <job-name>")},
found = 0;
stat = 1;
- Dmsg1(20, "Command: %s\n", ua->UA_sock->msg);
+ Dmsg1(120, "Command: %s\n", ua->UA_sock->msg);
if (ua->argc == 0) {
return 1;
}
return stat;
}
+/*
+ * This is a common routine used to stuff the Pool DB record defaults
+ * into the Media DB record just before creating a media (Volume)
+ * record.
+ */
+void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr)
+{
+ mr->PoolId = pr->PoolId;
+ strcpy(mr->VolStatus, "Append");
+ mr->Recycle = pr->Recycle;
+ mr->VolRetention = pr->VolRetention;
+ mr->VolUseDuration = pr->VolUseDuration;
+ mr->MaxVolJobs = pr->MaxVolJobs;
+ mr->MaxVolFiles = pr->MaxVolFiles;
+ mr->MaxVolBytes = pr->MaxVolBytes;
+}
+
/*
* Add Volumes to an existing Pool
int num, i, max, startnum;
int first_id = 0;
char name[MAX_NAME_LENGTH];
+ STORE *store;
+ int slot = 0;
bsendmsg(ua, _(
"You probably don't want to be using this command since it\n"
"creates database records without labeling the Volumes.\n"
-"You probably want to use the label command.\n\n"));
+"You probably want to use the \"label\" command.\n\n"));
if (!open_db(ua)) {
return 1;
return 1;
}
- Dmsg4(20, "id=%d Num=%d Max=%d type=%s\n", pr.PoolId, pr.NumVols,
+ Dmsg4(120, "id=%d Num=%d Max=%d type=%s\n", pr.PoolId, pr.NumVols,
pr.MaxVols, pr.PoolType);
while (pr.MaxVols > 0 && pr.NumVols >= pr.MaxVols) {
}
}
- if (!get_media_type(ua, mr.MediaType)) {
+ /* Get media type */
+ if ((store = get_storage_resource(ua, cmd)) != NULL) {
+ strcpy(mr.MediaType, store->media_type);
+ } else if (!get_media_type(ua, mr.MediaType, sizeof(mr.MediaType))) {
return 1;
}
-
+
if (pr.MaxVols == 0) {
max = 1000;
} else {
return 1;
}
}
+ /* Don't allow | in Volume name because it is the volume separator character */
if (strchr(ua->cmd, '|')) {
bsendmsg(ua, _("Illegal character | in a volume name.\n"));
goto getVolName;
bsendmsg(ua, _("Volume name too long.\n"));
goto getVolName;
}
+ if (strlen(ua->cmd) == 0) {
+ bsendmsg(ua, _("Volume name must be at least one character long.\n"));
+ goto getVolName;
+ }
strcpy(name, ua->cmd);
if (num > 0) {
startnum = 1;
num = 1;
}
+
+ if (store && store->autochanger) {
+ if (!get_cmd(ua, _("Enter slot (0 for none): "))) {
+ return 1;
+ }
+ slot = atoi(ua->cmd);
+ }
- mr.PoolId = pr.PoolId;
- strcpy(mr.VolStatus, "Append");
- mr.Recycle = pr.Recycle;
- mr.VolRetention = pr.VolRetention;
+ set_pool_dbr_defaults_in_media_dbr(&mr, &pr);
for (i=startnum; i < num+startnum; i++) {
sprintf(mr.VolumeName, name, i);
+ mr.Slot = slot++;
Dmsg1(200, "Create Volume %s\n", mr.VolumeName);
- if (!db_create_media_record(ua->db, &mr)) {
+ if (!db_create_media_record(ua->jcr, ua->db, &mr)) {
bsendmsg(ua, db_strerror(ua->db));
return 1;
}
}
pr.NumVols += num;
Dmsg0(200, "Update pool record.\n");
- if (db_update_pool_record(ua->db, &pr) != 1) {
+ if (db_update_pool_record(ua->jcr, ua->db, &pr) != 1) {
bsendmsg(ua, db_strerror(ua->db));
return 1;
}
}
unlock_jcr_chain();
- if (do_prompt(ua, _("Choose Job to cancel"), JobName) < 0) {
+ if (do_prompt(ua, _("Choose Job to cancel"), JobName, sizeof(JobName)) < 0) {
return 1;
}
if (njobs == 1) {
switch (jcr->JobStatus) {
case JS_Created:
- jcr->JobStatus = JS_Cancelled;
+ set_jcr_job_status(jcr, JS_Cancelled);
bsendmsg(ua, _("JobId %d, Job %s marked to be cancelled.\n"),
jcr->JobId, jcr->Job);
free_jcr(jcr);
default:
- jcr->JobStatus = JS_Cancelled;
+ set_jcr_job_status(jcr, JS_Cancelled);
/* Cancel File daemon */
ua->jcr->client = jcr->client;
if (!connect_to_file_daemon(ua->jcr, 10, FDConnectTimeout, 1)) {
Dmsg0(200, "Connected to file daemon\n");
fd = ua->jcr->file_bsock;
bnet_fsend(fd, "cancel Job=%s\n", jcr->Job);
- while (bnet_recv(fd) > 0) {
+ while (bnet_recv(fd) >= 0) {
bsendmsg(ua, "%s", fd->msg);
}
bnet_sig(fd, BNET_TERMINATE);
Dmsg0(200, "Connected to storage daemon\n");
sd = ua->jcr->store_bsock;
bnet_fsend(sd, "cancel Job=%s\n", jcr->Job);
- while (bnet_recv(sd) > 0) {
+ while (bnet_recv(sd) >= 0) {
bsendmsg(ua, "%s", sd->msg);
}
bnet_sig(sd, BNET_TERMINATE);
return 1;
}
+/*
+ * This is a common routine to create or update a
+ * Pool DB base record from a Pool Resource. We handle
+ * the setting of MaxVols and NumVols slightly differently
+ * depending on if we are creating the Pool or we are
+ * simply bringing it into agreement with the resource (updage).
+ */
+void set_pooldbr_from_poolres(POOL_DBR *pr, POOL *pool, int create)
+{
+ strcpy(pr->PoolType, pool->pool_type);
+ if (create) {
+ pr->MaxVols = pool->max_volumes;
+ pr->NumVols = 0;
+ } else { /* update pool */
+ if (pr->MaxVols != pool->max_volumes) {
+ pr->MaxVols = pool->max_volumes;
+ }
+ if (pr->MaxVols != 0 && pr->MaxVols < pr->NumVols) {
+ pr->MaxVols = pr->NumVols;
+ }
+ }
+ pr->UseOnce = pool->use_volume_once;
+ pr->UseCatalog = pool->use_catalog;
+ pr->AcceptAnyVolume = pool->accept_any_volume;
+ pr->Recycle = pool->Recycle;
+ pr->VolRetention = pool->VolRetention;
+ pr->VolUseDuration = pool->VolUseDuration;
+ pr->MaxVolJobs = pool->MaxVolJobs;
+ pr->MaxVolFiles = pool->MaxVolFiles;
+ pr->MaxVolBytes = pool->MaxVolBytes;
+ if (pool->label_format) {
+ strcpy(pr->LabelFormat, pool->label_format);
+ } else {
+ strcpy(pr->LabelFormat, "*"); /* none */
+ }
+}
+
+
/*
* Create a pool record from a given Pool resource
* Also called from backup.c
* 1 record created
*/
-int create_pool(B_DB *db, POOL *pool)
+int create_pool(JCR *jcr, B_DB *db, POOL *pool)
{
POOL_DBR pr;
strcpy(pr.Name, pool->hdr.name);
- if (db_get_pool_record(db, &pr)) {
+ if (db_get_pool_record(jcr, db, &pr)) {
return 0; /* exists */
}
- strcpy(pr.PoolType, pool->pool_type);
- pr.MaxVols = pool->max_volumes;
- pr.NumVols = 0;
- pr.UseOnce = pool->use_volume_once;
- pr.UseCatalog = pool->use_catalog;
- pr.AcceptAnyVolume = pool->accept_any_volume;
- pr.Recycle = pool->Recycle;
- pr.VolRetention = pool->VolRetention;
- pr.AutoPrune = pool->AutoPrune;
- if (pool->label_format) {
- strcpy(pr.LabelFormat, pool->label_format);
- } else {
- strcpy(pr.LabelFormat, "*"); /* none */
- }
+ set_pooldbr_from_poolres(&pr, pool, 1);
- if (!db_create_pool_record(db, &pr)) {
+ if (!db_create_pool_record(jcr, db, &pr)) {
return -1; /* error */
}
return 1;
return 1;
}
- switch (create_pool(ua->db, pool)) {
+ switch (create_pool(ua->jcr, ua->db, pool)) {
case 0:
bsendmsg(ua, _("Error: Pool %s already exists.\n\
Use update to change it.\n"), pool->hdr.name);
}
start_prompt(ua, _("Update choice:\n"));
- add_prompt(ua, _("Pool from resource"));
add_prompt(ua, _("Volume parameters"));
- switch (do_prompt(ua, _("Choose catalog item to update"), NULL)) {
+ add_prompt(ua, _("Pool from resource"));
+ switch (do_prompt(ua, _("Choose catalog item to update"), NULL, 0)) {
case 0:
- update_pool(ua);
+ update_volume(ua);
break;
case 1:
- update_volume(ua);
+ update_pool(ua);
break;
default:
break;
{
POOL_DBR pr;
MEDIA_DBR mr;
- int i;
- static char *kw[] = {
- "volume",
- NULL};
POOLMEM *query;
char ed1[30];
- memset(&pr, 0, sizeof(pr));
- memset(&mr, 0, sizeof(mr));
- if (!get_pool_dbr(ua, &pr)) {
+ if (!select_pool_and_media_dbr(ua, &pr, &mr)) {
return 0;
}
- mr.PoolId = pr.PoolId;
- mr.VolumeName[0] = 0;
-
- i = find_arg_keyword(ua, kw);
- if (i == 0 && ua->argv[i]) {
- strcpy(mr.VolumeName, ua->argv[i]);
- }
- if (mr.VolumeName[0] == 0) {
- db_list_media_records(ua->db, &mr, prtit, ua);
- if (!get_cmd(ua, _("Enter Volume name to update: "))) {
- return 0;
- }
- strcpy(mr.VolumeName, ua->cmd);
- }
for (int done=0; !done; ) {
- mr.MediaId = 0;
- if (!db_get_media_record(ua->db, &mr)) {
- bsendmsg(ua, _("Volume record for %s not found.\n"), mr.VolumeName);
+ if (!db_get_media_record(ua->jcr, ua->db, &mr)) {
+ if (mr.MediaId != 0) {
+ bsendmsg(ua, _("Volume record for MediaId %d not found.\n"), mr.MediaId);
+ } else {
+ bsendmsg(ua, _("Volume record for %s not found.\n"), mr.VolumeName);
+ }
return 0;
}
+ bsendmsg(ua, _("Updating Volume \"%s\"\n"), mr.VolumeName);
start_prompt(ua, _("Parameters to modify:\n"));
add_prompt(ua, _("Volume Status"));
add_prompt(ua, _("Volume Retention Period"));
+ add_prompt(ua, _("Volume Use Duration"));
+ add_prompt(ua, _("Maximum Volume Jobs"));
+ add_prompt(ua, _("Maximum Volume Files"));
+ add_prompt(ua, _("Maximum Volume Bytes"));
add_prompt(ua, _("Recycle Flag"));
add_prompt(ua, _("Slot"));
+ add_prompt(ua, _("Volume Files"));
add_prompt(ua, _("Done"));
- switch (do_prompt(ua, _("Select paramter to modify"), NULL)) {
+ switch (do_prompt(ua, _("Select parameter to modify"), NULL, 0)) {
case 0: /* Volume Status */
/* Modify Volume Status */
- bsendmsg(ua, _("Current value is: %s\n"), mr.VolStatus);
+ bsendmsg(ua, _("Current Volume status is: %s\n"), mr.VolStatus);
start_prompt(ua, _("Possible Values are:\n"));
- add_prompt(ua, "Append");
- add_prompt(ua, "Archive");
+ add_prompt(ua, "Append"); /* Better not translate these as */
+ add_prompt(ua, "Archive"); /* They are known in the database code */
add_prompt(ua, "Disabled");
add_prompt(ua, "Full");
+ add_prompt(ua, "Used");
if (strcmp(mr.VolStatus, "Purged") == 0) {
add_prompt(ua, "Recycle");
}
add_prompt(ua, "Read-Only");
- if (do_prompt(ua, _("Choose new Volume Status"), ua->cmd) < 0) {
+ if (do_prompt(ua, _("Choose new Volume Status"), ua->cmd, sizeof(mr.VolStatus)) < 0) {
return 1;
}
- strcpy(mr.VolStatus, ua->cmd);
+ bstrncpy(mr.VolStatus, ua->cmd, sizeof(mr.VolStatus));
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET VolStatus=\"%s\" WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET VolStatus='%s' WHERE MediaId=%u",
mr.VolStatus, mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
- }
+ } else {
+ bsendmsg(ua, _("New Volume status is: %s\n"), mr.VolStatus);
+ }
free_pool_memory(query);
break;
case 1: /* Retention */
- bsendmsg(ua, _("Current value is: %s\n"),
- edit_btime(mr.VolRetention, ed1));
+ bsendmsg(ua, _("Current retention seconds is: %s\n"),
+ edit_utime(mr.VolRetention, ed1));
if (!get_cmd(ua, _("Enter Volume Retention period: "))) {
return 0;
}
- if (!string_to_btime(ua->cmd, &mr.VolRetention)) {
+ if (!duration_to_utime(ua->cmd, &mr.VolRetention)) {
bsendmsg(ua, _("Invalid retention period specified.\n"));
break;
}
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET VolRetention=%s WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET VolRetention=%s WHERE MediaId=%u",
edit_uint64(mr.VolRetention, ed1), mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
- }
+ } else {
+ bsendmsg(ua, _("New retention seconds is: %s\n"),
+ edit_utime(mr.VolRetention, ed1));
+ }
+ free_pool_memory(query);
+ break;
+
+ case 2: /* Use Duration */
+ bsendmsg(ua, _("Current use duration is: %s\n"),
+ edit_utime(mr.VolUseDuration, ed1));
+ if (!get_cmd(ua, _("Enter Volume Use Duration: "))) {
+ return 0;
+ }
+ if (!duration_to_utime(ua->cmd, &mr.VolUseDuration)) {
+ bsendmsg(ua, _("Invalid use duration specified.\n"));
+ break;
+ }
+ query = get_pool_memory(PM_MESSAGE);
+ Mmsg(&query, "UPDATE Media SET VolUseDuration=%s WHERE MediaId=%u",
+ edit_uint64(mr.VolUseDuration, ed1), mr.MediaId);
+ if (!db_sql_query(ua->db, query, NULL, NULL)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ } else {
+ bsendmsg(ua, _("New use duration is: %s\n"),
+ edit_utime(mr.VolUseDuration, ed1));
+ }
free_pool_memory(query);
break;
- case 2: /* Recycle */
+
+ case 3: /* Max Jobs */
+ int32_t maxjobs;
+ bsendmsg(ua, _("Current max jobs is: %u\n"), mr.MaxVolJobs);
+ if (!get_cmd(ua, _("Enter new Maximum Jobs: "))) {
+ return 0;
+ }
+ maxjobs = atoi(ua->cmd);
+ if (maxjobs < 0) {
+ bsendmsg(ua, _("Invalid number, it must be 0 or greater\n"));
+ break;
+ }
+ query = get_pool_memory(PM_MESSAGE);
+ Mmsg(&query, "UPDATE Media SET MaxVolJobs=%u WHERE MediaId=%u",
+ maxjobs, mr.MediaId);
+ if (!db_sql_query(ua->db, query, NULL, NULL)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ } else {
+ bsendmsg(ua, _("New max jobs is: %u\n"), maxjobs);
+ }
+ free_pool_memory(query);
+ break;
+
+ case 4: /* Max Files */
+ int32_t maxfiles;
+ bsendmsg(ua, _("Current max files is: %u\n"), mr.MaxVolFiles);
+ if (!get_cmd(ua, _("Enter new Maximum Files: "))) {
+ return 0;
+ }
+ maxfiles = atoi(ua->cmd);
+ if (maxfiles < 0) {
+ bsendmsg(ua, _("Invalid number, it must be 0 or greater\n"));
+ break;
+ }
+ query = get_pool_memory(PM_MESSAGE);
+ Mmsg(&query, "UPDATE Media SET MaxVolFiles=%u WHERE MediaId=%u",
+ maxfiles, mr.MediaId);
+ if (!db_sql_query(ua->db, query, NULL, NULL)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ } else {
+ bsendmsg(ua, _("New max files is: %u\n"), maxfiles);
+ }
+ free_pool_memory(query);
+ break;
+
+ case 5: /* Max Bytes */
+ uint64_t maxbytes;
+ bsendmsg(ua, _("Current value is: %s\n"), edit_uint64(mr.MaxVolBytes, ed1));
+ if (!get_cmd(ua, _("Enter new Maximum Bytes: "))) {
+ return 0;
+ }
+ if (!size_to_uint64(ua->cmd, strlen(ua->cmd), &maxbytes)) {
+ bsendmsg(ua, _("Invalid byte size specification.\n"));
+ break;
+ }
+ query = get_pool_memory(PM_MESSAGE);
+ Mmsg(&query, "UPDATE Media SET MaxVolBytes=%s WHERE MediaId=%u",
+ edit_uint64(maxbytes, ed1), mr.MediaId);
+ if (!db_sql_query(ua->db, query, NULL, NULL)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ } else {
+ bsendmsg(ua, _("New Max bytes is: %s\n"), edit_uint64(maxbytes, ed1));
+ }
+ free_pool_memory(query);
+ break;
+
+
+ case 6: /* Recycle */
int recycle;
- bsendmsg(ua, _("Current value is: %s\n"),
+ bsendmsg(ua, _("Current recycle flag is: %s\n"),
mr.Recycle==1?_("yes"):_("no"));
if (!get_cmd(ua, _("Enter new Recycle status: "))) {
return 0;
break;
}
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET Recycle=%d WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET Recycle=%d WHERE MediaId=%u",
recycle, mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
- }
+ } else {
+ bsendmsg(ua, _("New recycle flag is: %s\n"),
+ mr.Recycle==1?_("yes"):_("no"));
+ }
free_pool_memory(query);
break;
- case 3: /* Slot */
+ case 7: /* Slot */
int slot;
- bsendmsg(ua, _("Current value is: %d\n"), mr.Slot);
+ bsendmsg(ua, _("Current Slot is: %d\n"), mr.Slot);
if (!get_cmd(ua, _("Enter new Slot: "))) {
return 0;
}
break;
}
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET Slot=%d WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET Slot=%d WHERE MediaId=%u",
slot, mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
} else {
- bsendmsg(ua, "New value is: %d\n", slot);
+ bsendmsg(ua, "New Slot is: %d\n", slot);
+ }
+ free_pool_memory(query);
+ break;
+
+ case 8: /* Volume Files */
+ int32_t VolFiles;
+ bsendmsg(ua, _("Warning changing Volume Files can result\n"
+ "in loss of data on your Volume\n\n"));
+ bsendmsg(ua, _("Current Volume Files is: %u\n"), mr.VolFiles);
+ if (!get_cmd(ua, _("Enter new number of Files for Volume: "))) {
+ return 0;
+ }
+ VolFiles = atoi(ua->cmd);
+ if (VolFiles < 0) {
+ bsendmsg(ua, _("Invalid number, it must be 0 or greater\n"));
+ break;
+ }
+ if (VolFiles != (int)(mr.VolFiles + 1)) {
+ bsendmsg(ua, _("Normally, you should only increase Volume Files by one!\n"));
+ if (!get_cmd(ua, _("Continue? (yes/no): ")) ||
+ strcasecmp(ua->cmd, "yes") != 0) {
+ break;
+ }
+ }
+ query = get_pool_memory(PM_MESSAGE);
+ Mmsg(&query, "UPDATE Media SET VolFiles=%u WHERE MediaId=%u",
+ VolFiles, mr.MediaId);
+ if (!db_sql_query(ua->db, query, NULL, NULL)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ } else {
+ bsendmsg(ua, _("New Volume Files is: %u\n"), VolFiles);
}
free_pool_memory(query);
break;
-
default: /* Done or error */
bsendmsg(ua, "Selection done.\n");
return 1;
if (!get_pool_dbr(ua, &pr)) {
return 0;
}
- strcpy(pr.PoolType, pool->pool_type);
- if (pr.MaxVols != (uint32_t) (pool->max_volumes)) {
- pr.MaxVols = pool->max_volumes;
- }
- if (pr.MaxVols != 0 && pr.MaxVols < pr.NumVols) {
- pr.MaxVols = pr.NumVols;
- }
- pr.UseOnce = pool->use_volume_once;
- pr.UseCatalog = pool->use_catalog;
- pr.AcceptAnyVolume = pool->accept_any_volume;
- if (pool->label_format) {
- strcpy(pr.LabelFormat, pool->label_format);
- } else {
- strcpy(pr.LabelFormat, "*"); /* none */
- }
- id = db_update_pool_record(ua->db, &pr);
+
+ set_pooldbr_from_poolres(&pr, pool, 0); /* update */
+
+ id = db_update_pool_record(ua->jcr, ua->db, &pr);
if (id <= 0) {
bsendmsg(ua, _("db_update_pool_record returned %d. ERR=%s\n"),
id, db_strerror(ua->db));
bsendmsg(ua, _("Failed to connect to Storage daemon.\n"));
return;
}
- Dmsg0(20, _("Connected to storage daemon\n"));
+ Dmsg0(120, _("Connected to storage daemon\n"));
sd = ua->jcr->store_bsock;
bnet_fsend(sd, "setdebug=%d\n", level);
- if (bnet_recv(sd) > 0) {
+ if (bnet_recv(sd) >= 0) {
bsendmsg(ua, "%s", sd->msg);
}
bnet_sig(sd, BNET_TERMINATE);
bsendmsg(ua, _("Failed to connect to Client.\n"));
return;
}
- Dmsg0(20, "Connected to file daemon\n");
+ Dmsg0(120, "Connected to file daemon\n");
fd = ua->jcr->file_bsock;
bnet_fsend(fd, "setdebug=%d\n", level);
- if (bnet_recv(fd) > 0) {
+ if (bnet_recv(fd) >= 0) {
bsendmsg(ua, "%s", fd->msg);
}
bnet_sig(fd, BNET_TERMINATE);
}
if (!found) {
unique_store[i++] = store;
- Dmsg2(40, "Stuffing: %s:%d\n", store->address, store->SDport);
+ Dmsg2(140, "Stuffing: %s:%d\n", store->address, store->SDport);
}
}
UnlockRes();
}
if (!found) {
unique_client[i++] = client;
- Dmsg2(40, "Stuffing: %s:%d\n", client->address, client->FDport);
+ Dmsg2(140, "Stuffing: %s:%d\n", client->address, client->FDport);
}
}
UnlockRes();
if (!open_db(ua)) {
return 1;
}
- Dmsg1(20, "setdebug:%s:\n", cmd);
+ Dmsg1(120, "setdebug:%s:\n", cmd);
level = -1;
for (i=1; i<ua->argc; i++) {
add_prompt(ua, _("Storage"));
add_prompt(ua, _("Client"));
add_prompt(ua, _("All"));
- switch(do_prompt(ua, _("Select daemon type to set debug level"), NULL)) {
+ switch(do_prompt(ua, _("Select daemon type to set debug level"), NULL, 0)) {
case 0: /* Director */
debug_level = level;
break;
static int deletecmd(UAContext *ua, char *cmd)
{
static char *keywords[] = {
- N_("media"),
+ N_("volume"),
N_("pool"),
NULL};
bsendmsg(ua, _(
"In general it is not a good idea to delete either a\n"
-"Pool or Media since in both cases, you may delete Media\n"
-"that contain data.\n\n"));
+"Pool or a Volume since they may contain data.\n\n"));
switch (find_arg_keyword(ua, keywords)) {
case 0:
"and all Jobs saved on that volume from the Catalog\n"),
mr.VolumeName);
- if (!get_cmd(ua, _("If you want to continue enter pretty please: "))) {
+ if (!get_cmd(ua, _("Are you sure you want to delete this Volume? (yes/no): "))) {
return 1;
}
- if (strcmp(ua->cmd, _("pretty please")) == 0) {
- db_delete_media_record(ua->db, &mr);
+ if (strcasecmp(ua->cmd, _("yes")) == 0) {
+ db_delete_media_record(ua->jcr, ua->db, &mr);
}
return 1;
}
if (!get_pool_dbr(ua, &pr)) {
return 1;
}
- if (!get_cmd(ua, _("If you want to continue enter pretty please: "))) {
+ if (!get_cmd(ua, _("Are you sure you want to delete this Pool? (yes/no): "))) {
return 1;
}
- if (strcmp(ua->cmd, _("pretty please")) == 0) {
- db_delete_pool_record(ua->db, &pr);
+ if (strcasecmp(ua->cmd, _("yes")) == 0) {
+ db_delete_pool_record(ua->jcr, ua->db, &pr);
}
return 1;
}
int ok = FALSE;
int mounted = FALSE;
int i;
+ int slot = 0;
static char *keyword[] = {
"volume",
NULL};
bsendmsg(ua, _("Volume name too long.\n"));
goto getVol;
}
+ if (strlen(ua->cmd) == 0) {
+ bsendmsg(ua, _("Volume name must be at least one character long.\n"));
+ goto getVol;
+ }
+
memset(&mr, 0, sizeof(mr));
strcpy(mr.VolumeName, ua->cmd);
- if (db_get_media_record(ua->db, &mr)) {
+ if (db_get_media_record(ua->jcr, ua->db, &mr)) {
bsendmsg(ua, _("Media record for Volume %s already exists.\n"),
mr.VolumeName);
return 1;
}
+
+ /* Do some more checking on slot ****FIXME**** */
+ if (store->autochanger) {
+ if (!get_cmd(ua, _("Enter slot (0 for none): "))) {
+ return 1;
+ }
+ slot = atoi(ua->cmd);
+ }
strcpy(mr.MediaType, store->media_type);
+ mr.Slot = slot;
memset(&pr, 0, sizeof(pr));
if (!select_pool_dbr(ua, &pr)) {
return 1;
}
- mr.PoolId = pr.PoolId;
- strcpy(mr.VolStatus, "Append");
- mr.Recycle = pr.Recycle;
- mr.VolRetention = pr.VolRetention;
ua->jcr->store = store;
bsendmsg(ua, _("Connecting to Storage daemon %s at %s:%d ...\n"),
bash_spaces(mr.VolumeName);
bash_spaces(mr.MediaType);
bash_spaces(pr.Name);
- bnet_fsend(sd, _("label %s VolumeName=%s PoolName=%s MediaType=%s"),
- dev_name, mr.VolumeName, pr.Name, mr.MediaType);
+ bnet_fsend(sd, _("label %s VolumeName=%s PoolName=%s MediaType=%s Slot=%d"),
+ dev_name, mr.VolumeName, pr.Name, mr.MediaType, mr.Slot);
bsendmsg(ua, "Sending label command ...\n");
- while (bget_msg(sd, 0) > 0) {
+ while (bget_msg(sd, 0) >= 0) {
bsendmsg(ua, "%s", sd->msg);
if (strncmp(sd->msg, "3000 OK label.", 14) == 0) {
ok = TRUE;
unbash_spaces(mr.VolumeName);
unbash_spaces(mr.MediaType);
unbash_spaces(pr.Name);
+ mr.LabelDate = time(NULL);
if (ok) {
- if (db_create_media_record(ua->db, &mr)) {
+ set_pool_dbr_defaults_in_media_dbr(&mr, &pr);
+ if (db_create_media_record(ua->jcr, ua->db, &mr)) {
bsendmsg(ua, _("Media record for Volume=%s successfully created.\n"),
mr.VolumeName);
if (ua->automount) {
bash_spaces(dev_name);
bnet_fsend(sd, "mount %s", dev_name);
unbash_spaces(dev_name);
- while (bnet_recv(sd) > 0) {
+ while (bnet_recv(sd) >= 0) {
bsendmsg(ua, "%s", sd->msg);
/* Here we can get
* 3001 OK mount. Device=xxx or
if (!open_db(ua)) {
return;
}
- Dmsg1(20, "mount: %s\n", ua->UA_sock->msg);
+ Dmsg1(120, "mount: %s\n", ua->UA_sock->msg);
store = get_storage_resource(ua, cmd);
if (!store) {
return;
}
- Dmsg2(20, "Found storage, MediaType=%s DevName=%s\n",
+ Dmsg2(120, "Found storage, MediaType=%s DevName=%s\n",
store->media_type, store->dev_name);
ua->jcr->store = store;
} else {
bnet_fsend(sd, "unmount %s", dev_name);
}
- while (bnet_recv(sd) > 0) {
+ while (bnet_recv(sd) >= 0) {
bsendmsg(ua, "%s", sd->msg);
if (strncmp(sd->msg, "3001 OK mount.", 14) == 0) {
/***** ****FIXME**** fix JobStatus */
unsigned int i;
/* usage(); */
- bnet_fsend(ua->UA_sock, _(" Command Description\n ======= ===========\n"));
+ bsendmsg(ua, _(" Command Description\n ======= ===========\n"));
for (i=0; i<comsize; i++) {
- bnet_fsend(ua->UA_sock, _(" %-10s %s\n"), _(commands[i].key), _(commands[i].help));
+ bsendmsg(ua, _(" %-10s %s\n"), _(commands[i].key), _(commands[i].help));
}
- bnet_fsend(ua->UA_sock, "\n");
+ bsendmsg(ua, "\n");
return 1;
}
static int versioncmd(UAContext *ua, char *cmd)
{
- bsendmsg(ua, "%s Version: " VERSION " (" DATE ")\n", my_name);
+ bsendmsg(ua, "%s Version: " VERSION " (" BDATE ")\n", my_name);
return 1;
}
ua->catalog = (CAT *)GetNextRes(R_CATALOG, NULL);
UnlockRes();
if (!ua->catalog) {
- bnet_fsend(ua->UA_sock, _("Could not find a Catalog resource\n"));
+ bsendmsg(ua, _("Could not find a Catalog resource\n"));
return 0;
} else {
- bnet_fsend(ua->UA_sock, _("Using default Catalog name=%s DB=%s\n"),
+ bsendmsg(ua, _("Using default Catalog name=%s DB=%s\n"),
ua->catalog->hdr.name, ua->catalog->db_name);
}
}
- Dmsg0(50, "Open database\n");
- ua->db = db_init_database(ua->catalog->db_name, ua->catalog->db_user,
+ Dmsg0(150, "Open database\n");
+ ua->db = db_init_database(ua->jcr, ua->catalog->db_name, ua->catalog->db_user,
ua->catalog->db_password);
- if (!db_open_database(ua->db)) {
- bnet_fsend(ua->UA_sock, _("Could not open DB %s: ERR=%s"),
+ if (!db_open_database(ua->jcr, ua->db)) {
+ bsendmsg(ua, _("Could not open DB %s: ERR=%s"),
ua->catalog->db_name, db_strerror(ua->db));
close_db(ua);
return 0;
}
ua->jcr->db = ua->db;
- Dmsg1(50, "DB %s opened\n", ua->catalog->db_name);
+ Dmsg1(150, "DB %s opened\n", ua->catalog->db_name);
return 1;
}
void close_db(UAContext *ua)
{
if (ua->db) {
- db_close_database(ua->db);
+ db_close_database(ua->jcr, ua->db);
}
ua->db = NULL;
ua->jcr->db = NULL;