]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/jcr.h
ebl use tokyocabinet by default instead of htable
[bacula/bacula] / bacula / src / jcr.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  * Bacula JCR Structure definition for Daemons and the Library
30  *  This definition consists of a "Global" definition common
31  *  to all daemons and used by the library routines, and a
32  *  daemon specific part that is enabled with #defines.
33  *
34  * Kern Sibbald, Nov MM
35  *
36  *   Version $Id$
37  */
38
39
40 #ifndef __JCR_H_
41 #define __JCR_H_ 1
42
43 /* Backup/Verify level code. These are stored in the DB */
44 #define L_FULL                   'F'  /* Full backup */
45 #define L_INCREMENTAL            'I'  /* since last backup */
46 #define L_DIFFERENTIAL           'D'  /* since last full backup */
47 #define L_SINCE                  'S'
48 #define L_VERIFY_CATALOG         'C'  /* verify from catalog */
49 #define L_VERIFY_INIT            'V'  /* verify save (init DB) */
50 #define L_VERIFY_VOLUME_TO_CATALOG 'O'  /* verify Volume to catalog entries */
51 #define L_VERIFY_DISK_TO_CATALOG 'd'  /* verify Disk attributes to catalog */
52 #define L_VERIFY_DATA            'A'  /* verify data on volume */
53 #define L_BASE                   'B'  /* Base level job */
54 #define L_NONE                   ' '  /* None, for Restore and Admin */
55
56
57 /* Job Types. These are stored in the DB */
58 #define JT_BACKUP                'B'  /* Backup Job */
59 #define JT_MIGRATED_JOB          'M'  /* A previous backup job that was migrated */
60 #define JT_VERIFY                'V'  /* Verify Job */
61 #define JT_RESTORE               'R'  /* Restore Job */
62 #define JT_CONSOLE               'c'  /* console program */
63 #define JT_SYSTEM                'I'  /* internal system "job" */
64 #define JT_ADMIN                 'D'  /* admin job */
65 #define JT_ARCHIVE               'A'  /* Archive Job */
66 #define JT_COPY                  'C'  /* Copy Job */
67 #define JT_MIGRATE               'g'  /* Migration Job */
68 #define JT_SCAN                  'S'  /* Scan Job */
69
70 /* Job Status. Some of these are stored in the DB */
71 #define JS_Created               'C'  /* created but not yet running */
72 #define JS_Running               'R'  /* running */
73 #define JS_Blocked               'B'  /* blocked */
74 #define JS_Terminated            'T'  /* terminated normally */
75 #define JS_ErrorTerminated       'E'  /* Job terminated in error */
76 #define JS_Error                 'e'  /* Non-fatal error */
77 #define JS_FatalError            'f'  /* Fatal error */
78 #define JS_Differences           'D'  /* Verify differences */
79 #define JS_Canceled              'A'  /* canceled by user */
80 #define JS_WaitFD                'F'  /* waiting on File daemon */
81 #define JS_WaitSD                'S'  /* waiting on the Storage daemon */
82 #define JS_WaitMedia             'm'  /* waiting for new media */
83 #define JS_WaitMount             'M'  /* waiting for Mount */
84 #define JS_WaitStoreRes          's'  /* Waiting for storage resource */
85 #define JS_WaitJobRes            'j'  /* Waiting for job resource */
86 #define JS_WaitClientRes         'c'  /* Waiting for Client resource */
87 #define JS_WaitMaxJobs           'd'  /* Waiting for maximum jobs */
88 #define JS_WaitStartTime         't'  /* Waiting for start time */
89 #define JS_WaitPriority          'p'  /* Waiting for higher priority jobs to finish */
90 #define JS_AttrDespooling        'a'  /* SD despooling attributes */
91 #define JS_AttrInserting         'i'  /* Doing batch insert file records */
92 #define JS_DataDespooling        'l'  /* Doing data despooling */
93 #define JS_DataCommitting        'L'  /* Committing data (last despool) */
94
95 /* Migration selection types */
96 enum {
97    MT_SMALLEST_VOL = 1,
98    MT_OLDEST_VOL,
99    MT_POOL_OCCUPANCY,
100    MT_POOL_TIME,
101    MT_CLIENT,
102    MT_VOLUME,
103    MT_JOB,
104    MT_SQLQUERY
105 };
106
107 #define job_canceled(jcr) \
108   (jcr->JobStatus == JS_Canceled || \
109    jcr->JobStatus == JS_ErrorTerminated || \
110    jcr->JobStatus == JS_FatalError)
111
112 #define job_waiting(jcr) \
113   (jcr->JobStatus == JS_WaitFD       || \
114    jcr->JobStatus == JS_WaitSD       || \
115    jcr->JobStatus == JS_WaitMedia    || \
116    jcr->JobStatus == JS_WaitMount    || \
117    jcr->JobStatus == JS_WaitStoreRes || \
118    jcr->JobStatus == JS_WaitJobRes   || \
119    jcr->JobStatus == JS_WaitClientRes|| \
120    jcr->JobStatus == JS_WaitMaxJobs  || \
121    jcr->JobStatus == JS_WaitPriority || \
122    jcr->SDJobStatus == JS_WaitMedia  || \
123    jcr->SDJobStatus == JS_WaitMount  || \
124    jcr->SDJobStatus == JS_WaitMaxJobs)
125
126
127
128 #define foreach_jcr(jcr) \
129    for (jcr=jcr_walk_start(); jcr; (jcr=jcr_walk_next(jcr)) )
130
131 #define endeach_jcr(jcr) jcr_walk_end(jcr)
132
133 #define SD_APPEND 1
134 #define SD_READ   0
135
136 /* Forward referenced structures */
137 class JCR;
138 struct FF_PKT;
139 struct B_DB;
140 struct ATTR_DBR;
141 struct Plugin;
142 struct save_pkt;
143
144 #ifdef FILE_DAEMON
145 class htable;
146
147 struct CRYPTO_CTX {
148    bool pki_sign;                     /* Enable PKI Signatures? */
149    bool pki_encrypt;                  /* Enable PKI Encryption? */
150    DIGEST *digest;                    /* Last file's digest context */
151    X509_KEYPAIR *pki_keypair;         /* Encryption key pair */
152    alist *pki_signers;                /* Trusted Signers */
153    alist *pki_recipients;             /* Trusted Recipients */
154    CRYPTO_SESSION *pki_session;       /* PKE Public Keys + Symmetric Session Keys */
155    POOLMEM *pki_session_encoded;      /* Cached DER-encoded copy of pki_session */
156    int32_t pki_session_encoded_size;  /* Size of DER-encoded pki_session */
157    POOLMEM *crypto_buf;               /* Encryption/Decryption buffer */
158 };
159 #endif
160
161 typedef void (JCR_free_HANDLER)(JCR *jcr);
162
163 /* Job Control Record (JCR) */
164 class JCR {
165 private:
166    pthread_mutex_t mutex;             /* jcr mutex */
167    volatile int _use_count;           /* use count */
168 public:
169    void lock() {P(mutex); };
170    void unlock() {V(mutex); };
171    void inc_use_count(void) {lock(); _use_count++; unlock(); };
172    void dec_use_count(void) {lock(); _use_count--; unlock(); };
173    int  use_count() { return _use_count; };
174    void init_mutex(void) {pthread_mutex_init(&mutex, NULL); };
175    void destroy_mutex(void) {pthread_mutex_destroy(&mutex); };
176    bool is_job_canceled() {return job_canceled(this); };
177
178    /* Global part of JCR common to all daemons */
179    dlink link;                        /* JCR chain link */
180    pthread_t my_thread_id;            /* id of thread controlling jcr */
181    BSOCK *dir_bsock;                  /* Director bsock or NULL if we are him */
182    BSOCK *store_bsock;                /* Storage connection socket */
183    BSOCK *file_bsock;                 /* File daemon connection socket */
184    JCR_free_HANDLER *daemon_free_jcr; /* Local free routine */
185    dlist *msg_queue;                  /* Queued messages */
186    alist job_end_push;                /* Job end pushed calls */
187    bool dequeuing;                    /* dequeuing messages */
188    POOLMEM *VolumeName;               /* Volume name desired -- pool_memory */
189    POOLMEM *errmsg;                   /* edited error message */
190    char Job[MAX_NAME_LENGTH];         /* Unique name of this Job */
191    char event[MAX_NAME_LENGTH];       /* Current event */
192    uint32_t JobId;                    /* Director's JobId */
193    uint32_t VolSessionId;
194    uint32_t VolSessionTime;
195    uint32_t JobFiles;                 /* Number of files written, this job */
196    uint32_t JobErrors;                /* */
197    uint64_t JobBytes;                 /* Number of bytes processed this job */
198    uint64_t ReadBytes;                /* Bytes read -- before compression */
199    uint32_t Errors;                   /* Number of non-fatal errors */
200    volatile int JobStatus;            /* ready, running, blocked, terminated */
201    int JobType;                       /* backup, restore, verify ... */
202    int JobLevel;                      /* Job level */
203    int JobPriority;                   /* Job priority */
204    time_t sched_time;                 /* job schedule time, i.e. when it should start */
205    time_t start_time;                 /* when job actually started */
206    time_t run_time;                   /* used for computing speed */
207    time_t end_time;                   /* job end time */
208    time_t wait_time;                  /* when job have started to wait */
209    POOLMEM *client_name;              /* client name */
210    POOLMEM *RestoreBootstrap;         /* Bootstrap file to restore */
211    POOLMEM *stime;                    /* start time for incremental/differential */
212    char *sd_auth_key;                 /* SD auth key */
213    MSGS *jcr_msgs;                    /* Copy of message resource -- actually used */
214    uint32_t ClientId;                 /* Client associated with Job */
215    char *where;                       /* prefix to restore files to */
216    char *RegexWhere;                  /* file relocation in restore */
217    alist *where_bregexp;              /* BREGEXP alist for path manipulation */
218    int cached_pnl;                    /* cached path length */
219    POOLMEM *cached_path;              /* cached path */
220    bool prefix_links;                 /* Prefix links with Where path */
221    bool gui;                          /* set if gui using console */
222    bool authenticated;                /* set when client authenticated */
223    void *Python_job;                  /* Python Job Object */
224    void *Python_events;               /* Python Events Object */
225
226    bool cached_attribute;             /* set if attribute is cached */
227    POOLMEM *attr;                     /* Attribute string from SD */
228    B_DB *db;                          /* database pointer */
229    B_DB *db_batch;                    /* database pointer for batch insert */
230    ATTR_DBR *ar;                      /* DB attribute record */
231    guid_list *id_list;                /* User/group id to name list */
232    bool accurate;                     /* true if job is accurate */
233
234    void *plugin_ctx_list;             /* list of contexts for plugins */
235    void *plugin_ctx;                  /* current plugin context */
236    Plugin *plugin;                    /* plugin instance */
237    save_pkt *plugin_sp;               /* plugin save packet */
238    char *plugin_options;              /* user set options for plugin */
239
240    /* Daemon specific part of JCR */
241    /* This should be empty in the library */
242
243 #ifdef DIRECTOR_DAEMON
244    /* Director Daemon specific data part of JCR */
245    pthread_t SD_msg_chan;             /* Message channel thread id */
246    pthread_cond_t term_wait;          /* Wait for job termination */
247    workq_ele_t *work_item;            /* Work queue item if scheduled */
248    volatile bool sd_msg_thread_done;  /* Set when Storage message thread terms */
249    BSOCK *ua;                         /* User agent */
250    JOB *job;                          /* Job resource */
251    JOB *verify_job;                   /* Job resource of verify previous job */
252    alist *rstorage;                   /* Read storage possibilities */
253    STORE *rstore;                     /* Selected read storage */
254    alist *wstorage;                   /* Write storage possibilities */
255    STORE *wstore;                     /* Selected write storage */
256    CLIENT *client;                    /* Client resource */
257    POOL *pool;                        /* Pool resource = write for migration */
258    POOL *rpool;                       /* Read pool. Used only in migration */
259    POOL *full_pool;                   /* Full backup pool resource */
260    POOL *inc_pool;                    /* Incremental backup pool resource */
261    POOL *diff_pool;                   /* Differential backup pool resource */
262    bool run_pool_override;
263    bool run_full_pool_override;
264    bool run_inc_pool_override;
265    bool run_diff_pool_override;
266    FILESET *fileset;                  /* FileSet resource */
267    CAT *catalog;                      /* Catalog resource */
268    MSGS *messages;                    /* Default message handler */
269    uint32_t SDJobFiles;               /* Number of files written, this job */
270    uint64_t SDJobBytes;               /* Number of bytes processed this job */
271    uint32_t SDErrors;                 /* Number of non-fatal errors */
272    volatile int SDJobStatus;          /* Storage Job Status */
273    volatile int FDJobStatus;          /* File daemon Job Status */
274    uint32_t ExpectedFiles;            /* Expected restore files */
275    uint32_t MediaId;                  /* DB record IDs associated with this job */
276    FileId_t FileId;                   /* Last file id inserted */
277    uint32_t FileIndex;                /* Last FileIndex processed */
278    POOLMEM *fname;                    /* name to put into catalog */
279    JOB_DBR jr;                        /* Job DB record for current job */
280    JOB_DBR previous_jr;               /* previous job database record */
281    JOB *previous_job;                 /* Job resource of migration previous job */
282    JCR *mig_jcr;                      /* JCR for migration/copy job */
283    char FSCreateTime[MAX_TIME_LENGTH]; /* FileSet CreateTime as returned from DB */
284    char since[MAX_TIME_LENGTH];       /* since time */
285    union {
286       JobId_t RestoreJobId;           /* Id specified by UA */
287       JobId_t MigrateJobId;
288    };
289    POOLMEM *client_uname;             /* client uname */
290    POOLMEM *pool_source;              /* Where pool came from */
291    POOLMEM *rpool_source;             /* Where migrate read pool came from */
292    POOLMEM *rstore_source;            /* Where read storage came from */
293    POOLMEM *wstore_source;            /* Where write storage came from */
294    POOLMEM *catalog_source;           /* Where catalog came from */
295    int replace;                       /* Replace option */
296    int NumVols;                       /* Number of Volume used in pool */
297    int reschedule_count;              /* Number of times rescheduled */
298    int FDVersion;                     /* File daemon version number */
299    int64_t spool_size;                /* Spool size for this job */
300    bool spool_data;                   /* Spool data in SD */
301    bool acquired_resource_locks;      /* set if resource locks acquired */
302    bool term_wait_inited;             /* Set when cond var inited */
303    bool fn_printed;                   /* printed filename */
304    bool write_part_after_job;         /* Write part after job in SD */
305    bool needs_sd;                     /* set if SD needed by Job */
306    bool cloned;                       /* set if cloned */
307    bool unlink_bsr;                   /* Unlink bsr file created */
308    bool VSS;                          /* VSS used by FD */
309    bool Encrypt;                      /* Encryption used by FD */
310    bool stats_enabled;                /* Keep all job records in a table for long term statistics */
311 #endif /* DIRECTOR_DAEMON */
312
313
314 #ifdef FILE_DAEMON
315    /* File Daemon specific part of JCR */
316    uint32_t num_files_examined;       /* files examined this job */
317    POOLMEM *last_fname;               /* last file saved/verified */
318    POOLMEM *acl_text;                 /* text of ACL for backup */
319    int last_type;                     /* type of last file saved/verified */
320    /*********FIXME********* add missing files and files to be retried */
321    int incremental;                   /* set if incremental for SINCE */
322    time_t mtime;                      /* begin time for SINCE */
323    int listing;                       /* job listing in estimate */
324    long Ticket;                       /* Ticket */
325    char *big_buf;                     /* I/O buffer */
326    POOLMEM *compress_buf;             /* Compression buffer */
327    int32_t compress_buf_size;         /* Length of compression buffer */
328    void *pZLIB_compress_workset;      /* zlib compression session data */
329    int replace;                       /* Replace options */
330    int buf_size;                      /* length of buffer */
331    FF_PKT *ff;                        /* Find Files packet */
332    char stored_addr[MAX_NAME_LENGTH]; /* storage daemon address */
333    uint32_t StartFile;
334    uint32_t EndFile;
335    uint32_t StartBlock;
336    uint32_t EndBlock;
337    pthread_t heartbeat_id;            /* id of heartbeat thread */
338    BSOCK *hb_bsock;                   /* duped SD socket */
339    BSOCK *hb_dir_bsock;               /* duped DIR socket */
340    alist *RunScripts;                 /* Commands to run before and after job */
341    CRYPTO_CTX crypto;                 /* Crypto ctx */
342    DIRRES* director;                  /* Director resource */
343    bool VSS;                          /* VSS used by FD */
344    TCADB *file_list;                  /* Previous file list (accurate mode) */
345    POOLMEM *hash_name;
346 #endif /* FILE_DAEMON */
347
348
349 #ifdef STORAGE_DAEMON
350    /* Storage Daemon specific part of JCR */
351    JCR *next_dev;                     /* next JCR attached to device */
352    JCR *prev_dev;                     /* previous JCR attached to device */
353    char *dir_auth_key;                /* Dir auth key */
354    pthread_cond_t job_start_wait;     /* Wait for FD to start Job */
355    int type;
356    DCR *read_dcr;                     /* device context for reading */
357    DCR *dcr;                          /* device context record */
358    alist *dcrs;                       /* list of dcrs open */
359    POOLMEM *job_name;                 /* base Job name (not unique) */
360    POOLMEM *fileset_name;             /* FileSet */
361    POOLMEM *fileset_md5;              /* MD5 for FileSet */
362    VOL_LIST *VolList;                 /* list to read */
363    int32_t NumWriteVolumes;           /* number of volumes written */
364    int32_t NumReadVolumes;            /* total number of volumes to read */
365    int32_t CurReadVolume;             /* current read volume number */
366    int label_errors;                  /* count of label errors */
367    bool session_opened;
368    long Ticket;                       /* ticket for this job */
369    bool ignore_label_errors;          /* ignore Volume label errors */
370    bool spool_attributes;             /* set if spooling attributes */
371    bool no_attributes;                /* set if no attributes wanted */
372    int64_t spool_size;                /* Spool size for this job */
373    bool spool_data;                   /* set to spool data */
374    int CurVol;                        /* Current Volume count */
375    DIRRES* director;                  /* Director resource */
376    alist *write_store;                /* list of write storage devices sent by DIR */ 
377    alist *read_store;                 /* list of read devices sent by DIR */
378    alist *reserve_msgs;               /* reserve fail messages */
379    bool write_part_after_job;         /* Set to write part after job */
380    bool PreferMountedVols;            /* Prefer mounted vols rather than new */
381    
382    uint32_t FileId;                   /* Last file id inserted */
383
384    /* Parmaters for Open Read Session */
385    BSR *bsr;                          /* Bootstrap record -- has everything */
386    bool mount_next_volume;            /* set to cause next volume mount */
387    uint32_t read_VolSessionId;
388    uint32_t read_VolSessionTime;
389    uint32_t read_StartFile;
390    uint32_t read_EndFile;
391    uint32_t read_StartBlock;
392    uint32_t read_EndBlock;
393    /* Device wait times */
394    int min_wait;
395    int max_wait;
396    int max_num_wait;
397    int wait_sec;
398    int rem_wait_sec;
399    int num_wait;
400
401 #endif /* STORAGE_DAEMON */
402
403 };
404
405 /*
406  * Structure for all daemons that keeps some summary
407  *  info on the last job run.
408  */
409 struct s_last_job {
410    dlink link;
411    int Errors;                        /* FD/SD errors */
412    int JobType;
413    int JobStatus;
414    int JobLevel;
415    uint32_t JobId;
416    uint32_t VolSessionId;
417    uint32_t VolSessionTime;
418    uint32_t JobFiles;
419    uint64_t JobBytes;
420    time_t start_time;
421    time_t end_time;
422    char Job[MAX_NAME_LENGTH];
423 };
424
425 extern struct s_last_job last_job;
426 extern DLL_IMP_EXP dlist * last_jobs;
427
428
429 /* The following routines are found in lib/jcr.c */
430 extern bool init_jcr_subsystem(void);
431 extern JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr);
432 extern JCR *get_jcr_by_id(uint32_t JobId);
433 extern JCR *get_jcr_by_session(uint32_t SessionId, uint32_t SessionTime);
434 extern JCR *get_jcr_by_partial_name(char *Job);
435 extern JCR *get_jcr_by_full_name(char *Job);
436 extern JCR *get_next_jcr(JCR *jcr);
437 extern void set_jcr_job_status(JCR *jcr, int JobStatus);
438 extern int DLL_IMP_EXP num_jobs_run;
439
440 #ifdef DEBUG
441 extern void b_free_jcr(const char *file, int line, JCR *jcr);
442 #define free_jcr(jcr) b_free_jcr(__FILE__, __LINE__, (jcr))
443 #else
444 extern void free_jcr(JCR *jcr);
445 #endif
446
447 #endif /* __JCR_H_ */