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