]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/bscan.c
kes Fix mtx-changer to detect both versions of Ubuntu (Debian)
[bacula/bacula] / bacula / src / stored / bscan.c
index f5ef83bf97f33ba8bf3ac042512509cd223282be..265a6201d5c1907f2333dd32c9d46fd73918c50f 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2001-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2001-2008 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.
@@ -44,6 +44,7 @@
  
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Forward referenced functions */
 static void do_scan(void);
@@ -82,10 +83,12 @@ static ATTR *attr;
 
 static time_t lasttime = 0;
 
+static const char *db_driver = "NULL";
 static const char *db_name = "bacula";
 static const char *db_user = "bacula";
 static const char *db_password = "";
 static const char *db_host = NULL;
+static int db_port = 0;
 static const char *wd = NULL;
 static bool update_db = false;
 static bool update_vol_info = false;
@@ -100,6 +103,7 @@ static int num_pools = 0;
 static int num_media = 0;
 static int num_files = 0;
 
+static CONFIG *config;
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile = NULL;
 STORES *me = NULL;                    /* our Global resource */
@@ -119,10 +123,12 @@ PROG_COPYRIGHT
 "       -d <nn>           set debug level to <nn>\n"
 "       -dt               print timestamp in debug output\n"
 "       -m                update media info in database\n"
+"       -D <driver name>  specify the driver database name (default NULL)\n"
 "       -n <name>         specify the database name (default bacula)\n"
 "       -u <user>         specify database user name (default bacula)\n"
 "       -P <password>     specify database password (default none)\n"
 "       -h <host>         specify database host (default NULL)\n"
+"       -t <port>         specify database port (default 0)\n"
 "       -p                proceed inspite of I/O errors\n"
 "       -r                list records\n"
 "       -s                synchronize or store in database\n"
@@ -150,7 +156,7 @@ int main (int argc, char *argv[])
 
    OSDependentInit();
 
