From: Eric Bollengier Date: Wed, 23 Mar 2022 18:02:39 +0000 (+0100) Subject: Add list joblog pattern= option X-Git-Tag: Beta-15.0.0~615 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a839cac596adf50b34813907f74be6e7f1776d5e;p=thirdparty%2Fbacula.git Add list joblog pattern= option --- diff --git a/bacula/src/cats/bdb.h b/bacula/src/cats/bdb.h index 8357f42a3..12f9c6b58 100644 --- a/bacula/src/cats/bdb.h +++ b/bacula/src/cats/bdb.h @@ -275,7 +275,7 @@ public: void bdb_list_media_records(JCR *jcr, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); void bdb_list_jobmedia_records(JCR *jcr, JobId_t JobId, char *volume, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); void bdb_list_filemedia_records(JCR *jcr, JobId_t JobId, uint32_t FileIndex, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); - void bdb_list_joblog_records(JCR *jcr, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + void bdb_list_joblog_records(JCR *jcr, JobId_t JobId, const char *pattern, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); int bdb_list_sql_query(JCR *jcr, const char *title, const char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose, e_list_type type); void bdb_list_client_records(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); void bdb_list_copies_records(JCR *jcr, uint32_t limit, char *jobids, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); @@ -307,7 +307,7 @@ public: bool bdb_update_snapshot_record(JCR *jcr, SNAPSHOT_DBR *sr); /* Pure virtual low level methods */ - virtual void bdb_escape_string(JCR *jcr, char *snew, char *old, int len) = 0; + virtual void bdb_escape_string(JCR *jcr, char *snew, const char *old, int len) = 0; virtual char *bdb_escape_object(JCR *jcr, char *old, int len) = 0; virtual void bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, POOLMEM **dest, int32_t *len) = 0; diff --git a/bacula/src/cats/bdb_mysql.h b/bacula/src/cats/bdb_mysql.h index 6d14df5b2..cab3d0d3c 100644 --- a/bacula/src/cats/bdb_mysql.h +++ b/bacula/src/cats/bdb_mysql.h @@ -46,7 +46,7 @@ public: bool bdb_open_database(JCR *jcr); void bdb_close_database(JCR *jcr); void bdb_thread_cleanup(void); - void bdb_escape_string(JCR *jcr, char *snew, char *old, int len); + void bdb_escape_string(JCR *jcr, char *snew, const char *old, int len); char *bdb_escape_object(JCR *jcr, char *old, int len); void bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, POOLMEM **dest, int32_t *len); diff --git a/bacula/src/cats/bdb_postgresql.h b/bacula/src/cats/bdb_postgresql.h index b4b3599de..e379b7435 100644 --- a/bacula/src/cats/bdb_postgresql.h +++ b/bacula/src/cats/bdb_postgresql.h @@ -35,7 +35,7 @@ public: bool bdb_open_database(JCR *jcr); void bdb_close_database(JCR *jcr); void bdb_thread_cleanup(void); - void bdb_escape_string(JCR *jcr, char *snew, char *old, int len); + void bdb_escape_string(JCR *jcr, char *snew, const char *old, int len); char *bdb_escape_object(JCR *jcr, char *old, int len); void bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, POOLMEM **dest, int32_t *len); diff --git a/bacula/src/cats/mysql.c b/bacula/src/cats/mysql.c index 7fa13ff7e..eccc13bbc 100644 --- a/bacula/src/cats/mysql.c +++ b/bacula/src/cats/mysql.c @@ -441,7 +441,7 @@ void BDB_MYSQL::bdb_thread_cleanup(void) * string must be long enough (max 2*old+1) to hold * the escaped output. */ -void BDB_MYSQL::bdb_escape_string(JCR *jcr, char *snew, char *old, int len) +void BDB_MYSQL::bdb_escape_string(JCR *jcr, char *snew, const char *old, int len) { BDB_MYSQL *mdb = this; mysql_real_escape_string(mdb->m_db_handle, snew, old, len); diff --git a/bacula/src/cats/postgresql.c b/bacula/src/cats/postgresql.c index 74b15f01e..b369a3256 100644 --- a/bacula/src/cats/postgresql.c +++ b/bacula/src/cats/postgresql.c @@ -566,7 +566,7 @@ void BDB_POSTGRESQL::bdb_thread_cleanup(void) * string must be long enough (max 2*old+1) to hold * the escaped output. */ -void BDB_POSTGRESQL::bdb_escape_string(JCR *jcr, char *snew, char *old, int len) +void BDB_POSTGRESQL::bdb_escape_string(JCR *jcr, char *snew, const char *old, int len) { BDB_POSTGRESQL *mdb = this; int failed; diff --git a/bacula/src/cats/protos.h b/bacula/src/cats/protos.h index 890e69b3a..006324799 100644 --- a/bacula/src/cats/protos.h +++ b/bacula/src/cats/protos.h @@ -292,8 +292,8 @@ void bdb_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr); mdb->bdb_list_jobmedia_records(jcr, JobId, volume, sendit, ctx, type) #define db_list_filemedia_records(jcr, mdb, JobId, FI, sendit, ctx, type) \ mdb->bdb_list_filemedia_records(jcr, JobId, FI, sendit, ctx, type) -#define db_list_joblog_records(jcr, mdb, JobId, sendit, ctx, type) \ - mdb->bdb_list_joblog_records(jcr, JobId, sendit, ctx, type) +#define db_list_joblog_records(jcr, mdb, JobId, pattern, sendit, ctx, type) \ + mdb->bdb_list_joblog_records(jcr, JobId, pattern, sendit, ctx, type) #define db_list_sql_query(jcr, mdb, title, query, sendit, ctx, verbose, type) \ mdb->bdb_list_sql_query(jcr, title, query, sendit, ctx, verbose, type) #define db_list_client_records(jcr, mdb, sendit, ctx, type) \ diff --git a/bacula/src/cats/sql_list.c b/bacula/src/cats/sql_list.c index 2fa7b33cf..45f7f9170 100644 --- a/bacula/src/cats/sql_list.c +++ b/bacula/src/cats/sql_list.c @@ -791,36 +791,57 @@ bail_out: bdb_unlock(); } -void BDB::bdb_list_joblog_records(JCR *jcr, uint32_t JobId, +void BDB::bdb_list_joblog_records(JCR *jcr, uint32_t JobId, const char *pattern, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { - char ed1[50]; - - if (JobId <= 0) { + if (JobId <= 0 && !pattern) { return; } + + POOL_MEM tmp, where2; + char ed1[50]; bdb_lock(); + if (JobId > 0) { + Mmsg(tmp, "Log.JobId=%s", edit_int64(JobId, ed1)); + append_filter(where2.handle(), tmp.c_str()); + } + + if (pattern) { + POOL_MEM esc; + esc.check_size(strlen(pattern) * 2 + 1); + bdb_escape_string(jcr, esc.c_str(), pattern, strlen(pattern)); + Mmsg(tmp, "Log.LogText ILIKE '%%%s%%' ", esc.c_str()); + append_filter(where2.handle(), tmp.c_str()); + } + const char *where = get_acls(DB_ACL_BIT(DB_ACL_JOB) | DB_ACL_BIT(DB_ACL_FILESET) | - DB_ACL_BIT(DB_ACL_CLIENT), false); + DB_ACL_BIT(DB_ACL_CLIENT), where2.c_str()[0] == '\0'); const char *join = *where ? get_acl_join_filter(DB_ACL_BIT(DB_ACL_JOB) | DB_ACL_BIT(DB_ACL_FILESET) | DB_ACL_BIT(DB_ACL_CLIENT)) : ""; - - if (type == VERT_LIST || type == JSON_LIST) { + + if (type == VERT_LIST) { Mmsg(cmd, "SELECT Time,LogText FROM Log %s " - "WHERE Log.JobId=%s %s ORDER BY LogId ASC", + "%s %s ORDER BY LogId ASC", join, - edit_int64(JobId, ed1), + where2.c_str(), + where); + + } else if (type == JSON_LIST) { + Mmsg(cmd, "SELECT JobId, Time,LogText FROM Log %s " + "%s %s ORDER BY LogId ASC", + join, + where2.c_str(), where); } else { Mmsg(cmd, "SELECT LogText FROM Log %s " - "WHERE Log.JobId=%s %s ORDER BY LogId ASC", + "%s %s ORDER BY LogId ASC", join, - edit_int64(JobId, ed1), + where2.c_str(), where); } Dmsg1(DT_SQL|50, "q=%s\n", cmd); diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index 91250a384..0fa520519 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -318,7 +318,7 @@ void BDB_SQLITE::bdb_thread_cleanup(void) * string must be long enough (max 2*old+1) to hold * the escaped output. */ -void BDB_SQLITE::bdb_escape_string(JCR *jcr, char *snew, char *sold, int len) +void BDB_SQLITE::bdb_escape_string(JCR *jcr, char *snew, const char *sold, int len) { char *n, *o; diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index e790cebe7..fd545a466 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -133,7 +133,7 @@ static struct cmdstruct commands[] = { /* C { NT_("list"), list_cmd, _("List objects from catalog"), NT_("jobs [client=] [jobid=] [ujobid=] [job=] [tag=] [joberrors] [jobstatus=] [level=] [jobtype=] [days=] [hours=] [limit=] [order=]|\n" "\tjobtotals | pools | volume | media | files [type=] jobid= | copies jobid= |\n" - "\tjoblog jobid= | pluginrestoreconf jobid= restoreobjectid= | snapshot | \n" + "\tjoblog [pattern=] jobid= | pluginrestoreconf jobid= restoreobjectid= | snapshot | \n" "\tfilemedia jobid= fileindex= | clients | jobmedia [jobid= volume=] |\n" "\tevents [type= | limit= | order= | days= | start= | end= |\n" "\t\t source= | code= | type= ]\n" diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index 133e09461..cc6a34b35 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -321,7 +321,8 @@ bail_out: * list jobname=name - same as above * list jobmedia jobid= * list jobmedia job=name - * list joblog jobid= + * list joblog pattern=xxx jobid= + * list joblog pattern=xxx jobid= * list joblog job=name * list files [type=] jobid= - list files saved for job nn * list files [type=] job=name @@ -619,26 +620,32 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) /* List JOBLOG */ } else if (strcasecmp(ua->argk[i], NT_("joblog")) == 0) { bool done = false; + const char *pattern=NULL; for (j=i+1; jargc; j++) { if (strcasecmp(ua->argk[j], NT_("ujobid")) == 0 && ua->argv[j]) { bstrncpy(jr.Job, ua->argv[j], MAX_NAME_LENGTH); jr.JobId = 0; db_get_job_record(ua->jcr, ua->db, &jr); jobid = jr.JobId; + } else if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j]) { jobid = str_to_int64(ua->argv[j]); + + } else if (strcasecmp(ua->argk[j], NT_("pattern")) == 0 && ua->argv[j]) { + pattern = ua->argv[j]; + continue; + } else { continue; } - db_list_joblog_records(ua->jcr, ua->db, jobid, prtit, ua, llist); + db_list_joblog_records(ua->jcr, ua->db, jobid, pattern, prtit, ua, llist); done = true; } if (!done) { /* List for all jobs (jobid=0) */ - db_list_joblog_records(ua->jcr, ua->db, 0, prtit, ua, llist); + db_list_joblog_records(ua->jcr, ua->db, 0, pattern, prtit, ua, llist); } - /* List POOLS */ } else if (strcasecmp(ua->argk[i], NT_("pool")) == 0 || strcasecmp(ua->argk[i], NT_("pools")) == 0) { @@ -1098,6 +1105,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) || strcasecmp(ua->argk[i], NT_("daemon")) == 0 || strcasecmp(ua->argk[i], NT_("code")) == 0 || strcasecmp(ua->argk[i], NT_("offset")) == 0 + || strcasecmp(ua->argk[i], NT_("pattern")) == 0 ) { /* Ignore it */ } else if (strcasecmp(ua->argk[i], NT_("snapshot")) == 0 ||