/*
- Bacula® - The Network Backup Solution
-
- Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
-
- The main author of Bacula is Kern Sibbald, with contributions from
- many others, a complete list can be found in the file AUTHORS.
- This program is Free Software; you can redistribute it and/or
- modify it under the terms of version three of the GNU Affero General Public
- License as published by the Free Software Foundation and included
- in the file LICENSE.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301, USA.
-
- Bacula® is a registered trademark of Kern Sibbald.
- The licensor of Bacula is the Free Software Foundation Europe
- (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
- Switzerland, email:ftf@fsfeurope.org.
+ Bacula(R) - The Network Backup Solution
+
+ Copyright (C) 2000-2017 Kern Sibbald
+
+ The original author of Bacula is Kern Sibbald, with contributions
+ from many others, a complete list can be found in the file AUTHORS.
+
+ You may use this file and others of this release according to the
+ license defined in the LICENSE file, which includes the Affero General
+ Public License, v3.0 ("AGPLv3") and some additional permissions and
+ terms pursuant to its AGPLv3 Section 7.
+
+ This notice must be preserved when any source code is
+ conveyed and/or propagated.
+
+ Bacula(R) is a registered trademark of Kern Sibbald.
*/
/*
* Bacula JCR Structure definition for Daemons and the Library
* to all daemons and used by the library routines, and a
* daemon specific part that is enabled with #defines.
*
- * Kern Sibbald, Nov MM
- *
+ * Written by Kern Sibbald, Nov MM
*/
#define JT_MIGRATE 'g' /* Migration Job */
#define JT_SCAN 'S' /* Scan Job */
+/* Used to handle ClientAcl in various commands, not stored in the DB */
+#define JT_BACKUP_RESTORE '*' /* Backup or Restore Job */
+
/* Job Status. Some of these are stored in the DB */
#define JS_Canceled 'A' /* canceled by user */
#define JS_Blocked 'B' /* blocked */
#define JS_DataDespooling 'l' /* Doing data despooling */
#define JS_WaitMedia 'm' /* waiting for new media */
#define JS_WaitPriority 'p' /* Waiting for higher priority jobs to finish */
+#define JS_WaitDevice 'q' /* Queued waiting for device */
#define JS_WaitStoreRes 's' /* Waiting for storage resource */
-#define JS_WaitStartTime 't' /* Waiting for start time */
+#define JS_WaitStartTime 't' /* Waiting for start time */
+#define JS_CloudUpload 'u' /* Cloud upload */
+#define JS_CloudDownload 'w' /* Cloud download */
-/* Migration selection types */
+/* Migration selection types. Do not change the order. */
enum {
MT_SMALLEST_VOL = 1,
MT_OLDEST_VOL,
)
#define job_waiting(jcr) \
- (jcr->JobStatus == JS_WaitFD || \
- jcr->JobStatus == JS_WaitSD || \
- jcr->JobStatus == JS_WaitMedia || \
- jcr->JobStatus == JS_WaitMount || \
- jcr->JobStatus == JS_WaitStoreRes || \
- jcr->JobStatus == JS_WaitJobRes || \
- jcr->JobStatus == JS_WaitClientRes|| \
- jcr->JobStatus == JS_WaitMaxJobs || \
- jcr->JobStatus == JS_WaitPriority || \
- jcr->SDJobStatus == JS_WaitMedia || \
- jcr->SDJobStatus == JS_WaitMount || \
- jcr->SDJobStatus == JS_WaitMaxJobs)
+ (jcr->job_started && \
+ (jcr->JobStatus == JS_WaitFD || \
+ jcr->JobStatus == JS_WaitSD || \
+ jcr->JobStatus == JS_WaitMedia || \
+ jcr->JobStatus == JS_WaitMount || \
+ jcr->JobStatus == JS_WaitStoreRes || \
+ jcr->JobStatus == JS_WaitJobRes || \
+ jcr->JobStatus == JS_WaitClientRes || \
+ jcr->JobStatus == JS_WaitMaxJobs || \
+ jcr->JobStatus == JS_WaitPriority || \
+ jcr->SDJobStatus == JS_WaitMedia || \
+ jcr->SDJobStatus == JS_WaitMount || \
+ jcr->SDJobStatus == JS_WaitDevice || \
+ jcr->SDJobStatus == JS_CloudUpload || \
+ jcr->SDJobStatus == JS_CloudDownload || \
+ jcr->SDJobStatus == JS_WaitMaxJobs))
#define endeach_jcr(jcr) jcr_walk_end(jcr)
-#define SD_APPEND 1
-#define SD_READ 0
+#define SD_APPEND true
+#define SD_READ false
/* Forward referenced structures */
class JCR;
+class BSOCK;
struct FF_PKT;
-class B_DB;
+class BDB;
struct ATTR_DBR;
-struct Plugin;
+class Plugin;
struct save_pkt;
struct bpContext;
-struct xattr_private_data_t;
+
#ifdef FILE_DAEMON
+class VSSClient;
class htable;
-struct acl_data_t;
-struct xattr_data_t;
+class BACL;
+class BXATTR;
+class snapshot_manager;
struct CRYPTO_CTX {
bool pki_sign; /* Enable PKI Signatures? */
class JCR {
private:
pthread_mutex_t mutex; /* jcr mutex */
+ pthread_mutex_t mutex_auth; /* used during authentication */
volatile int32_t _use_count; /* use count */
int32_t m_JobType; /* backup, restore, verify ... */
int32_t m_JobLevel; /* Job level */
public:
void lock() {P(mutex); };
void unlock() {V(mutex); };
+ void lock_auth() {P(mutex_auth);};
+ void unlock_auth() {V(mutex_auth);};
void inc_use_count(void) {lock(); _use_count++; unlock(); };
void dec_use_count(void) {lock(); _use_count--; unlock(); };
int32_t use_count() const { return _use_count; };
- void init_mutex(void) {pthread_mutex_init(&mutex, NULL); };
- void destroy_mutex(void) {pthread_mutex_destroy(&mutex); };
+ void init_mutex(void) {
+ pthread_mutex_init(&mutex, NULL);
+ pthread_mutex_init(&mutex_auth, NULL);
+ };
+ void destroy_mutex(void) {
+ pthread_mutex_destroy(&mutex_auth);
+ pthread_mutex_destroy(&mutex);
+ };
+ bool is_internal_job() {return (JobId == 0 || m_JobType == JT_SYSTEM || m_JobType == JT_CONSOLE); };
bool is_job_canceled() {return job_canceled(this); };
bool is_canceled() {return job_canceled(this); };
bool is_incomplete() { return JobStatus == JS_Incomplete; };
bool is_JobLevel(int32_t JobLevel) { return JobLevel == m_JobLevel; };
bool is_JobType(int32_t JobType) { return JobType == m_JobType; };
bool is_JobStatus(int32_t aJobStatus) { return aJobStatus == JobStatus; };
- void set_JobLevel(int32_t JobLevel) { m_JobLevel = JobLevel; };
void setJobLevel(int32_t JobLevel) { m_JobLevel = JobLevel; };
- void set_JobType(int32_t JobType) { m_JobType = JobType; };
void setJobType(int32_t JobType) { m_JobType = JobType; };
+ void forceJobStatus(int32_t aJobStatus) { JobStatus = aJobStatus; };
+ void setJobStarted();
int32_t getJobType() const { return m_JobType; };
int32_t getJobLevel() const { return m_JobLevel; };
int32_t getJobStatus() const { return JobStatus; };
bool no_client_used() const {
- return (m_JobType == JT_MIGRATE || m_JobType == JT_COPY ||
- m_JobLevel == L_VIRTUAL_FULL);
+ return (m_JobLevel == L_VIRTUAL_FULL);
};
+ bool can_be_stopped(); /* in lib/jcr.c */
const char *get_OperationName(); /* in lib/jcr.c */
const char *get_ActionName(bool past); /* in lib/jcr.c */
void setJobStatus(int JobStatus); /* in lib/jcr.c */
+ bool sendJobStatus(); /* in lib/jcr.c */
+ bool sendJobStatus(int JobStatus); /* in lib/jcr.c */
bool JobReads(); /* in lib/jcr.c */
void my_thread_send_signal(int sig); /* in lib/jcr.c */
void set_killable(bool killable); /* in lib/jcr.c */
uint32_t VolSessionTime;
uint32_t JobFiles; /* Number of files written, this job */
uint32_t JobErrors; /* Number of non-fatal errors this job */
+ uint32_t SDErrors; /* Number of non-fatal SD errors */
uint32_t JobWarnings; /* Number of warning messages */
+ uint32_t LastRate; /* Last sample bytes/sec */
uint64_t JobBytes; /* Number of bytes processed this job */
+ uint64_t LastJobBytes; /* Last sample number bytes */
uint64_t ReadBytes; /* Bytes read -- before compression */
+ uint64_t CommBytes; /* FD comm line bytes sent to SD */
+ uint64_t CommCompressedBytes; /* FD comm line compressed bytes sent to SD */
FileId_t FileId; /* Last FileId used */
volatile int32_t JobStatus; /* ready, running, blocked, terminated */
int32_t JobPriority; /* Job priority */
time_t sched_time; /* job schedule time, i.e. when it should start */
+ time_t initial_sched_time; /* original sched time before any reschedules are done */
time_t start_time; /* when job actually started */
time_t run_time; /* used for computing speed */
+ time_t last_time; /* Last sample time */
time_t end_time; /* job end time */
time_t wait_time_sum; /* cumulative wait time since job start */
time_t wait_time; /* timestamp when job have started to wait */
+ time_t job_started_time; /* Time when the MaxRunTime start to count */
POOLMEM *client_name; /* client name */
POOLMEM *JobIds; /* User entered string of JobIds */
POOLMEM *RestoreBootstrap; /* Bootstrap file to restore */
bool cached_attribute; /* set if attribute is cached */
bool batch_started; /* is batch mode already started ? */
bool cmd_plugin; /* Set when processing a command Plugin = */
+ bool opt_plugin; /* Set when processing an option Plugin = */
bool keep_path_list; /* Keep newly created path in a hash */
bool accurate; /* true if job is accurate */
bool HasBase; /* True if job use base jobs */
- bool incomplete; /* finishing an incomplete job */
+ bool rerunning; /* rerunning an incomplete job */
+ bool job_started; /* Set when the job is actually started */
+ bool sd_calls_client; /* Set for SD to call client (FD/SD) */
+ bool exiting; /* Set when exiting */
void *Python_job; /* Python Job Object */
void *Python_events; /* Python Events Object */
POOLMEM *attr; /* Attribute string from SD */
- B_DB *db; /* database pointer */
- B_DB *db_batch; /* database pointer for batch and accurate */
+ BDB *db; /* database pointer */
+ BDB *db_batch; /* database pointer for batch and accurate */
uint64_t nb_base_files; /* Number of base files */
uint64_t nb_base_files_used; /* Number of useful files in base */
POOLMEM *comment; /* Comment for this Job */
int64_t max_bandwidth; /* Bandwidth limit for this Job */
htable *path_list; /* Directory list (used by findlib) */
+ int job_uid; /* UID used during job session */
+ char *job_user; /* Specific permission for a job */
+ char *job_group; /* Specific permission for a job */
+ POOLMEM *StatusErrMsg; /* Error message displayed in the job report */
+ uint32_t getErrors() { return JobErrors + SDErrors; }; /* Get error count */
/* Daemon specific part of JCR */
/* This should be empty in the library */
#ifdef DIRECTOR_DAEMON
/* Director Daemon specific data part of JCR */
+ bool SD_msg_chan_started; /* True if the msg thread is started */
pthread_t SD_msg_chan; /* Message channel thread id */
pthread_cond_t term_wait; /* Wait for job termination */
workq_ele_t *work_item; /* Work queue item if scheduled */
- volatile bool sd_msg_thread_done; /* Set when Storage message thread done */
BSOCK *ua; /* User agent */
JOB *job; /* Job resource */
JOB *verify_job; /* Job resource of verify previous job */
+ alist *plugin_config; /* List of ConfigFile needed for restore */
alist *rstorage; /* Read storage possibilities */
STORE *rstore; /* Selected read storage */
alist *wstorage; /* Write storage possibilities */
STORE *wstore; /* Selected write storage */
CLIENT *client; /* Client resource */
POOL *pool; /* Pool resource = write for migration */
+ POOL *next_pool; /* Next pool override */
POOL *rpool; /* Read pool. Used only in migration */
POOL *full_pool; /* Full backup pool resource */
+ POOL *vfull_pool; /* Virtual Full backup pool resource */
POOL *inc_pool; /* Incremental backup pool resource */
POOL *diff_pool; /* Differential backup pool resource */
FILESET *fileset; /* FileSet resource */
MSGS *messages; /* Default message handler */
uint32_t SDJobFiles; /* Number of files written, this job */
uint64_t SDJobBytes; /* Number of bytes processed this job */
- uint32_t SDErrors; /* Number of non-fatal errors */
volatile int32_t SDJobStatus; /* Storage Job Status */
volatile int32_t FDJobStatus; /* File daemon Job Status */
uint32_t ExpectedFiles; /* Expected restore files */
uint32_t MediaId; /* DB record IDs associated with this job */
uint32_t FileIndex; /* Last FileIndex processed */
+ utime_t MaxRunSchedTime; /* max run time in seconds from Initial Scheduled time */
POOLMEM *fname; /* name to put into catalog */
+ POOLMEM *component_fname; /* Component info file name */
+ POOLMEM *media_type; /* Set if user supplied Storage */
+ FILE *component_fd; /* Component info file desc */
JOB_DBR jr; /* Job DB record for current job */
JOB_DBR previous_jr; /* previous job database record */
JOB *previous_job; /* Job resource of migration previous job */
- JCR *mig_jcr; /* JCR for migration/copy job */
+ JCR *wjcr; /* JCR for migration/copy write job */
char FSCreateTime[MAX_TIME_LENGTH]; /* FileSet CreateTime as returned from DB */
char since[MAX_TIME_LENGTH]; /* since time */
+ char PrevJob[MAX_NAME_LENGTH]; /* Previous job name assiciated with since time */
union {
JobId_t RestoreJobId; /* Id specified by UA */
JobId_t MigrateJobId;
};
POOLMEM *client_uname; /* client uname */
POOLMEM *pool_source; /* Where pool came from */
+ POOLMEM *next_pool_source; /* Where next pool came from */
POOLMEM *rpool_source; /* Where migrate read pool came from */
POOLMEM *rstore_source; /* Where read storage came from */
POOLMEM *wstore_source; /* Where write storage came from */
POOLMEM *catalog_source; /* Where catalog came from */
- uint32_t replace; /* Replace option */
+ POOLMEM *next_vol_list; /* Volumes previously requested */
+ int32_t replace; /* Replace option */
int32_t NumVols; /* Number of Volume used in pool */
int32_t reschedule_count; /* Number of times rescheduled */
int32_t FDVersion; /* File daemon version number */
+ int32_t SDVersion; /* Storage daemon version number */
int64_t spool_size; /* Spool size for this job */
+ utime_t snapshot_retention; /* Snapshot retention (from Client/Job resource) */
+ volatile bool sd_msg_thread_done; /* Set when Storage message thread done */
+ bool wasVirtualFull; /* set if job was VirtualFull */
+ bool IgnoreDuplicateJobChecking; /* set in migration jobs */
bool spool_data; /* Spool data in SD */
bool acquired_resource_locks; /* set if resource locks acquired */
bool term_wait_inited; /* Set when cond var inited */
bool needs_sd; /* set if SD needed by Job */
bool cloned; /* set if cloned */
bool unlink_bsr; /* Unlink bsr file created */
- bool VSS; /* VSS used by FD */
+ bool Snapshot; /* Snapshot used by FD (VSS on Windows) */
bool Encrypt; /* Encryption used by FD */
bool stats_enabled; /* Keep all job records in a table for long term statistics */
bool no_maxtime; /* Don't check Max*Time for this JCR */
bool keep_sd_auth_key; /* Clear or not the SD auth key after connection*/
bool use_accurate_chksum; /* Use or not checksum option in accurate code */
bool run_pool_override;
+ bool cmdline_next_pool_override; /* Next pool is overridden */
+ bool run_next_pool_override; /* Next pool is overridden */
bool run_full_pool_override;
+ bool run_vfull_pool_override;
bool run_inc_pool_override;
bool run_diff_pool_override;
bool sd_canceled; /* set if SD canceled */
+ bool RescheduleIncompleteJobs; /* set if incomplete can be rescheduled */
+ bool use_all_JobIds; /* Use all jobids present in command line */
+ bool sd_client; /* This job runs as SD client */
+ bool dummy_jobmedia; /* Dummy JobMedia written */
#endif /* DIRECTOR_DAEMON */
#ifdef FILE_DAEMON
/* File Daemon specific part of JCR */
+ BSOCK *sd_calls_client_bsock; /* Socket used by SDCallsClient feature */
uint32_t num_files_examined; /* files examined this job */
POOLMEM *last_fname; /* last file saved/verified */
POOLMEM *job_metadata; /* VSS job metadata */
- acl_data_t *acl_data; /* ACLs for backup/restore */
- xattr_data_t *xattr_data; /* Extended Attributes for backup/restore */
+ pthread_cond_t job_start_wait; /* Wait for SD to start Job */
+ BACL *bacl; /* ACLs for backup/restore */
+ BXATTR *bxattr; /* Extended Attributes for backup/restore */
int32_t last_type; /* type of last file saved/verified */
int incremental; /* set if incremental for SINCE */
+ time_t last_stat_time; /* Last time stats sent to Dir */
+ time_t stat_interval; /* Stats send interval */
utime_t mtime; /* begin time for SINCE */
int listing; /* job listing in estimate */
long Ticket; /* Ticket */
POOLMEM *compress_buf; /* Compression buffer */
int32_t compress_buf_size; /* Length of compression buffer */
void *pZLIB_compress_workset; /* zlib compression session data */
+ void *LZO_compress_workset; /* lzo compression session data */
int32_t replace; /* Replace options */
int32_t buf_size; /* length of buffer */
FF_PKT *ff; /* Find Files packet */
char stored_addr[MAX_NAME_LENGTH]; /* storage daemon address */
+ char PrevJob[MAX_NAME_LENGTH]; /* Previous job name assiciated with since time */
+ uint32_t ExpectedFiles; /* Expected restore files */
uint32_t StartFile;
uint32_t EndFile;
uint32_t StartBlock;
alist *RunScripts; /* Commands to run before and after job */
CRYPTO_CTX crypto; /* Crypto ctx */
DIRRES* director; /* Director resource */
- bool VSS; /* VSS used by FD */
+ bool Snapshot; /* Snapshot used by FD (or VSS) */
+ bool got_metadata; /* set when found job_metatdata */
bool multi_restore; /* Dir can do multiple storage restore */
+ bool interactive_session; /* Use interactive session with the SD */
htable *file_list; /* Previous file list (accurate mode) */
uint64_t base_size; /* compute space saved with base job */
+ utime_t snapshot_retention; /* Snapshot retention (from director) */
+ snapshot_manager *snap_mgr; /* Snapshot manager */
+ VSSClient *pVSSClient; /* VSS handler */
#endif /* FILE_DAEMON */
/* Storage Daemon specific part of JCR */
JCR *next_dev; /* next JCR attached to device */
JCR *prev_dev; /* previous JCR attached to device */
+ dlist *jobmedia_queue; /* JobMedia queue */
char *dir_auth_key; /* Dir auth key */
pthread_cond_t job_start_wait; /* Wait for FD to start Job */
int32_t type;
POOLMEM *job_name; /* base Job name (not unique) */
POOLMEM *fileset_name; /* FileSet */
POOLMEM *fileset_md5; /* MD5 for FileSet */
- VOL_LIST *VolList; /* list to read */
+ char stored_addr[MAX_NAME_LENGTH]; /* storage daemon address */
+ char client_addr[MAX_NAME_LENGTH]; /* client daemon address */
+ VOL_LIST *VolList; /* list to read, freed at the end of the job */
int32_t NumWriteVolumes; /* number of volumes written */
int32_t NumReadVolumes; /* total number of volumes to read */
int32_t CurReadVolume; /* current read volume number */
int32_t label_errors; /* count of label errors */
+ int32_t DIRVersion; /* Director version number */
+ int32_t FDVersion; /* File daemon version number */
+ int32_t SDVersion; /* Storage daemon version number */
bool session_opened;
+ bool interactive_session; /* Interactive session with the FD */
+ bool is_ok_data_sent; /* the "3000 OK data" has been sent */
long Ticket; /* ticket for this job */
bool ignore_label_errors; /* ignore Volume label errors */
bool spool_attributes; /* set if spooling attributes */
bool spool_data; /* set to spool data */
int32_t CurVol; /* Current Volume count */
DIRRES* director; /* Director resource */
- alist *write_store; /* list of write storage devices sent by DIR */
+ alist *write_store; /* list of write storage devices sent by DIR */
alist *read_store; /* list of read devices sent by DIR */
alist *reserve_msgs; /* reserve fail messages */
bool write_part_after_job; /* Set to write part after job */
bool PreferMountedVols; /* Prefer mounted vols rather than new */
bool Resched; /* Job may be rescheduled */
+ bool bscan_insert_jobmedia_records; /*Bscan: needs to insert job media records */
+ bool sd_client; /* Set if acting as client */
+ bool use_new_match_all; /* TODO: Remove when the match_bsr() will be well tested */
/* Parmaters for Open Read Session */
BSR *bsr; /* Bootstrap record -- has everything */
/*
* Setting a NULL in tsd doesn't clear the tsd but instead tells
- * pthreads not to call the tsd destructor. Consequently, we
+ * pthreads not to call the tsd destructor. Consequently, we
* define this *invalid* jcr address and stuff it in the tsd
* when the jcr is not valid.
*/