Implemented in Director Pool resource and in SD Device resource.
If it is specified in the SD Device resource, it will take
precedence over the value passed from the Director to the SD.
- IBM is not yet implemented.
- Check Labels = yes | no
Implemented in the SD Device resource. If you intend to read
ANSI or IBM labels, this *must* be set. Even if the volume
- With Python 2.3, there are a few compiler warnings.
- You must either create a new catalog database or upgrade your
old database (the PostgreSQL upgrade scripts not yet tested).
+- You must add --with-openssl to the configure command line if
+ you want TLS communications encryption support.
Other Items:
- 2 new scripts, dvd-writepart and dvd-freespace, in the scripts directory,
- Part files support: File volumes can now be splitted in multiple
files, called "parts".
-NOTE THE FOLLOWING IS NOW OUT OF DATE!!!!
-- Python scripting support:
- A Python script will be called at particular points or conditions
- in Bacula called Events. The currently defined Events are called:
-
- StartJob, EndJob, NewVolume
-
- Where StartJob is called before the RunBeforeJob, EndJob is called
- after RunAfterJob, and NewVolume, is called before all other
- "methods" of obtaining a new Volume name, when one is needed.
-
- The Python script of the same name as the Event name (but with a .py)
- is called from the Scripts Directory (a directive defined in the
- Director resource). Note, both the Filename, and the name of
- the function in the file must correspond to the Event name.
-
- Once the Python script gets control, it can have access to Bacula
- variables by doing:
-
- import bacula
-
- The script is called with one argument, typically called jcr. This
- argument *must* be used to access each bacula function. The
- format of the call is slightly different for reading Bacula
- variable and for writing bacula variables. See below.
-
- Bacula variables can be read with:
-
- jcr.get("Variable-name")
-
- where jcr is the argument passed to the function, and Variable-name
- is on of the following:
-
- JobId, Client, Pool, Storage, Catalog, MediaType, NumVols, DirName,
- Level, Type, Job, JobName, JobStatus
-
- Bacula varibles can be set using Python keyword arguments:
-
- jcr.set(VolumeName="xyz")
-
- The two currently implemented writable "variables" are:
-
- VolumeName and JobReport
-
- It is possible to submit a Bacula run command with the following:
-
- jcr.run("run kernsave client=Matou storage=File")
-
- this function returns the JobId of the job that was started. If
- there is an error, the return value is zero.
-
- Example:
-
-== File EndJob.py ===
-import bacula
-
-def EndJob(jcr):
- jobid = jcr.get("JobId")
- client = jcr.get("Client")
- jcr.set(JobReport="EndJob output: JobId=%d Client=%s.\n" % (jobid, client))
- if (jobid < 5) :
- startid = jcr.run("run kernsave")
- print "Python started jobid=", startid
-
- return 1
-====
-
-== File NewVolume.py ===
-import bacula
-
-def NewVolume(jcr):
- jobid = jcr.get("JobId")
- print "JobId=", jobid
- client = jcr.get("Client")
- print "Client=" + client
- numvol = jcr.get("NumVols");
- print "NumVols=", numvol
- jcr.set(JobReport="New Volume set for Job.\n")
- jcr.set(VolumeName="TestA-001")
- return 1
-====
+- For the details of the Python scripting support, please see the new
+ Python Scripting chapter in the manual.
\ No newline at end of file
"Include { " .
( $1 ? options($1) : '' ) . "\n" .
file_lines($2) .
- "\n }\n" /eg;
+ "\n }" /eg;
+
+$in =~ s/Exclude\s*=\s*{\s*}/
+ "Exclude { }"/eg;
$in =~ s/Exclude\s*=\s*{\s*((?:.*?\n)+?)\s*}/
- "Exclude {\n" . file_lines($1) . "\n }\n"/eg;
+ "Exclude {\n" . file_lines($1) . "\n }"/eg;
print $in;
return true; /* accept file */
}
}
-//#ifndef WIN32
+#ifndef WIN32
if (S_ISDIR(ff->statp.st_mode)) {
for (k=0; k<fo->regexdir.size(); k++) {
const int nmatch = 30;
return true; /* accept file */
}
}
-//#endif
+#endif
/*
* If we have an empty Options clause with exclude, then
* exclude the file
#include "bacula.h"
#include "fnmatch.h"
-
-/* Comment out all this code if we are using the GNU C Library, and are not
- actually compiling the library itself. This code is part of the GNU C
- Library, but also included in many other GNU distributions. Compiling
- and linking in this code is a waste when using the GNU C library
- (especially if it is a shared library). Rather than having every GNU
- program understand `configure --with-gnu-libc' and omit the object files,
- it is simpler to just do this in the source for each such file. */
-
-#if defined _LIBC || !defined __GNU_LIBRARY__
-
-
-# if defined STDC_HEADERS || !defined isascii
-# define ISASCII(c) 1
-# else
-# define ISASCII(c) isascii(c)
-# endif
-
-#ifndef ISUPPER
-# define ISUPPER(c) (ISASCII (c) && isupper (c))
-#endif
-
-
# ifndef errno
extern int errno;
# endif
/* Match STRING against the filename pattern PATTERN, returning zero if
- it matches, nonzero if not. */
+ it matches, nonzero if not. */
int
fnmatch (const char *pattern, const char *string, int flags)
{
register char c;
/* Note that this evaluates C many times. */
-# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# define FOLD(c) ((flags & FNM_CASEFOLD) && B_ISUPPER (c) ? tolower (c) : (c))
while ((c = *p++) != '\0')
{
c = FOLD (c);
switch (c)
- {
+ {
case '?':
if (*n == '\0')
- return FNM_NOMATCH;
+ return FNM_NOMATCH;
else if ((flags & FNM_FILE_NAME) && *n == '/')
- return FNM_NOMATCH;
+ return FNM_NOMATCH;
else if ((flags & FNM_PERIOD) && *n == '.' &&
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
- return FNM_NOMATCH;
- break;
+ return FNM_NOMATCH;
+ break;
case '\\':
- if (!(flags & FNM_NOESCAPE))
- {
- c = *p++;
+ if (!(flags & FNM_NOESCAPE))
+ {
+ c = *p++;
if (c == '\0')
/* Trailing \ loses. */
- return FNM_NOMATCH;
- c = FOLD (c);
- }
- if (FOLD (*n) != c)
- return FNM_NOMATCH;
- break;
+ return FNM_NOMATCH;
+ c = FOLD (c);
+ }
+ if (FOLD (*n) != c)
+ return FNM_NOMATCH;
+ break;
case '*':
if ((flags & FNM_PERIOD) && *n == '.' &&
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
- return FNM_NOMATCH;
+ return FNM_NOMATCH;
for (c = *p++; c == '?' || c == '*'; c = *p++)
- {
+ {
if ((flags & FNM_FILE_NAME) && *n == '/')
- /* A slash does not match a wildcard under FNM_FILE_NAME. */
- return FNM_NOMATCH;
+ /* A slash does not match a wildcard under FNM_FILE_NAME. */
+ return FNM_NOMATCH;
else if (c == '?')
- {
- /* A ? needs to match one character. */
+ {
+ /* A ? needs to match one character. */
if (*n == '\0')
/* There isn't another character; no match. */
- return FNM_NOMATCH;
- else
- /* One character of the string is consumed in matching
+ return FNM_NOMATCH;
+ else
+ /* One character of the string is consumed in matching
this ? wildcard, so *??? won't match if there are
- less than three characters. */
- ++n;
- }
- }
+ less than three characters. */
+ ++n;
+ }
+ }
if (c == '\0')
- return 0;
+ return 0;
- {
+ {
char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
- c1 = FOLD (c1);
+ c1 = FOLD (c1);
for (--p; *n != '\0'; ++n)
if ((c == '[' || FOLD ((unsigned char)*n) == c1) &&
- fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
- return 0;
- return FNM_NOMATCH;
- }
+ fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
+ return 0;
+ return FNM_NOMATCH;
+ }
case '[':
- {
- /* Nonzero if the sense of the character class is inverted. */
- register int nnot;
+ {
+ /* Nonzero if the sense of the character class is inverted. */
+ register int nnot;
if (*n == '\0')
- return FNM_NOMATCH;
+ return FNM_NOMATCH;
if ((flags & FNM_PERIOD) && *n == '.' &&
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
- return FNM_NOMATCH;
+ return FNM_NOMATCH;
nnot = (*p == '!' || *p == '^');
- if (nnot)
- ++p;
+ if (nnot)
+ ++p;
- c = *p++;
- for (;;)
- {
- register char cstart = c, cend = c;
+ c = *p++;
+ for (;;)
+ {
+ register char cstart = c, cend = c;
if (!(flags & FNM_NOESCAPE) && c == '\\')
- {
+ {
if (*p == '\0')
- return FNM_NOMATCH;
- cstart = cend = *p++;
- }
+ return FNM_NOMATCH;
+ cstart = cend = *p++;
+ }
- cstart = cend = FOLD (cstart);
+ cstart = cend = FOLD (cstart);
if (c == '\0')
- /* [ (unterminated) loses. */
- return FNM_NOMATCH;
+ /* [ (unterminated) loses. */
+ return FNM_NOMATCH;
- c = *p++;
- c = FOLD (c);
+ c = *p++;
+ c = FOLD (c);
if ((flags & FNM_FILE_NAME) && c == '/')
- /* [/] can never match. */
- return FNM_NOMATCH;
+ /* [/] can never match. */
+ return FNM_NOMATCH;
if (c == '-' && *p != ']')
- {
- cend = *p++;
+ {
+ cend = *p++;
if (!(flags & FNM_NOESCAPE) && cend == '\\')
- cend = *p++;
+ cend = *p++;
if (cend == '\0')
- return FNM_NOMATCH;
- cend = FOLD (cend);
+ return FNM_NOMATCH;
+ cend = FOLD (cend);
- c = *p++;
- }
+ c = *p++;
+ }
- if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
- goto matched;
+ if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
+ goto matched;
if (c == ']')
- break;
- }
- if (!nnot)
- return FNM_NOMATCH;
- break;
-
- matched:;
- /* Skip the rest of the [...] that already matched. */
+ break;
+ }
+ if (!nnot)
+ return FNM_NOMATCH;
+ break;
+
+ matched:;
+ /* Skip the rest of the [...] that already matched. */
while (c != ']')
- {
+ {
if (c == '\0')
- /* [... (unterminated) loses. */
- return FNM_NOMATCH;
+ /* [... (unterminated) loses. */
+ return FNM_NOMATCH;
- c = *p++;
+ c = *p++;
if (!(flags & FNM_NOESCAPE) && c == '\\')
- {
+ {
if (*p == '\0')
- return FNM_NOMATCH;
- /* XXX 1003.2d11 is unclear if this is right. */
- ++p;
- }
- }
- if (nnot)
- return FNM_NOMATCH;
- }
- break;
-
- default:
- if (c != FOLD ((unsigned char)*n))
- return FNM_NOMATCH;
- }
+ return FNM_NOMATCH;
+ /* XXX 1003.2d11 is unclear if this is right. */
+ ++p;
+ }
+ }
+ if (nnot)
+ return FNM_NOMATCH;
+ }
+ break;
+
+ default:
+ if (c != FOLD (*n))
+ return FNM_NOMATCH;
+ }
++n;
}
# undef FOLD
}
-
-#endif /* _LIBC or not __GNU_LIBRARY__. */
/* */
#undef VERSION
#define VERSION "1.37.16"
-#define BDATE "01 May 2005"
-#define LSMDATE "01May05"
+#define BDATE "02 May 2005"
+#define LSMDATE "02May05"
/* Debug flags */
#undef DEBUG