]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/dird/dird_conf.h
ebl Add AfterVSS option to RunsWhen runscript option
[bacula/bacula] / bacula / src / dird / dird_conf.h
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version two of the GNU General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of John Walker.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  * Director specific configuration and defines
30  *
31  *     Kern Sibbald, Feb MM
32  *
33  *    Version $Id$
34  */
35
36 /* NOTE:  #includes at the end of this file */
37
38 /*
39  * Resource codes -- they must be sequential for indexing
40  */
41 enum {
42    R_DIRECTOR = 1001,
43    R_CLIENT,
44    R_JOB,
45    R_STORAGE,
46    R_CATALOG,
47    R_SCHEDULE,
48    R_FILESET,
49    R_POOL,
50    R_MSGS,
51    R_COUNTER,
52    R_CONSOLE,
53    R_JOBDEFS,
54    R_DEVICE,
55    R_FIRST = R_DIRECTOR,
56    R_LAST  = R_DEVICE                 /* keep this updated */
57 };
58
59
60 /*
61  * Some resource attributes
62  */
63 enum {
64    R_NAME = 1020,
65    R_ADDRESS,
66    R_PASSWORD,
67    R_TYPE,
68    R_BACKUP
69 };
70
71
72 /* Used for certain KeyWord tables */
73 struct s_kw {
74    const char *name;
75    int token;
76 };
77
78 /* Job Level keyword structure */
79 struct s_jl {
80    const char *level_name;                  /* level keyword */
81    int  level;                        /* level */
82    int  job_type;                     /* JobType permitting this level */
83 };
84
85 /* Job Type keyword structure */
86 struct s_jt {
87    const char *type_name;
88    int job_type;
89 };
90
91 /* Definition of the contents of each Resource */
92 /* Needed for forward references */
93 class SCHED;
94 class CLIENT;
95 class FILESET;
96 class POOL;
97 class RUN;
98 class DEVICE;
99 class RUNSCRIPT;
100
101 /*
102  *   Director Resource
103  *
104  */
105 class DIRRES {
106 public:
107    RES   hdr;
108    dlist *DIRaddrs;
109    char *password;                    /* Password for UA access */
110    char *query_file;                  /* SQL query file */
111    char *working_directory;           /* WorkingDirectory */
112    const char *scripts_directory;     /* ScriptsDirectory */
113    const char *plugin_directory;      /* Plugin Directory */
114    char *pid_directory;               /* PidDirectory */
115    char *subsys_directory;            /* SubsysDirectory */
116    MSGS *messages;                    /* Daemon message handler */
117    uint32_t MaxConcurrentJobs;        /* Max concurrent jobs for whole director */
118    utime_t FDConnectTimeout;          /* timeout for connect in seconds */
119    utime_t SDConnectTimeout;          /* timeout in seconds */
120    utime_t heartbeat_interval;        /* Interval to send heartbeats */
121    char *tls_ca_certfile;             /* TLS CA Certificate File */
122    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
123    char *tls_certfile;                /* TLS Server Certificate File */
124    char *tls_keyfile;                 /* TLS Server Key File */
125    char *tls_dhfile;                  /* TLS Diffie-Hellman Parameters */
126    alist *tls_allowed_cns;            /* TLS Allowed Clients */
127    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
128    bool tls_authenticate;             /* Authenticated with TLS */
129    bool tls_enable;                   /* Enable TLS */
130    bool tls_require;                  /* Require TLS */
131    bool tls_verify_peer;              /* TLS Verify Client Certificate */
132
133    /* Methods */
134    char *name() const;
135 };
136
137 inline char *DIRRES::name() const { return hdr.name; }
138
139 /*
140  * Device Resource
141  *  This resource is a bit different from the other resources
142  *  because it is not defined in the Director 
143  *  by DEVICE { ... }, but rather by a "reference" such as
144  *  DEVICE = xxx; Then when the Director connects to the
145  *  SD, it requests the information about the device.
146  */
147 class DEVICE {
148 public:
149    RES hdr;
150
151    bool found;                        /* found with SD */
152    int num_writers;                   /* number of writers */
153    int max_writers;                   /* = 1 for files */
154    int reserved;                      /* number of reserves */
155    int num_drives;                    /* for autochanger */
156    bool autochanger;                  /* set if device is autochanger */
157    bool open;                         /* drive open */
158    bool append;                       /* in append mode */
159    bool read;                         /* in read mode */
160    bool labeled;                      /* Volume name valid */
161    bool offline;                      /* not available */
162    bool autoselect;                   /* can be selected via autochanger */
163    uint32_t PoolId;
164    char ChangerName[MAX_NAME_LENGTH];
165    char VolumeName[MAX_NAME_LENGTH];
166    char MediaType[MAX_NAME_LENGTH];
167
168    /* Methods */
169    char *name() const;
170 };
171
172 inline char *DEVICE::name() const { return hdr.name; }
173
174 /*
175  * Console ACL positions
176  */
177 enum {
178    Job_ACL = 0,
179    Client_ACL,
180    Storage_ACL,
181    Schedule_ACL,
182    Run_ACL,
183    Pool_ACL,
184    Command_ACL,
185    FileSet_ACL,
186    Catalog_ACL,
187    Where_ACL,
188    PluginOptions_ACL,
189    Num_ACL                            /* keep last */
190 };
191
192 /*
193  *    Console Resource
194  */
195 class CONRES {
196 public:
197    RES   hdr;
198    char *password;                    /* UA server password */
199    alist *ACL_lists[Num_ACL];         /* pointers to ACLs */
200    char *tls_ca_certfile;             /* TLS CA Certificate File */
201    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
202    char *tls_certfile;                /* TLS Server Certificate File */
203    char *tls_keyfile;                 /* TLS Server Key File */
204    char *tls_dhfile;                  /* TLS Diffie-Hellman Parameters */
205    alist *tls_allowed_cns;            /* TLS Allowed Clients */
206    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
207    bool tls_authenticate;             /* Authenticated with TLS */
208    bool tls_enable;                   /* Enable TLS */
209    bool tls_require;                  /* Require TLS */
210    bool tls_verify_peer;              /* TLS Verify Client Certificate */
211
212    /* Methods */
213    char *name() const;
214 };
215
216 inline char *CONRES::name() const { return hdr.name; }
217
218
219 /*
220  *   Catalog Resource
221  *
222  */
223 class CAT {
224 public:
225    RES   hdr;
226
227    int   db_port;                     /* Port */
228    char *db_address;                  /* host name for remote access */
229    char *db_socket;                   /* Socket for local access */
230    char *db_password;
231    char *db_user;
232    char *db_name;
233    char *db_driver;                   /* Select appropriate driver */
234    int   mult_db_connections;         /* set if multiple connections wanted */
235
236    /* Methods */
237    char *name() const;
238 };
239
240 inline char *CAT::name() const { return hdr.name; }
241
242
243 /*
244  *   Client Resource
245  *
246  */
247 class CLIENT {
248 public:
249    RES   hdr;
250
251    int   FDport;                      /* Where File daemon listens */
252    utime_t FileRetention;             /* file retention period in seconds */
253    utime_t JobRetention;              /* job retention period in seconds */
254    utime_t heartbeat_interval;        /* Interval to send heartbeats */
255    char *address;
256    char *password;
257    CAT *catalog;                      /* Catalog resource */
258    uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
259    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
260    char *tls_ca_certfile;             /* TLS CA Certificate File */
261    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
262    char *tls_certfile;                /* TLS Client Certificate File */
263    char *tls_keyfile;                 /* TLS Client Key File */
264    alist *tls_allowed_cns;            /* TLS Allowed Clients */
265    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
266    bool tls_authenticate;             /* Authenticated with TLS */
267    bool tls_enable;                   /* Enable TLS */
268    bool tls_require;                  /* Require TLS */
269    bool AutoPrune;                    /* Do automatic pruning? */
270
271    /* Methods */
272    char *name() const;
273 };
274
275 inline char *CLIENT::name() const { return hdr.name; }
276
277
278 /*
279  *   Store Resource
280  *
281  */
282 class STORE {
283 public:
284    RES   hdr;
285
286    int   SDport;                      /* port where Directors connect */
287    int   SDDport;                     /* data port for File daemon */
288    char *address;
289    char *password;
290    char *media_type;
291    alist *device;                     /* Alternate devices for this Storage */
292    uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
293    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
294    uint32_t NumConcurrentReadJobs;    /* number of jobs reading */
295    char *tls_ca_certfile;             /* TLS CA Certificate File */
296    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
297    char *tls_certfile;                /* TLS Client Certificate File */
298    char *tls_keyfile;                 /* TLS Client Key File */
299    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
300    bool tls_authenticate;             /* Authenticated with TLS */
301    bool tls_enable;                   /* Enable TLS */
302    bool tls_require;                  /* Require TLS */
303    bool enabled;                      /* Set if device is enabled */
304    bool  autochanger;                 /* set if autochanger */
305    int64_t StorageId;                 /* Set from Storage DB record */
306    utime_t heartbeat_interval;        /* Interval to send heartbeats */
307    int  drives;                       /* number of drives in autochanger */
308
309    /* Methods */
310    char *dev_name() const;
311    char *name() const;
312 };
313
314 inline char *STORE::dev_name() const
315
316    DEVICE *dev = (DEVICE *)device->first();
317    return dev->hdr.name;
318 }
319
320 inline char *STORE::name() const { return hdr.name; }
321
322 /*
323  * This is a sort of "unified" store that has both the
324  *  storage pointer and the text of where the pointer was
325  *  found.
326  */
327 class USTORE {
328 public:
329    STORE *store;
330    POOLMEM *store_source;
331
332    /* Methods */
333    USTORE() { store = NULL; store_source = get_pool_memory(PM_MESSAGE); 
334               *store_source = 0; };
335    ~USTORE() { destroy(); }   
336    void set_source(const char *where);
337    void destroy();
338 };
339
340 inline void USTORE::destroy()
341 {
342    if (store_source) {
343       free_pool_memory(store_source);
344       store_source = NULL;
345    }
346 }
347
348
349 inline void USTORE::set_source(const char *where)
350 {
351    if (!store_source) {
352       store_source = get_pool_memory(PM_MESSAGE);
353    }
354    pm_strcpy(store_source, where);
355 }
356
357
358 /*
359  *   Job Resource
360  */
361 class JOB {
362 public:
363    RES   hdr;
364
365    int   JobType;                     /* job type (backup, verify, restore */
366    int   JobLevel;                    /* default backup/verify level */
367    int   Priority;                    /* Job priority */
368    int   RestoreJobId;                /* What -- JobId to restore */
369    int   RescheduleTimes;             /* Number of times to reschedule job */
370    int   replace;                     /* How (overwrite, ..) */
371    int   selection_type;
372
373    char *RestoreWhere;                /* Where on disk to restore -- directory */
374    char *RegexWhere;                  /* RegexWhere option */
375    char *strip_prefix;                /* remove prefix from filename  */
376    char *add_prefix;                  /* add prefix to filename  */
377    char *add_suffix;                  /* add suffix to filename -- .old */
378    char *RestoreBootstrap;            /* Bootstrap file */
379    char *PluginOptions;               /* Options to pass to plugin */
380    union {
381       char *WriteBootstrap;           /* Where to write bootstrap Job updates */
382       char *WriteVerifyList;          /* List of changed files */
383    };
384    utime_t MaxRunTime;                /* max run time in seconds */
385    utime_t MaxWaitTime;               /* max blocking time in seconds */
386    utime_t FullMaxWaitTime;           /* Max Full job wait time */
387    utime_t DiffMaxWaitTime;           /* Max Differential job wait time */
388    utime_t IncMaxWaitTime;            /* Max Incremental job wait time */
389    utime_t MaxStartDelay;             /* max start delay in seconds */
390    utime_t RescheduleInterval;        /* Reschedule interval */
391    utime_t JobRetention;              /* job retention period in seconds */
392    utime_t MaxFullInterval;           /* Maximum time interval between Fulls */
393    utime_t MaxDiffInterval;           /* Maximum time interval between Diffs */
394    utime_t DuplicateJobProximity;     /* Permitted time between duplicicates */
395    int64_t spool_size;                /* Size of spool file for this job */
396    uint32_t MaxConcurrentJobs;        /* Maximum concurrent jobs */
397    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
398
399    MSGS      *messages;               /* How and where to send messages */
400    SCHED     *schedule;               /* When -- Automatic schedule */
401    CLIENT    *client;                 /* Who to backup */
402    FILESET   *fileset;                /* What to backup -- Fileset */
403    alist     *storage;                /* Where is device -- list of Storage to be used */
404    POOL      *pool;                   /* Where is media -- Media Pool */
405    POOL      *full_pool;              /* Pool for Full backups */
406    POOL      *inc_pool;               /* Pool for Incremental backups */
407    POOL      *diff_pool;              /* Pool for Differental backups */
408    char      *selection_pattern;
409    union {
410       JOB    *verify_job;             /* Job name to verify */
411    };
412    JOB       *jobdefs;                /* Job defaults */
413    alist     *run_cmds;               /* Run commands */
414    alist *RunScripts;                 /* Run {client} program {after|before} Job */
415
416    bool where_use_regexp;             /* true if RestoreWhere is a BREGEXP */
417    bool RescheduleOnError;            /* Set to reschedule on error */
418    bool PrefixLinks;                  /* prefix soft links with Where path */
419    bool PruneJobs;                    /* Force pruning of Jobs */
420    bool PruneFiles;                   /* Force pruning of Files */
421    bool PruneVolumes;                 /* Force pruning of Volumes */
422    bool SpoolAttributes;              /* Set to spool attributes in SD */
423    bool spool_data;                   /* Set to spool data in SD */
424    bool rerun_failed_levels;          /* Upgrade to rerun failed levels */
425    bool PreferMountedVolumes;         /* Prefer vols mounted rather than new one */
426    bool write_part_after_job;         /* Set to write part after job in SD */
427    bool enabled;                      /* Set if job enabled */
428    bool OptimizeJobScheduling;        /* Set if we should optimize Job scheduling */
429    bool accurate;                     /* Set if it is an accurate backup job */
430    bool AllowDuplicateJobs;           /* Allow duplicate jobs */
431    bool AllowHigherDuplicates;        /* Permit Higher Level */
432    bool CancelQueuedDuplicates;       /* Cancel queued jobs */
433    bool CancelRunningDuplicates;      /* Cancel Running jobs */
434    
435
436    /* Methods */
437    char *name() const;
438 };
439
440 inline char *JOB::name() const { return hdr.name; }
441
442 #undef  MAX_FOPTS
443 #define MAX_FOPTS 40
444
445 /* File options structure */
446 struct FOPTS {
447    char opts[MAX_FOPTS];              /* options string */
448    alist regex;                       /* regex string(s) */
449    alist regexdir;                    /* regex string(s) for directories */
450    alist regexfile;                   /* regex string(s) for files */
451    alist wild;                        /* wild card strings */
452    alist wilddir;                     /* wild card strings for directories */
453    alist wildfile;                    /* wild card strings for files */
454    alist wildbase;                    /* wild card strings for files without '/' */
455    alist base;                        /* list of base names */
456    alist fstype;                      /* file system type limitation */
457    alist drivetype;                   /* drive type limitation */
458    char *reader;                      /* reader program */
459    char *writer;                      /* writer program */
460    char *plugin;                      /* plugin program */
461 };
462
463
464 /* This is either an include item or an exclude item */
465 struct INCEXE {
466    FOPTS *current_opts;               /* points to current options structure */
467    FOPTS **opts_list;                 /* options list */
468    int num_opts;                      /* number of options items */
469    alist name_list;                   /* filename list -- holds char * */
470    alist plugin_list;                 /* filename list for plugins */
471 };
472
473 /*
474  *   FileSet Resource
475  *
476  */
477 class FILESET {
478 public:
479    RES   hdr;
480
481    bool new_include;                  /* Set if new include used */
482    INCEXE **include_items;            /* array of incexe structures */
483    int num_includes;                  /* number in array */
484    INCEXE **exclude_items;
485    int num_excludes;
486    bool have_MD5;                     /* set if MD5 initialized */
487    struct MD5Context md5c;            /* MD5 of include/exclude */
488    char MD5[30];                      /* base 64 representation of MD5 */
489    bool ignore_fs_changes;            /* Don't force Full if FS changed */
490    bool enable_vss;                   /* Enable Volume Shadow Copy */
491
492    /* Methods */
493    char *name() const;
494 };
495
496 inline char *FILESET::name() const { return hdr.name; }
497
498 /*
499  *   Schedule Resource
500  *
501  */
502 class SCHED {
503 public:
504    RES   hdr;
505
506    RUN *run;
507 };
508
509 /*
510  *   Counter Resource
511  */
512 class COUNTER {
513 public:
514    RES   hdr;
515
516    int32_t  MinValue;                 /* Minimum value */
517    int32_t  MaxValue;                 /* Maximum value */
518    int32_t  CurrentValue;             /* Current value */
519    COUNTER *WrapCounter;              /* Wrap counter name */
520    CAT     *Catalog;                  /* Where to store */
521    bool     created;                  /* Created in DB */
522    /* Methods */
523    char *name() const;
524 };
525
526 inline char *COUNTER::name() const { return hdr.name; }
527
528 /*
529  *   Pool Resource
530  *
531  */
532 class POOL {
533 public:
534    RES   hdr;
535
536    char *pool_type;                   /* Pool type */
537    char *label_format;                /* Label format string */
538    char *cleaning_prefix;             /* Cleaning label prefix */
539    int32_t LabelType;                 /* Bacula/ANSI/IBM label type */
540    uint32_t max_volumes;              /* max number of volumes */
541    utime_t VolRetention;              /* volume retention period in seconds */
542    utime_t VolUseDuration;            /* duration volume can be used */
543    uint32_t MaxVolJobs;               /* Maximum jobs on the Volume */
544    uint32_t MaxVolFiles;              /* Maximum files on the Volume */
545    uint64_t MaxVolBytes;              /* Maximum bytes on the Volume */
546    utime_t MigrationTime;             /* Time to migrate to next pool */
547    uint64_t MigrationHighBytes;       /* When migration starts */
548    uint64_t MigrationLowBytes;        /* When migration stops */
549    POOL  *NextPool;                   /* Next pool for migration */
550    alist *storage;                    /* Where is device -- list of Storage to be used */
551    bool  use_catalog;                 /* maintain catalog for media */
552    bool  catalog_files;               /* maintain file entries in catalog */
553    bool  use_volume_once;             /* write on volume only once */
554    bool  purge_oldest_volume;         /* purge oldest volume */
555    bool  recycle_oldest_volume;       /* attempt to recycle oldest volume */
556    bool  recycle_current_volume;      /* attempt recycle of current volume */
557    bool  AutoPrune;                   /* default for pool auto prune */
558    bool  Recycle;                     /* default for media recycle yes/no */
559    POOL  *RecyclePool;                /* RecyclePool destination when media is purged */
560    alist *CopyPool;                   /* List of copy pools */
561    CAT *catalog;                      /* Catalog to be used */
562    /* Methods */
563    char *name() const;
564 };
565
566 inline char *POOL::name() const { return hdr.name; }
567
568
569
570
571 /* Define the Union of all the above
572  * resource structure definitions.
573  */
574 union URES {
575    DIRRES     res_dir;
576    CONRES     res_con;
577    CLIENT     res_client;
578    STORE      res_store;
579    CAT        res_cat;
580    JOB        res_job;
581    FILESET    res_fs;
582    SCHED      res_sch;
583    POOL       res_pool;
584    MSGS       res_msgs;
585    COUNTER    res_counter;
586    DEVICE     res_dev;
587    RES        hdr;
588    RUNSCRIPT  res_runscript;
589 };
590
591
592
593 /* Run structure contained in Schedule Resource */
594 class RUN {
595 public:
596    RUN *next;                         /* points to next run record */
597    int level;                         /* level override */
598    int Priority;                      /* priority override */
599    int job_type;
600    bool spool_data;                   /* Data spooling override */
601    bool spool_data_set;               /* Data spooling override given */
602    bool write_part_after_job;         /* Write part after job override */
603    bool write_part_after_job_set;     /* Write part after job override given */
604    
605    POOL *pool;                        /* Pool override */
606    POOL *full_pool;                   /* Pool override */
607    POOL *inc_pool;                    /* Pool override */
608    POOL *diff_pool;                   /* Pool override */
609    STORE *storage;                    /* Storage override */
610    MSGS *msgs;                        /* Messages override */
611    char *since;
612    int level_no;
613    int minute;                        /* minute to run job */
614    time_t last_run;                   /* last time run */
615    time_t next_run;                   /* next time to run */
616    char hour[nbytes_for_bits(24)];    /* bit set for each hour */
617    char mday[nbytes_for_bits(31)];    /* bit set for each day of month */
618    char month[nbytes_for_bits(12)];   /* bit set for each month */
619    char wday[nbytes_for_bits(7)];     /* bit set for each day of the week */
620    char wom[nbytes_for_bits(5)];      /* week of month */
621    char woy[nbytes_for_bits(54)];     /* week of year */
622 };
623
624 #define GetPoolResWithName(x) ((POOL *)GetResWithName(R_POOL, (x)))
625 #define GetStoreResWithName(x) ((STORE *)GetResWithName(R_STORAGE, (x)))
626 #define GetClientResWithName(x) ((CLIENT *)GetResWithName(R_CLIENT, (x)))
627 #define GetJobResWithName(x) ((JOB *)GetResWithName(R_JOB, (x)))
628 #define GetFileSetResWithName(x) ((FILESET *)GetResWithName(R_FILESET, (x)))
629 #define GetCatalogResWithName(x) ((CAT *)GetResWithName(R_CATALOG, (x)))