]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/dird/dird_conf.h
Implement a security enhancement: TLS authentication but no
[bacula/bacula] / bacula / src / dird / dird_conf.h
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2007 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    char *pid_directory;               /* PidDirectory */
114    char *subsys_directory;            /* SubsysDirectory */
115    MSGS *messages;                    /* Daemon message handler */
116    uint32_t MaxConcurrentJobs;        /* Max concurrent jobs for whole director */
117    utime_t FDConnectTimeout;          /* timeout for connect in seconds */
118    utime_t SDConnectTimeout;          /* timeout in seconds */
119    utime_t heartbeat_interval;        /* Interval to send heartbeats */
120    char *tls_ca_certfile;             /* TLS CA Certificate File */
121    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
122    char *tls_certfile;                /* TLS Server Certificate File */
123    char *tls_keyfile;                 /* TLS Server Key File */
124    char *tls_dhfile;                  /* TLS Diffie-Hellman Parameters */
125    alist *tls_allowed_cns;            /* TLS Allowed Clients */
126    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
127    bool tls_authenticate;             /* Authenticated with TLS */
128    bool tls_enable;                   /* Enable TLS */
129    bool tls_require;                  /* Require TLS */
130    bool tls_verify_peer;              /* TLS Verify Client Certificate */
131
132    /* Methods */
133    char *name() const;
134 };
135
136 inline char *DIRRES::name() const { return hdr.name; }
137
138 /*
139  * Device Resource
140  *  This resource is a bit different from the other resources
141  *  because it is not defined in the Director 
142  *  by DEVICE { ... }, but rather by a "reference" such as
143  *  DEVICE = xxx; Then when the Director connects to the
144  *  SD, it requests the information about the device.
145  */
146 class DEVICE {
147 public:
148    RES hdr;
149
150    bool found;                        /* found with SD */
151    int num_writers;                   /* number of writers */
152    int max_writers;                   /* = 1 for files */
153    int reserved;                      /* number of reserves */
154    int num_drives;                    /* for autochanger */
155    bool autochanger;                  /* set if device is autochanger */
156    bool open;                         /* drive open */
157    bool append;                       /* in append mode */
158    bool read;                         /* in read mode */
159    bool labeled;                      /* Volume name valid */
160    bool offline;                      /* not available */
161    bool autoselect;                   /* can be selected via autochanger */
162    uint32_t PoolId;
163    char ChangerName[MAX_NAME_LENGTH];
164    char VolumeName[MAX_NAME_LENGTH];
165    char MediaType[MAX_NAME_LENGTH];
166
167    /* Methods */
168    char *name() const;
169 };
170
171 inline char *DEVICE::name() const { return hdr.name; }
172
173 /*
174  * Console ACL positions
175  */
176 enum {
177    Job_ACL = 0,
178    Client_ACL,
179    Storage_ACL,
180    Schedule_ACL,
181    Run_ACL,
182    Pool_ACL,
183    Command_ACL,
184    FileSet_ACL,
185    Catalog_ACL,
186    Where_ACL,
187    Num_ACL                            /* keep last */
188 };
189
190 /*
191  *    Console Resource
192  */
193 class CONRES {
194 public:
195    RES   hdr;
196    char *password;                    /* UA server password */
197    alist *ACL_lists[Num_ACL];         /* pointers to ACLs */
198    char *tls_ca_certfile;             /* TLS CA Certificate File */
199    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
200    char *tls_certfile;                /* TLS Server Certificate File */
201    char *tls_keyfile;                 /* TLS Server Key File */
202    char *tls_dhfile;                  /* TLS Diffie-Hellman Parameters */
203    alist *tls_allowed_cns;            /* TLS Allowed Clients */
204    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
205    bool tls_authenticate;             /* Authenticated with TLS */
206    bool tls_enable;                   /* Enable TLS */
207    bool tls_require;                  /* Require TLS */
208    bool tls_verify_peer;              /* TLS Verify Client Certificate */
209
210    /* Methods */
211    char *name() const;
212 };
213
214 inline char *CONRES::name() const { return hdr.name; }
215
216
217 /*
218  *   Catalog Resource
219  *
220  */
221 class CAT {
222 public:
223    RES   hdr;
224
225    int   db_port;                     /* Port */
226    char *db_address;                  /* host name for remote access */
227    char *db_socket;                   /* Socket for local access */
228    char *db_password;
229    char *db_user;
230    char *db_name;
231    int   mult_db_connections;         /* set if multiple connections wanted */
232
233    /* Methods */
234    char *name() const;
235 };
236
237 inline char *CAT::name() const { return hdr.name; }
238
239
240 /*
241  *   Client Resource
242  *
243  */
244 class CLIENT {
245 public:
246    RES   hdr;
247
248    int   FDport;                      /* Where File daemon listens */
249    utime_t FileRetention;             /* file retention period in seconds */
250    utime_t JobRetention;              /* job retention period in seconds */
251    utime_t heartbeat_interval;        /* Interval to send heartbeats */
252    char *address;
253    char *password;
254    CAT *catalog;                      /* Catalog resource */
255    uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
256    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
257    char *tls_ca_certfile;             /* TLS CA Certificate File */
258    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
259    char *tls_certfile;                /* TLS Client Certificate File */
260    char *tls_keyfile;                 /* TLS Client Key File */
261    alist *tls_allowed_cns;            /* TLS Allowed Clients */
262    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
263    bool tls_authenticate;             /* Authenticated with TLS */
264    bool tls_enable;                   /* Enable TLS */
265    bool tls_require;                  /* Require TLS */
266    bool AutoPrune;                    /* Do automatic pruning? */
267
268    /* Methods */
269    char *name() const;
270 };
271
272 inline char *CLIENT::name() const { return hdr.name; }
273
274
275 /*
276  *   Store Resource
277  *
278  */
279 class STORE {
280 public:
281    RES   hdr;
282
283    int   SDport;                      /* port where Directors connect */
284    int   SDDport;                     /* data port for File daemon */
285    char *address;
286    char *password;
287    char *media_type;
288    alist *device;                     /* Alternate devices for this Storage */
289    uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
290    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
291    char *tls_ca_certfile;             /* TLS CA Certificate File */
292    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
293    char *tls_certfile;                /* TLS Client Certificate File */
294    char *tls_keyfile;                 /* TLS Client Key File */
295    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
296    bool tls_authenticate;             /* Authenticated with TLS */
297    bool tls_enable;                   /* Enable TLS */
298    bool tls_require;                  /* Require TLS */
299    bool enabled;                      /* Set if device is enabled */
300    bool  autochanger;                 /* set if autochanger */
301    int64_t StorageId;                 /* Set from Storage DB record */
302    utime_t heartbeat_interval;        /* Interval to send heartbeats */
303    int  drives;                       /* number of drives in autochanger */
304
305    /* Methods */
306    char *dev_name() const;
307    char *name() const;
308 };
309
310 inline char *STORE::dev_name() const
311
312    DEVICE *dev = (DEVICE *)device->first();
313    return dev->hdr.name;
314 }
315
316 inline char *STORE::name() const { return hdr.name; }
317
318 /*
319  * This is a sort of "unified" store that has both the
320  *  storage pointer and the text of where the pointer was
321  *  found.
322  */
323 class USTORE {
324 public:
325    STORE *store;
326    POOLMEM *store_source;
327
328    /* Methods */
329    USTORE() { store = NULL; store_source = get_pool_memory(PM_MESSAGE); 
330               *store_source = 0; };
331    ~USTORE() { destroy(); }   
332    void set_source(const char *where);
333    void destroy();
334 };
335
336 inline void USTORE::destroy()
337 {
338    if (store_source) {
339       free_pool_memory(store_source);
340       store_source = NULL;
341    }
342 }
343
344
345 inline void USTORE::set_source(const char *where)
346 {
347    if (!store_source) {
348       store_source = get_pool_memory(PM_MESSAGE);
349    }
350    pm_strcpy(store_source, where);
351 }
352
353
354 /*
355  *   Job Resource
356  */
357 class JOB {
358 public:
359    RES   hdr;
360
361    int   JobType;                     /* job type (backup, verify, restore */
362    int   JobLevel;                    /* default backup/verify level */
363    int   Priority;                    /* Job priority */
364    int   RestoreJobId;                /* What -- JobId to restore */
365    char *RestoreWhere;                /* Where on disk to restore -- directory */
366    char *RegexWhere;                  /* RegexWhere option */
367    char *strip_prefix;                /* remove prefix from filename  */
368    char *add_prefix;                  /* add prefix to filename  */
369    char *add_suffix;                  /* add suffix to filename -- .old */
370    bool  where_use_regexp;            /* true if RestoreWhere is a BREGEXP */
371    char *RestoreBootstrap;            /* Bootstrap file */
372    alist *RunScripts;                 /* Run {client} program {after|before} Job */
373    union {
374       char *WriteBootstrap;           /* Where to write bootstrap Job updates */
375       char *WriteVerifyList;          /* List of changed files */
376    };
377    int   replace;                     /* How (overwrite, ..) */
378    utime_t MaxRunTime;                /* max run time in seconds */
379    utime_t MaxWaitTime;               /* max blocking time in seconds */
380    utime_t FullMaxWaitTime;           /* Max Full job wait time */
381    utime_t DiffMaxWaitTime;           /* Max Differential job wait time */
382    utime_t IncMaxWaitTime;            /* Max Incremental job wait time */
383    utime_t MaxStartDelay;             /* max start delay in seconds */
384    utime_t RescheduleInterval;        /* Reschedule interval */
385    utime_t JobRetention;              /* job retention period in seconds */
386    uint32_t MaxConcurrentJobs;        /* Maximum concurrent jobs */
387    int64_t spool_size;                /* Size of spool file for this job */
388    int RescheduleTimes;               /* Number of times to reschedule job */
389    bool RescheduleOnError;            /* Set to reschedule on error */
390    bool PrefixLinks;                  /* prefix soft links with Where path */
391    bool PruneJobs;                    /* Force pruning of Jobs */
392    bool PruneFiles;                   /* Force pruning of Files */
393    bool PruneVolumes;                 /* Force pruning of Volumes */
394    bool SpoolAttributes;              /* Set to spool attributes in SD */
395    bool spool_data;                   /* Set to spool data in SD */
396    bool rerun_failed_levels;          /* Upgrade to rerun failed levels */
397    bool PreferMountedVolumes;         /* Prefer vols mounted rather than new one */
398    bool write_part_after_job;         /* Set to write part after job in SD */
399    bool enabled;                      /* Set if job enabled */
400    bool OptimizeJobScheduling;        /* Set if we should optimize Job scheduling */
401    
402    MSGS      *messages;               /* How and where to send messages */
403    SCHED     *schedule;               /* When -- Automatic schedule */
404    CLIENT    *client;                 /* Who to backup */
405    FILESET   *fileset;                /* What to backup -- Fileset */
406    alist     *storage;                /* Where is device -- list of Storage to be used */
407    POOL      *pool;                   /* Where is media -- Media Pool */
408    POOL      *full_pool;              /* Pool for Full backups */
409    POOL      *inc_pool;               /* Pool for Incremental backups */
410    POOL      *diff_pool;              /* Pool for Differental backups */
411    char      *selection_pattern;
412    int        selection_type;
413    union {
414       JOB       *verify_job;          /* Job name to verify */
415    };
416    JOB       *jobdefs;                /* Job defaults */
417    alist     *run_cmds;               /* Run commands */
418    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
419
420    /* Methods */
421    char *name() const;
422 };
423
424 inline char *JOB::name() const { return hdr.name; }
425
426 #undef  MAX_FOPTS
427 #define MAX_FOPTS 34
428
429 /* File options structure */
430 struct FOPTS {
431    char opts[MAX_FOPTS];              /* options string */
432    alist regex;                       /* regex string(s) */
433    alist regexdir;                    /* regex string(s) for directories */
434    alist regexfile;                   /* regex string(s) for files */
435    alist wild;                        /* wild card strings */
436    alist wilddir;                     /* wild card strings for directories */
437    alist wildfile;                    /* wild card strings for files */
438    alist wildbase;                    /* wild card strings for files without '/' */
439    alist base;                        /* list of base names */
440    alist fstype;                      /* file system type limitation */
441    alist drivetype;                   /* drive type limitation */
442    char *reader;                      /* reader program */
443    char *writer;                      /* writer program */
444 };
445
446
447 /* This is either an include item or an exclude item */
448 struct INCEXE {
449    FOPTS *current_opts;               /* points to current options structure */
450    FOPTS **opts_list;                 /* options list */
451    int num_opts;                      /* number of options items */
452    alist name_list;                   /* filename list -- holds char * */
453 };
454
455 /*
456  *   FileSet Resource
457  *
458  */
459 class FILESET {
460 public:
461    RES   hdr;
462
463    bool new_include;                  /* Set if new include used */
464    INCEXE **include_items;            /* array of incexe structures */
465    int num_includes;                  /* number in array */
466    INCEXE **exclude_items;
467    int num_excludes;
468    bool have_MD5;                     /* set if MD5 initialized */
469    struct MD5Context md5c;            /* MD5 of include/exclude */
470    char MD5[30];                      /* base 64 representation of MD5 */
471    bool ignore_fs_changes;            /* Don't force Full if FS changed */
472    bool enable_vss;                   /* Enable Volume Shadow Copy */
473
474    /* Methods */
475    char *name() const;
476 };
477
478 inline char *FILESET::name() const { return hdr.name; }
479
480 /*
481  *   Schedule Resource
482  *
483  */
484 class SCHED {
485 public:
486    RES   hdr;
487
488    RUN *run;
489 };
490
491 /*
492  *   Counter Resource
493  */
494 class COUNTER {
495 public:
496    RES   hdr;
497
498    int32_t  MinValue;                 /* Minimum value */
499    int32_t  MaxValue;                 /* Maximum value */
500    int32_t  CurrentValue;             /* Current value */
501    COUNTER *WrapCounter;              /* Wrap counter name */
502    CAT     *Catalog;                  /* Where to store */
503    bool     created;                  /* Created in DB */
504    /* Methods */
505    char *name() const;
506 };
507
508 inline char *COUNTER::name() const { return hdr.name; }
509
510 /*
511  *   Pool Resource
512  *
513  */
514 class POOL {
515 public:
516    RES   hdr;
517
518    char *pool_type;                   /* Pool type */
519    char *label_format;                /* Label format string */
520    char *cleaning_prefix;             /* Cleaning label prefix */
521    int32_t LabelType;                 /* Bacula/ANSI/IBM label type */
522    uint32_t max_volumes;              /* max number of volumes */
523    utime_t VolRetention;              /* volume retention period in seconds */
524    utime_t VolUseDuration;            /* duration volume can be used */
525    uint32_t MaxVolJobs;               /* Maximum jobs on the Volume */
526    uint32_t MaxVolFiles;              /* Maximum files on the Volume */
527    uint64_t MaxVolBytes;              /* Maximum bytes on the Volume */
528    utime_t MigrationTime;             /* Time to migrate to next pool */
529    uint64_t MigrationHighBytes;       /* When migration starts */
530    uint64_t MigrationLowBytes;        /* When migration stops */
531    POOL  *NextPool;                   /* Next pool for migration */
532    alist *storage;                    /* Where is device -- list of Storage to be used */
533    bool  use_catalog;                 /* maintain catalog for media */
534    bool  catalog_files;               /* maintain file entries in catalog */
535    bool  use_volume_once;             /* write on volume only once */
536    bool  purge_oldest_volume;         /* purge oldest volume */
537    bool  recycle_oldest_volume;       /* attempt to recycle oldest volume */
538    bool  recycle_current_volume;      /* attempt recycle of current volume */
539    bool  AutoPrune;                   /* default for pool auto prune */
540    bool  Recycle;                     /* default for media recycle yes/no */
541    POOL  *RecyclePool;                /* RecyclePool destination when media is purged */
542    alist *CopyPool;                   /* List of copy pools */
543    CAT *Catalog;                      /* Catalog to be used */
544    /* Methods */
545    char *name() const;
546 };
547
548 inline char *POOL::name() const { return hdr.name; }
549
550
551
552
553 /* Define the Union of all the above
554  * resource structure definitions.
555  */
556 union URES {
557    DIRRES     res_dir;
558    CONRES     res_con;
559    CLIENT     res_client;
560    STORE      res_store;
561    CAT        res_cat;
562    JOB        res_job;
563    FILESET    res_fs;
564    SCHED      res_sch;
565    POOL       res_pool;
566    MSGS       res_msgs;
567    COUNTER    res_counter;
568    DEVICE     res_dev;
569    RES        hdr;
570    RUNSCRIPT  res_runscript;
571 };
572
573
574
575 /* Run structure contained in Schedule Resource */
576 class RUN {
577 public:
578    RUN *next;                         /* points to next run record */
579    int level;                         /* level override */
580    int Priority;                      /* priority override */
581    int job_type;
582    bool spool_data;                   /* Data spooling override */
583    bool spool_data_set;               /* Data spooling override given */
584    bool write_part_after_job;         /* Write part after job override */
585    bool write_part_after_job_set;     /* Write part after job override given */
586    
587    POOL *pool;                        /* Pool override */
588    POOL *full_pool;                   /* Pool override */
589    POOL *inc_pool;                    /* Pool override */
590    POOL *diff_pool;                   /* Pool override */
591    STORE *storage;                    /* Storage override */
592    MSGS *msgs;                        /* Messages override */
593    char *since;
594    int level_no;
595    int minute;                        /* minute to run job */
596    time_t last_run;                   /* last time run */
597    time_t next_run;                   /* next time to run */
598    char hour[nbytes_for_bits(24)];    /* bit set for each hour */
599    char mday[nbytes_for_bits(31)];    /* bit set for each day of month */
600    char month[nbytes_for_bits(12)];   /* bit set for each month */
601    char wday[nbytes_for_bits(7)];     /* bit set for each day of the week */
602    char wom[nbytes_for_bits(5)];      /* week of month */
603    char woy[nbytes_for_bits(54)];     /* week of year */
604 };
605
606 #define GetPoolResWithName(x) ((POOL *)GetResWithName(R_POOL, (x)))
607 #define GetStoreResWithName(x) ((STORE *)GetResWithName(R_STORAGE, (x)))
608 #define GetClientResWithName(x) ((CLIENT *)GetResWithName(R_CLIENT, (x)))
609 #define GetJobResWithName(x) ((JOB *)GetResWithName(R_JOB, (x)))
610 #define GetFileSetResWithName(x) ((FILESET *)GetResWithName(R_FILESET, (x)))
611 #define GetCatalogResWithName(x) ((CAT *)GetResWithName(R_CATALOG, (x)))