-   while ((ch = getopt(argc, argv, "b:c:d:h:mn:pP:rsSu:vV:w:?")) != -1) {
+   while ((ch = getopt(argc, argv, "b:c:dD:h:p:mn:pP:rsSt:u:vV:w:?")) != -1) {
       switch (ch) {
       case 'S' :
          showProgress = true;
@@ -166,6 +172,10 @@ int main (int argc, char *argv[])
          configfile = bstrdup(optarg);
          break;
 
+      case 'D':
+         db_driver = optarg;
+         break;
+
       case 'd':                    /* debug level */
          if (*optarg == 't') {
             dbg_timestamp = true;
@@ -180,6 +190,10 @@ int main (int argc, char *argv[])
       case 'h':
          db_host = optarg;
          break;
+         
+      case 't':
+         db_port = atoi(optarg);
+         break;
 
       case 'm':
          update_vol_info = true;
@@ -239,7 +253,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
    LockRes();
    me = (STORES *)GetNextRes(R_STORAGE, NULL);
    if (!me) {
@@ -278,12 +293,12 @@ int main (int argc, char *argv[])
       struct stat sb;
       fstat(dev->fd(), &sb);
       currentVolumeSize = sb.st_size;
-      Pmsg1(000, _("First Volume Size = %sn"), 
+      Pmsg1(000, _("First Volume Size = %s\n"), 
          edit_uint64(currentVolumeSize, ed1));
    }
 
-   if ((db=db_init_database(NULL, db_name, db_user, db_password,
-        db_host, 0, NULL, 0)) == NULL) {
+   if ((db=db_init(NULL, db_driver, db_name, db_user, db_password,
+        db_host, db_port, NULL, 0)) == NULL) {
       Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
    }
    if (!db_open_database(NULL, db)) {
@@ -298,8 +313,7 @@ int main (int argc, char *argv[])
    if (update_db) {
       printf("Records added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n",
          num_media, num_pools, num_jobs, num_files);
-   }
-   else {
+   } else {
       printf("Records would have been added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n",
          num_media, num_pools, num_jobs, num_files);
    }
@@ -353,7 +367,7 @@ static bool bscan_mount_next_read_volume(DCR *dcr)
       struct stat sb;
       fstat(dev->fd(), &sb);
       currentVolumeSize = sb.st_size;
-      Pmsg1(000, _("First Volume Size = %sn"), 
+      Pmsg1(000, _("First Volume Size = %s\n"), 
          edit_uint64(currentVolumeSize, ed1));
    }
    return stat;
@@ -524,20 +538,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
          update_db = save_update_db;
 
          jr.PoolId = pr.PoolId;
-#ifdef xxx
-         /* Set start positions into JCR */
-         if (dev->is_tape()) {
-            /*
-             * Note, we have already advanced past current block,
-             *  so the correct number is block_num - 1
-             */
-            dcr->StartBlock = dev->block_num - 1;
-            dcr->StartFile = dev->file;
-         } else {
-            dcr->StartBlock = (uint32_t)dev->file_addr;
-            dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
-         }
-#endif
          mjcr->start_time = jr.StartTime;
          mjcr->JobLevel = jr.JobLevel;
 
@@ -622,7 +622,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
                jr.VolSessionTime = mjcr->VolSessionTime;
                jr.JobTDate = (utime_t)mjcr->start_time;
                jr.ClientId = mjcr->ClientId;
-               if (!db_update_job_end_record(bjcr, db, &jr)) {
+               if (!db_update_job_end_record(bjcr, db, &jr, false)) {
                   Pmsg1(0, _("Could not update job record. ERR=%s\n"), db_strerror(db));
                }
                mjcr->read_dcr = NULL;
@@ -791,8 +791,8 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       }
       break;
 
-   case STREAM_UNIX_ATTRIBUTES_ACCESS_ACL:   /* Standard ACL attributes on UNIX */
-   case STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL:  /* Default ACL attributes on UNIX */
+   case STREAM_UNIX_ACCESS_ACL:          /* Standard ACL attributes on UNIX */
+   case STREAM_UNIX_DEFAULT_ACL:         /* Default ACL attributes on UNIX */
       /* Ignore Unix attributes */
       break;
 
@@ -848,7 +848,11 @@ static int create_file_attributes_record(B_DB *db, JCR *mjcr,
    ar.ClientId = mjcr->ClientId;
    ar.JobId = mjcr->JobId;
    ar.Stream = rec->Stream;
-   ar.FileIndex = rec->FileIndex;
+   if (type == FT_DELETED) {
+      ar.FileIndex = 0;
+   } else {
+      ar.FileIndex = rec->FileIndex;
+   }
    ar.attr = ap;
    if (dcr->VolFirstIndex == 0) {
       dcr->VolFirstIndex = rec->FileIndex;
@@ -973,7 +977,16 @@ static int create_pool_record(B_DB *db, POOL_DBR *pr)
  */
 static int create_client_record(B_DB *db, CLIENT_DBR *cr)
 {
+   /*
+    * Note, update_db can temporarily be set false while 
+    * updating the database, so we must ensure that ClientId is non-zero.
+    */
    if (!update_db) {
+      cr->ClientId = 0;
+      if (!db_get_client_record(bjcr, db, cr)) {
+        Pmsg1(0, _("Could not get Client record. ERR=%s\n"), db_strerror(db));
+        return 0;
+      }
       return 1;
    }
    if (!db_create_client_record(bjcr, db, cr)) {
@@ -1112,7 +1125,7 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel,
       return 1;
    }
 
-   if (!db_update_job_end_record(bjcr, db, jr)) {
+   if (!db_update_job_end_record(bjcr, db, jr, false)) {
       Pmsg2(0, _("Could not update JobId=%u record. ERR=%s\n"), jr->JobId,  db_strerror(db));
       free_jcr(mjcr);
       return 0;
@@ -1284,7 +1297,7 @@ bool    dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;}
 bool    dir_send_job_status(JCR *jcr) {return 1;}
 int     generate_job_event(JCR *jcr, const char *event) { return 1; }
 
-bool dir_ask_sysop_to_mount_volume(DCR *dcr)
+bool dir_ask_sysop_to_mount_volume(DCR *dcr, int /*mode*/)
 {
    DEVICE *dev = dcr->dev;
    Dmsg0(20, "Enter dir_ask_sysop_to_mount_volume\n");