X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_cmds.c;h=2baa3438e3d8a62facca795c3cee1639ab0c0315;hb=9f01506e19567ce5c8fae5699016a1d512647f55;hp=954ac237f614126fac884f2b998b5b22a65c448c;hpb=ccc6c893d38802a042091e5c0ec6317ead19179f;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index 954ac237f6..2baa3438e3 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -39,6 +39,7 @@ extern struct s_res resources[]; extern char my_name[]; extern jobq_t job_queue; /* job queue */ + extern char *list_pool; /* Imported functions */ @@ -47,7 +48,8 @@ extern int list_cmd(UAContext *ua, char *cmd); extern int llist_cmd(UAContext *ua, char *cmd); extern int show_cmd(UAContext *ua, char *cmd); extern int messagescmd(UAContext *ua, char *cmd); -extern int autodisplaycmd(UAContext *ua, char *cmd); +extern int autodisplay_cmd(UAContext *ua, char *cmd); +extern int gui_cmd(UAContext *ua, char *cmd); extern int sqlquerycmd(UAContext *ua, char *cmd); extern int querycmd(UAContext *ua, char *cmd); extern int run_cmd(UAContext *ua, char *cmd); @@ -64,6 +66,7 @@ static int add_cmd(UAContext *ua, char *cmd); static int create_cmd(UAContext *ua, char *cmd); static int cancel_cmd(UAContext *ua, char *cmd); static int setdebug_cmd(UAContext *ua, char *cmd); +static int trace_cmd(UAContext *ua, char *cmd); static int var_cmd(UAContext *ua, char *cmd); static int estimate_cmd(UAContext *ua, char *cmd); static int help_cmd(UAContext *ua, char *cmd); @@ -71,6 +74,7 @@ static int delete_cmd(UAContext *ua, char *cmd); static int use_cmd(UAContext *ua, char *cmd), unmount_cmd(UAContext *ua, char *cmd); static int version_cmd(UAContext *ua, char *cmd), automount_cmd(UAContext *ua, char *cmd); static int time_cmd(UAContext *ua, char *cmd); +static int reload_cmd(UAContext *ua, char *cmd); static int update_volume(UAContext *ua); static int update_pool(UAContext *ua); static int delete_volume(UAContext *ua); @@ -88,13 +92,14 @@ int quit_cmd(UAContext *ua, char *cmd); struct cmdstruct { char *key; int (*func)(UAContext *ua, char *cmd); char *help; }; static struct cmdstruct commands[] = { { N_("add"), add_cmd, _("add media to a pool")}, - { N_("autodisplay"), autodisplaycmd, _("autodisplay [on/off] -- console messages")}, + { N_("autodisplay"), autodisplay_cmd, _("autodisplay [on/off] -- console messages")}, { N_("automount"), automount_cmd, _("automount [on/off] -- after label")}, { N_("cancel"), cancel_cmd, _("cancel job=nnn -- cancel a job")}, { N_("create"), create_cmd, _("create DB Pool from resource")}, { N_("delete"), delete_cmd, _("delete [pool= | media volume=]")}, { N_("estimate"), estimate_cmd, _("performs FileSet estimate, listing gives full listing")}, { N_("exit"), quit_cmd, _("exit = quit")}, + { N_("gui"), gui_cmd, _("gui [on/off] -- non-interactive gui mode")}, { N_("help"), help_cmd, _("print this command")}, { N_("list"), list_cmd, _("list [pools | jobs | jobtotals | media | files jobid=]; from catalog")}, { N_("label"), label_cmd, _("label a tape")}, @@ -108,6 +113,7 @@ static struct cmdstruct commands[] = { { N_("restore"), restore_cmd, _("restore files")}, { N_("relabel"), relabel_cmd, _("relabel a tape")}, { N_("release"), release_cmd, _("release ")}, + { N_("reload"), reload_cmd, _("reload conf file")}, { N_("run"), run_cmd, _("run ")}, { N_("status"), status_cmd, _("status [storage | client]=")}, { N_("setdebug"), setdebug_cmd, _("sets debug level")}, @@ -115,6 +121,7 @@ static struct cmdstruct commands[] = { { N_("show"), show_cmd, _("show (resource records) [jobs | pools | ... | all]")}, { N_("sqlquery"), sqlquerycmd, _("use SQL to query catalog")}, { N_("time"), time_cmd, _("print current time")}, + { N_("trace"), trace_cmd, _("turn on/off trace to file")}, { N_("unmount"), unmount_cmd, _("unmount ")}, { N_("update"), update_cmd, _("update Volume or Pool")}, { N_("use"), use_cmd, _("use catalog xxx")}, @@ -388,13 +395,13 @@ static int cancel_cmd(UAContext *ua, char *cmd) if (!jcr) { /* Count Jobs running */ lock_jcr_chain(); - for (jcr=NULL; (jcr=get_next_jcr(jcr)); njobs++) { + foreach_jcr(jcr) { if (jcr->JobId == 0) { /* this is us */ free_locked_jcr(jcr); - njobs--; continue; } free_locked_jcr(jcr); + njobs++; } unlock_jcr_chain(); @@ -404,7 +411,7 @@ static int cancel_cmd(UAContext *ua, char *cmd) } start_prompt(ua, _("Select Job:\n")); lock_jcr_chain(); - for (jcr=NULL; (jcr=get_next_jcr(jcr)); ) { + foreach_jcr(jcr) { if (jcr->JobId == 0) { /* this is us */ free_locked_jcr(jcr); continue; @@ -558,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; } @@ -584,6 +592,8 @@ static int setip_cmd(UAContext *ua, char *cmd) * updates pool from Pool resource * update media pool= volume= * changes pool info for volume + * update slots [scan=...] + * updates autochanger slots */ static int update_cmd(UAContext *ua, char *cmd) { @@ -786,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)); @@ -794,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")); } } @@ -826,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++) { @@ -858,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; } @@ -980,7 +1021,7 @@ static int update_volume(UAContext *ua) if (!db_update_media_record(ua->jcr, ua->db, &mr)) { bsendmsg(ua, _("Error updating media record Slot: ERR=%s"), db_strerror(ua->db)); } else { - bsendmsg(ua, _("New Slot is: %s\n"), mr.Slot); + bsendmsg(ua, _("New Slot is: %d\n"), mr.Slot); } break; @@ -997,7 +1038,7 @@ static int update_volume(UAContext *ua) if (!db_update_media_record(ua->jcr, ua->db, &mr)) { bsendmsg(ua, _("Error updating media record Slot: ERR=%s"), db_strerror(ua->db)); } else { - bsendmsg(ua, _("New InChanger flag is: %s\n"), mr.InChanger); + bsendmsg(ua, _("New InChanger flag is: %d\n"), mr.InChanger); } break; @@ -1087,7 +1128,7 @@ static int update_pool(UAContext *ua) } -static void do_storage_setdebug(UAContext *ua, STORE *store, int level) +static void do_storage_setdebug(UAContext *ua, STORE *store, int level, int trace_flag) { BSOCK *sd; @@ -1101,7 +1142,7 @@ static void do_storage_setdebug(UAContext *ua, STORE *store, int level) } Dmsg0(120, _("Connected to storage daemon\n")); sd = ua->jcr->store_bsock; - bnet_fsend(sd, "setdebug=%d\n", level); + bnet_fsend(sd, "setdebug=%d trace=%d\n", level, trace_flag); if (bnet_recv(sd) >= 0) { bsendmsg(ua, "%s", sd->msg); } @@ -1111,7 +1152,7 @@ static void do_storage_setdebug(UAContext *ua, STORE *store, int level) return; } -static void do_client_setdebug(UAContext *ua, CLIENT *client, int level) +static void do_client_setdebug(UAContext *ua, CLIENT *client, int level, int trace_flag) { BSOCK *fd; @@ -1127,7 +1168,7 @@ static void do_client_setdebug(UAContext *ua, CLIENT *client, int level) } Dmsg0(120, "Connected to file daemon\n"); fd = ua->jcr->file_bsock; - bnet_fsend(fd, "setdebug=%d\n", level); + bnet_fsend(fd, "setdebug=%d trace=%d\n", level, trace_flag); if (bnet_recv(fd) >= 0) { bsendmsg(ua, "%s", fd->msg); } @@ -1138,7 +1179,7 @@ static void do_client_setdebug(UAContext *ua, CLIENT *client, int level) } -static void do_all_setdebug(UAContext *ua, int level) +static void do_all_setdebug(UAContext *ua, int level, int trace_flag) { STORE *store, **unique_store; CLIENT *client, **unique_client; @@ -1175,7 +1216,7 @@ static void do_all_setdebug(UAContext *ua, int level) /* Call each unique Storage daemon */ for (j=0; jpint32_val; } + /* Look for trace flag. -1 => not change */ + i = find_arg_with_value(ua, _("trace")); + if (i >= 0) { + trace_flag = atoi(ua->argv[i]); + if (trace_flag > 0) { + trace_flag = 1; + } + } + /* General debug? */ for (i=1; iargc; i++) { if (strcasecmp(ua->argk[i], _("all")) == 0) { - do_all_setdebug(ua, level); + do_all_setdebug(ua, level, trace_flag); return 1; } if (strcasecmp(ua->argk[i], _("dir")) == 0 || strcasecmp(ua->argk[i], _("director")) == 0) { debug_level = level; + set_trace(trace_flag); return 1; } if (strcasecmp(ua->argk[i], _("client")) == 0 || @@ -1256,13 +1308,13 @@ static int setdebug_cmd(UAContext *ua, char *cmd) if (ua->argv[i]) { client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[i]); if (client) { - do_client_setdebug(ua, client, level); + do_client_setdebug(ua, client, level, trace_flag); return 1; } } client = select_client_resource(ua); if (client) { - do_client_setdebug(ua, client, level); + do_client_setdebug(ua, client, level, trace_flag); return 1; } } @@ -1274,13 +1326,13 @@ static int setdebug_cmd(UAContext *ua, char *cmd) if (ua->argv[i]) { store = (STORE *)GetResWithName(R_STORAGE, ua->argv[i]); if (store) { - do_storage_setdebug(ua, store, level); + do_storage_setdebug(ua, store, level, trace_flag); return 1; } } store = get_storage_resource(ua, 0); if (store) { - do_storage_setdebug(ua, store, level); + do_storage_setdebug(ua, store, level, trace_flag); return 1; } } @@ -1297,21 +1349,22 @@ static int setdebug_cmd(UAContext *ua, char *cmd) switch(do_prompt(ua, "", _("Select daemon type to set debug level"), NULL, 0)) { case 0: /* Director */ debug_level = level; + set_trace(trace_flag); break; case 1: store = get_storage_resource(ua, 0); if (store) { - do_storage_setdebug(ua, store, level); + do_storage_setdebug(ua, store, level, trace_flag); } break; case 2: client = select_client_resource(ua); if (client) { - do_client_setdebug(ua, client, level); + do_client_setdebug(ua, client, level, trace_flag); } break; case 3: - do_all_setdebug(ua, level); + do_all_setdebug(ua, level, trace_flag); break; default: break; @@ -1319,6 +1372,27 @@ static int setdebug_cmd(UAContext *ua, char *cmd) return 1; } +/* + * Turn debug tracing to file on/off + */ +static int trace_cmd(UAContext *ua, char *cmd) +{ + char *onoff; + + if (ua->argc != 2) { + if (!get_cmd(ua, _("Turn on or off? "))) { + return 1; + } + onoff = ua->cmd; + } else { + onoff = ua->argk[1]; + } + + set_trace((strcasecmp(onoff, _("off")) == 0) ? false : true); + return 1; + +} + static int var_cmd(UAContext *ua, char *cmd) { POOLMEM *val = get_pool_memory(PM_FNAME); @@ -1447,13 +1521,25 @@ static int time_cmd(UAContext *ua, char *cmd) return 1; } +/* + * reload the conf file + */ +extern void reload_config(int sig); + +static int reload_cmd(UAContext *ua, char *cmd) +{ + reload_config(1); + return 1; +} + /* * Delete Pool records (should purge Media with it). * * delete pool= - * delete media pool= volume= + * delete volume pool= volume= + * delete job jobid=xxx */ static int delete_cmd(UAContext *ua, char *cmd) { @@ -1461,14 +1547,14 @@ static int delete_cmd(UAContext *ua, char *cmd) N_("volume"), N_("pool"), N_("job"), + N_("jobid"), NULL}; if (!open_db(ua)) { return 1; } - - switch (find_arg_keyword(ua, keywords)) { + switch (find_arg_keyword(ua, keywords)) { case 0: delete_volume(ua); return 1; @@ -1476,7 +1562,12 @@ static int delete_cmd(UAContext *ua, char *cmd) delete_pool(ua); return 1; case 2: - delete_job(ua); + case 3: + int i; + while ((i=find_arg(ua, _("jobid"))) > 0) { + delete_job(ua); + *ua->argk[i] = 0; /* zap keyword already visited */ + } return 1; default: break; @@ -1508,7 +1599,7 @@ static int delete_job(UAContext *ua) POOLMEM *query = get_pool_memory(PM_MESSAGE); JobId_t JobId; - int i = find_arg_with_value(ua, "jobid"); + int i = find_arg_with_value(ua, _("jobid")); if (i >= 0) { JobId = str_to_int64(ua->argv[i]); } else if (!get_pint(ua, _("Enter JobId to delete: "))) { @@ -1674,13 +1765,14 @@ int quit_cmd(UAContext *ua, char *cmd) */ int wait_cmd(UAContext *ua, char *cmd) { + JCR *jcr; bmicrosleep(0, 200000); /* let job actually start */ - for (int running=1; running; ) { - running = 0; + for (bool running=true; running; ) { + running = false; lock_jcr_chain(); - for (JCR *jcr=NULL; (jcr=get_next_jcr(jcr)); ) { + foreach_jcr(jcr) { if (jcr->JobId != 0) { - running = 1; + running = true; free_locked_jcr(jcr); break; }