extern int restorecmd(UAContext *ua, char *cmd);
extern int labelcmd(UAContext *ua, char *cmd);
extern int relabelcmd(UAContext *ua, char *cmd);
+extern int update_slots(UAContext *ua); /* ua_label.c */
/* Forward referenced functions */
static int addcmd(UAContext *ua, char *cmd), createcmd(UAContext *ua, char *cmd), cancelcmd(UAContext *ua, char *cmd);
static int delete_pool(UAContext *ua);
static int mountcmd(UAContext *ua, char *cmd);
static int updatecmd(UAContext *ua, char *cmd);
+static int waitcmd(UAContext *ua, char *cmd);
int quitcmd(UAContext *ua, char *cmd);
{ N_("query"), querycmd, _("query catalog")},
{ N_("time"), timecmd, _("print current time")},
{ N_("exit"), quitcmd, _("exit = quit")},
+ { N_("wait"), waitcmd, _("wait until no jobs are running")},
};
#define comsize (sizeof(commands)/sizeof(struct cmdstruct))
}
len = strlen(ua->argk[0]);
- for (i=0; i<comsize; i++) /* search for command */
+ for (i=0; i<comsize; i++) { /* search for command */
if (strncasecmp(ua->argk[0], _(commands[i].key), len) == 0) {
stat = (*commands[i].func)(ua, cmd); /* go execute command */
found = 1;
break;
}
+ }
if (!found) {
- strcat(ua->UA_sock->msg, _(": is an illegal command\n"));
+ pm_strcat(&ua->UA_sock->msg, _(": is an illegal command\n"));
ua->UA_sock->msglen = strlen(ua->UA_sock->msg);
bnet_send(ua->UA_sock);
}
while (pr.MaxVols > 0 && pr.NumVols >= pr.MaxVols) {
bsendmsg(ua, _("Pool already has maximum volumes = %d\n"), pr.MaxVols);
for (;;) {
- if (!get_cmd(ua, _("Enter new maximum (zero for unlimited): "))) {
+ if (!get_pint(ua, _("Enter new maximum (zero for unlimited): "))) {
return 1;
}
- pr.MaxVols = atoi(ua->cmd);
- if (pr.MaxVols < 0) {
- bsendmsg(ua, _("Max vols must be zero or greater.\n"));
- continue;
- }
- break;
+ pr.MaxVols = ua->pint32_val;
}
}
/* Get media type */
- if ((store = get_storage_resource(ua, cmd, 0)) != NULL) {
+ if ((store = get_storage_resource(ua, 0)) != NULL) {
strcpy(mr.MediaType, store->media_type);
} else if (!get_media_type(ua, mr.MediaType, sizeof(mr.MediaType))) {
return 1;
for (;;) {
char buf[100];
sprintf(buf, _("Enter number of Volumes to create. 0=>fixed name. Max=%d: "), max);
- if (!get_cmd(ua, buf)) {
+ if (!get_pint(ua, buf)) {
return 1;
}
- num = atoi(ua->cmd);
+ num = ua->pint32_val;
if (num < 0 || num > max) {
bsendmsg(ua, _("The number must be between 0 and %d\n"), max);
continue;
strcat(name, "%04d");
for (;;) {
- if (!get_cmd(ua, _("Enter the starting number: "))) {
+ if (!get_pint(ua, _("Enter the starting number: "))) {
return 1;
}
- startnum = atoi(ua->cmd);
+ startnum = ua->pint32_val;
if (startnum < 1) {
bsendmsg(ua, _("Start number must be greater than zero.\n"));
continue;
}
if (store && store->autochanger) {
- if (!get_cmd(ua, _("Enter slot (0 for none): "))) {
+ if (!get_pint(ua, _("Enter slot (0 for none): "))) {
return 1;
}
- slot = atoi(ua->cmd);
+ slot = ua->pint32_val;
}
set_pool_dbr_defaults_in_media_dbr(&mr, &pr);
return 1;
}
if (njobs == 1) {
- if (!get_cmd(ua, _("Confirm cancel (yes/no): "))) {
- return 1;
- }
- if (strcasecmp(ua->cmd, _("yes")) != 0) {
+ if (!get_yesno(ua, _("Confirm cancel (yes/no): ")) || ua->pint32_val == 0) {
return 1;
}
}
switch (jcr->JobStatus) {
case JS_Created:
+ case JS_WaitJobRes:
+ case JS_WaitClientRes:
+ case JS_WaitStoreRes:
+ case JS_WaitMaxJobs:
+ case JS_WaitStartTime:
set_jcr_job_status(jcr, JS_Canceled);
bsendmsg(ua, _("JobId %d, Job %s marked to be canceled.\n"),
jcr->JobId, jcr->Job);
default:
set_jcr_job_status(jcr, JS_Canceled);
+
/* Cancel File daemon */
- ua->jcr->client = jcr->client;
- if (!connect_to_file_daemon(ua->jcr, 10, FDConnectTimeout, 1)) {
- bsendmsg(ua, _("Failed to connect to File daemon.\n"));
- free_jcr(jcr);
- return 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) {
- bsendmsg(ua, "%s", fd->msg);
+ if (jcr->file_bsock) {
+ ua->jcr->client = jcr->client;
+ if (!connect_to_file_daemon(ua->jcr, 10, FDConnectTimeout, 1)) {
+ bsendmsg(ua, _("Failed to connect to File daemon.\n"));
+ free_jcr(jcr);
+ return 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) {
+ bsendmsg(ua, "%s", fd->msg);
+ }
+ bnet_sig(fd, BNET_TERMINATE);
+ bnet_close(fd);
+ ua->jcr->file_bsock = NULL;
}
- bnet_sig(fd, BNET_TERMINATE);
- bnet_close(fd);
- ua->jcr->file_bsock = NULL;
/* Cancel Storage daemon */
- ua->jcr->store = jcr->store;
- if (!connect_to_storage_daemon(ua->jcr, 10, SDConnectTimeout, 1)) {
- bsendmsg(ua, _("Failed to connect to Storage daemon.\n"));
- free_jcr(jcr);
- return 1;
- }
- 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) {
- bsendmsg(ua, "%s", sd->msg);
+ if (jcr->store_bsock) {
+ ua->jcr->store = jcr->store;
+ if (!connect_to_storage_daemon(ua->jcr, 10, SDConnectTimeout, 1)) {
+ bsendmsg(ua, _("Failed to connect to Storage daemon.\n"));
+ free_jcr(jcr);
+ return 1;
+ }
+ 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) {
+ bsendmsg(ua, "%s", sd->msg);
+ }
+ bnet_sig(sd, BNET_TERMINATE);
+ bnet_close(sd);
+ ua->jcr->store_bsock = NULL;
}
- bnet_sig(sd, BNET_TERMINATE);
- bnet_close(sd);
- ua->jcr->store_bsock = NULL;
-
}
free_jcr(jcr);
static int updatecmd(UAContext *ua, char *cmd)
{
static char *kw[] = {
- N_("media"),
- N_("volume"),
- N_("pool"),
+ N_("media"), /* 0 */
+ N_("volume"), /* 1 */
+ N_("pool"), /* 2 */
+ N_("slots"), /* 3 */
NULL};
if (!open_db(ua)) {
case 2:
update_pool(ua);
return 1;
+ case 3:
+ update_slots(ua);
+ return 1;
default:
break;
}
start_prompt(ua, _("Update choice:\n"));
add_prompt(ua, _("Volume parameters"));
add_prompt(ua, _("Pool from resource"));
+ add_prompt(ua, _("Slots from autochanger"));
switch (do_prompt(ua, _("Choose catalog item to update"), NULL, 0)) {
case 0:
update_volume(ua);
case 1:
update_pool(ua);
break;
+ case 2:
+ update_slots(ua);
+ break;
default:
break;
}
*/
static int update_volume(UAContext *ua)
{
- POOL_DBR pr;
MEDIA_DBR mr;
POOLMEM *query;
char ed1[30];
- if (!select_pool_and_media_dbr(ua, &pr, &mr)) {
- return 0;
- }
for (int done=0; !done; ) {
- 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);
- }
+ if (!select_media_dbr(ua, &mr)) {
return 0;
}
bsendmsg(ua, _("Updating Volume \"%s\"\n"), mr.VolumeName);
add_prompt(ua, "Disabled");
add_prompt(ua, "Full");
add_prompt(ua, "Used");
+ add_prompt(ua, "Cleaning");
if (strcmp(mr.VolStatus, "Purged") == 0) {
add_prompt(ua, "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: "))) {
+ if (!get_pint(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;
- }
+ maxjobs = ua->pint32_val;
query = get_pool_memory(PM_MESSAGE);
Mmsg(&query, "UPDATE Media SET MaxVolJobs=%u WHERE MediaId=%u",
maxjobs, mr.MediaId);
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: "))) {
+ if (!get_pint(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;
- }
+ maxfiles = ua->pint32_val;
query = get_pool_memory(PM_MESSAGE);
Mmsg(&query, "UPDATE Media SET MaxVolFiles=%u WHERE MediaId=%u",
maxfiles, mr.MediaId);
int recycle;
bsendmsg(ua, _("Current recycle flag is: %s\n"),
mr.Recycle==1?_("yes"):_("no"));
- if (!get_cmd(ua, _("Enter new Recycle status: "))) {
+ if (!get_yesno(ua, _("Enter new Recycle status: "))) {
return 0;
}
- if (strcasecmp(ua->cmd, _("yes")) == 0) {
- recycle = 1;
- } else if (strcasecmp(ua->cmd, _("no")) == 0) {
- recycle = 0;
- } else {
- bsendmsg(ua, _("Invalid recycle status specified.\n"));
- break;
- }
+ recycle = ua->pint32_val;
query = get_pool_memory(PM_MESSAGE);
Mmsg(&query, "UPDATE Media SET Recycle=%d WHERE MediaId=%u",
recycle, mr.MediaId);
case 7: /* Slot */
int slot;
+ POOL_DBR pr;
+
+ memset(&pr, 0, sizeof(POOL_DBR));
+ pr.PoolId = mr.PoolId;
+ if (!db_get_pool_record(ua->jcr, ua->db, &pr)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ return 0;
+ }
bsendmsg(ua, _("Current Slot is: %d\n"), mr.Slot);
- if (!get_cmd(ua, _("Enter new Slot: "))) {
+ if (!get_pint(ua, _("Enter new Slot: "))) {
return 0;
}
- slot = atoi(ua->cmd);
- if (slot < 0) {
- bsendmsg(ua, _("Invalid slot, it must be 0 or greater\n"));
- break;
- } else if (pr.MaxVols > 0 && slot >(int)pr.MaxVols) {
+ slot = ua->pint32_val;
+ if (pr.MaxVols > 0 && slot > (int)pr.MaxVols) {
bsendmsg(ua, _("Invalid slot, it must be between 0 and %d\n"),
pr.MaxVols);
break;
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: "))) {
+ if (!get_pint(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;
- }
+ VolFiles = ua->pint32_val;
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) {
+ if (!get_yesno(ua, _("Continue? (yes/no): ")) || ua->pint32_val == 0) {
break;
}
}
Dmsg1(120, "setdebug:%s:\n", cmd);
level = -1;
- for (i=1; i<ua->argc; i++) {
- if (strcasecmp(ua->argk[i], _("level")) == 0 && ua->argv[i]) {
- level = atoi(ua->argv[i]);
- break;
- }
+ i = find_arg_with_value(ua, _("level"));
+ if (i >= 0) {
+ level = atoi(ua->argv[i]);
}
if (level < 0) {
- if (!get_cmd(ua, _("Enter new debug level: "))) {
+ if (!get_pint(ua, _("Enter new debug level: "))) {
return 1;
}
- level = atoi(ua->cmd);
- }
- if (level < 0) {
- bsendmsg(ua, _("level cannot be negative.\n"));
- return 1;
+ level = ua->pint32_val;
}
/* General debug? */
return 1;
}
}
- store = get_storage_resource(ua, cmd, 0);
+ store = get_storage_resource(ua, 0);
if (store) {
do_storage_setdebug(ua, store, level);
return 1;
debug_level = level;
break;
case 1:
- store = get_storage_resource(ua, cmd, 0);
+ store = get_storage_resource(ua, 0);
if (store) {
do_storage_setdebug(ua, store, level);
}
*/
static int delete_volume(UAContext *ua)
{
- POOL_DBR pr;
MEDIA_DBR mr;
- if (!select_pool_and_media_dbr(ua, &pr, &mr)) {
+ if (!select_media_dbr(ua, &mr)) {
return 1;
}
bsendmsg(ua, _("\nThis command will delete volume %s\n"
"and all Jobs saved on that volume from the Catalog\n"),
mr.VolumeName);
- if (!get_cmd(ua, _("Are you sure you want to delete this Volume? (yes/no): "))) {
+ if (!get_yesno(ua, _("Are you sure you want to delete this Volume? (yes/no): "))) {
return 1;
}
- if (strcasecmp(ua->cmd, _("yes")) == 0) {
+ if (ua->pint32_val) {
db_delete_media_record(ua->jcr, ua->db, &mr);
}
return 1;
if (!get_pool_dbr(ua, &pr)) {
return 1;
}
- if (!get_cmd(ua, _("Are you sure you want to delete this Pool? (yes/no): "))) {
+ if (!get_yesno(ua, _("Are you sure you want to delete this Pool? (yes/no): "))) {
return 1;
}
- if (strcasecmp(ua->cmd, _("yes")) == 0) {
+ if (ua->pint32_val) {
db_delete_pool_record(ua->jcr, ua->db, &pr);
}
return 1;
}
Dmsg1(120, "mount: %s\n", ua->UA_sock->msg);
- store = get_storage_resource(ua, cmd, 1);
+ store = get_storage_resource(ua, 1);
if (!store) {
return;
}
return 1;
}
+/*
+ * Wait until no job is running
+ */
+int waitcmd(UAContext *ua, char *cmd)
+{
+ bmicrosleep(0, 200000); /* let job actually start */
+ for (int running=1; running; ) {
+ running = 0;
+ lock_jcr_chain();
+ for (JCR *jcr=NULL; (jcr=get_next_jcr(jcr)); ) {
+ if (jcr->JobId != 0) {
+ running = 1;
+ free_locked_jcr(jcr);
+ break;
+ }
+ free_locked_jcr(jcr);
+ }
+ unlock_jcr_chain();
+ if (running) {
+ bmicrosleep(1, 0);
+ }
+ }
+ return 1;
+}
+
+
static int helpcmd(UAContext *ua, char *cmd)
{
unsigned int i;