Skip to content

Commit

Permalink
sysutils/bacula13-server: Add upstream patch
Browse files Browse the repository at this point in the history
If you are using bacula-fd < 13.x, this is a required update for you.

Not all warnings from a bacula < 13 client are seen when running with
bacula-server >= 13.x

See: https://gitlab.bacula.org/bacula-community-edition/bacula-community/-/issues/2704
  • Loading branch information
dlangille committed Jan 31, 2024
1 parent c13d435 commit 3c57e9f
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 0 deletions.
1 change: 1 addition & 0 deletions sysutils/bacula13-server/Makefile
@@ -1,5 +1,6 @@
PORTNAME= bacula
DISTVERSION= 13.0.3
PORTREVISION= 1
CATEGORIES?= sysutils
MASTER_SITES= SF/bacula/bacula/${PORTVERSION}
PKGNAMEPREFIX?= #
Expand Down
46 changes: 46 additions & 0 deletions sysutils/bacula13-server/files/patch-src_dird_fd__cmds.c
@@ -0,0 +1,46 @@
--- src/dird/fd_cmds.c.orig 2023-05-02 09:50:49 UTC
+++ src/dird/fd_cmds.c
@@ -72,6 +72,34 @@ static void delete_bsock_end_cb(JCR *jcr, void *ctx)
free_bsock(socket);
}

+/* 16.0.10 (12Jan24) x86_64-pc-linux-gnu,ubuntu,20.04 -> 160010 */
+static uint64_t scan_version(char *str)
+{
+ Enter(0);
+ uint64_t version = 0;
+
+ regex_t r1;
+ regmatch_t pmatch[16];
+ regcomp(&r1, "^([0-9]+)\\.([0-9]+)\\.([0-9]+)", REG_EXTENDED);
+ if (regexec(&r1, str, 4, pmatch, 0) == 0 &&
+ pmatch[1].rm_so == 0 && pmatch[1].rm_eo > 0 && pmatch[1].rm_eo < 50 &&
+ pmatch[2].rm_so > 0 && pmatch[2].rm_eo > 0 && (pmatch[2].rm_eo - pmatch[2].rm_so) < 50 &&
+ pmatch[3].rm_so > 0 && pmatch[3].rm_eo > 0 && (pmatch[3].rm_eo - pmatch[3].rm_so) < 50)
+ {
+ char buf[50];
+ bstrncpy(buf, str + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so + 1);
+ version = str_to_uint64(buf) * 10000;
+
+ bstrncpy(buf, str + pmatch[2].rm_so, pmatch[2].rm_eo - pmatch[2].rm_so + 1);
+ version += str_to_uint64(buf) * 100;
+
+ bstrncpy(buf, str + pmatch[3].rm_so, pmatch[3].rm_eo - pmatch[3].rm_so + 1);
+ version += str_to_uint64(buf);
+ }
+ regfree(&r1);
+ return version;
+}
+
/*
* Open connection with File daemon.
* Try connecting every retry_interval (default 10 sec), and
@@ -195,6 +223,8 @@ int connect_to_file_daemon(JCR *jcr, int retry_interva
cr.FileRetention = jcr->client->FileRetention;
cr.JobRetention = jcr->client->JobRetention;
bstrncpy(cr.Uname, fd->msg+strlen(OKjob)+1, sizeof(cr.Uname));
+ jcr->client_version = scan_version(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));
17 changes: 17 additions & 0 deletions sysutils/bacula13-server/files/patch-src_dird_getmsg.c
@@ -0,0 +1,17 @@
--- src/dird/getmsg.c.orig 2023-05-02 09:50:49 UTC
+++ src/dird/getmsg.c
@@ -251,6 +251,14 @@ int bget_dirmsg(JCR *jcr, BSOCK *bs, BSOCK_CLIENT_TYPE
if (*msg == ' ') {
msg++; /* skip leading space */
}
+ /* Fix to support old FDs */
+ if (role == BSOCK_TYPE_FD && jcr->client_version > 0 && jcr->client_version < 130000) {
+ type = type + 1; /* Adding M_EVENTS pushed all old events by 1, we fix it automatically here */
+ }
+ if (type == M_ABORT) { // not allowed here
+ Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+ continue;
+ }
Dmsg1(900, "Dispatch msg: %s", msg);
dispatch_message(jcr, type, mtime, msg);
continue;
10 changes: 10 additions & 0 deletions sysutils/bacula13-server/files/patch-src_jcr.h
@@ -0,0 +1,10 @@
--- src/jcr.h.orig 2023-05-02 09:50:49 UTC
+++ src/jcr.h
@@ -399,6 +399,7 @@ class JCR { (public)
int32_t FDVersion; /* File daemon version number */
int32_t SDVersion; /* Storage daemon version number */
int64_t spool_size; /* Spool size for this job */
+ uint64_t client_version; /* Client version as a number */
utime_t snapshot_retention; /* Snapshot retention (from Client/Job resource) */
volatile bool sd_msg_thread_done; /* Set when Storage message thread done */
bool wasVirtualFull; /* set if job was VirtualFull */

0 comments on commit 3c57e9f

Please sign in to comment.