Update of /cvsroot/bacula/bacula/src/dird In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14504/src/dird Modified Files: admin.c backup.c dird.c dird_conf.c dird_conf.h job.c mac.c msgchan.c protos.h restore.c verify.c Log Message: - Corrected some typos in the make_xxx_tables.in files. - Made preliminary split of pre-run and run code for each job type. This will permit early opening of SD for reserving drives. - Add offline and autochanger fields to Device Query record. - Correct pthread_mutex_init() for autochanger in SD. - Tweak Makefile for LaTeX manual, plus add nav buttons. Index: dird.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/dird.c,v retrieving revision 1.79 retrieving revision 1.80 diff -u -d -r1.79 -r1.80 --- dird.c 21 Feb 2005 12:00:16 -0000 1.79 +++ dird.c 28 Feb 2005 14:02:07 -0000 1.80 @@ -42,8 +42,6 @@ JCR *wait_for_next_job(char *runjob); void term_scheduler(); void term_ua_server(); -int do_backup(JCR *jcr); -void backup_cleanup(void); void start_UA_server(dlist *addrs); void init_job_server(int max_workers); void term_job_server(); Index: dird_conf.h =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/dird_conf.h,v retrieving revision 1.78 retrieving revision 1.79 diff -u -d -r1.78 -r1.79 --- dird_conf.h 21 Feb 2005 12:00:17 -0000 1.78 +++ dird_conf.h 28 Feb 2005 14:02:07 -0000 1.79 @@ -131,6 +131,8 @@ bool append; /* in append mode */ bool read; bool labeled; + bool autochanger; + bool offline; char VolumeName[MAX_NAME_LENGTH]; char MediaType[MAX_NAME_LENGTH]; }; Index: verify.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/verify.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- verify.c 29 Jan 2005 22:39:00 -0000 1.63 +++ verify.c 28 Feb 2005 14:02:08 -0000 1.64 @@ -44,36 +44,27 @@ /* Commands sent to File daemon */ static char verifycmd[] = "verify level=%s\n"; static char storaddr[] = "storage address=%s port=%d ssl=0\n"; -static char sessioncmd[] = "session %s %ld %ld %ld %ld %ld %ld\n"; /* Responses received from File daemon */ static char OKverify[] = "2000 OK verify\n"; static char OKstore[] = "2000 OK storage\n"; -static char OKsession[] = "2000 OK session\n"; /* Forward referenced functions */ -static void verify_cleanup(JCR *jcr, int TermCode); static void prt_fname(JCR *jcr); static int missing_handler(void *ctx, int num_fields, char **row); -/* - * Do a verification of the specified files against the Catlaog - * - * Returns: false on failure - * true on success + +/* + * Called here before the job is run to do the job + * specific setup. */ -bool do_verify(JCR *jcr) +bool do_verify_init(JCR *jcr) { - const char *level, *Name; - BSOCK *fd; - JOB_DBR jr, verify_jr; + JOB_DBR jr; JobId_t verify_jobid = 0; - int stat; + const char *Name; - memset(&verify_jr, 0, sizeof(verify_jr)); - if (!jcr->verify_jr) { - jcr->verify_jr = &verify_jr; - } + memset(&jcr->target_jr, 0, sizeof(jcr->target_jr)); Dmsg1(9, "bdird: created client %s record\n", jcr->client->hdr.name); @@ -105,21 +96,11 @@ Jmsg(jcr, M_FATAL, 0, _( "Unable to find JobId of previous Job for this client.\n")); } - goto bail_out; + return false; } verify_jobid = jr.JobId; Dmsg1(100, "Last full jobid=%d\n", verify_jobid); } - - if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { - Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); - goto bail_out; - } - - /* Print Job Start message */ - Jmsg(jcr, M_INFO, 0, _("Start Verify JobId=%d Level=%s Job=%s\n"), - jcr->JobId, level_to_str(jcr->JobLevel), jcr->Job); - /* * Now get the job record for the previous backup that interests * us. We use the verify_jobid that we found above. @@ -127,19 +108,19 @@ if (jcr->JobLevel == L_VERIFY_CATALOG || jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG || jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG) { - verify_jr.JobId = verify_jobid; - if (!db_get_job_record(jcr, jcr->db, &verify_jr)) { + jcr->target_jr.JobId = verify_jobid; + if (!db_get_job_record(jcr, jcr->db, &jcr->target_jr)) { Jmsg(jcr, M_FATAL, 0, _("Could not get job record for previous Job. ERR=%s"), db_strerror(jcr->db)); - goto bail_out; + return false; } - if (verify_jr.JobStatus != 'T') { + if (jcr->target_jr.JobStatus != 'T') { Jmsg(jcr, M_FATAL, 0, _("Last Job %d did not terminate normally. JobStatus=%c\n"), - verify_jobid, verify_jr.JobStatus); - goto bail_out; + verify_jobid, jcr->target_jr.JobStatus); + return false; } Jmsg(jcr, M_INFO, 0, _("Verifying against JobId=%d Job=%s\n"), - verify_jr.JobId, verify_jr.Job); + jcr->target_jr.JobId, jcr->target_jr.Job); } /* @@ -151,17 +132,17 @@ if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) { RBSR *bsr = new_bsr(); UAContext *ua; - bsr->JobId = verify_jr.JobId; + bsr->JobId = jcr->target_jr.JobId; ua = new_ua_context(jcr); complete_bsr(ua, bsr); bsr->fi = new_findex(); bsr->fi->findex = 1; - bsr->fi->findex2 = verify_jr.JobFiles; + bsr->fi->findex2 = jcr->target_jr.JobFiles; jcr->ExpectedFiles = write_bsr_file(ua, bsr); if (jcr->ExpectedFiles == 0) { free_ua_context(ua); free_bsr(bsr); - goto bail_out; + return false; } free_ua_context(ua); free_bsr(bsr); @@ -172,43 +153,70 @@ Mmsg(fname, "%s/restore.bsr", working_directory); jcr->RestoreBootstrap = bstrdup(fname); free_pool_memory(fname); + jcr->needs_sd = true; + + } else { + jcr->sd_auth_key = bstrdup("dummy"); /* dummy Storage daemon key */ + } + + if (jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG && jcr->verify_job) { + jcr->fileset = jcr->verify_job->fileset; + } + Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->target_jr.ClientId, jcr->JobLevel); + return true; +} + + +/* + * Do a verification of the specified files against the Catlaog + * + * Returns: false on failure + * true on success + */ +bool do_verify(JCR *jcr) +{ + const char *level; + BSOCK *fd; + int stat; + + if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { + Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + return false; + } + + /* Print Job Start message */ + Jmsg(jcr, M_INFO, 0, _("Start Verify JobId=%d Level=%s Job=%s\n"), + jcr->JobId, level_to_str(jcr->JobLevel), jcr->Job); + if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) { /* * Start conversation with Storage daemon */ set_jcr_job_status(jcr, JS_Blocked); if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) { - goto bail_out; + return false; } /* * Now start a job with the Storage daemon */ if (!start_storage_daemon_job(jcr, jcr->storage, SD_READ)) { - goto bail_out; + return false; } /* * Now start a Storage daemon message thread */ if (!start_storage_daemon_message_thread(jcr)) { - goto bail_out; + return false; } Dmsg0(50, "Storage daemon connection OK\n"); - } else { - jcr->sd_auth_key = bstrdup("dummy"); /* dummy Storage daemon key */ } - - if (jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG && jcr->verify_job) { - jcr->fileset = jcr->verify_job->fileset; - } - Dmsg2(100, "ClientId=%u JobLevel=%c\n", verify_jr.ClientId, jcr->JobLevel); - /* * OK, now connect to the File daemon * and ask him for the files. */ set_jcr_job_status(jcr, JS_Blocked); if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) { - goto bail_out; + return false; } set_jcr_job_status(jcr, JS_Running); @@ -217,12 +225,12 @@ Dmsg0(30, ">filed: Send include list\n"); if (!send_include_list(jcr)) { - goto bail_out; + return false; } Dmsg0(30, ">filed: Send exclude list\n"); if (!send_exclude_list(jcr)) { - goto bail_out; + return false; } /* @@ -245,33 +253,21 @@ } bnet_fsend(fd, storaddr, jcr->store->address, jcr->store->SDDport); if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) { - goto bail_out; + return false; } /* * Send the bootstrap file -- what Volumes/files to restore */ if (!send_bootstrap_file(jcr)) { - goto bail_out; + return false; } - /* - * The following code is deprecated - */ if (!jcr->RestoreBootstrap) { - /* - * Pass the VolSessionId, VolSessionTime, Start and - * end File and Blocks on the session command. - */ - bnet_fsend(fd, sessioncmd, - jcr->VolumeName, - jr.VolSessionId, jr.VolSessionTime, - jr.StartFile, jr.EndFile, jr.StartBlock, - jr.EndBlock); - if (!response(jcr, fd, OKsession, "Session", DISPLAY_ERROR)) { - goto bail_out; - } + Jmsg0(jcr, M_FATAL, 0, _("Deprecated feature ... use bootstrap.\n")); + return false; } + level = "volume"; break; case L_VERIFY_DATA: @@ -283,11 +279,11 @@ default: Jmsg2(jcr, M_FATAL, 0, _("Unimplemented Verify level %d(%c)\n"), jcr->JobLevel, jcr->JobLevel); - goto bail_out; + return false; } if (!send_run_before_and_after_commands(jcr)) { - goto bail_out; + return false; } /* @@ -295,7 +291,7 @@ */ bnet_fsend(fd, verifycmd, level); if (!response(jcr, fd, OKverify, "Verify", DISPLAY_ERROR)) { - goto bail_out; + return false; } /* @@ -309,19 +305,19 @@ Dmsg0(10, "Verify level=catalog\n"); jcr->sd_msg_thread_done = true; /* no SD msg thread, so it is done */ jcr->SDJobStatus = JS_Terminated; - get_attributes_and_compare_to_catalog(jcr, verify_jobid); + get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId); break; case L_VERIFY_VOLUME_TO_CATALOG: Dmsg0(10, "Verify level=volume\n"); - get_attributes_and_compare_to_catalog(jcr, verify_jobid); + get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId); break; case L_VERIFY_DISK_TO_CATALOG: Dmsg0(10, "Verify level=disk_to_catalog\n"); jcr->sd_msg_thread_done = true; /* no SD msg thread, so it is done */ jcr->SDJobStatus = JS_Terminated; - get_attributes_and_compare_to_catalog(jcr, verify_jobid); + get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId); break; case L_VERIFY_INIT: @@ -334,23 +330,20 @@ default: Jmsg1(jcr, M_FATAL, 0, _("Unimplemented verify level %d\n"), jcr->JobLevel); - goto bail_out; + return false; } stat = wait_for_job_termination(jcr); verify_cleanup(jcr, stat); return true; - -bail_out: - verify_cleanup(jcr, JS_ErrorTerminated); - return false; } + /* * Release resources allocated during backup. * */ -static void verify_cleanup(JCR *jcr, int TermCode) +void verify_cleanup(JCR *jcr, int TermCode) { char sdt[50], edt[50]; char ec1[30], ec2[30]; @@ -433,7 +426,7 @@ jcr->fileset->hdr.name, level_to_str(jcr->JobLevel), jcr->client->hdr.name, - jcr->verify_jr->JobId, + jcr->target_jr.JobId, Name, sdt, edt, @@ -464,7 +457,7 @@ jcr->fileset->hdr.name, level_to_str(jcr->JobLevel), jcr->client->hdr.name, - jcr->verify_jr->JobId, + jcr->target_jr.JobId, Name, sdt, edt, @@ -474,10 +467,6 @@ term_msg); } Dmsg0(100, "Leave verify_cleanup()\n"); - if (jcr->fname) { - free_memory(jcr->fname); - jcr->fname = NULL; - } } /* @@ -524,7 +513,7 @@ fname)) != 3) { Jmsg3(jcr, M_FATAL, 0, _("bird<filed: bad attributes, expected 3 fields got %d\n" " mslen=%d msg=%s\n"), len, fd->msglen, fd->msg); - goto bail_out; + return false; } /* * We read the Options or Signature into fname @@ -565,7 +554,7 @@ */ fdbr.FileId = 0; if (!db_get_file_attributes_record(jcr, jcr->db, jcr->fname, - jcr->verify_jr, &fdbr)) { + &jcr->target_jr, &fdbr)) { Jmsg(jcr, M_INFO, 0, _("New file: %s\n"), jcr->fname); Dmsg1(020, _("File not in catalog: %s\n"), jcr->fname); stat = JS_Differences; @@ -694,7 +683,7 @@ if (jcr->FileIndex != (uint32_t)file_index) { Jmsg2(jcr, M_FATAL, 0, _("MD5/SHA1 index %d not same as attributes %d\n"), file_index, jcr->FileIndex); - goto bail_out; + return false; } if (do_SIG) { db_escape_string(buf, Opts_SIG, strlen(Opts_SIG)); @@ -718,7 +707,7 @@ berrno be; Jmsg2(jcr, M_FATAL, 0, _("bdird<filed: bad attributes from filed n=%d : %s\n"), n, be.strerror()); - goto bail_out; + return false; } /* Now find all the files that are missing -- i.e. all files in @@ -738,12 +727,7 @@ } free_pool_memory(fname); set_jcr_job_status(jcr, stat); - return 1; - -bail_out: - free_pool_memory(fname); - set_jcr_job_status(jcr, JS_ErrorTerminated); - return 0; + return stat == JS_Terminated; } /* Index: job.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/job.c,v retrieving revision 1.99 retrieving revision 1.100 diff -u -d -r1.99 -r1.100 --- job.c 21 Feb 2005 12:00:17 -0000 1.99 +++ job.c 28 Feb 2005 14:02:08 -0000 1.100 @@ -41,11 +41,6 @@ /* Imported subroutines */ extern void term_scheduler(); extern void term_ua_server(); -extern int do_backup(JCR *jcr); -extern bool do_mac(JCR *jcr); -extern int do_admin(JCR *jcr); -extern int do_restore(JCR *jcr); -extern bool do_verify(JCR *jcr); /* Imported variables */ extern time_t watchdog_time; @@ -143,6 +138,44 @@ jcr->fname = get_pool_memory(PM_FNAME); } + /* Now, do pre-run stuff, like setting job level (Inc/diff, ...) */ + switch (jcr->JobType) { + case JT_BACKUP: + if (!do_backup_init(jcr)) { + backup_cleanup(jcr, JS_ErrorTerminated); + } + break; + case JT_VERIFY: + if (!do_verify_init(jcr)) { + verify_cleanup(jcr, JS_ErrorTerminated); + } + break; + case JT_RESTORE: + if (!do_restore_init(jcr)) { + restore_cleanup(jcr, JS_ErrorTerminated); + } + break; + case JT_ADMIN: + if (!do_admin_init(jcr)) { + admin_cleanup(jcr, JS_ErrorTerminated); + } + break; + case JT_MIGRATION: + case JT_COPY: + case JT_ARCHIVE: + if (!do_mac_init(jcr)) { /* migration, archive, copy */ + mac_cleanup(jcr, JS_ErrorTerminated); + } + break; + default: + Pmsg1(0, "Unimplemented job type: %d\n", jcr->JobType); + set_jcr_job_status(jcr, JS_ErrorTerminated); + break; + } + if (job_canceled(jcr)) { + goto bail_out; + } + Dmsg0(200, "Add jrc to work queue\n"); /* Queue the job to be run */ @@ -158,7 +191,10 @@ return JobId; bail_out: - set_jcr_job_status(jcr, JS_ErrorTerminated); + if (jcr->fname) { + free_memory(jcr->fname); + jcr->fname = NULL; + } V(jcr->mutex); return JobId; @@ -222,35 +258,40 @@ } switch (jcr->JobType) { case JT_BACKUP: - do_backup(jcr); - if (jcr->JobStatus == JS_Terminated) { + if (do_backup(jcr)) { do_autoprune(jcr); + } else { + backup_cleanup(jcr, JS_ErrorTerminated); } break; case JT_VERIFY: - do_verify(jcr); - if (jcr->JobStatus == JS_Terminated) { + if (do_verify(jcr)) { do_autoprune(jcr); + } else { + verify_cleanup(jcr, JS_ErrorTerminated); } break; case JT_RESTORE: - do_restore(jcr); - if (jcr->JobStatus == JS_Terminated) { + if (do_restore(jcr)) { do_autoprune(jcr); + } else { + restore_cleanup(jcr, JS_ErrorTerminated); } break; case JT_ADMIN: - do_admin(jcr); - if (jcr->JobStatus == JS_Terminated) { + if (do_admin(jcr)) { do_autoprune(jcr); + } else { + admin_cleanup(jcr, JS_ErrorTerminated); } break; case JT_MIGRATION: case JT_COPY: case JT_ARCHIVE: - do_mac(jcr); /* migration, archive, copy */ - if (jcr->JobStatus == JS_Terminated) { + if (do_mac(jcr)) { /* migration, archive, copy */ do_autoprune(jcr); + } else { + mac_cleanup(jcr, JS_ErrorTerminated); } break; default: Index: dird_conf.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/dird_conf.c,v retrieving revision 1.118 retrieving revision 1.119 diff -u -d -r1.118 -r1.119 --- dird_conf.c 21 Feb 2005 12:00:16 -0000 1.118 +++ dird_conf.c 28 Feb 2005 14:02:07 -0000 1.119 @@ -472,10 +472,11 @@ case R_DEVICE: dev = &res->res_dev; sendit(sock, "Device: name=%s ok=%d num_writers=%d num_waiting=%d\n" -" use_cnt=%d open=%d append=%d read=%d labeled=%d\n" +" use_cnt=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=%d\n" " volname=%s MediaType=%s\n", dev->hdr.name, dev->found, dev->num_writers, dev->num_waiting, dev->use_count, dev->open, dev->append, dev->read, dev->labeled, + dev->offline, dev->autochanger, dev->VolumeName, dev->MediaType); break; case R_STORAGE: Index: backup.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/backup.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- backup.c 19 Feb 2005 15:29:46 -0000 1.80 +++ backup.c 28 Feb 2005 14:02:07 -0000 1.81 @@ -48,35 +48,14 @@ static char EndJob[] = "2800 End Job TermCode=%d JobFiles=%u " "ReadBytes=%lld JobBytes=%lld Errors=%u\n"; - -/* Forward referenced functions */ -static void backup_cleanup(JCR *jcr, int TermCode, char *since, FILESET_DBR *fsr); - -/* External functions */ - -/* - * Do a backup of the specified FileSet - * - * Returns: 0 on failure - * 1 on success +/* + * Called here before the job is run to do the job + * specific setup. */ -int do_backup(JCR *jcr) +bool do_backup_init(JCR *jcr) { - char since[MAXSTRING]; - int stat; - BSOCK *fd; - POOL_DBR pr; FILESET_DBR fsr; - STORE *store; - - since[0] = 0; - - if (!get_or_create_fileset_record(jcr, &fsr)) { - goto bail_out; - } - - get_level_since_time(jcr, since, sizeof(since)); - + POOL_DBR pr; /* * Get the Pool record -- first apply any level defined pools */ @@ -100,19 +79,48 @@ memset(&pr, 0, sizeof(pr)); bstrncpy(pr.Name, jcr->pool->hdr.name, sizeof(pr.Name)); - while (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */ + if (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */ /* Try to create the pool */ if (create_pool(jcr, jcr->db, jcr->pool, POOL_OP_CREATE) < 0) { Jmsg(jcr, M_FATAL, 0, _("Pool %s not in database. %s"), pr.Name, db_strerror(jcr->db)); - goto bail_out; + return false; } else { Jmsg(jcr, M_INFO, 0, _("Pool %s created in database.\n"), pr.Name); + if (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */ + Jmsg(jcr, M_FATAL, 0, _("Pool %s not in database. %s"), pr.Name, + db_strerror(jcr->db)); + return false; + } } } jcr->PoolId = pr.PoolId; /****FIXME**** this can go away */ jcr->jr.PoolId = pr.PoolId; + jcr->since[0] = 0; + + if (!get_or_create_fileset_record(jcr, &fsr)) { + return false; + } + bstrncpy(jcr->FSCreateTime, fsr.cCreateTime, sizeof(jcr->FSCreateTime)); + + get_level_since_time(jcr, jcr->since, sizeof(jcr->since)); + + return true; +} + +/* + * Do a backup of the specified FileSet + * + * Returns: false on failure + * true on success + */ +bool do_backup(JCR *jcr) +{ + int stat; + BSOCK *fd; + STORE *store; + /* Print Job Start message */ Jmsg(jcr, M_INFO, 0, _("Start Backup JobId %u, Job=%s\n"), @@ -122,7 +130,7 @@ Dmsg2(100, "JobId=%d JobLevel=%c\n", jcr->jr.JobId, jcr->jr.JobLevel); if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); - goto bail_out; + return false; } /* @@ -137,40 +145,40 @@ * Start conversation with Storage daemon */ if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) { - goto bail_out; + return false; } /* * Now start a job with the Storage daemon */ if (!start_storage_daemon_job(jcr, jcr->storage, SD_APPEND)) { - goto bail_out; + return false; } /* * Now start a Storage daemon message thread */ if (!start_storage_daemon_message_thread(jcr)) { - goto bail_out; + return false; } Dmsg0(150, "Storage daemon connection OK\n"); set_jcr_job_status(jcr, JS_WaitFD); if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) { - goto bail_out; + return false; } set_jcr_job_status(jcr, JS_Running); fd = jcr->file_bsock; if (!send_include_list(jcr)) { - goto bail_out; + return false; } if (!send_exclude_list(jcr)) { - goto bail_out; + return false; } if (!send_level_command(jcr)) { - goto bail_out; + return false; } /* @@ -183,30 +191,27 @@ bnet_fsend(fd, storaddr, store->address, store->SDDport, store->enable_ssl); if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) { - goto bail_out; + return false; } if (!send_run_before_and_after_commands(jcr)) { - goto bail_out; + return false; } /* Send backup command */ bnet_fsend(fd, backupcmd); if (!response(jcr, fd, OKbackup, "backup", DISPLAY_ERROR)) { - goto bail_out; + return false; } /* Pickup Job termination data */ stat = wait_for_job_termination(jcr); - backup_cleanup(jcr, stat, since, &fsr); - return 1; - -bail_out: - backup_cleanup(jcr, JS_ErrorTerminated, since, &fsr); - return 0; + backup_cleanup(jcr, stat); + return stat == JS_Terminated; } + /* * Here we wait for the File daemon to signal termination, * then we wait for the Storage daemon. When both @@ -276,7 +281,7 @@ /* * Release resources allocated during backup. */ -static void backup_cleanup(JCR *jcr, int TermCode, char *since, FILESET_DBR *fsr) +void backup_cleanup(JCR *jcr, int TermCode) { char sdt[50], edt[50]; char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], compress[50]; @@ -464,9 +469,9 @@ edt, jcr->jr.JobId, jcr->jr.Job, - level_to_str(jcr->JobLevel), since, + level_to_str(jcr->JobLevel), jcr->since, jcr->client->hdr.name, - jcr->fileset->hdr.name, fsr->cCreateTime, + jcr->fileset->hdr.name, jcr->FSCreateTime, jcr->pool->hdr.name, jcr->store->hdr.name, sdt, Index: mac.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/mac.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mac.c 29 Jan 2005 22:38:59 -0000 1.6 +++ mac.c 28 Feb 2005 14:02:08 -0000 1.7 @@ -39,47 +39,22 @@ #include "dird.h" #include "ua.h" -/* Forward referenced functions */ -static void mac_cleanup(JCR *jcr, int TermCode, char *since, FILESET_DBR *fsr, - const char *Type); - -/* External functions */ - -/* - * Do a Migration, Archive, or Copy of a previous job - * - * Returns: false on failure - * true on success +/* + * Called here before the job is run to do the job + * specific setup. */ -bool do_mac(JCR *jcr) +bool do_mac_init(JCR *jcr) { - char since[MAXSTRING]; - int stat; + FILESET_DBR fsr; POOL_DBR pr; JOB_DBR jr; - FILESET_DBR fsr; JobId_t input_jobid; char *Name; - const char *Type; - - switch(jcr->JobType) { - case JT_MIGRATION: - Type = "Migration"; - break; - case JT_ARCHIVE: - Type = "Archive"; - break; - case JT_COPY: - Type = "Copy"; - break; - default: - Type = "Unknown"; - break; - } if (!get_or_create_fileset_record(jcr, &fsr)) { - goto bail_out; + return false; } + bstrncpy(jcr->FSCreateTime, fsr.cCreateTime, sizeof(jcr->FSCreateTime)); /* * Find JobId of last job that ran. @@ -90,7 +65,7 @@ if (!db_find_last_jobid(jcr, jcr->db, Name, &jr)) { Jmsg(jcr, M_FATAL, 0, _( "Unable to find JobId of previous Job for this client.\n")); - goto bail_out; + return false; } input_jobid = jr.JobId; jcr->JobLevel = jr.JobLevel; @@ -124,13 +99,42 @@ if (create_pool(jcr, jcr->db, jcr->pool, POOL_OP_CREATE) < 0) { Jmsg(jcr, M_FATAL, 0, _("Pool %s not in database. %s"), pr.Name, db_strerror(jcr->db)); - goto bail_out; + return false; } else { Jmsg(jcr, M_INFO, 0, _("Pool %s created in database.\n"), pr.Name); } } jcr->PoolId = pr.PoolId; /****FIXME**** this can go away */ jcr->jr.PoolId = pr.PoolId; + jcr->needs_sd = true; + return true; +} + +/* + * Do a Migration, Archive, or Copy of a previous job + * + * Returns: false on failure + * true on success + */ +bool do_mac(JCR *jcr) +{ + int stat; + const char *Type; + + switch(jcr->JobType) { + case JT_MIGRATION: + Type = "Migration"; + break; + case JT_ARCHIVE: + Type = "Archive"; + break; + case JT_COPY: + Type = "Copy"; + break; + default: + Type = "Unknown"; + break; + } /* Print Job Start message */ @@ -141,7 +145,7 @@ Dmsg2(100, "JobId=%d JobLevel=%c\n", jcr->jr.JobId, jcr->jr.JobLevel); if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); - goto bail_out; + return false; } /* @@ -156,19 +160,19 @@ * Start conversation with Storage daemon */ if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) { - goto bail_out; + return false; } /* * Now start a job with the Storage daemon */ if (!start_storage_daemon_job(jcr, jcr->storage, SD_APPEND)) { - goto bail_out; + return false; } /* * Now start a Storage daemon message thread */ if (!start_storage_daemon_message_thread(jcr)) { - goto bail_out; + return false; } Dmsg0(150, "Storage daemon connection OK\n"); @@ -183,20 +187,15 @@ } else { stat = jcr->SDJobStatus; } - mac_cleanup(jcr, stat, since, &fsr, Type); - return true; - -bail_out: - mac_cleanup(jcr, JS_ErrorTerminated, since, &fsr, Type); - return false; + mac_cleanup(jcr, stat); + return jcr->JobStatus == JS_Terminated; } /* * Release resources allocated during backup. */ -static void mac_cleanup(JCR *jcr, int TermCode, char *since, FILESET_DBR *fsr, - const char *Type) +void mac_cleanup(JCR *jcr, int TermCode) { char sdt[50], edt[50]; char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], compress[50]; @@ -206,6 +205,22 @@ MEDIA_DBR mr; double kbps, compression; utime_t RunTime; + const char *Type; + + switch(jcr->JobType) { + case JT_MIGRATION: + Type = "Migration"; + break; + case JT_ARCHIVE: + Type = "Archive"; + break; + case JT_COPY: + Type = "Copy"; + break; + default: + Type = "Unknown"; + break; + } Dmsg2(100, "Enter mac_cleanup %d %c\n", TermCode, TermCode); dequeue_messages(jcr); /* display any queued messages */ @@ -383,9 +398,9 @@ edt, jcr->jr.JobId, jcr->jr.Job, - level_to_str(jcr->JobLevel), since, + level_to_str(jcr->JobLevel), jcr->since, jcr->client->hdr.name, - jcr->fileset->hdr.name, fsr->cCreateTime, + jcr->fileset->hdr.name, jcr->FSCreateTime, jcr->pool->hdr.name, sdt, edt, Index: protos.h =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/protos.h,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- protos.h 7 Feb 2005 16:20:43 -0000 1.62 +++ protos.h 28 Feb 2005 14:02:08 -0000 1.63 @@ -4,7 +4,7 @@ * Version $Id$ */ /* - Copyright (C) 2000-2004 Kern Sibbald and John Walker + Copyright (C) 2000-2005 Kern Sibbald This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -23,6 +23,12 @@ */ +/* admin.c */ +extern bool do_admin_init(JCR *jcr); +extern bool do_admin(JCR *jcr); +extern void admin_cleanup(JCR *jcr, int TermCode); + + /* authenticate.c */ extern bool authenticate_storage_daemon(JCR *jcr, STORE *store); extern int authenticate_file_daemon(JCR *jcr); @@ -39,6 +45,9 @@ /* backup.c */ extern int wait_for_job_termination(JCR *jcr); +extern bool do_backup_init(JCR *jcr); +extern bool do_backup(JCR *jcr); +extern void backup_cleanup(JCR *jcr, int TermCode); /* bsr.c */ RBSR *new_bsr(); @@ -63,7 +72,7 @@ /* fd_cmds.c */ extern int connect_to_file_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); + int max_retry_time, int verbose); extern int send_include_list(JCR *jcr); extern int send_exclude_list(JCR *jcr); extern int send_bootstrap_file(JCR *jcr); @@ -71,7 +80,7 @@ extern int get_attributes_and_put_in_catalog(JCR *jcr); extern int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId); extern int put_file_into_catalog(JCR *jcr, long file_index, char *fname, - char *link, char *attr, int stream); + char *link, char *attr, int stream); extern void get_level_since_time(JCR *jcr, char *since, int since_len); extern int send_run_before_and_after_commands(JCR *jcr); @@ -94,12 +103,18 @@ extern void copy_storage(JCR *new_jcr, JCR *old_jcr); extern void set_storage(JCR *jcr, STORE *store); +/* mac.c */ +extern bool do_mac(JCR *jcr); +extern bool do_mac_init(JCR *jcr); +extern void mac_cleanup(JCR *jcr, int TermCode); + + /* mountreq.c */ extern void mount_request(JCR *jcr, BSOCK *bs, char *buf); /* msgchan.c */ extern bool connect_to_storage_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); + int max_retry_time, int verbose); extern int start_storage_daemon_job(JCR *jcr, alist *store, int append); extern int start_storage_daemon_message_thread(JCR *jcr); extern int bget_dirmsg(BSOCK *bs); @@ -113,6 +128,12 @@ /* newvol.c */ bool newVolume(JCR *jcr, MEDIA_DBR *mr); +/* restore.c */ +extern bool do_restore(JCR *jcr); +extern bool do_restore_init(JCR *jcr); +extern void restore_cleanup(JCR *jcr, int TermCode); + + /* ua_acl.c */ bool acl_access_ok(UAContext *ua, int acl, char *item); bool acl_access_ok(UAContext *ua, int acl, char *item, int len); @@ -151,28 +172,28 @@ void free_ua_context(UAContext *ua); /* ua_select.c */ -STORE *select_storage_resource(UAContext *ua); -JOB *select_job_resource(UAContext *ua); -JOB *select_restore_job_resource(UAContext *ua); -CLIENT *select_client_resource(UAContext *ua); +STORE *select_storage_resource(UAContext *ua); +JOB *select_job_resource(UAContext *ua); +JOB *select_restore_job_resource(UAContext *ua); +CLIENT *select_client_resource(UAContext *ua); FILESET *select_fileset_resource(UAContext *ua); -int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); -int select_media_dbr(UAContext *ua, MEDIA_DBR *mr); -bool select_pool_dbr(UAContext *ua, POOL_DBR *pr); -int select_client_dbr(UAContext *ua, CLIENT_DBR *cr); +int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); +int select_media_dbr(UAContext *ua, MEDIA_DBR *mr); +bool select_pool_dbr(UAContext *ua, POOL_DBR *pr); +int select_client_dbr(UAContext *ua, CLIENT_DBR *cr); -void start_prompt(UAContext *ua, const char *msg); -void add_prompt(UAContext *ua, const char *prompt); -int do_prompt(UAContext *ua, const char *automsg, const char *msg, char *prompt, int max_prompt); +void start_prompt(UAContext *ua, const char *msg); +void add_prompt(UAContext *ua, const char *prompt); +int do_prompt(UAContext *ua, const char *automsg, const char *msg, char *prompt, int max_prompt); CAT *get_catalog_resource(UAContext *ua); STORE *get_storage_resource(UAContext *ua, int use_default); -int get_media_type(UAContext *ua, char *MediaType, int max_media); -bool get_pool_dbr(UAContext *ua, POOL_DBR *pr); -int get_client_dbr(UAContext *ua, CLIENT_DBR *cr); +int get_media_type(UAContext *ua, char *MediaType, int max_media); +bool get_pool_dbr(UAContext *ua, POOL_DBR *pr); +int get_client_dbr(UAContext *ua, CLIENT_DBR *cr); POOL *get_pool_resource(UAContext *ua); POOL *select_pool_resource(UAContext *ua); CLIENT *get_client_resource(UAContext *ua); -int get_job_dbr(UAContext *ua, JOB_DBR *jr); +int get_job_dbr(UAContext *ua, JOB_DBR *jr); int find_arg_keyword(UAContext *ua, const char **list); int find_arg(UAContext *ua, const char *keyword); @@ -195,3 +216,8 @@ /* ua_run.c */ extern int run_cmd(UAContext *ua, const char *cmd); + +/* verify.c */ +extern bool do_verify(JCR *jcr); +extern bool do_verify_init(JCR *jcr); +extern void verify_cleanup(JCR *jcr, int TermCode); Index: msgchan.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/msgchan.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- msgchan.c 29 Jan 2005 22:38:59 -0000 1.39 +++ msgchan.c 28 Feb 2005 14:02:08 -0000 1.40 @@ -50,7 +50,7 @@ static char OKjob[] = "3000 OK Job SDid=%d SDtime=%d Authorization=%100s\n"; static char OK_device[] = "3000 OK use device\n"; static char OK_query[] = "3001 OK query append=%d read=%d num_writers=%d " - "num_waiting=%d open=%d use_count=%d labeled=%d " + "num_waiting=%d open=%d use_count=%d labeled=%d offline=%d autochanger=%d " "media_type=%127s volume_name=%127s"; /* Storage Daemon requests */ @@ -106,6 +106,7 @@ { POOL_MEM device_name, media_type, volume_name; int dev_open, dev_append, dev_read, dev_labeled; + int dev_offline, dev_autochanger; BSOCK *sd; if (!connect_to_storage_daemon(jcr, 5, 30, 0)) { return false; @@ -118,8 +119,9 @@ Dmsg1(400, "<stored: %s", sd->msg); if (sscanf(sd->msg, OK_query, &dev_append, &dev_read, &dev->num_writers, &dev->num_waiting, &dev_open, - &dev->use_count, &dev_labeled, media_type.c_str(), - volume_name.c_str()) != 9) { + &dev->use_count, &dev_labeled, &dev_offline, + &dev_autochanger, media_type.c_str(), + volume_name.c_str()) != 11) { return false; } unbash_spaces(media_type); @@ -130,6 +132,8 @@ dev->append = dev_append; dev->read = dev_read; dev->labeled = dev_labeled; + dev->offline = dev_offline; + dev->autochanger = dev_autochanger; dev->found = true; } else { return false; Index: restore.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/restore.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- restore.c 29 Jan 2005 22:39:00 -0000 1.50 +++ restore.c 28 Feb 2005 14:02:08 -0000 1.51 @@ -51,18 +51,13 @@ static char OKstore[] = "2000 OK storage\n"; static char OKsession[] = "2000 OK session\n"; -/* Forward referenced functions */ -static void restore_cleanup(JCR *jcr, int status); - -/* External functions */ - /* * Do a restore of the specified files * * Returns: 0 on failure * 1 on success */ -int do_restore(JCR *jcr) +bool do_restore(JCR *jcr) { BSOCK *fd; JOB_DBR rjr; /* restore job record */ @@ -72,7 +67,7 @@ if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } Dmsg0(20, "Updated job start record\n"); @@ -96,7 +91,7 @@ Jmsg2(jcr, M_FATAL, 0, _("Cannot get job record id=%d %s"), rjr.JobId, db_strerror(jcr->db)); restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } /* @@ -108,7 +103,7 @@ Jmsg(jcr, M_FATAL, 0, _("Cannot find Volume names for restore Job %d. %s"), rjr.JobId, db_strerror(jcr->db)); restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } Dmsg1(20, "Got job Volume Names: %s\n", jcr->VolumeName); } @@ -137,14 +132,14 @@ */ if (!start_storage_daemon_job(jcr, jcr->storage, SD_READ)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } /* * Now start a Storage daemon message thread */ if (!start_storage_daemon_message_thread(jcr)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } Dmsg0(50, "Storage daemon connection OK\n"); @@ -154,7 +149,7 @@ set_jcr_job_status(jcr, JS_WaitFD); if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } fd = jcr->file_bsock; @@ -162,12 +157,12 @@ if (!send_include_list(jcr)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } if (!send_exclude_list(jcr)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } /* @@ -182,7 +177,7 @@ Dmsg1(6, "dird>filed: %s\n", fd->msg); if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } /* @@ -190,7 +185,7 @@ */ if (!send_bootstrap_file(jcr)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } /* @@ -208,13 +203,13 @@ rjr.EndBlock); if (!response(jcr, fd, OKsession, "Session", DISPLAY_ERROR)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } } if (!send_run_before_and_after_commands(jcr)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } /* Send restore command */ @@ -242,21 +237,26 @@ if (!response(jcr, fd, OKrestore, "Restore", DISPLAY_ERROR)) { restore_cleanup(jcr, JS_ErrorTerminated); - return 0; + return false; } /* Wait for Job Termination */ int stat = wait_for_job_termination(jcr); restore_cleanup(jcr, stat); - return 1; + return true; +} + +bool do_restore_init(JCR *jcr) +{ + return true; } /* * Release resources allocated during restore. * */ -static void restore_cleanup(JCR *jcr, int TermCode) +void restore_cleanup(JCR *jcr, int TermCode) { char sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH]; char ec1[30], ec2[30], ec3[30]; Index: admin.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/admin.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- admin.c 21 Dec 2004 16:18:31 -0000 1.8 +++ admin.c 28 Feb 2005 14:02:07 -0000 1.9 @@ -35,16 +35,16 @@ #include "ua.h" -/* Forward referenced functions */ -static void admin_cleanup(JCR *jcr, int TermCode); - -/* External functions */ +bool do_admin_init(JCR *jcr) +{ + return true; +} /* - * Returns: 0 on failure - * 1 on success + * Returns: false on failure + * true on success */ -int do_admin(JCR *jcr) +bool do_admin(JCR *jcr) { jcr->jr.JobId = jcr->JobId; @@ -57,13 +57,14 @@ set_jcr_job_status(jcr, JS_Running); admin_cleanup(jcr, JS_Terminated); - return 0; + return true; } + /* * Release resources allocated during backup. */ -static void admin_cleanup(JCR *jcr, int TermCode) +void admin_cleanup(JCR *jcr, int TermCode) { char sdt[50], edt[50]; char term_code[100]; |