From 6a4e8f7df70b2ea9b70e3b64e5fcc4fecb88fdfa Mon Sep 17 00:00:00 2001 From: Philipp Storz Date: Wed, 7 Aug 2013 11:18:35 +0200 Subject: [PATCH] Add command for doing a name resolution on client. Resolve command now can resolve given hostname(s) on director, client and storage daemon if specified. examples: * resolution on director: resolve www.bareos.com > gonzo-dir resolves www.bareos.com to host[ipv4:84.44.166.242] * resolution on client: resolve client=gonzo.bareos.com-fd www.bareos.com > gonzo-fd resolves www.bareos.com to host[ipv4:84.44.166.242] * resolution on storage: resolve storage=File www.bareos.com > gonzo-sd resolves www.bareos.com to host[ipv4:84.44.166.242] Fixes #181: Add command for doing a name resolution on client. Signed-off-by: Marco van Wieringen --- src/cats/protos.h | 2 +- src/cats/sql_list.c | 2 +- src/console/console.c | 2 +- src/dird/backup.c | 4 +- src/dird/fd_cmds.c | 150 ++++++++++++++++++---------- src/dird/migrate.c | 6 +- src/dird/msgchan.c | 4 +- src/dird/ndmp_dma.c | 4 +- src/dird/protos.h | 8 +- src/dird/restore.c | 4 +- src/dird/sd_cmds.c | 44 +++++++- src/dird/ua_cmds.c | 98 ++++++++++++++++-- src/dird/ua_dotcmds.c | 2 +- src/dird/ua_query.c | 10 +- src/dird/ua_restore.c | 10 +- src/dird/ua_update.c | 2 +- src/dird/vbackup.c | 2 +- src/dird/verify.c | 6 +- src/filed/dir_cmd.c | 33 +++++- src/lib/address_conf.c | 15 ++- src/lib/address_conf.h | 4 +- src/lib/bnet.c | 4 +- src/lib/bsock.c | 4 +- src/lib/bsock.h | 2 +- src/lib/protos.h | 2 +- src/qt-console/bcomm/dircomm.cpp | 2 +- src/qt-tray-monitor/monitoritem.cpp | 6 +- src/stored/bcopy.c | 2 +- src/stored/bscan.c | 2 +- src/stored/dir_cmd.c | 31 ++++++ src/stored/label.c | 2 +- src/stored/protos.h | 2 +- src/tools/bpluginfo.c | 12 +-- 33 files changed, 361 insertions(+), 122 deletions(-) diff --git a/src/cats/protos.h b/src/cats/protos.h index ec08c829ea4..7b34376e3cf 100644 --- a/src/cats/protos.h +++ b/src/cats/protos.h @@ -114,7 +114,7 @@ void db_list_files_for_job(JCR *jcr, B_DB *db, uint32_t jobid, DB_LIST_HANDLER s void db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); void db_list_joblog_records(JCR *jcr, B_DB *mdb, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); -bool db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose, e_list_type type); +bool db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit, void *ctx, bool verbose, e_list_type type); void db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); void db_list_copies_records(JCR *jcr, B_DB *mdb, uint32_t limit, char *jobids, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); void db_list_base_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx); diff --git a/src/cats/sql_list.c b/src/cats/sql_list.c index af5b1975dfd..8fd0bd66ea4 100644 --- a/src/cats/sql_list.c +++ b/src/cats/sql_list.c @@ -45,7 +45,7 @@ * Submit general SQL query */ bool db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit, - void *ctx, int verbose, e_list_type type) + void *ctx, bool verbose, e_list_type type) { bool retval = false; diff --git a/src/console/console.c b/src/console/console.c index 25bed410e92..427eeb33074 100644 --- a/src/console/console.c +++ b/src/console/console.c @@ -1241,7 +1241,7 @@ int main(int argc, char *argv[]) heart_beat = 0; } UA_sock = bnet_connect(NULL, 5, 15, heart_beat, "Director daemon", dir->address, - NULL, dir->DIRport, 0); + NULL, dir->DIRport, false); if (UA_sock == NULL) { terminate_console(0); return 1; diff --git a/src/dird/backup.c b/src/dird/backup.c index c7f1637c3b4..a6b5691f380 100644 --- a/src/dird/backup.c +++ b/src/dird/backup.c @@ -346,7 +346,7 @@ bool do_native_backup(JCR *jcr) /* * Start conversation with Storage daemon */ - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { return false; } sd = jcr->store_bsock; @@ -387,7 +387,7 @@ bool do_native_backup(JCR *jcr) } jcr->setJobStatus(JS_WaitFD); - if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, 1)) { + if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, true, true)) { goto bail_out; } fd = jcr->file_bsock; diff --git a/src/dird/fd_cmds.c b/src/dird/fd_cmds.c index 9a6255b6482..da16d4c142d 100644 --- a/src/dird/fd_cmds.c +++ b/src/dird/fd_cmds.c @@ -90,7 +90,7 @@ extern DIRRES *director; * give up after max_retry_time (default 30 mins). */ -int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time, int verbose) +int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time, bool verbose, bool start_job) { BSOCK *fd = new_bsock(); char ed1[30]; @@ -132,44 +132,47 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time, int return 0; } - /* - * Now send JobId and authorization key - */ - if (jcr->sd_auth_key == NULL) { - jcr->sd_auth_key = bstrdup("dummy"); - } - fd->fsend(jobcmd, edit_int64(jcr->JobId, ed1), jcr->Job, jcr->VolSessionId, - jcr->VolSessionTime, jcr->sd_auth_key); - if (!jcr->keep_sd_auth_key && !bstrcmp(jcr->sd_auth_key, "dummy")) { - memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key)); - } - Dmsg1(100, ">filed: %s", fd->msg); - if (bget_dirmsg(fd) > 0) { - Dmsg1(110, "msg); - if (!bstrncmp(fd->msg, OKjob, strlen(OKjob))) { - Jmsg(jcr, M_FATAL, 0, _("File daemon \"%s\" rejected Job command: %s\n"), - jcr->res.client->hdr.name, fd->msg); - jcr->setJobStatus(JS_ErrorTerminated); - return 0; - } else if (jcr->db) { - CLIENT_DBR cr; - memset(&cr, 0, sizeof(cr)); - bstrncpy(cr.Name, jcr->res.client->hdr.name, sizeof(cr.Name)); - cr.AutoPrune = jcr->res.client->AutoPrune; - cr.FileRetention = jcr->res.client->FileRetention; - cr.JobRetention = jcr->res.client->JobRetention; - bstrncpy(cr.Uname, fd->msg+strlen(OKjob)+1, sizeof(cr.Uname)); - if (!db_update_client_record(jcr, jcr->db, &cr)) { - Jmsg(jcr, M_WARNING, 0, _("Error updating Client record. ERR=%s\n"), - db_strerror(jcr->db)); + if (start_job) { + /* + * Now send JobId and authorization key + */ + if (jcr->sd_auth_key == NULL) { + jcr->sd_auth_key = bstrdup("dummy"); + } + fd->fsend(jobcmd, edit_int64(jcr->JobId, ed1), jcr->Job, jcr->VolSessionId, + jcr->VolSessionTime, jcr->sd_auth_key); + if (!jcr->keep_sd_auth_key && !bstrcmp(jcr->sd_auth_key, "dummy")) { + memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key)); + } + Dmsg1(100, ">filed: %s", fd->msg); + if (bget_dirmsg(fd) > 0) { + Dmsg1(110, "msg); + if (!bstrncmp(fd->msg, OKjob, strlen(OKjob))) { + Jmsg(jcr, M_FATAL, 0, _("File daemon \"%s\" rejected Job command: %s\n"), + jcr->res.client->hdr.name, fd->msg); + jcr->setJobStatus(JS_ErrorTerminated); + return 0; + } else if (jcr->db) { + CLIENT_DBR cr; + memset(&cr, 0, sizeof(cr)); + bstrncpy(cr.Name, jcr->res.client->hdr.name, sizeof(cr.Name)); + cr.AutoPrune = jcr->res.client->AutoPrune; + cr.FileRetention = jcr->res.client->FileRetention; + cr.JobRetention = jcr->res.client->JobRetention; + bstrncpy(cr.Uname, fd->msg+strlen(OKjob)+1, sizeof(cr.Uname)); + if (!db_update_client_record(jcr, jcr->db, &cr)) { + Jmsg(jcr, M_WARNING, 0, _("Error updating Client record. ERR=%s\n"), + db_strerror(jcr->db)); + } } - } - } else { - Jmsg(jcr, M_FATAL, 0, _("FD gave bad response to JobId command: %s\n"), + } else { + Jmsg(jcr, M_FATAL, 0, _("FD gave bad response to JobId command: %s\n"), bnet_strerror(fd)); - jcr->setJobStatus(JS_ErrorTerminated); - return 0; + jcr->setJobStatus(JS_ErrorTerminated); + return 0; + } } + return 1; } @@ -866,7 +869,7 @@ bool cancel_file_daemon_job(UAContext *ua, JCR *jcr) BSOCK *fd; ua->jcr->res.client = jcr->res.client; - if (!connect_to_file_daemon(ua->jcr, 10, me->FDConnectTimeout, 1)) { + if (!connect_to_file_daemon(ua->jcr, 10, me->FDConnectTimeout, true, false)) { ua->error_msg(_("Failed to connect to File daemon.\n")); return false; } @@ -897,23 +900,14 @@ void do_native_client_status(UAContext *ua, CLIENTRES *client, char *cmd) ua->jcr->res.client = client; /* - * Release any old dummy key + * Try to connect for 15 seconds */ - if (ua->jcr->sd_auth_key) { - free(ua->jcr->sd_auth_key); + if (!ua->api) { + ua->send_msg(_("Connecting to Client %s at %s:%d\n"), + client->name(), client->address, client->FDport); } - /* - * Create a new dummy SD auth key - */ - ua->jcr->sd_auth_key = bstrdup("dummy"); - - /* - * Try to connect for 15 seconds - */ - if (!ua->api) ua->send_msg(_("Connecting to Client %s at %s:%d\n"), - client->name(), client->address, client->FDport); - if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { + if (!connect_to_file_daemon(ua->jcr, 1, 15, false, false)) { ua->send_msg(_("Failed to connect to Client %s.\n====\n"), client->name()); if (ua->jcr->file_bsock) { @@ -922,6 +916,7 @@ void do_native_client_status(UAContext *ua, CLIENTRES *client, char *cmd) } return; } + Dmsg0(20, _("Connected to file daemon\n")); fd = ua->jcr->file_bsock; if (cmd) { @@ -929,9 +924,62 @@ void do_native_client_status(UAContext *ua, CLIENTRES *client, char *cmd) } else { fd->fsend("status"); } + while (fd->recv() >= 0) { ua->send_msg("%s", fd->msg); } + + fd->signal(BNET_TERMINATE); + fd->close(); + ua->jcr->file_bsock = NULL; + + return; +} + +/* + * resolve a host on a filedaemon + */ +void do_client_resolve(UAContext *ua, CLIENTRES *client) +{ + BSOCK *fd; + + /* + * Connect to File daemon + */ + ua->jcr->res.client = client; + + /* + * Try to connect for 15 seconds + */ + if (!ua->api) { + ua->send_msg(_("Connecting to Client %s at %s:%d\n"), + client->name(), client->address, client->FDport); + } + + if (!connect_to_file_daemon(ua->jcr, 1, 15, false, false)) { + ua->send_msg(_("Failed to connect to Client %s.\n====\n"), + client->name()); + if (ua->jcr->file_bsock) { + ua->jcr->file_bsock->close(); + ua->jcr->file_bsock = NULL; + } + return; + } + + Dmsg0(20, _("Connected to file daemon\n")); + fd = ua->jcr->file_bsock; + + for (int i = 1; i < ua->argc; i++) { + if (!*ua->argk[i]) { + continue; + } + + fd->fsend("resolve %s", ua->argk[i]); + while (fd->recv() >= 0) { + ua->send_msg("%s", fd->msg); + } + } + fd->signal(BNET_TERMINATE); fd->close(); ua->jcr->file_bsock = NULL; diff --git a/src/dird/migrate.c b/src/dird/migrate.c index 0665d62d9ca..d4e58971f67 100644 --- a/src/dird/migrate.c +++ b/src/dird/migrate.c @@ -431,7 +431,7 @@ bool do_migration(JCR *jcr) /* * Start conversation with Storage daemon */ - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { return false; } @@ -485,7 +485,7 @@ bool do_migration(JCR *jcr) * Start conversation with Reading Storage daemon */ jcr->setJobStatus(JS_WaitSD); - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { goto bail_out; } @@ -498,7 +498,7 @@ bool do_migration(JCR *jcr) * Start conversation with Writing Storage daemon */ mig_jcr->setJobStatus(JS_WaitSD); - if (!connect_to_storage_daemon(mig_jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(mig_jcr, 10, me->SDConnectTimeout, true)) { goto bail_out; } diff --git a/src/dird/msgchan.c b/src/dird/msgchan.c index 77263e29ee7..6c1bb36a86d 100644 --- a/src/dird/msgchan.c +++ b/src/dird/msgchan.c @@ -83,7 +83,7 @@ bool update_device_res(JCR *jcr, DEVICERES *dev) { POOL_MEM device_name; BSOCK *sd; - if (!connect_to_storage_daemon(jcr, 5, 30, 0)) { + if (!connect_to_storage_daemon(jcr, 5, 30, false)) { return false; } sd = jcr->store_bsock; @@ -490,7 +490,7 @@ extern "C" void *device_thread(void *arg) pthread_detach(pthread_self()); jcr = new_control_jcr("*DeviceInit*", JT_SYSTEM); for (i=0; i < MAX_TRIES; i++) { - if (!connect_to_storage_daemon(jcr, 10, 30, 1)) { + if (!connect_to_storage_daemon(jcr, 10, 30, true)) { Dmsg0(900, "Failed connecting to SD.\n"); continue; } diff --git a/src/dird/ndmp_dma.c b/src/dird/ndmp_dma.c index 1ca1c0c8ea0..1a87534b356 100644 --- a/src/dird/ndmp_dma.c +++ b/src/dird/ndmp_dma.c @@ -1712,7 +1712,7 @@ bool do_ndmp_backup(JCR *jcr) set_paired_storage(jcr); jcr->setJobStatus(JS_WaitSD); - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { return false; } @@ -2221,7 +2221,7 @@ static inline bool do_ndmp_restore_bootstrap(JCR *jcr) /* * Start conversation with Storage daemon */ - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { goto cleanup; } sd = jcr->store_bsock; diff --git a/src/dird/protos.h b/src/dird/protos.h index 30518488416..e33db8d32c0 100644 --- a/src/dird/protos.h +++ b/src/dird/protos.h @@ -90,8 +90,8 @@ extern "C" char *job_code_callback_director(JCR *jcr, const char*); int variable_expansion(JCR *jcr, char *inp, POOLMEM **exp); /* fd_cmds.c */ -int connect_to_file_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); +int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time, + bool verbose, bool start_job); bool send_include_list(JCR *jcr); bool send_exclude_list(JCR *jcr); bool send_level_command(JCR *jcr); @@ -105,6 +105,7 @@ bool send_plugin_options(JCR *jcr); bool send_restore_objects(JCR *jcr); bool cancel_file_daemon_job(UAContext *ua, JCR *jcr); void do_native_client_status(UAContext *ua, CLIENTRES *client, char *cmd); +void do_client_resolve(UAContext *ua, CLIENTRES *client); /* getmsg.c */ bool response(JCR *jcr, BSOCK *fd, char *resp, const char *cmd, e_prtmsg prtmsg); @@ -204,7 +205,7 @@ void generate_restore_summary(JCR *jcr, int msg_type, const char *term_msg); /* sd_cmds.c */ bool connect_to_storage_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); + int max_retry_time, bool verbose); BSOCK *open_sd_bsock(UAContext *ua); void close_sd_bsock(UAContext *ua); char *get_volume_name_from_SD(UAContext *ua, int Slot, int drive); @@ -220,6 +221,7 @@ bool transfer_volume(UAContext *ua, STORERES *store, int src_slot, int dst_slot) bool do_autochanger_volume_operation(UAContext *ua, STORERES *store, const char *operation, int drive, int slot); bool send_bwlimit_to_sd(JCR *jcr, const char *Job); +bool do_storage_resolve(UAContext *ua, STORERES *store); /* scheduler.c */ JCR *wait_for_next_job(char *one_shot_job_to_run); diff --git a/src/dird/restore.c b/src/dird/restore.c index 0c25c176e68..0c279f4a831 100644 --- a/src/dird/restore.c +++ b/src/dird/restore.c @@ -159,7 +159,7 @@ static inline bool do_native_restore_bootstrap(JCR *jcr) /* * Start conversation with Storage daemon */ - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { goto bail_out; } sd = jcr->store_bsock; @@ -177,7 +177,7 @@ static inline bool do_native_restore_bootstrap(JCR *jcr) */ jcr->setJobStatus(JS_WaitFD); jcr->keep_sd_auth_key = true; /* don't clear the sd_auth_key now */ - if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, 1)) { + if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, true, true)) { goto bail_out; } fd = jcr->file_bsock; diff --git a/src/dird/sd_cmds.c b/src/dird/sd_cmds.c index 479c177c274..376931babf7 100644 --- a/src/dird/sd_cmds.c +++ b/src/dird/sd_cmds.c @@ -71,7 +71,7 @@ static char changerdrivesresponse[] = * Establish a connection with the Storage daemon and perform authentication. */ bool connect_to_storage_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose) + int max_retry_time, bool verbose) { BSOCK *sd = new_bsock(); STORERES *store; @@ -132,7 +132,7 @@ BSOCK *open_sd_bsock(UAContext *ua) if (!ua->jcr->store_bsock) { ua->send_msg(_("Connecting to Storage daemon %s at %s:%d ...\n"), store->name(), store->address, store->SDport); - if (!connect_to_storage_daemon(ua->jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(ua->jcr, 10, me->SDConnectTimeout, true)) { ua->error_msg(_("Failed to connect to Storage daemon.\n")); return NULL; } @@ -617,7 +617,7 @@ bool cancel_storage_daemon_job(UAContext *ua, STORERES *store, char *JobId) control_jcr = new_control_jcr("*JobCancel*", JT_SYSTEM); control_jcr->res.wstore = store; - if (!connect_to_storage_daemon(control_jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(control_jcr, 10, me->SDConnectTimeout, true)) { ua->error_msg(_("Failed to connect to Storage daemon.\n")); } @@ -661,7 +661,7 @@ bool cancel_storage_daemon_job(UAContext *ua, JCR *jcr, bool silent) set_wstorage(ua->jcr, &store); } - if (!connect_to_storage_daemon(ua->jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(ua->jcr, 10, me->SDConnectTimeout, true)) { if (!silent) { ua->error_msg(_("Failed to connect to Storage daemon.\n")); } @@ -738,7 +738,7 @@ void do_native_storage_status(UAContext *ua, STORERES *store, char *cmd) store->name(), store->address, store->SDport); } - if (!connect_to_storage_daemon(ua->jcr, 10, me->SDConnectTimeout, 0)) { + if (!connect_to_storage_daemon(ua->jcr, 10, me->SDConnectTimeout, false)) { ua->send_msg(_("\nFailed to connect to Storage daemon %s.\n====\n"), store->name()); if (ua->jcr->store_bsock) { @@ -863,3 +863,37 @@ bool send_bwlimit_to_sd(JCR *jcr, const char *Job) return true; } + +/* + * resolve a host on a storage daemon + */ +bool do_storage_resolve(UAContext *ua, STORERES *store) +{ + BSOCK *sd; + USTORERES lstore; + + lstore.store = store; + pm_strcpy(lstore.store_source, _("unknown source")); + set_wstorage(ua->jcr, &lstore); + + if (!(sd = open_sd_bsock(ua))) { + return false; + } + + for (int i = 1; i < ua->argc; i++) { + if (!*ua->argk[i]) { + continue; + } + + sd->fsend("resolve %s", ua->argk[i]); + while (sd->recv() >= 0) { + ua->send_msg("%s", sd->msg); + } + } + + sd->signal(BNET_TERMINATE); + sd->close(); + ua->jcr->store_bsock = NULL; + + return true; +} diff --git a/src/dird/ua_cmds.c b/src/dird/ua_cmds.c index 1513785d27b..7328904d1c6 100644 --- a/src/dird/ua_cmds.c +++ b/src/dird/ua_cmds.c @@ -69,6 +69,7 @@ static int setdebug_cmd(UAContext *ua, const char *cmd); static int setbwlimit_cmd(UAContext *ua, const char *cmd); static int setip_cmd(UAContext *ua, const char *cmd); static int time_cmd(UAContext *ua, const char *cmd); +static int resolve_cmd(UAContext *ua, const char *cmd); static int trace_cmd(UAContext *ua, const char *cmd); static int unmount_cmd(UAContext *ua, const char *cmd); static int use_cmd(UAContext *ua, const char *cmd); @@ -212,6 +213,8 @@ static struct cmdstruct commands[] = { NT_(""), true }, { NT_("trace"), trace_cmd, _("Turn on/off trace to file"), NT_("on | off"), true }, + { NT_("resolve"), resolve_cmd, _("Resolve a hostname"), + NT_("client= | storage= "), false }, { NT_("unmount"), unmount_cmd, _("Unmount storage"), NT_("storage= [ drive= ]\n" "\tjobid= | job= | ujobid="), false }, @@ -748,7 +751,7 @@ static inline int setbwlimit_filed(UAContext *ua, CLIENTRES *client, ua->send_msg(_("Connecting to Client %s at %s:%d\n"), client->name(), client->address, client->FDport); - if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { + if (!connect_to_file_daemon(ua->jcr, 1, 15, false, false)) { ua->error_msg(_("Failed to connect to Client.\n")); return 1; } @@ -797,7 +800,7 @@ static inline int setbwlimit_stored(UAContext *ua, STORERES *store, ua->send_msg(_("Connecting to Storage daemon %s at %s:%d\n"), store->name(), store->address, store->SDport); - if (!connect_to_storage_daemon(ua->jcr, 1, 15, 0)) { + if (!connect_to_storage_daemon(ua->jcr, 1, 15, false)) { ua->error_msg(_("Failed to connect to Storage daemon.\n")); return 1; } @@ -984,7 +987,7 @@ static void do_storage_setdebug(UAContext *ua, STORERES *store, int level, int t /* Try connecting for up to 15 seconds */ ua->send_msg(_("Connecting to Storage daemon %s at %s:%d\n"), store->name(), store->address, store->SDport); - if (!connect_to_storage_daemon(jcr, 1, 15, 0)) { + if (!connect_to_storage_daemon(jcr, 1, 15, false)) { ua->error_msg(_("Failed to connect to Storage daemon.\n")); return; } @@ -1019,7 +1022,7 @@ static void do_client_setdebug(UAContext *ua, CLIENTRES *client, /* Try to connect for 15 seconds */ ua->send_msg(_("Connecting to Client %s at %s:%d\n"), client->name(), client->address, client->FDport); - if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { + if (!connect_to_file_daemon(ua->jcr, 1, 15, false, false)) { ua->error_msg(_("Failed to connect to Client.\n")); return; } @@ -1155,7 +1158,7 @@ static int setdebug_cmd(UAContext *ua, const char *cmd) } /* General debug? */ - for (i=1; iargc; i++) { + for (i = 1; i < ua->argc; i++) { if (bstrcasecmp(ua->argk[i], "all")) { do_all_setdebug(ua, level, trace_flag, hangup); return 1; @@ -1255,6 +1258,88 @@ static int setdebug_cmd(UAContext *ua, const char *cmd) return 1; } +/* + * Resolve a hostname. + */ +static int resolve_cmd(UAContext *ua, const char *cmd) +{ + STORERES *storage = NULL; + CLIENTRES *client = NULL; + + for (int i = 1; i < ua->argc; i++) { + if (bstrcasecmp(ua->argk[i], NT_("client")) || + bstrcasecmp(ua->argk[i], NT_("fd"))) { + if (ua->argv[i]) { + client = GetClientResWithName(ua->argv[i]); + if (!client) { + ua->error_msg(_("Client \"%s\" not found.\n"), ua->argv[i]); + return 1; + } + + if (!acl_access_ok(ua, Client_ACL, client->name())) { + ua->error_msg(_("No authorization for Client \"%s\"\n"), client->name()); + return 1; + } + + *ua->argk[i] = 0; /* zap keyword already visited */ + continue; + } else { + ua->error_msg(_("Client name missing.\n")); + return 1; + } + } else if (bstrcasecmp(ua->argk[i], NT_("storage"))) { + if (ua->argv[i]) { + storage = GetStoreResWithName(ua->argv[i]); + if (!storage) { + ua->error_msg(_("Storage \"%s\" not found.\n"), ua->argv[i]); + return 1; + } + + if (!acl_access_ok(ua, Storage_ACL, storage->name())) { + ua->error_msg(_("No authorization for Storage \"%s\"\n"), storage->name()); + return 1; + } + + *ua->argk[i] = 0; /* zap keyword already visited */ + continue; + } else { + ua->error_msg(_("Storage name missing.\n")); + return 1; + } + } + } + + if (client) { + do_client_resolve(ua, client); + } + + if (storage) { + do_storage_resolve(ua, storage); + } + + if (!client && !storage) { + dlist *addr_list; + const char *errstr; + char addresses[2048]; + + for (int i = 1; i < ua->argc; i++) { + if (!*ua->argk[i]) { + continue; + } + + if ((addr_list = bnet_host2ipaddrs(ua->argk[i], 0, &errstr)) == NULL) { + ua->error_msg(_("%s Failed to resolve %s\n"), my_name, ua->argk[i]); + return 0; + } + ua->send_msg(_("%s resolves %s to %s\n"), my_name, ua->argk[i], + build_addresses_str(addr_list, addresses, sizeof(addresses), false)); + free_addresses(addr_list); + } + } + + return 1; +} + /* * Turn debug tracing to file on/off */ @@ -1271,6 +1356,7 @@ static int trace_cmd(UAContext *ua, const char *cmd) onoff = ua->argk[1]; } + set_trace((bstrcasecmp(onoff, NT_("off"))) ? false : true); return 1; @@ -1440,7 +1526,7 @@ static int estimate_cmd(UAContext *ua, const char *cmd) ua->send_msg(_("Connecting to Client %s at %s:%d\n"), jcr->res.client->name(), jcr->res.client->address, jcr->res.client->FDport); - if (!connect_to_file_daemon(jcr, 1, 15, 0)) { + if (!connect_to_file_daemon(jcr, 1, 15, false, true)) { ua->error_msg(_("Failed to connect to Client.\n")); return 1; } diff --git a/src/dird/ua_dotcmds.c b/src/dird/ua_dotcmds.c index a9df7633bd3..d498a14b7a3 100644 --- a/src/dird/ua_dotcmds.c +++ b/src/dird/ua_dotcmds.c @@ -650,7 +650,7 @@ static void do_client_cmd(UAContext *ua, CLIENTRES *client, const char *cmd) /* Try to connect for 15 seconds */ ua->send_msg(_("Connecting to Client %s at %s:%d\n"), client->name(), client->address, client->FDport); - if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { + if (!connect_to_file_daemon(ua->jcr, 1, 15, false, false)) { ua->error_msg(_("Failed to connect to Client.\n")); return; } diff --git a/src/dird/ua_query.c b/src/dird/ua_query.c index 166e27af854..05e136fc035 100644 --- a/src/dird/ua_query.c +++ b/src/dird/ua_query.c @@ -126,8 +126,8 @@ int query_cmd(UAContext *ua, const char *cmd) query = substitute_prompts(ua, query, prompt, nprompt); Dmsg1(100, "Query2=%s\n", query); if (query[0] == '!') { - db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST); - } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) { + db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, false, VERT_LIST); + } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, true, HORZ_LIST)) { ua->send_msg("%s\n", query); } query[0] = 0; @@ -138,8 +138,8 @@ int query_cmd(UAContext *ua, const char *cmd) query = substitute_prompts(ua, query, prompt, nprompt); Dmsg1(100, "Query2=%s\n", query); if (query[0] == '!') { - db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, 0, VERT_LIST); - } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST)) { + db_list_sql_query(ua->jcr, ua->db, query+1, prtit, ua, false, VERT_LIST); + } else if (!db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, true, HORZ_LIST)) { ua->error_msg("%s\n", query); } } @@ -271,7 +271,7 @@ int sqlquery_cmd(UAContext *ua, const char *cmd) if (ua->cmd[len-1] == ';') { ua->cmd[len-1] = 0; /* zap ; */ /* Submit query */ - db_list_sql_query(ua->jcr, ua->db, query.c_str(), prtit, ua, 1, HORZ_LIST); + db_list_sql_query(ua->jcr, ua->db, query.c_str(), prtit, ua, true, HORZ_LIST); *query.c_str() = 0; /* start new query */ msg = _("Enter SQL query: "); } else { diff --git a/src/dird/ua_restore.c b/src/dird/ua_restore.c index 79e8b1ef173..9e2904a4846 100644 --- a/src/dird/ua_restore.c +++ b/src/dird/ua_restore.c @@ -338,7 +338,7 @@ static void get_and_display_basejobs(UAContext *ua, RESTORE_CTX *rx) Mmsg(q, uar_print_jobs, jobids.list); ua->send_msg(_("The restore will use the following job(s) as Base\n")); - db_list_sql_query(ua->jcr, ua->db, q.c_str(), prtit, ua, 1, HORZ_LIST); + db_list_sql_query(ua->jcr, ua->db, q.c_str(), prtit, ua, true, HORZ_LIST); } pm_strcpy(rx->BaseJobIds, jobids.list); } @@ -633,7 +633,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) } gui_save = ua->jcr->gui; ua->jcr->gui = true; - db_list_sql_query(ua->jcr, ua->db, uar_list_jobs, prtit, ua, 1, HORZ_LIST); + db_list_sql_query(ua->jcr, ua->db, uar_list_jobs, prtit, ua, true, HORZ_LIST); ua->jcr->gui = gui_save; done = false; break; @@ -651,7 +651,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) free(fname); gui_save = ua->jcr->gui; ua->jcr->gui = true; - db_list_sql_query(ua->jcr, ua->db, rx->query, prtit, ua, 1, HORZ_LIST); + db_list_sql_query(ua->jcr, ua->db, rx->query, prtit, ua, true, HORZ_LIST); ua->jcr->gui = gui_save; done = false; break; @@ -671,7 +671,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) } gui_save = ua->jcr->gui; ua->jcr->gui = true; - db_list_sql_query(ua->jcr, ua->db, ua->cmd, prtit, ua, 1, HORZ_LIST); + db_list_sql_query(ua->jcr, ua->db, ua->cmd, prtit, ua, true, HORZ_LIST); ua->jcr->gui = gui_save; done = false; break; @@ -1442,7 +1442,7 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat prtit, ua, HORZ_LIST); } /* Display a list of Jobs selected for this restore */ - db_list_sql_query(ua->jcr, ua->db, uar_list_temp, prtit, ua, 1,HORZ_LIST); + db_list_sql_query(ua->jcr, ua->db, uar_list_temp, prtit, ua, true, HORZ_LIST); ok = true; } else { diff --git a/src/dird/ua_update.c b/src/dird/ua_update.c index bb8a06f2bdc..85e8c9cfffa 100644 --- a/src/dird/ua_update.c +++ b/src/dird/ua_update.c @@ -887,7 +887,7 @@ static bool update_pool(UAContext *ua) } query = get_pool_memory(PM_MESSAGE); Mmsg(query, list_pool, edit_int64(pr.PoolId, ed1)); - db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, HORZ_LIST); + db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, true, HORZ_LIST); free_pool_memory(query); ua->info_msg(_("Pool DB record updated from resource.\n")); return true; diff --git a/src/dird/vbackup.c b/src/dird/vbackup.c index 9657ce493db..95d012f81d0 100644 --- a/src/dird/vbackup.c +++ b/src/dird/vbackup.c @@ -216,7 +216,7 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n") /* * Start conversation with Storage daemon */ - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { return false; } sd = jcr->store_bsock; diff --git a/src/dird/verify.c b/src/dird/verify.c index daf9b6bf5a7..793b3ec8ac2 100644 --- a/src/dird/verify.c +++ b/src/dird/verify.c @@ -229,7 +229,7 @@ bool do_verify(JCR *jcr) * Start conversation with Storage daemon */ jcr->setJobStatus(JS_Blocked); - if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, 1)) { + if (!connect_to_storage_daemon(jcr, 10, me->SDConnectTimeout, true)) { return false; } sd = jcr->store_bsock; @@ -263,7 +263,7 @@ bool do_verify(JCR *jcr) * OK, now connect to the File daemon and ask him for the files. */ jcr->setJobStatus(JS_Blocked); - if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, 1)) { + if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, true, true)) { goto bail_out; } fd = jcr->file_bsock; @@ -283,7 +283,7 @@ bool do_verify(JCR *jcr) * OK, now connect to the File daemon and ask him for the files. */ jcr->setJobStatus(JS_Blocked); - if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, 1)) { + if (!connect_to_file_daemon(jcr, 10, me->FDConnectTimeout, true, true)) { goto bail_out; } fd = jcr->file_bsock; diff --git a/src/filed/dir_cmd.c b/src/filed/dir_cmd.c index 4b8c34ccd92..5097a903858 100644 --- a/src/filed/dir_cmd.c +++ b/src/filed/dir_cmd.c @@ -79,6 +79,7 @@ static bool runafter_cmd(JCR *jcr); static bool runbeforenow_cmd(JCR *jcr); static bool runbefore_cmd(JCR *jcr); static bool runscript_cmd(JCR *jcr); +static bool resolve_cmd(JCR *jcr); static bool restore_object_cmd(JCR *jcr); static bool restore_cmd(JCR *jcr); static bool session_cmd(JCR *jcr); @@ -127,6 +128,7 @@ static struct s_cmds cmds[] = { { "Run", runscript_cmd, false }, { "restoreobject", restore_object_cmd, false }, { "restore ", restore_cmd, false }, + { "resolve ", resolve_cmd, false }, { "session", session_cmd, false }, { "setauthorization", setauthorization_cmd, false }, { "setbandwidth=", setbandwidth_cmd, false }, @@ -180,6 +182,8 @@ static char runaftercmd[] = "RunAfterJob %s"; static char runscriptcmd[] = "Run OnSuccess=%d OnFailure=%d AbortOnError=%d When=%d Command=%s"; +static char resolvecmd[] = + "resolve %s"; /* * Responses sent to Director @@ -595,8 +599,35 @@ static bool sm_dump_cmd(JCR *jcr) return true; } +/* + * Resolve a hostname + */ +static bool resolve_cmd(JCR *jcr) +{ + BSOCK *dir = jcr->dir_bsock; + dlist *addr_list; + const char *errstr; + char addresses[2048]; + char hostname[2048]; + + sscanf(dir->msg, resolvecmd, &hostname); + + if ((addr_list = bnet_host2ipaddrs(hostname, 0, &errstr)) == NULL) { + dir->fsend(_("%s: Failed to resolve %s\n"), my_name, hostname); + goto bail_out; + } + + dir->fsend(_("%s resolves %s to %s\n"),my_name, hostname, + build_addresses_str(addr_list, addresses, sizeof(addresses), false)); + free_addresses(addr_list); + +bail_out: + dir->signal(BNET_EOD); + return true; +} + #ifdef DEVELOPER -static bool exit_cmd(JCR *jcr) + static bool exit_cmd(JCR *jcr) { jcr->dir_bsock->fsend("2000 exit OK\n"); terminate_filed(0); diff --git a/src/lib/address_conf.c b/src/lib/address_conf.c index e25350cb118..aba4cff262f 100644 --- a/src/lib/address_conf.c +++ b/src/lib/address_conf.c @@ -193,16 +193,23 @@ const char *IPADDR::get_address(char *outputbuf, int outlen) return outputbuf; } -const char *IPADDR::build_address_str(char *buf, int blen) +const char *IPADDR::build_address_str(char *buf, int blen, bool print_port/*=true*/) { char tmp[1024]; - bsnprintf(buf, blen, "host[%s:%s:%hu] ", + if (print_port) { + bsnprintf(buf, blen, "host[%s:%s:%hu] ", get_family() == AF_INET ? "ipv4" : "ipv6", get_address(tmp, sizeof(tmp) - 1), get_port_host_order()); + } else { + bsnprintf(buf, blen, "host[%s:%s] ", + get_family() == AF_INET ? "ipv4" : "ipv6", + get_address(tmp, sizeof(tmp) - 1)); + + } return buf; } -const char *build_addresses_str(dlist *addrs, char *buf, int blen) +const char *build_addresses_str(dlist *addrs, char *buf, int blen, bool print_port/*=true*/) { if (!addrs || addrs->size() == 0) { bstrncpy(buf, "", blen); @@ -212,7 +219,7 @@ const char *build_addresses_str(dlist *addrs, char *buf, int blen) IPADDR *p; foreach_dlist(p, addrs) { char tmp[1024]; - int len = bsnprintf(work, blen, "%s", p->build_address_str(tmp, sizeof(tmp))); + int len = bsnprintf(work, blen, "%s", p->build_address_str(tmp, sizeof(tmp), print_port)); if (len < 0) break; work += len; diff --git a/src/lib/address_conf.h b/src/lib/address_conf.h index b9fa7ffddb5..0452e7c289c 100644 --- a/src/lib/address_conf.h +++ b/src/lib/address_conf.h @@ -64,7 +64,7 @@ class IPADDR : public SMARTALLOC { #endif const char *get_address(char *outputbuf, int outlen); - const char *build_address_str(char *buf, int blen); + const char *build_address_str(char *buf, int blen, bool print_port=true); /* private */ dlink link; @@ -79,7 +79,7 @@ int get_first_port_host_order(dlist * addrs); int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultport, int family, const char *hostname_str, const char *port_str, char *buf, int buflen); -const char *build_addresses_str(dlist *addrs, char *buf, int blen); +const char *build_addresses_str(dlist *addrs, char *buf, int blen, bool print_port=true); int sockaddr_get_port_net_order(const struct sockaddr *sa); int sockaddr_get_port(const struct sockaddr *sa); diff --git a/src/lib/bnet.c b/src/lib/bnet.c index 8945a2123d3..c51f3308917 100644 --- a/src/lib/bnet.c +++ b/src/lib/bnet.c @@ -616,7 +616,7 @@ dlist *bnet_host2ipaddrs(const char *host, int family, const char **errstr) BSOCK *bnet_connect(JCR * jcr, int retry_interval, utime_t max_retry_time, utime_t heart_beat, const char *name, char *host, char *service, int port, - int verbose) + bool verbose) { BSOCK *bsock = new_bsock(); if (!bsock->connect(jcr, retry_interval, max_retry_time, heart_beat, @@ -796,7 +796,7 @@ BSOCK *dup_bsock(BSOCK *osock) bsock->set_host(bstrdup(osock->host())); } if (osock->src_addr) { - bsock->src_addr = New( IPADDR( *(osock->src_addr)) ); + bsock->src_addr = New(IPADDR(*(osock->src_addr))); } bsock->set_duped(); return bsock; diff --git a/src/lib/bsock.c b/src/lib/bsock.c index 4db5d08741f..651f4689206 100644 --- a/src/lib/bsock.c +++ b/src/lib/bsock.c @@ -95,7 +95,7 @@ void BSOCK::free_tls() */ bool BSOCK::connect(JCR * jcr, int retry_interval, utime_t max_retry_time, utime_t heart_beat, const char *name, char *host, - char *service, int port, int verbose) + char *service, int port, bool verbose) { bool ok = false; int i; @@ -177,7 +177,7 @@ void BSOCK::set_source_address(dlist *src_addr_list) if (src_addr_list) { addr = (IPADDR*) src_addr_list->first(); - src_addr = New( IPADDR(*addr)); + src_addr = New(IPADDR(*addr)); } } diff --git a/src/lib/bsock.h b/src/lib/bsock.h index 296f532c670..73c8967a6c4 100644 --- a/src/lib/bsock.h +++ b/src/lib/bsock.h @@ -100,7 +100,7 @@ class BSOCK { void free_tls(); bool connect(JCR * jcr, int retry_interval, utime_t max_retry_time, utime_t heart_beat, const char *name, char *host, - char *service, int port, int verbose); + char *service, int port, bool verbose); int32_t recv(); bool send(); bool fsend(const char*, ...); diff --git a/src/lib/protos.h b/src/lib/protos.h index 715f4223342..ca394c21741 100644 --- a/src/lib/protos.h +++ b/src/lib/protos.h @@ -64,7 +64,7 @@ bool bnet_tls_client(TLS_CONTEXT *ctx, BSOCK *bsock, BSOCK * bnet_connect(JCR *jcr, int retry_interval, utime_t max_retry_time, utime_t heart_beat, const char *name, char *host, char *service, - int port, int verbose); + int port, bool verbose); void bnet_close(BSOCK *bsock); BSOCK *init_bsock(JCR *jcr, int sockfd, const char *who, const char *ip, int port, struct sockaddr *client_addr); diff --git a/src/qt-console/bcomm/dircomm.cpp b/src/qt-console/bcomm/dircomm.cpp index 2e2655121d6..64cbbf4eb0a 100644 --- a/src/qt-console/bcomm/dircomm.cpp +++ b/src/qt-console/bcomm/dircomm.cpp @@ -169,7 +169,7 @@ bool DirComm::connect_dir() m_sock = bnet_connect(NULL, 5, 15, heart_beat, _("Director daemon"), m_console->m_dir->address, - NULL, m_console->m_dir->DIRport, 0); + NULL, m_console->m_dir->DIRport, false); if (m_sock == NULL) { mainWin->set_status("Connection failed"); if (mainWin->m_connDebug) { diff --git a/src/qt-tray-monitor/monitoritem.cpp b/src/qt-tray-monitor/monitoritem.cpp index 5873ce222b1..77b71030dfd 100644 --- a/src/qt-tray-monitor/monitoritem.cpp +++ b/src/qt-tray-monitor/monitoritem.cpp @@ -153,7 +153,7 @@ bool MonitorItem::doconnect() message = QString("Connecting to Director %1:%2").arg(dird->address).arg(dird->DIRport); emit showStatusbarMessage(message); d->DSock = bnet_connect(NULL, d->connectTimeout, - 0, 0, "Director daemon", dird->address, NULL, dird->DIRport, 0); + 0, 0, "Director daemon", dird->address, NULL, dird->DIRport, false); jcr.dir_bsock = d->DSock; break; case R_CLIENT: @@ -161,7 +161,7 @@ bool MonitorItem::doconnect() message = QString("Connecting to Client %1:%2").arg(filed->address).arg(filed->FDport); emit showStatusbarMessage(message); d->DSock = bnet_connect(NULL, d->connectTimeout, - 0, 0, "File daemon", filed->address, NULL, filed->FDport, 0); + 0, 0, "File daemon", filed->address, NULL, filed->FDport, false); jcr.file_bsock = d->DSock; break; case R_STORAGE: @@ -169,7 +169,7 @@ bool MonitorItem::doconnect() message = QString("Connecting to Storage %1:%2").arg(stored->address).arg(stored->SDport); emit showStatusbarMessage(message); d->DSock = bnet_connect(NULL, d->connectTimeout, - 0, 0, "Storage daemon", stored->address, NULL, stored->SDport, 0); + 0, 0, "Storage daemon", stored->address, NULL, stored->SDport, false); jcr.store_bsock = d->DSock; break; default: diff --git a/src/stored/bcopy.c b/src/stored/bcopy.c index a7d7b082299..2569a136dff 100644 --- a/src/stored/bcopy.c +++ b/src/stored/bcopy.c @@ -278,7 +278,7 @@ static bool record_cb(DCR *in_dcr, DEV_RECORD *rec) get_session_record(in_dcr->dev, rec, &sessrec); if (verbose > 1) { - dump_label_record(in_dcr->dev, rec, 1); + dump_label_record(in_dcr->dev, rec, true); } switch (rec->FileIndex) { case PRE_LABEL: diff --git a/src/stored/bscan.c b/src/stored/bscan.c index 5070f6adf72..6c85835da2d 100644 --- a/src/stored/bscan.c +++ b/src/stored/bscan.c @@ -463,7 +463,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) bool save_update_db = update_db; if (verbose > 1) { - dump_label_record(dev, rec, 1); + dump_label_record(dev, rec, true); } switch (rec->FileIndex) { case PRE_LABEL: diff --git a/src/stored/dir_cmd.c b/src/stored/dir_cmd.c index 2962fb07634..ad4da10f9b1 100644 --- a/src/stored/dir_cmd.c +++ b/src/stored/dir_cmd.c @@ -80,6 +80,8 @@ static char replicatecmd[] = "replicate Job=%127s address=%s port=%d ssl=%d Authorization=%100s"; static char passiveclientcmd[] = "passive client address=%s port=%d ssl=%d"; +static char resolvecmd[] = + "resolve %s"; /* Responses sent to Director */ static char derrmsg[] = @@ -125,6 +127,7 @@ static bool listen_cmd(JCR *jcr); static bool mount_cmd(JCR *jcr); static bool passive_cmd(JCR *jcr); static bool readlabel_cmd(JCR *jcr); +static bool resolve_cmd(JCR *jcr); static bool relabel_cmd(JCR *jcr); static bool release_cmd(JCR *jcr); static bool replicate_cmd(JCR *jcr); @@ -169,6 +172,7 @@ static struct s_cmds cmds[] = { { "readlabel", readlabel_cmd, false }, { "relabel", relabel_cmd, false }, /* Relabel a tape */ { "release", release_cmd, false }, + { "resolve", resolve_cmd, false }, { "replicate", replicate_cmd, false }, /* Replicate data to an external SD */ { "run", run_cmd, false }, /* Start of Job */ { "setbandwidth=", setbandwidth_cmd, false }, @@ -514,6 +518,33 @@ static bool cancel_cmd(JCR *cjcr) return true; } +/* + * Resolve a hostname + */ +static bool resolve_cmd(JCR *jcr) +{ + BSOCK *dir = jcr->dir_bsock; + dlist *addr_list; + const char *errstr; + char addresses[2048]; + char hostname[2048]; + + sscanf(dir->msg, resolvecmd, &hostname); + + if ((addr_list = bnet_host2ipaddrs(hostname, 0, &errstr)) == NULL) { + dir->fsend(_("%s: Failed to resolve %s\n"), my_name, hostname); + goto bail_out; + } + + dir->fsend(_("%s resolves %s to %s\n"), my_name, hostname, + build_addresses_str(addr_list, addresses, sizeof(addresses), false)); + free_addresses(addr_list); + +bail_out: + dir->signal(BNET_EOD); + return true; +} + static bool do_label(JCR *jcr, bool relabel) { int len; diff --git a/src/stored/label.c b/src/stored/label.c index feafd978faf..90a6feba4c6 100644 --- a/src/stored/label.c +++ b/src/stored/label.c @@ -1060,7 +1060,7 @@ static void dump_session_label(DEV_RECORD *rec, const char *type) debug_level = dbl; } -void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose) +void dump_label_record(DEVICE *dev, DEV_RECORD *rec, bool verbose) { const char *type; int dbl; diff --git a/src/stored/protos.h b/src/stored/protos.h index 803697f790e..dafdf0af0c6 100644 --- a/src/stored/protos.h +++ b/src/stored/protos.h @@ -137,7 +137,7 @@ bool write_ansi_ibm_labels(DCR *dcr, int type, const char *VolName); int read_ansi_ibm_label(DCR *dcr); bool write_session_label(DCR *dcr, int label); void dump_volume_label(DEVICE *dev); -void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose); +void dump_label_record(DEVICE *dev, DEV_RECORD *rec, bool verbose); bool unser_volume_label(DEVICE *dev, DEV_RECORD *rec); bool unser_session_label(SESSION_LABEL *label, DEV_RECORD *rec); bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, diff --git a/src/tools/bpluginfo.c b/src/tools/bpluginfo.c index b8813b167e0..f15641c5ba0 100644 --- a/src/tools/bpluginfo.c +++ b/src/tools/bpluginfo.c @@ -107,9 +107,9 @@ union _bareosinfos { typedef struct _progdata progdata; struct _progdata { - int verbose; - int listinfo; - int listfunc; + bool verbose; + bool listinfo; + bool listfunc; char *pluginfile; void *pluginhandle; int bapiversion; @@ -244,15 +244,15 @@ void parse_args(progdata *pdata, int argc, char *argv[]) break; case 'f': - pdata->listfunc = 1; + pdata->listfunc = true; break; case 'i': - pdata->listinfo = 1; + pdata->listinfo = true; break; case 'v': - pdata->verbose = 1; + pdata->verbose = true; break; case '?':