]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/bscan.c
update configure
[bacula/bacula] / bacula / src / stored / bscan.c
index fb04bc4c69eed6fe6ad357337856387e84b8b01d..93b118dc1c106ef3afab36254c580495e90779fa 100644 (file)
@@ -1,12 +1,12 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2001-2008 Free Software Foundation Europe e.V.
+   Copyright (C) 2001-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 two of the GNU General Public
+   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.
 
@@ -15,7 +15,7 @@
    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 General Public License
+   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.
  *
  *   Kern E. Sibbald, December 2001
  *
- *
- *   Version $Id$
  */
 
 #include "bacula.h"
 #include "stored.h"
 #include "findlib/find.h"
 #include "cats/cats.h"
+#include "cats/sql_glue.h"
  
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
@@ -150,6 +149,7 @@ int main (int argc, char *argv[])
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
    init_stack_dump();
+   lmgr_init_thread();
 
    my_name_is(argc, argv, "bscan");
    init_msg(NULL, NULL);
@@ -297,8 +297,8 @@ int main (int argc, char *argv[])
          edit_uint64(currentVolumeSize, ed1));
    }
 
-   if ((db=db_init(NULL, db_driver, db_name, db_user, db_password,
-        db_host, db_port, NULL, 0)) == NULL) {
+   if ((db = db_init_database(NULL, db_driver, db_name, db_user, db_password,
+                              db_host, db_port, NULL, false, false)) == NULL) {
       Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
    }
    if (!db_open_database(NULL, db)) {
@@ -332,7 +332,7 @@ static bool bscan_mount_next_read_volume(DCR *dcr)
 {
    DEVICE *dev = dcr->dev;
    DCR *mdcr;
-   Dmsg1(100, "Walk attached jcrs. Volume=%s\n", dev->VolCatInfo.VolCatName);
+   Dmsg1(100, "Walk attached jcrs. Volume=%s\n", dev->getVolCatName());
    foreach_dlist(mdcr, dev->attached_dcrs) {
       JCR *mjcr = mdcr->jcr;
       Dmsg1(000, "========== JobId=%u ========\n", mjcr->JobId);
@@ -348,9 +348,11 @@ static bool bscan_mount_next_read_volume(DCR *dcr)
       mdcr->EndFile = dcr->EndFile;
       mdcr->VolMediaId = dcr->VolMediaId;
       mjcr->read_dcr->VolLastIndex = dcr->VolLastIndex;
-      if (!create_jobmedia_record(db, mjcr)) {
-         Pmsg2(000, _("Could not create JobMedia record for Volume=%s Job=%s\n"),
-            dev->VolCatInfo.VolCatName, mjcr->Job);
+      if( mjcr->bscan_insert_jobmedia_records ) {
+         if (!create_jobmedia_record(db, mjcr)) {
+            Pmsg2(000, _("Could not create JobMedia record for Volume=%s Job=%s\n"),
+               dev->getVolCatName(), mjcr->Job);
+         }
       }
    }
 
@@ -405,6 +407,9 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    DEVICE *dev = dcr->dev;
    JCR *bjcr = dcr->jcr;
    DEV_BLOCK *block = dcr->block;
+   POOL_MEM sql_buffer;
+   db_int64_ctx jmr_count;
+
    char digest[BASE64_SIZE(CRYPTO_DIGEST_MAX_SIZE)];
 
    if (rec->data_len > 0) {
@@ -527,10 +532,11 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
                   jr.JobId);
             }
          }
+
          /* Create Client record if not already there */
-            bstrncpy(cr.Name, label.ClientName, sizeof(cr.Name));
-            create_client_record(db, &cr);
-            jr.ClientId = cr.ClientId;
+         bstrncpy(cr.Name, label.ClientName, sizeof(cr.Name));
+         create_client_record(db, &cr);
+         jr.ClientId = cr.ClientId;
 
          /* process label, if Job record exists don't update db */
          mjcr = create_job_record(db, &jr, &label, rec);
@@ -539,7 +545,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
 
          jr.PoolId = pr.PoolId;
          mjcr->start_time = jr.StartTime;
-         mjcr->set_JobLevel(jr.JobLevel);
+         mjcr->setJobLevel(jr.JobLevel);
 
          mjcr->client_name = get_pool_memory(PM_FNAME);
          pm_strcpy(mjcr->client_name, label.ClientName);
@@ -548,6 +554,19 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
          bstrncpy(dcr->pool_type, label.PoolType, sizeof(dcr->pool_type));
          bstrncpy(dcr->pool_name, label.PoolName, sizeof(dcr->pool_name));
 
+         /* Look for existing Job Media records for this job.  If there are 
+            any, no new ones need be created.  This may occur if File 
+            Retention has expired before Job Retention, or if the volume
+            has already been bscan'd */
+         Mmsg(sql_buffer, "SELECT count(*) from JobMedia where JobId=%d", jr.JobId);
+         db_sql_query(db, sql_buffer.c_str(), db_int64_handler, &jmr_count); 
+         if( jmr_count.value > 0 ) {
+            //FIELD NAME TO BE DEFINED/CONFIRMED (maybe a struct?)
+            mjcr->bscan_insert_jobmedia_records = false; 
+         } else {
+            mjcr->bscan_insert_jobmedia_records = true;
+         }
+
          if (rec->VolSessionId != jr.VolSessionId) {
             Pmsg3(000, _("SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"),
                jr.JobId,
@@ -592,8 +611,10 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
 
          /* Create JobMedia record */
          mjcr->read_dcr->VolLastIndex = dcr->VolLastIndex;
-         create_jobmedia_record(db, mjcr);
-         detach_dcr_from_dev(mjcr->read_dcr);
+         if( mjcr->bscan_insert_jobmedia_records ) {
+            create_jobmedia_record(db, mjcr); 
+         }
+         free_dcr(mjcr->read_dcr);
          free_jcr(mjcr);
 
          break;
@@ -659,21 +680,16 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    }
 
    /* File Attributes stream */
-   switch (rec->Stream) {
+   switch (rec->maskedStream) {
    case STREAM_UNIX_ATTRIBUTES:
    case STREAM_UNIX_ATTRIBUTES_EX:
 
-      if (!unpack_attributes_record(bjcr, rec->Stream, rec->data, attr)) {
+      if (!unpack_attributes_record(bjcr, rec->Stream, rec->data, rec->data_len, attr)) {
          Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
       }
 
-      if (attr->file_index != rec->FileIndex) {
-         Emsg2(M_ERROR_TERM, 0, _("Record header file index %ld not equal record index %ld\n"),
-            rec->FileIndex, attr->file_index);
-      }
-
       if (verbose > 1) {
-         decode_stat(attr->attr, &attr->statp, &attr->LinkFI);
+         decode_stat(attr->attr, &attr->statp, sizeof(attr->statp), &attr->LinkFI);
          build_attr_output_fnames(bjcr, attr);
          print_ls_output(bjcr, attr);
       }
@@ -693,10 +709,16 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       free_jcr(mjcr);
       break;
 
+   case STREAM_RESTORE_OBJECT:
+   /* ****FIXME*****/
+      /* Implement putting into catalog */
+      break;
+
    /* Data stream */
    case STREAM_WIN32_DATA:
    case STREAM_FILE_DATA:
    case STREAM_SPARSE_DATA:
+   case STREAM_MACOS_FORK_DATA:
    case STREAM_ENCRYPTED_FILE_DATA:
    case STREAM_ENCRYPTED_WIN32_DATA:
    case STREAM_ENCRYPTED_MACOS_FORK_DATA:
@@ -705,7 +727,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
        * The data must be decrypted to know the correct length.
        */
       mjcr->JobBytes += rec->data_len;
-      if (rec->Stream == STREAM_SPARSE_DATA) {
+      if (rec->maskedStream == STREAM_SPARSE_DATA) {
          mjcr->JobBytes -= sizeof(uint64_t);
       }
 
@@ -713,8 +735,11 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       break;
 
    case STREAM_GZIP_DATA:
+   case STREAM_COMPRESSED_DATA:
    case STREAM_ENCRYPTED_FILE_GZIP_DATA:
+   case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA:
    case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
+   case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA:
       /* No correct, we should (decrypt and) expand it 
          done using JCR 
       */
@@ -723,12 +748,14 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       break;
 
    case STREAM_SPARSE_GZIP_DATA:
+   case STREAM_SPARSE_COMPRESSED_DATA:
       mjcr->JobBytes += rec->data_len - sizeof(uint64_t); /* No correct, we should expand it */
       free_jcr(mjcr);                 /* done using JCR */
       break;
 
    /* Win32 GZIP stream */
    case STREAM_WIN32_GZIP_DATA:
+   case STREAM_WIN32_COMPRESSED_DATA:
       mjcr->JobBytes += rec->data_len;
       free_jcr(mjcr);                 /* done using JCR */
       break;
@@ -793,6 +820,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
 
    case STREAM_UNIX_ACCESS_ACL:          /* Deprecated Standard ACL attributes on UNIX */
    case STREAM_UNIX_DEFAULT_ACL:         /* Deprecated Default ACL attributes on UNIX */
+   case STREAM_HFSPLUS_ATTRIBUTES:
    case STREAM_ACL_AIX_TEXT:
    case STREAM_ACL_DARWIN_ACCESS_ACL:
    case STREAM_ACL_FREEBSD_DEFAULT_ACL:
@@ -807,9 +835,15 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    case STREAM_ACL_TRU64_ACCESS_ACL:
    case STREAM_ACL_SOLARIS_ACLENT:
    case STREAM_ACL_SOLARIS_ACE:
+   case STREAM_ACL_AFS_TEXT:
+   case STREAM_ACL_AIX_AIXC:
+   case STREAM_ACL_AIX_NFS4:
+   case STREAM_ACL_FREEBSD_NFS4_ACL:
       /* Ignore Unix ACL attributes */
       break;
 
+   case STREAM_XATTR_TRU64:
+   case STREAM_XATTR_AIX:
    case STREAM_XATTR_OPENBSD:
    case STREAM_XATTR_SOLARIS_SYS:
    case STREAM_XATTR_SOLARIS:
@@ -838,11 +872,11 @@ static void bscan_free_jcr(JCR *jcr)
 
    if (jcr->file_bsock) {
       Dmsg0(200, "Close File bsock\n");
-      bnet_close(jcr->file_bsock);
+      jcr->file_bsock->close();
    }
    if (jcr->store_bsock) {
       Dmsg0(200, "Close Store bsock\n");
-      bnet_close(jcr->store_bsock);
+      jcr->store_bsock->close();
    }
    if (jcr->RestoreBootstrap) {
       free(jcr->RestoreBootstrap);
@@ -913,6 +947,7 @@ static int create_media_record(B_DB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl)
    mr->VolRetention = 365 * 3600 * 24; /* 1 year */
    mr->Enabled = 1;
    if (vl->VerNum >= 11) {
+      mr->set_first_written = true; /* Save FirstWritten during update_media */
       mr->FirstWritten = btime_to_utime(vl->write_btime);
       mr->LabelDate    = btime_to_utime(vl->label_btime);
    } else {
@@ -1138,6 +1173,9 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel,
    jr->JobStatus = elabel->JobStatus;
    mjcr->JobStatus = elabel->JobStatus;
    jr->JobFiles = elabel->JobFiles;
+   if (jr->JobFiles > 0) {  /* If we found files, force PurgedFiles */
+      jr->PurgedFiles = 0;
+   }
    jr->JobBytes = elabel->JobBytes;
    jr->VolSessionId = rec->VolSessionId;
    jr->VolSessionTime = rec->VolSessionTime;
@@ -1156,7 +1194,7 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel,
    }
    if (verbose) {
       Pmsg3(000, _("Updated Job termination record for JobId=%u Level=%s TermStat=%c\n"), 
-         jr->JobId, job_level_to_str(mjcr->get_JobLevel()), jr->JobStatus);
+         jr->JobId, job_level_to_str(mjcr->getJobLevel()), jr->JobStatus);
    }
    if (verbose > 1) {
       const char *term_msg;
@@ -1203,7 +1241,7 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel,
         mjcr->JobId,
         mjcr->Job,
         mjcr->fileset_name,
-        job_level_to_str(mjcr->get_JobLevel()),
+        job_level_to_str(mjcr->getJobLevel()),
         mjcr->client_name,
         sdt,
         edt,
@@ -1300,8 +1338,8 @@ static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId)
     *   the JobId and the ClientId.
     */
    jobjcr = new_jcr(sizeof(JCR), bscan_free_jcr);
-   jobjcr->set_JobType(jr->JobType);
-   jobjcr->set_JobLevel(jr->JobLevel);
+   jobjcr->setJobType(jr->JobType);
+   jobjcr->setJobLevel(jr->JobLevel);
    jobjcr->JobStatus = jr->JobStatus;
    bstrncpy(jobjcr->Job, jr->Job, sizeof(jobjcr->Job));
    jobjcr->JobId = JobId;      /* this is JobId on tape */
@@ -1339,8 +1377,8 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, int /*mode*/)
 bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw  writing)
 {
    Dmsg0(100, "Fake dir_get_volume_info\n");
-   bstrncpy(dcr->VolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
+   dcr->setVolCatName(dcr->VolumeName);
    dcr->VolCatInfo.VolCatParts = find_num_dvd_parts(dcr);
-   Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->VolCatInfo.VolCatName, dcr->VolCatInfo.VolCatParts);
+   Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatParts);
    return 1;
 }