]> git.sur5r.net Git - bacula/bacula/commitdiff
Change media pool+first cut Verify disk to catalog + get gnome2 console working
authorKern Sibbald <kern@sibbald.com>
Sun, 19 Oct 2003 13:33:53 +0000 (13:33 +0000)
committerKern Sibbald <kern@sibbald.com>
Sun, 19 Oct 2003 13:33:53 +0000 (13:33 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@751 91ce42f0-d328-0410-95d8-f526ca767f89

21 files changed:
bacula/autoconf/configure.in
bacula/configure
bacula/kernstodo
bacula/src/.cvsignore
bacula/src/cats/sql_find.c
bacula/src/cats/sql_get.c
bacula/src/cats/sql_update.c
bacula/src/dird/backup.c
bacula/src/dird/fd_cmds.c
bacula/src/dird/inc_conf.c
bacula/src/dird/ua_run.c
bacula/src/dird/ua_status.c
bacula/src/dird/verify.c
bacula/src/filed/verify.c
bacula/src/gnome2-console/Makefile.in [new file with mode: 0644]
bacula/src/gnome2-console/callbacks.c [new file with mode: 0644]
bacula/src/gnome2-console/console.c [new file with mode: 0644]
bacula/src/gnome2-console/interface.c [new file with mode: 0644]
bacula/src/gnome2-console/support.c [new file with mode: 0644]
bacula/src/gnome2-console/support.h [new file with mode: 0644]
bacula/src/version.h

index 92acf4feabe97107edc97ab4e4664ff2038df8e1..03d953dc59183d73f26c1628e18f9eb780f21096 100644 (file)
@@ -1433,6 +1433,8 @@ AC_OUTPUT([autoconf/Make.common \
           src/console/console.conf \
           src/gnome-console/Makefile \
           src/gnome-console/gnome-console.conf \
+          src/gnome2-console/Makefile \
+          src/gnome2-console/gnome-console.conf \
           src/tconsole/Makefile \
           src/dird/Makefile \
           src/dird/bacula-dir.conf \
index 56b9244a7f42aeb701e51e4a4427127a526918ee..3cae1343bdef436e46b4d06f1514a4f6308a7620 100755 (executable)
@@ -17481,7 +17481,7 @@ if test "x${subsysdir}" = "x${sbindir}" ; then
    exit 1
 fi
 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ac_config_files="$ac_config_files autoconf/Make.common Makefile rescue/Makefile rescue/linux/Makefile rescue/freebsd/Makefile rescue/solaris/Makefile scripts/startmysql scripts/stopmysql scripts/btraceback scripts/startit scripts/stopit scripts/console scripts/gconsole scripts/bacula scripts/fd scripts/Makefile scripts/logrotate scripts/bacula.desktop.gnome1 scripts/bacula.desktop.gnome2 scripts/mtx-changer doc/Makefile src/Makefile src/host.h src/console/Makefile src/console/console.conf src/gnome-console/Makefile src/gnome-console/gnome-console.conf src/tconsole/Makefile src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/filed/win32/Makefile src/cats/Makefile src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/alter_mysql_tables src/cats/make_mysql_tables src/cats/drop_mysql_tables src/cats/create_mysql_database src/cats/grant_mysql_privileges src/cats/alter_sqlite_tables src/cats/make_sqlite_tables src/cats/drop_sqlite_tables src/cats/create_sqlite_database src/cats/sqlite src/cats/mysql src/cats/create_bdb_database src/cats/make_bdb_tables src/cats/drop_bdb_tables src/cats/make_bacula_tables src/cats/drop_bacula_tables src/findlib/Makefile src/tools/Makefile $PFILES"
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ac_config_files="$ac_config_files autoconf/Make.common Makefile rescue/Makefile rescue/linux/Makefile rescue/freebsd/Makefile rescue/solaris/Makefile scripts/startmysql scripts/stopmysql scripts/btraceback scripts/startit scripts/stopit scripts/console scripts/gconsole scripts/bacula scripts/fd scripts/Makefile scripts/logrotate scripts/bacula.desktop.gnome1 scripts/bacula.desktop.gnome2 scripts/mtx-changer doc/Makefile src/Makefile src/host.h src/console/Makefile src/console/console.conf src/gnome-console/Makefile src/gnome-console/gnome-console.conf src/gnome2-console/Makefile src/gnome2-console/gnome-console.conf src/tconsole/Makefile src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/filed/win32/Makefile src/cats/Makefile src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/alter_mysql_tables src/cats/make_mysql_tables src/cats/drop_mysql_tables src/cats/create_mysql_database src/cats/grant_mysql_privileges src/cats/alter_sqlite_tables src/cats/make_sqlite_tables src/cats/drop_sqlite_tables src/cats/create_sqlite_database src/cats/sqlite src/cats/mysql src/cats/create_bdb_database src/cats/make_bdb_tables src/cats/drop_bdb_tables src/cats/make_bacula_tables src/cats/drop_bacula_tables src/findlib/Makefile src/tools/Makefile $PFILES"
           ac_config_commands="$ac_config_commands default"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -18037,6 +18037,8 @@ do
   "src/console/console.conf" ) CONFIG_FILES="$CONFIG_FILES src/console/console.conf" ;;
   "src/gnome-console/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/gnome-console/Makefile" ;;
   "src/gnome-console/gnome-console.conf" ) CONFIG_FILES="$CONFIG_FILES src/gnome-console/gnome-console.conf" ;;
+  "src/gnome2-console/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/gnome2-console/Makefile" ;;
+  "src/gnome2-console/gnome-console.conf" ) CONFIG_FILES="$CONFIG_FILES src/gnome2-console/gnome-console.conf" ;;
   "src/tconsole/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/tconsole/Makefile" ;;
   "src/dird/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/dird/Makefile" ;;
   "src/dird/bacula-dir.conf" ) CONFIG_FILES="$CONFIG_FILES src/dird/bacula-dir.conf" ;;
index 0095e2ba2d6bfbe4139bde3ce4e8592d27c8eb8b..b1250f39e3ac5f16d22dfc6b100c0a5adc716810 100644 (file)
@@ -36,6 +36,8 @@ For 1.33 Testing/Documentation:
   SuSE.
                 
 For 1.33
+- Limit the number of block checksum/header BB01, ... errors 
+  printed.
 - Add VerifyJob to "run" summary (yes/mod/no) prompt.
 - Add device name to "Current Volume not acceptable because ..."
 - Make sure that Bacula rechecks the tape after the 20 min wait.
index 018076a9bea1ee4bca9813f885762ef6c1221013..a9c61f762d0a9e958a41436a5b89b36b88fe9448 100644 (file)
@@ -5,3 +5,4 @@ Makefile
 config.h
 testprogs
 host.h
+perlgui
index e29ea401105ba6edbbfc0ba07777bc3573af0c1b..6279e8a11a3fe1b33eb67997feb83da6bd5ddff0 100644 (file)
@@ -155,7 +155,8 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, char *Name, JOB_DBR *jr)
 "SELECT JobId FROM Job WHERE Type='V' AND Level='%c' AND Name='%s' AND "
 "ClientId=%u ORDER BY StartTime DESC LIMIT 1",
           L_VERIFY_INIT, jr->Name, jr->ClientId);
-   } else if (jr->Level == L_VERIFY_VOLUME_TO_CATALOG) {
+   } else if (jr->Level == L_VERIFY_VOLUME_TO_CATALOG ||
+             jr->Level == L_VERIFY_DISK_TO_CATALOG) {
       if (Name) {
         Mmsg(&mdb->cmd,
 "SELECT JobId FROM Job WHERE Type='B' AND JobStatus='T' AND "
@@ -170,7 +171,7 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, char *Name, JOB_DBR *jr)
       db_unlock(mdb);
       return 0;
    }
-
+   Dmsg1(100, "Query: %s\n", mdb->cmd);
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return 0;
index 43d9a3a1182c3f1e9a69b2dd52c42669e85f7014..47e034e15a37cc1ea8b3a5239151fc49153523f8 100644 (file)
@@ -70,7 +70,7 @@ extern void split_path_and_filename(JCR *jcr, B_DB *mdb, char *fname);
 int db_get_file_attributes_record(JCR *jcr, B_DB *mdb, char *fname, JOB_DBR *jr, FILE_DBR *fdbr)
 {
    int stat;
-   Dmsg1(20, "Enter get_file_from_catalog fname=%s \n", fname);
+   Dmsg1(100, "db_get_file_att_record fname=%s \n", fname);
 
    db_lock(mdb);
    split_path_and_filename(jcr, mdb, fname);
@@ -262,15 +262,15 @@ int db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
 
    db_lock(mdb);
    if (jr->JobId == 0) {
-      Mmsg(&mdb->cmd, "SELECT VolSessionId,VolSessionTime,\
-PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,\
-Type,Level \
-FROM Job WHERE Job='%s'", jr->Job);
+      Mmsg(&mdb->cmd, "SELECT VolSessionId,VolSessionTime,"
+"PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
+"Type,Level,ClientId "
+"FROM Job WHERE Job='%s'", jr->Job);
     } else {
-      Mmsg(&mdb->cmd, "SELECT VolSessionId,VolSessionTime,\
-PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,\
-Type,Level \
-FROM Job WHERE JobId=%u", jr->JobId);
+      Mmsg(&mdb->cmd, "SELECT VolSessionId,VolSessionTime,"
+"PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
+"Type,Level,ClientId "
+"FROM Job WHERE JobId=%u", jr->JobId);
     }
 
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
@@ -296,6 +296,7 @@ FROM Job WHERE JobId=%u", jr->JobId);
    jr->JobStatus = (int)*row[9];
    jr->Type = (int)*row[10];
    jr->Level = (int)*row[11];
+   jr->ClientId = str_to_uint64(row[12]);
    sql_free_result(mdb);
 
    db_unlock(mdb);
index 510c21bab2f1959ab6378c15f8767c410fe45aa9..4acb2b8f59f69ff2a147fc753b527020061204d2 100644 (file)
@@ -103,9 +103,10 @@ db_update_job_start_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
    JobTDate = (btime_t)stime;
 
    db_lock(mdb);
-   Mmsg(&mdb->cmd, "UPDATE Job SET Level='%c', StartTime='%s', \
-ClientId=%u, JobTDate=%s WHERE JobId=%u",
+   Mmsg(&mdb->cmd, "UPDATE Job SET Level='%c', StartTime='%s',"
+"ClientId=%u, JobTDate=%s WHERE JobId=%u",
       (char)(jr->Level), dt, jr->ClientId, edit_uint64(JobTDate, ed1), jr->JobId);
+
    stat = UPDATE_DB(jcr, mdb, mdb->cmd);
    db_unlock(mdb);
    mdb->changes = 0;
index 8d547b406563bc8c47e94c32d38ad4487c8aa1c9..2f32d18ce75ae9486c1b6c6529742983f24df156 100644 (file)
@@ -257,6 +257,7 @@ int wait_for_job_termination(JCR *jcr)
    /* Note, the SD stores in jcr->JobFiles/ReadBytes/JobBytes/Errors */
    wait_for_storage_daemon_termination(jcr);
 
+
    /* Return values from FD */
    if (fd_ok) {
       jcr->JobFiles = JobFiles;
@@ -295,7 +296,7 @@ static void backup_cleanup(JCR *jcr, int TermCode, char *since, FILESET_DBR *fsr
    double kbps, compression;
    utime_t RunTime;
 
-   Dmsg0(100, "Enter backup_cleanup()\n");
+   Dmsg2(100, "Enter backup_cleanup %d %c\n", TermCode, TermCode);
    memset(&mr, 0, sizeof(mr));
    set_jcr_job_status(jcr, TermCode);
 
index 4d7f1e25b970dfe32d556b46c425a37155bc62ff..0756292270cc6140a4ae2128e01bba59fcb4a7b6 100644 (file)
@@ -250,6 +250,7 @@ static int send_list(JCR *jcr, int list)
            } else {
                bstrncpy(buf, "0 ", sizeof(buf));
            }
+            Dmsg1(000, "Opts=%s\n", buf);
            optlen = strlen(buf);
            while (fgets(buf+optlen, sizeof(buf)-optlen, bpipe->rfd)) {
                fd->msglen = Mmsg(&fd->msg, "%s", buf);
@@ -279,6 +280,7 @@ static int send_list(JCR *jcr, int list)
            } else {
                bstrncpy(buf, "0 ", sizeof(buf));
            }
+            Dmsg1(000, "Opts=%s\n", buf);
            optlen = strlen(buf);
            while (fgets(buf+optlen, sizeof(buf)-optlen, ffd)) {
                fd->msglen = Mmsg(&fd->msg, "%s", buf);
@@ -293,15 +295,15 @@ static int send_list(JCR *jcr, int list)
             p++;                      /* skip over \ */
            /* Note, fall through wanted */
         default:
+            Dmsg2(100, "numopts=%d opts=%s\n", ie->num_opts, NPRT(ie->opts_list[0]->opts));
            if (ie->num_opts) {
               pm_strcpy(&fd->msg, ie->opts_list[0]->opts);
                pm_strcat(&fd->msg, " ");
            } else {
                pm_strcpy(&fd->msg, "0 ");
            }
-           pm_strcat(&fd->msg, p);
+           fd->msglen = pm_strcat(&fd->msg, p);
             Dmsg1(100, "Inc/Exc name=%s\n", fd->msg);
-           fd->msglen = strlen(fd->msg);
            if (!bnet_send(fd)) {
                Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
               goto bail_out;
index bacd5bbead282d35aeaadcc806b85ff6f5934889..1e9c69c694451b354e64a99860d1c538b6ebc747 100644 (file)
@@ -151,8 +151,9 @@ static struct s_fs_opt FS_options[] = {
 
 
 /* 
- * Scan for old Include options (keyword=option) is converted into one or
- *  two characters. Verifyopts=xxxx is Vxxxx:
+ * Scan for right hand side of Include options (keyword=option) is 
+ *    converted into one or two characters. Verifyopts=xxxx is Vxxxx:
+ *    Whatever is found is concatenated to the opts string.
  */
 static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
 {
@@ -167,6 +168,7 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
       bstrncat(opts, "V", optlen);         /* indicate Verify */
       bstrncat(opts, lc->str, optlen);
       bstrncat(opts, ":", optlen);         /* terminate it */
+      Dmsg3(100, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
 
    /*
     * Standard keyword options for Include/Exclude 
@@ -185,7 +187,7 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
          scan_err1(lc, "Expected a FileSet option keyword, got:%s:", lc->str);
       } else { /* add option */
         bstrncat(opts, option, optlen);
-         Dmsg3(200, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
+         Dmsg3(100, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
       }
    }
 
@@ -238,6 +240,7 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass)
       if ((token=lex_get_token(lc, T_ALL)) != T_EQUALS) {
          scan_err1(lc, _("expected an = following keyword, got: %s"), lc->str);
       } else {
+        /* Scan right hand side of option */
         scan_include_options(lc, keyword, inc_opts, sizeof(inc_opts));
       }
       if (token == T_BOB) {
@@ -258,7 +261,7 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass)
       }
       setup_current_opts();
       bstrncpy(res_incexe.current_opts->opts, inc_opts, MAX_FOPTS);
-      Dmsg1(200, "incexe opts=%s\n", res_incexe.current_opts->opts);
+      Dmsg2(100, "old pass=%d incexe opts=%s\n", pass, res_incexe.current_opts->opts);
 
       /* Create incexe structure */
       Dmsg0(200, "Create INCEXE structure\n");
@@ -472,7 +475,9 @@ static void store_fname(LEX *lc, struct res_items *item, int index, int pass)
    scan_to_eol(lc);
 }
 
-
+/*
+ * New style options come here
+ */
 static void store_opts(LEX *lc, struct res_items *item, int index, int pass)
 {
    int i;
@@ -481,6 +486,7 @@ static void store_opts(LEX *lc, struct res_items *item, int index, int pass)
 
    inc_opts[0] = 0;
    keyword = INC_KW_NONE;
+   /* Look up the keyword */
    for (i=0; FS_option_kw[i].name; i++) {
       if (strcasecmp(item->name, FS_option_kw[i].name) == 0) {
         keyword = FS_option_kw[i].token;
@@ -490,14 +496,13 @@ static void store_opts(LEX *lc, struct res_items *item, int index, int pass)
    if (keyword == INC_KW_NONE) {
       scan_err1(lc, "Expected a FileSet keyword, got: %s", lc->str);
    }
-   Dmsg2(200, "keyword=%d %s\n", keyword, FS_option_kw[keyword].name);
+   /* Now scan for the value */
    scan_include_options(lc, keyword, inc_opts, sizeof(inc_opts));
-
    if (pass == 1) {
       setup_current_opts();
-      bstrncat(res_incexe.current_opts->opts, inc_opts, MAX_FOPTS);
+      bstrncpy(res_incexe.current_opts->opts, inc_opts, MAX_FOPTS);
+      Dmsg2(100, "new pass=%d incexe opts=%s\n", pass, res_incexe.current_opts->opts);
    }
-
    scan_to_eol(lc);
 }
 
index f54eaf22a36bc4080879ce3327ce72adf691fac6..8fc402644fea3120e37a680e6815bbfbca35e30d 100644 (file)
@@ -49,10 +49,12 @@ int run_cmd(UAContext *ua, char *cmd)
    JCR *jcr;
    char *job_name, *level_name, *jid, *store_name, *pool_name;
    char *where, *fileset_name, *client_name, *bootstrap, *replace;
-   char *when;
+   char *when, *verify_job_name;
    int Priority = 0;
-   int i, j, found, opt;
+   int i, j, opt;
+   bool found;
    JOB *job = NULL;
+   JOB *verify_job = NULL;
    STORE *store = NULL;
    CLIENT *client = NULL;
    FILESET *fileset = NULL;
@@ -72,6 +74,7 @@ int run_cmd(UAContext *ua, char *cmd)
       N_("priority"),
       N_("yes"),          /* 12 -- if you change this change YES_POS too */
       N_("run"),          /* 13 -- if you change this change RUN_POS too */
+      N_("verifyjob"),
       NULL};
 
 #define YES_POS 12
@@ -92,9 +95,10 @@ int run_cmd(UAContext *ua, char *cmd)
    fileset_name = NULL;
    bootstrap = NULL;
    replace = NULL;
+   verify_job_name = NULL;
 
    for (i=1; i<ua->argc; i++) {
-      found = False;
+      found = false;
       Dmsg2(200, "Doing arg %d = %s\n", i, ua->argk[i]);
       for (j=0; !found && kw[j]; j++) {
         if (strcasecmp(ua->argk[i], _(kw[j])) == 0) {
@@ -111,7 +115,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               job_name = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 1: /* JobId */
               if (jid) {
@@ -119,7 +123,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               jid = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 2: /* client */
               if (client_name) {
@@ -127,7 +131,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               client_name = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 3: /* fileset */
               if (fileset_name) {
@@ -135,7 +139,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               fileset_name = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 4: /* level */
               if (level_name) {
@@ -143,7 +147,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               level_name = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 5: /* storage */
               if (store_name) {
@@ -151,7 +155,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               store_name = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 6: /* pool */
               if (pool_name) {
@@ -159,7 +163,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               pool_name = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 7: /* where */
               if (where) {
@@ -167,7 +171,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               where = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 8: /* bootstrap */
               if (bootstrap) {
@@ -175,7 +179,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               bootstrap = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 9: /* replace */
               if (replace) {
@@ -183,7 +187,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               replace = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 10: /* When */
               if (when) {
@@ -191,7 +195,7 @@ int run_cmd(UAContext *ua, char *cmd)
                  return 1;
               }
               when = ua->argv[i];
-              found = True;
+              found = true;
               break;
            case 11:  /* Priority */
               if (Priority) {
@@ -206,8 +210,17 @@ int run_cmd(UAContext *ua, char *cmd)
               break;
            case 12: /* yes */
            case 13: /* run */
-              found = True;
+              found = true;
               break;
+           case 14: /* Verify Job */
+              if (verify_job_name) {
+                  bsendmsg(ua, _("Verify Job specified twice.\n"));
+                 return 1;
+              }
+              verify_job_name = ua->argv[i];
+              found = true;
+              break;
+
            default:
               break;
            }
@@ -300,6 +313,15 @@ int run_cmd(UAContext *ua, char *cmd)
       return 1;
    }
 
+   if (verify_job_name) {
+      verify_job = (JOB *)GetResWithName(R_JOB, verify_job_name);
+      if (!verify_job) {
+         bsendmsg(ua, _("Verify Job \"%s\" not found.\n"), verify_job_name);
+        verify_job = select_job_resource(ua);
+      }
+   } else {
+      verify_job = job->verify_job;
+   }
 
    /* Create JCR to run job */
    jcr = new_jcr(sizeof(JCR), dird_free_jcr);
@@ -399,7 +421,8 @@ Priority: %d\n"),
            }
         }
         level_name = NULL;
-         bsendmsg(ua, _("Run %s job\n\
+        if (jcr->JobType == JT_BACKUP) {
+            bsendmsg(ua, _("Run %s job\n\
 JobName:  %s\n\
 FileSet:  %s\n\
 Level:    %s\n\
@@ -408,15 +431,43 @@ Storage:  %s\n\
 Pool:     %s\n\
 When:     %s\n\
 Priority: %d\n"),
-                 jcr->JobType==JT_BACKUP?_("Backup"):_("Verify"),
+                 _("Backup"),
+                job->hdr.name,
+                jcr->fileset->hdr.name,
+                level_to_str(jcr->JobLevel),
+                jcr->client->hdr.name,
+                jcr->store->hdr.name,
+                NPRT(jcr->pool->hdr.name), 
+                bstrutime(dt, sizeof(dt), jcr->sched_time),
+                jcr->JobPriority);
+        } else {  /* JT_VERIFY */
+           char *Name;
+           if (jcr->job->verify_job) {
+              Name = jcr->job->verify_job->hdr.name;
+           } else {
+               Name = "";
+           }
+            bsendmsg(ua, _("Run %s job\n\
+JobName:     %s\n\
+FileSet:     %s\n\
+Level:       %s\n\
+Client:      %s\n\
+Storage:     %s\n\
+Pool:        %s\n\
+Verify Job:  %s\n\
+When:        %s\n\
+Priority:    %d\n"),
+                 _("Verify"),
                 job->hdr.name,
                 jcr->fileset->hdr.name,
                 level_to_str(jcr->JobLevel),
                 jcr->client->hdr.name,
                 jcr->store->hdr.name,
                 NPRT(jcr->pool->hdr.name), 
+                Name,            
                 bstrutime(dt, sizeof(dt), jcr->sched_time),
                 jcr->JobPriority);
+        }
         break;
       case JT_RESTORE:
         if (jcr->RestoreJobId == 0 && !jcr->RestoreBootstrap) {
@@ -643,6 +694,7 @@ Priority:   %d\n"),
         }
         goto try_again;
       case 7:
+        /* Pool or Bootstrap depending on JobType */
         if (jcr->JobType == JT_BACKUP ||
             jcr->JobType == JT_VERIFY) {      /* Pool */
            pool = select_pool_resource(ua);
index 2d8c59c6e447acea233c6e4230ada45c77f95e5d..d2eddedcb9783c188c5001ad7a153f4f3e311052 100644 (file)
@@ -238,6 +238,15 @@ static void do_director_status(UAContext *ua, char *cmd)
       case JS_ErrorTerminated:
          msg = _("has erred");
         break;
+      case JS_Error:
+         msg = _("has errors");
+        break;
+      case JS_FatalError:
+         msg = _("has a fatal error");
+        break;
+      case JS_Differences:
+         msg = _("has verify differences");
+        break;
       case JS_Canceled:
          msg = _("has been canceled");
         break;
@@ -260,16 +269,15 @@ static void do_director_status(UAContext *ua, char *cmd)
       case JS_WaitJobRes:
          msg = _("is waiting on max Job jobs");
         break;
-      case JS_WaitPriority:
-         msg = _("is waiting for higher priority jobs to finish");
-        break;
       case JS_WaitMaxJobs:
          msg = _("is waiting on max total jobs");
         break;
       case JS_WaitStartTime:
          msg = _("is waiting for its start time");
         break;
-
+      case JS_WaitPriority:
+         msg = _("is waiting for higher priority jobs to finish");
+        break;
 
       default:
         msg = (char *) get_pool_memory(PM_FNAME);
index 213d8ddc5f80efab334caf12ac76dc6eccb5dbc1..fe868f6b36396d7346c68d0bc4fb4f993c4e3488 100644 (file)
@@ -67,7 +67,7 @@ int do_verify(JCR *jcr)
    char *level, *Name;
    BSOCK   *fd;
    JOB_DBR jr, verify_jr;
-   JobId_t JobId = 0;
+   JobId_t verify_jobid = 0;
    int stat;
 
    if (!get_or_create_client_record(jcr)) {
@@ -83,10 +83,12 @@ int do_verify(JCR *jcr)
     *      last backup Job.
     */
    if (jcr->JobLevel == L_VERIFY_CATALOG || 
-       jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
+       jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
+       jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG) {
       memcpy(&jr, &jcr->jr, sizeof(jr));
-      if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG &&
-         jcr->job->verify_job) {
+      if (jcr->job->verify_job &&
+         (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
+          jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG)) {
         Name = jcr->job->verify_job->hdr.name;
       } else {
         Name = NULL;
@@ -104,8 +106,8 @@ int do_verify(JCR *jcr)
         }   
         goto bail_out;
       }
-      JobId = jr.JobId;
-      Dmsg1(100, "Last full Jobid=%d\n", JobId);
+      verify_jobid = jr.JobId;
+      Dmsg1(100, "Last full jobid=%d\n", verify_jobid);
    } 
 
    jcr->jr.JobId = jcr->JobId;
@@ -126,13 +128,13 @@ int do_verify(JCR *jcr)
 
    /*
     * Now get the job record for the previous backup that interests
-    *  us. We use the JobId that we found above.
+    *  us. We use the verify_jobid that we found above.
     */
    if (jcr->JobLevel == L_VERIFY_CATALOG || 
        jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
        jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG) {
       memset(&verify_jr, 0, sizeof(verify_jr));
-      verify_jr.JobId = JobId;
+      verify_jr.JobId = verify_jobid;
       if (!db_get_job_record(jcr, jcr->db, &verify_jr)) {
          Jmsg(jcr, M_FATAL, 0, _("Could not get job record for previous Job. ERR=%s"), 
              db_strerror(jcr->db));
@@ -140,7 +142,7 @@ int do_verify(JCR *jcr)
       }
       if (verify_jr.JobStatus != 'T') {
          Jmsg(jcr, M_FATAL, 0, _("Last Job %d did not terminate normally. JobStatus=%c\n"),
-           JobId, verify_jr.JobStatus);
+           verify_jobid, verify_jr.JobStatus);
         goto bail_out;
       }
       Jmsg(jcr, M_INFO, 0, _("Verifying against JobId=%d Job=%s\n"),
@@ -201,10 +203,10 @@ int do_verify(JCR *jcr)
       jcr->sd_auth_key = bstrdup("dummy");    /* dummy Storage daemon key */
    }
 
-   if (jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG &&
-       jcr->job->verify_job) {
-       jcr->fileset = jcr->job->verify_job->fileset;
+   if (jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG && jcr->job->verify_job) {
+      jcr->fileset = jcr->job->verify_job->fileset;
    }
+   Dmsg2(100, "ClientId=%u JobLevel=%c\n", verify_jr.ClientId, jcr->JobLevel);
    jcr->verify_jr = &verify_jr;
 
    /*
@@ -313,17 +315,19 @@ int do_verify(JCR *jcr)
       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, JobId);
+      get_attributes_and_compare_to_catalog(jcr, verify_jobid);
       break;
 
    case L_VERIFY_VOLUME_TO_CATALOG:
       Dmsg0(10, "Verify level=volume\n");
-      get_attributes_and_compare_to_catalog(jcr, JobId);
+      get_attributes_and_compare_to_catalog(jcr, verify_jobid);
       break;
 
    case L_VERIFY_DISK_TO_CATALOG:
       Dmsg0(10, "Verify level=disk_to_catalog\n");
-      get_attributes_and_compare_to_catalog(jcr, JobId);
+      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);
       break;
 
    case L_VERIFY_INIT:
@@ -340,7 +344,6 @@ int do_verify(JCR *jcr)
    }
 
    stat = wait_for_job_termination(jcr);
-
    verify_cleanup(jcr, stat);
    return 1;
 
@@ -361,6 +364,7 @@ static void verify_cleanup(JCR *jcr, int TermCode)
    char *term_msg;
    int msg_type;
    JobId_t JobId;
+   char *Name;
 
 // Dmsg1(000, "Enter verify_cleanup() TermCod=%d\n", TermCode);
 
@@ -386,11 +390,17 @@ static void verify_cleanup(JCR *jcr, int TermCode)
       break;
    default:
       term_msg = term_code;
-      sprintf(term_code, _("Inappropriate term code: %c\n"), TermCode);
+      bsnprintf(term_code, sizeof(term_code), 
+                _("Inappropriate term code: %d %c\n"), TermCode, TermCode);
       break;
    }
    bstrftime(sdt, sizeof(sdt), jcr->jr.StartTime);
    bstrftime(edt, sizeof(edt), jcr->jr.EndTime);
+   if (jcr->job->verify_job) {
+      Name = jcr->job->verify_job->hdr.name;
+   } else {
+      Name = "";
+   }
 
    jobstatus_to_ascii(jcr->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
    if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
@@ -401,6 +411,8 @@ Job:                    %s\n\
 FileSet:                %s\n\
 Verify Level:           %s\n\
 Client:                 %s\n\
+Verify JobId:           %d\n\
+Verify Job:             %s\n\
 Start time:             %s\n\
 End time:               %s\n\
 Files Examined:         %s\n\
@@ -414,6 +426,8 @@ Termination:            %s\n\n"),
         jcr->fileset->hdr.name,
         level_to_str(jcr->JobLevel),
         jcr->client->hdr.name,
+        jcr->verify_jr->JobId,
+        Name,
         sdt,
         edt,
         edit_uint64_with_commas(jcr->JobFiles, ec1),
@@ -428,6 +442,8 @@ Job:                    %s\n\
 FileSet:                %s\n\
 Verify Level:           %s\n\
 Client:                 %s\n\
+Verify JobId:           %d\n\
+Verify Job:             %s\n\
 Start time:             %s\n\
 End time:               %s\n\
 Files Examined:         %s\n\
@@ -440,6 +456,8 @@ Termination:            %s\n\n"),
         jcr->fileset->hdr.name,
         level_to_str(jcr->JobLevel),
         jcr->client->hdr.name,
+        jcr->verify_jr->JobId,
+        Name,
         sdt,
         edt,
         edit_uint64_with_commas(jcr->JobFiles, ec1),
@@ -493,7 +511,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
 
       fname = check_pool_memory_size(fname, fd->msglen);
       jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
-      Dmsg1(400, "Atts+SIG=%s\n", fd->msg);
+      Dmsg1(200, "Atts+SIG=%s\n", fd->msg);
       if ((len = sscanf(fd->msg, "%ld %d %100s", &file_index, &stream, 
            fname)) != 3) {
          Jmsg3(jcr, M_FATAL, 0, _("bird<filed: bad attributes, expected 3 fields got %d\n\
index 5bbb0db369578042ce2b68af5e80ffa5777eb5f8..30dddf2cd259cf435b6fd0f48d09416896629d47 100644 (file)
@@ -178,6 +178,11 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt)
       stat = bnet_fsend(dir, "%d %d %s %s%c%s%c%s%c", jcr->JobFiles,
                    STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->fname, 
                    0, attribs, 0, ff_pkt->link, 0);
+   } else if (ff_pkt->type == FT_DIR) {
+      /* Here link is the canonical filename (i.e. with trailing slash) */
+      stat = bnet_fsend(dir,"%d %d %s %s%c%s%c%c", jcr->JobFiles,
+                   STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->link, 
+                   0, attribs, 0, 0);
    } else {
       stat = bnet_fsend(dir,"%d %d %s %s%c%s%c%c", jcr->JobFiles,
                    STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->fname, 
@@ -199,6 +204,7 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt)
       while ((n=bread(&bfd, jcr->big_buf, jcr->buf_size)) > 0) {
         MD5Update(&md5c, ((unsigned char *) jcr->big_buf), n);
         jcr->JobBytes += n;
+        jcr->ReadBytes += n;
       }
       if (n < 0) {
          Jmsg(jcr, M_ERROR, -1, _("Error reading file %s: ERR=%s\n"), 
@@ -218,6 +224,7 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt)
       while ((n=bread(&bfd, jcr->big_buf, jcr->buf_size)) > 0) {
         SHA1Update(&sha1c, ((unsigned char *) jcr->big_buf), n);
         jcr->JobBytes += n;
+        jcr->ReadBytes += n;
       }
       if (n < 0) {
          Jmsg(jcr, M_ERROR, -1, _("Error reading file %s: ERR=%s\n"), 
diff --git a/bacula/src/gnome2-console/Makefile.in b/bacula/src/gnome2-console/Makefile.in
new file mode 100644 (file)
index 0000000..9dd4612
--- /dev/null
@@ -0,0 +1,125 @@
+#
+#   Version $Id$
+#
+@MCOMMON@
+
+srcdir =       .
+VPATH =        .
+.PATH:         .
+
+# one up
+basedir = ..
+# top dir
+topdir = ../..
+# this dir relative to top dir
+thisdir = src/gnome2-console
+
+DEBUG=@DEBUG@
+
+first_rule: all
+dummy:
+
+GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@
+GNOMEUI_LIBS = @GNOMEUI_LIBS@
+GNOME_LIBDIR = @GNOME_LIBDIR@
+GNOME_LIBS = @GNOME_LIBS@
+
+
+#
+CONSSRCS = console.c console_conf.c authenticate.c support.c interface.c callbacks.c
+CONSOBJS = console.o console_conf.o authenticate.o support.o interface.o callbacks.o
+
+# these are the objects that are changed by the .configure process
+EXTRAOBJS = @OBJLIST@
+
+#CONS_INC=@CONS_INC@ $(GNOME_INCLUDEDIR)
+#CONS_LIBS=@CONS_LIBS@ $(GNOME_LIBS)
+#CONS_LDFLAGS=@CONS_LDFLAGS@ $(GNOME_LIBDIR) $(GNOMEUI_LIBS)
+
+CONS_INC=$(GNOME_INCLUDEDIR)
+CONS_LIBS=$(GNOME_LIBS)
+CONS_LDFLAGS=$(GNOME_LIBDIR) $(GNOMEUI_LIBS)
+
+
+.SUFFIXES:     .c .o
+.PHONY:
+.DONTCARE:
+
+# inference rules
+.c.o:
+       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) $(CONS_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $<
+#-------------------------------------------------------------------------
+all: Makefile gnome-console @STATIC_CONS@
+       @echo "==== Make of gnome-console is good ===="
+       @echo " "
+
+support.o:   support.c
+       rm -f support.c.orig
+       mv support.c support.c.orig
+       sed "s%parent = g_object_get_data%parent = \(GtkWidget \*\)g_object_get_data%" support.c.orig >support.c
+       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) $(CONS_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $<
+
+gnome-console: $(CONSOBJS) ../lib/libbac.a ../cats/libsql.a
+       $(CXX) $(LDFLAGS) $(CONS_LDFLAGS) -L../lib -L../cats -o $@ $(CONSOBJS) \
+             $(LIBS) $(DLIB) $(CONS_LIBS) -lbac -lsql -lm
+
+static-console: static-gnome-console
+
+static-gnome-console: $(CONSOBJS) ../lib/libbac.a ../cats/libsql.a
+       $(CXX) $(LDFLAGS) $(CONS_LDFLAGS) -L../lib -L../cats -o $@ $(CONSOBJS) \
+             $(LIBS) $(DLIB) $(CONS_LIBS) -lbac -lsql -lm 
+       strip $@
+
+Makefile: $(srcdir)/Makefile.in $(topdir)/config.status
+       cd $(topdir) \
+         && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+clean:
+       @$(RMF) gnome-console core core.* a.out *.o *.bak *~ *.intpro *.extpro 1 2 3
+       @$(RMF) static-gnome-console
+
+realclean: clean
+       @$(RMF) tags
+       @$(RM) -rf .deps gnome-console.conf
+
+distclean: realclean
+       if test $(srcdir) = .; then $(MAKE) realclean; fi
+       (cd $(srcdir); $(RMF) Makefile; $(RMF) -r CVS)
+
+install: all
+       $(INSTALL_SCRIPT) gnome-console $(DESTDIR)$(sbindir)/gnome-console
+       @srcconf=gnome-console.conf; \
+       if  test -f ${DESTDIR}${sysconfdir}/$$srcconf; then \
+          destconf=$$srcconf.new; \
+          echo "  ==> Found existing $$srcconf, installing new conf file as $$destconf"; \
+       else \
+          destconf=$$srcconf; \
+       fi; \
+       echo "${INSTALL_CONFIG} $$srcconf ${DESTDIR}${sysconfdir}/$$destconf"; \
+       ${INSTALL_CONFIG} $$srcconf ${DESTDIR}${sysconfdir}/$$destconf
+
+uninstall:
+       (cd $(DESTDIR)$(sbindir); $(RMF) gnome-console)
+       (cd $(DESTDIR)$(sysconfdir); $(RMF) gnome-console.conf gnome-console.conf.new)
+
+
+
+# Semi-automatic generation of dependencies:
+# Use gcc -MM because X11 `makedepend' doesn't work on all systems
+# and it also includes system headers.
+# `semi'-automatic since dependencies are generated at distribution time.
+
+depend:
+       @$(MV) Makefile Makefile.bak
+       @$(SED) "/^# DO NOT DELETE:/,$$ d" Makefile.bak > Makefile
+       @$(ECHO) "# DO NOT DELETE: nice dependency list follows" >> Makefile
+       @$(CC) -S -M $(CPPFLAGS) $(XINC) -I$(srcdir) -I$(basedir) $(GNOME_INCLUDEDIR) $(SQL_INC) *.c >> Makefile
+       @if test -f Makefile ; then \
+           $(RMF) Makefile.bak; \
+       else \
+          $(MV) Makefile.bak Makefile; \
+          echo -e "Something went wrong\n\a"; \
+       fi
+
+# -----------------------------------------------------------------------
+# DO NOT DELETE: nice dependency list follows
diff --git a/bacula/src/gnome2-console/callbacks.c b/bacula/src/gnome2-console/callbacks.c
new file mode 100644 (file)
index 0000000..2d2f654
--- /dev/null
@@ -0,0 +1,504 @@
+/* 
+ *    Version $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "bacula.h"
+#include "console.h"
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+#define KEY_Enter 65293
+#define KEY_Up   65362
+#define KEY_Down  65364
+#define KEY_Left  65361
+#define KEY_Right 65363
+
+gboolean
+on_app1_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+   gtk_main_quit();
+   return FALSE;
+}
+
+void
+on_connect_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+   if (connect_to_director(user_data)) {
+      start_director_reader(user_data);
+   }
+}
+
+
+void
+on_disconnect_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+   if (disconnect_from_director(user_data)) {
+      stop_director_reader(user_data);
+   }
+}
+
+
+void
+on_exit_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+   gtk_main_quit();
+}
+
+
+void
+on_cut1_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+
+}
+
+
+void
+on_copy1_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+
+}
+
+
+void
+on_paste1_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+
+}
+
+
+void
+on_clear1_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+
+}
+
+
+void
+on_properties1_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+
+}
+
+
+void
+on_preferences1_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+}
+
+
+void
+on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+   gtk_widget_show(about1);
+   gtk_main();
+}
+
+
+void
+on_connect_button_clicked(GtkButton *button, gpointer user_data)
+{
+   if (connect_to_director(user_data)) {
+      start_director_reader(user_data);
+   }
+}
+
+/* Define max length of history and how many to delete when it gets there.  
+ * If you make HIST_DEL > HIST_MAX, you shoot yourself in the foot. 
+ */
+#define HIST_MAX 2500
+#define HIST_DEL  500
+
+static GList *hist = NULL;
+static GList *hc = NULL;
+static int hist_len = 0;
+
+static void add_to_history(gchar *ecmd)
+{
+   int len = strlen(ecmd);
+
+   if (len > 0) {
+      hist = g_list_append(hist, bstrdup(ecmd));
+      hist_len++;
+   }
+   if (hist_len >= HIST_MAX) {
+      int i;
+      GList *hp;
+      for (i=0; i<HIST_DEL; i++) {
+        hp = g_list_next(hist);
+        free(hp->data);
+        hist = g_list_remove(hist, hp->data);
+      }
+      hist_len -= HIST_DEL;
+   }
+   hc = NULL;            
+}
+
+/*
+ * Note, apparently there is a bug in GNOME where some of the
+ *  key press events are lost -- at least it loses every other
+ *  up arrow!
+ */
+gboolean
+on_entry1_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+   if (event->keyval == KEY_Enter) {
+      char *ecmd = (char *)gtk_entry_get_text((GtkEntry *)entry1);
+      set_text(ecmd, strlen(ecmd));
+      set_text("\n", 1);
+      add_to_history(ecmd);
+      write_director(ecmd);
+      gtk_entry_set_text((GtkEntry *)entry1, "");
+   } else if (event->keyval == KEY_Up) {
+      if (!hc) {
+        hc = g_list_last(hist);
+      } else {
+        hc = g_list_previous(hc);
+      }
+      if (!hc) {
+        hc = g_list_first(hist);
+      }
+      gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
+   } else if (event->keyval == KEY_Down) {
+      if (!hc) {
+        hc = g_list_first(hist);
+      } else {
+        hc = g_list_next(hc);
+      }
+      if (!hc) {
+        hc = g_list_last(hist);
+      }
+      gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
+   }
+// gtk_entry_set_position((GtkEntry *)entry1, -1);
+// gtk_window_set_focus((GtkWindow *)app1, entry1);
+   return FALSE;
+}
+
+
+void
+on_app1_show(GtkWidget *widget, gpointer user_data)
+{
+}
+
+
+
+void
+on_msgs_button_clicked(GtkButton *button, gpointer user_data)
+{
+   write_director("messages");
+}
+
+void
+on_msgs_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+   write_director("messages");
+}
+
+void
+on_about_button_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_hide(about1);
+   gtk_main_quit();
+   set_status_ready();
+}
+
+void
+on_select_director_OK_clicked(GtkButton *button, gpointer user_data)
+{
+   reply = OK;
+   gtk_widget_hide(dir_dialog);
+   gtk_main_quit();
+   set_status_ready();
+}
+
+
+void
+on_select_director_cancel_clicked(GtkButton *button, gpointer user_data)
+{
+   reply = CANCEL;
+   gtk_widget_hide(dir_dialog);
+   gtk_main_quit();
+   set_status_ready();
+}
+
+/*
+ * Compare list string items
+ */
+static gint compare_func(const void *data1, const void *data2)
+{
+   return strcmp((const char *)data1, (const char *)data2);
+}
+
+static GList *find_combo_list(char *name)
+{
+   if (strcmp(name, "job") == 0) {
+      return job_list;
+   }
+   if (strcmp(name, "pool") == 0) {
+      return pool_list;
+   }
+   if (strcmp(name, "client") == 0) {
+      return client_list;
+   }
+   if (strcmp(name, "storage") == 0) {
+      return storage_list;
+   }
+   if (strcmp(name, "fileset") == 0) {
+      return fileset_list;
+   }
+   if (strcmp(name, "messages") == 0) {
+      return messages_list;
+   }
+   if (strcmp(name, "type") == 0) {
+      return type_list;
+   }
+   if (strcmp(name, "level") == 0) {
+      return level_list;
+   }
+   return NULL;
+}
+
+/*
+ * Set correct default values in the Run dialog box
+ */
+static void set_run_defaults()
+{
+   GtkWidget *combo, *entry;
+   char *job, *def;
+   GList *item, *list;
+   char cmd[1000];
+   int pos;
+
+   stop_director_reader(NULL);
+
+   combo = lookup_widget(run_dialog, "combo_job");
+   job = (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
+   bsnprintf(cmd, sizeof(cmd), ".defaults job=\"%s\"", job);
+   write_director(cmd);
+   while (bnet_recv(UA_sock) > 0) {
+      def = strchr(UA_sock->msg, '=');
+      if (!def) {
+        continue;
+      }
+      *def++ = 0;
+      if (strcmp(UA_sock->msg, "job") == 0 ||
+          strcmp(UA_sock->msg, "when") == 0) {
+        continue;
+      }
+      /* Where is an entry box */
+      if (strcmp(UA_sock->msg, "where") == 0) {
+         entry = lookup_widget(run_dialog, "entry_where");
+        gtk_entry_set_text(GTK_ENTRY(entry), def);
+        continue;
+      }
+
+      /* Now handle combo boxes */
+      list = find_combo_list(UA_sock->msg);
+      if (!list) {
+        continue;
+      }
+      item = g_list_find_custom(list, def, compare_func);
+      bsnprintf(cmd, sizeof(cmd), "combo_%s", UA_sock->msg);
+      combo = lookup_widget(run_dialog, cmd);
+      if (!combo) {
+        continue;
+      }
+      pos = g_list_position(list, item);
+      gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), pos);
+   }
+   start_director_reader(NULL);
+}
+
+void
+on_entry_job_changed(GtkEditable *editable, gpointer user_data)
+{
+   set_run_defaults();
+}
+
+
+void
+on_run_button_clicked(GtkButton *button, gpointer user_data)
+{
+   char dt[50];
+   GtkWidget *entry;
+
+   bstrutime(dt, sizeof(dt), time(NULL));
+   entry = lookup_widget(run_dialog, "entry_when");
+   gtk_entry_set_text(GTK_ENTRY(entry), dt);
+   set_run_defaults();
+   gtk_widget_show(run_dialog);
+   gtk_main();
+}
+
+
+static char *get_combo_text(GtkWidget *dialog, char *combo_name)
+{
+   GtkWidget *combo;
+   combo = lookup_widget(dialog, combo_name);
+   if (!combo) {
+      return NULL;
+   }
+   return (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
+}
+
+static char *get_entry_text(GtkWidget *dialog, char *entry_name)
+{
+   GtkWidget *entry;
+   entry = lookup_widget(dialog, entry_name);
+   if (!entry) {
+      return NULL;
+   }
+   return (char *)gtk_entry_get_text(GTK_ENTRY(entry));
+}
+
+static char *get_spin_text(GtkWidget *dialog, char *spin_name)
+{
+   GtkSpinButton *spin;
+   spin = (GtkSpinButton *)lookup_widget(dialog, spin_name);
+   if (!spin) {
+      return NULL;
+   }
+   return (char *)gtk_entry_get_text(GTK_ENTRY(&spin->entry));
+}
+
+
+
+
+void
+on_run_ok_clicked(GtkButton *button, gpointer user_data)
+{
+   char *job, *fileset, *level, *client, *pool, *when, *where, *storage;
+
+   gtk_widget_hide(run_dialog);
+   gtk_main_quit();
+
+   job     = get_combo_text(run_dialog, "combo_job");
+   fileset = get_combo_text(run_dialog, "combo_fileset");
+   client  = get_combo_text(run_dialog, "combo_client");
+   pool    = get_combo_text(run_dialog, "combo_pool");
+   storage = get_combo_text(run_dialog, "combo_storage");
+   level   = get_combo_text(run_dialog, "combo_level");
+
+   when    = get_entry_text(run_dialog, "entry_when");
+   where   = get_entry_text(run_dialog, "entry_where");
+
+   if (!job || !fileset || !client || !pool || !storage ||
+       !level || !when || !where) {
+      set_status_ready();
+      return;
+   }
+      
+   bsnprintf(cmd, sizeof(cmd), 
+             "run job=\"%s\" fileset=\"%s\" level=%s client=\"%s\" pool=\"%s\" "
+             "when=\"%s\" where=\"%s\" storage=\"%s\"", 
+            job, fileset, level, client, pool, when, where, storage);
+   write_director(cmd);
+   write_director("yes");
+   return;
+}
+
+
+void
+on_run_cancel_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_hide(run_dialog);
+   gtk_main_quit();
+   set_status_ready();
+}
+
+gboolean
+on_entry1_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+  return FALSE;
+}
+
+void
+on_restore_button_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_show(restore_dialog);
+   gtk_main();
+}
+
+void
+on_view_fileset_clicked(GtkButton *button, gpointer user_data)
+{
+}
+
+void
+on_restore_ok_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_hide(restore_dialog);
+   gtk_main_quit();
+   set_status_ready();
+}
+
+
+void
+on_restore_cancel_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_hide(restore_dialog);
+   gtk_main_quit();
+   set_status_ready();
+}
+
+void
+on_apply_button_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_show(restore_files);
+   gtk_main();
+}
+
+void
+on_restore_file_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_hide(restore_files);
+   gtk_main_quit();
+}
+
+void
+on_label_button_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_show(label_dialog);
+   gtk_main();
+}
+
+void
+on_label_ok_clicked(GtkButton *button, gpointer user_data)
+{
+   char *pool, *volume, *storage, *slot;
+
+   gtk_widget_hide(label_dialog);
+   gtk_main_quit();
+
+   pool    = get_combo_text(label_dialog, "label_combo_pool");
+   storage = get_combo_text(label_dialog, "label_combo_storage");
+
+   volume  = get_entry_text(label_dialog, "label_entry_volume");
+
+   slot    = get_spin_text(label_dialog, "label_slot");
+
+   if (!pool || !storage || !volume || !(*volume)) {
+      set_status_ready();
+      return;
+   }
+      
+   bsnprintf(cmd, sizeof(cmd), 
+             "label name=\"%s\" pool=\"%s\" storage=\"%s\" slot=%s", 
+            volume, pool, storage, slot);
+   write_director(cmd);
+}
+
+
+void
+on_label_cancel_clicked(GtkButton *button, gpointer user_data)
+{
+   gtk_widget_hide(label_dialog);
+   gtk_main_quit();
+   set_status_ready();
+}
diff --git a/bacula/src/gnome2-console/console.c b/bacula/src/gnome2-console/console.c
new file mode 100644 (file)
index 0000000..56b5253
--- /dev/null
@@ -0,0 +1,609 @@
+/*
+ *
+ *   Bacula GNOME Console interface to the Director
+ *
+ *     Kern Sibbald, March MMII
+ *     
+ *     Version $Id$
+ */
+
+/*
+   Copyright (C) 2002 Kern Sibbald and John Walker
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License
+   as published by the Free Software Foundation; either version 2
+   of the License, or (at your option) any later version.
+
+   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 General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#include "bacula.h"
+#include "console.h"
+
+#include "interface.h"
+#include "support.h"
+
+/* Imported functions */
+int authenticate_director(JCR *jcr, DIRRES *director);
+       
+/* Exported variables */
+GtkWidget *app1;            /* application window */
+GtkWidget *text1;           /* text window */
+GtkWidget *entry1;          /* entry box */
+GtkWidget *status1;         /* status bar */
+GtkWidget *combo1;          /* director combo */
+GtkWidget *scroll1;         /* main scroll bar */
+GtkWidget *run_dialog;      /* run dialog */
+GtkWidget *dir_dialog;      /* director selection dialog */
+GtkWidget *restore_dialog;   /* restore dialog */
+GtkWidget *restore_files;    /* restore files dialog */
+GtkWidget *dir_select;
+GtkWidget *about1;          /* about box */
+GtkWidget *label_dialog;
+GdkFont   *text_font = NULL;
+PangoFontDescription *font_desc;
+GtkAdjustment *vadj;
+pthread_mutex_t cmd_mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t cmd_wait;
+char cmd[1000];
+int cmd_ready = FALSE;
+int reply;
+BSOCK *UA_sock = NULL;
+GList *job_list, *client_list, *fileset_list;
+GList *messages_list, *pool_list, *storage_list;
+GList *type_list, *level_list;
+
+/* Forward referenced functions */
+static void terminate_console(int sig);
+static gint message_handler(gpointer data);
+static int initial_connect_to_director(gpointer data);
+
+/* Static variables */
+static char *configfile = NULL;
+static DIRRES *dir; 
+static CONRES *con; 
+static int ndir;
+static int director_reader_running = FALSE;
+static int at_prompt = FALSE;
+static int ready = FALSE;
+static int quit = FALSE;
+static guint initial;
+
+#define CONFIG_FILE "./gnome-console.conf"   /* default configuration file */
+
+static void usage()
+{
+   fprintf(stderr, _(
+"\nVersion: " VERSION " (" BDATE ") %s %s %s\n\n"
+"Usage: gnome-console [-s] [-c config_file] [-d debug_level] [config_file]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -s          no signals\n"
+"       -t          test - read configuration and exit\n"
+"       -?          print this message.\n"
+"\n"), HOST_OS, DISTNAME, DISTVER);
+
+   exit(1);
+}
+
+
+/*********************************************************************
+ *
+ *        Main Bacula GNOME Console -- User Interface Program
+ *
+ */
+int main(int argc, char *argv[])
+{
+   int ch, stat;
+   int no_signals = TRUE;
+   int test_config = FALSE;
+   int gargc = 1;
+   char *gargv[2] = {"gnome-console", NULL};
+
+   init_stack_dump();
+   my_name_is(argc, argv, "gnome-console");
+   init_msg(NULL, NULL);
+   working_directory  = "/tmp";
+
+   struct sigaction sigignore;
+   sigignore.sa_flags = 0;
+   sigignore.sa_handler = SIG_IGN;      
+   sigfillset(&sigignore.sa_mask);
+   sigaction(SIGPIPE, &sigignore, NULL);
+
+   if ((stat=pthread_cond_init(&cmd_wait, NULL)) != 0) {
+      Emsg1(M_ABORT, 0, _("Pthread cond init error = %s\n"),
+        strerror(stat));
+   }
+
+   gnome_init("bacula", VERSION, gargc, (char **)&gargv);
+
+   while ((ch = getopt(argc, argv, "bc:d:r:st?")) != -1) {
+      switch (ch) {
+         case 'c':                    /* configuration file */
+           if (configfile != NULL)
+              free(configfile);
+           configfile = bstrdup(optarg);
+           break;
+
+         case 'd':
+           debug_level = atoi(optarg);
+           if (debug_level <= 0)
+              debug_level = 1;
+           break;
+
+         case 's':                    /* turn off signals */
+           no_signals = TRUE;
+           break;
+
+         case 't':
+           test_config = TRUE;
+           break;
+
+         case '?':
+        default:
+           usage();
+
+      }  
+   }
+   argc -= optind;
+   argv += optind;
+
+
+   if (!no_signals) {
+      init_signals(terminate_console);
+   }
+
+   if (argc) {
+      usage();
+   }
+
+   if (configfile == NULL) {
+      configfile = bstrdup(CONFIG_FILE);
+   }
+
+   parse_config(configfile);
+
+   LockRes();
+   ndir = 0;
+   for (dir=NULL; (dir = (DIRRES *)GetNextRes(R_DIRECTOR, (RES *)dir)); ) {
+      ndir++;
+   }
+   UnlockRes();
+   if (ndir == 0) {
+      Emsg1(M_ERROR_TERM, 0, _("No director resource defined in %s\n\
+Without that I don't how to speak to the Director :-(\n"), configfile);
+   }
+
+   if (test_config) {
+      terminate_console(0);
+      exit(0);
+   }
+
+
+   app1 = create_app1();
+   gtk_window_set_default_size(GTK_WINDOW(app1), 800, 700);
+   run_dialog = create_RunDialog();
+   label_dialog = create_label_dialog();
+   restore_dialog = create_restore_dialog();
+   restore_files  = create_restore_files();
+   about1 = create_about1();
+
+   gtk_widget_show(app1);
+
+   text1 = lookup_widget(app1, "text1");
+   entry1 = lookup_widget(app1, "entry1");
+   status1 = lookup_widget(app1, "status1");
+   scroll1 = lookup_widget(app1, "scroll1");
+
+/*
+ * Thanks to Phil Stracchino for providing the font configuration code.
+ * original default:
+   text_font = gdk_font_load("-misc-fixed-medium-r-normal-*-*-130-*-*-c-*-koi8-r");
+ * this works for me:
+   text_font = gdk_font_load("-Bigelow & Holmes-lucida console-medium-r-semi condensed-*-12-0-100-100-m-0-iso8859-1");
+ * and, new automagic:font specification!
+ */
+
+   LockRes();
+   for (con = NULL; (con = (CONRES *)GetNextRes(R_CONSOLE, (RES *)con)); ) {
+       text_font = gdk_font_load(con->fontface);
+       if (text_font == NULL) {
+           Dmsg2(404, "Load of requested ConsoleFont \"%s\" (%s) failed!\n",
+                 con->hdr.name, con->fontface);
+       } else {
+           Dmsg2(404, "ConsoleFont \"%s\" (%s) loaded.\n",
+                 con->hdr.name, con->fontface);
+          break;
+       }          
+   }
+   UnlockRes();
+
+   if (text_font == NULL) {
+       Dmsg1(100, "Attempting to load fallback font %s\n",
+              "-misc-fixed-medium-r-normal-*-*-130-*-*-c-*-iso8859-1");
+       text_font = gdk_font_load("-misc-fixed-medium-r-normal-*-*-130-*-*-c-*-iso8859-1");
+   }
+   font_desc = pango_font_description_from_string("LucidaTypewriter 9");
+   gtk_widget_modify_font (app1, font_desc);
+   gtk_widget_modify_font (text1, font_desc);
+   gtk_widget_modify_font (entry1, font_desc);
+   gtk_widget_modify_font (status1, font_desc);
+   pango_font_description_free (font_desc);
+
+
+   initial = gtk_timeout_add(100, initial_connect_to_director, (gpointer)NULL);
+
+   gtk_main();
+   quit = TRUE;
+   disconnect_from_director((gpointer)NULL);
+   return 0;
+}
+
+/*
+ * Every 5 seconds, ask the Director for our
+ *  messages.
+ */
+static gint message_handler(gpointer data)
+{
+   if (ready && UA_sock) {
+      bnet_fsend(UA_sock, ".messages");
+   }
+   return TRUE;
+}
+
+int disconnect_from_director(gpointer data)
+{
+   if (!quit)
+      set_status(_(" Not Connected"));
+   if (UA_sock) {
+      bnet_sig(UA_sock, BNET_TERMINATE); /* send EOF */
+      bnet_close(UA_sock);
+      UA_sock = NULL;
+   }
+   return 1;
+}
+
+/*
+ * Called just after the main loop is started to allow
+ *  us to connect to the Director.
+ */
+static int initial_connect_to_director(gpointer data)
+{
+   gtk_timeout_remove(initial);
+   if (connect_to_director(data)) {
+      start_director_reader(data);
+   }
+   gtk_timeout_add(5000, message_handler, (gpointer)NULL);
+   return TRUE;
+}
+
+static GList *get_list(char *cmd)
+{
+   GList *options;
+   char *msg;
+
+   options = NULL;
+   write_director(cmd);
+   while (bnet_recv(UA_sock) > 0) {
+      strip_trailing_junk(UA_sock->msg);
+      msg = (char *)malloc(strlen(UA_sock->msg) + 1);
+      strcpy(msg, UA_sock->msg);
+      options = g_list_append(options, msg);
+   }
+   return options;
+   
+}
+
+static GList *get_and_fill_combo(GtkWidget *dialog, char *combo_name, char *cmd)
+{
+   GtkWidget *combo;
+   GList *options;
+
+   combo = lookup_widget(dialog, combo_name);
+   options = get_list(cmd);
+   if (combo && options) {
+      gtk_combo_set_popdown_strings(GTK_COMBO(combo), options);
+   }
+   return options;
+}
+
+static void fill_combo(GtkWidget *dialog, char *combo_name, GList *options)
+{
+   GtkWidget *combo;
+
+   combo = lookup_widget(dialog, combo_name);
+   if (combo) {
+      gtk_combo_set_popdown_strings(GTK_COMBO(combo), options);
+   }
+   return;
+}
+
+
+/*
+ * Connect to Director. If there are more than one, put up
+ * a modal dialog so that the user chooses one.
+ */
+int connect_to_director(gpointer data)
+{
+   GList *dirs = NULL;
+   GtkWidget *combo;
+   char buf[1000];
+   JCR jcr;
+
+
+   if (UA_sock) {
+      return 0;
+   }
+
+   if (ndir > 1) {
+      LockRes();
+      for (dir = NULL; (dir = (DIRRES *)GetNextRes(R_DIRECTOR, (RES *)dir)); ) {
+         sprintf(buf, "%s at %s:%d", dir->hdr.name, dir->address,
+           dir->DIRport);
+         printf("%s\n", buf);
+        dirs = g_list_append(dirs, dir->hdr.name);
+      }
+      UnlockRes();
+      dir_dialog = create_SelectDirectorDialog();
+      combo = lookup_widget(dir_dialog, "combo1");
+      dir_select = lookup_widget(dir_dialog, "dirselect");
+      gtk_combo_set_popdown_strings(GTK_COMBO(combo), dirs);   
+      printf("dialog run\n");
+      gtk_widget_show(dir_dialog);
+      gtk_main();
+
+      if (reply == OK) {
+        gchar *ecmd = gtk_editable_get_chars((GtkEditable *)dir_select, 0, -1);
+        dir = (DIRRES *)GetResWithName(R_DIRECTOR, ecmd);
+        if (ecmd) {
+           g_free(ecmd);             /* release director name string */
+        }
+      }
+      if (dirs) {
+        g_free(dirs);
+      }
+      gtk_widget_destroy(dir_dialog);
+      dir_dialog = NULL;
+   } else {
+      /* Just take the first Director */
+      LockRes();
+      dir = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
+      UnlockRes();
+   }
+
+   if (!dir) {
+      printf("dir is NULL\n");
+      return 0;
+   }
+
+   memset(&jcr, 0, sizeof(jcr));
+   
+   set_statusf(_(" Connecting to Director %s:%d\n"), dir->address,dir->DIRport);
+   set_textf(_("Connecting to Director %s:%d\n"), dir->address,dir->DIRport);
+
+// while (gtk_events_pending()) {     /* fully paint screen */
+//    gtk_main_iteration();
+// }
+   UA_sock = bnet_connect(NULL, 5, 15, "Director daemon", dir->address, 
+                         NULL, dir->DIRport, 0);
+   if (UA_sock == NULL) {
+      return 0;
+   }
+   
+   jcr.dir_bsock = UA_sock;
+   if (!authenticate_director(&jcr, dir)) {
+      set_text(UA_sock->msg, UA_sock->msglen);
+      return 0;
+   }
+
+   set_status(" Initializing ...");
+
+   bnet_fsend(UA_sock, "autodisplay on");
+
+   /* Read and display all initial messages */
+   while (bnet_recv(UA_sock) > 0) {
+      set_text(UA_sock->msg, UA_sock->msglen);
+   }
+
+   /* Paint changes */
+   while (gtk_events_pending()) {
+      gtk_main_iteration();
+   }
+
+   /* Fill the run_dialog combo boxes */
+   job_list      = get_and_fill_combo(run_dialog, "combo_job", ".jobs");
+   client_list   = get_and_fill_combo(run_dialog, "combo_client", ".clients");
+   fileset_list  = get_and_fill_combo(run_dialog, "combo_fileset", ".filesets");
+   messages_list = get_and_fill_combo(run_dialog, "combo_messages", ".msgs");
+   pool_list     = get_and_fill_combo(run_dialog, "combo_pool", ".pools");
+   storage_list  = get_and_fill_combo(run_dialog, "combo_storage", ".storage");
+   type_list     = get_and_fill_combo(run_dialog, "combo_type", ".types");
+   level_list    = get_and_fill_combo(run_dialog, "combo_level", ".levels");
+
+   fill_combo(label_dialog, "label_combo_storage", storage_list);
+   fill_combo(label_dialog, "label_combo_pool", pool_list);
+
+   set_status(" Connected");
+   return 1;
+}
+
+void write_director(gchar *msg)
+{
+   if (UA_sock) {
+      at_prompt = FALSE;
+      set_status(_(" Processing command ..."));
+      UA_sock->msglen = strlen(msg);
+      pm_strcpy(&UA_sock->msg, msg);
+      bnet_send(UA_sock);
+   }
+   if (strcmp(msg, ".quit") == 0 || strcmp(msg, ".exit") == 0) {
+      disconnect_from_director((gpointer)NULL);
+      gtk_main_quit();
+   }
+}
+
+void read_director(gpointer data, gint fd, GdkInputCondition condition)
+{
+   int stat;
+
+   if (!UA_sock || UA_sock->fd != fd) {
+      return;
+   }
+   stat = bnet_recv(UA_sock);
+   if (stat >= 0) {
+      if (at_prompt) {
+         set_text("\n", 1);
+        at_prompt = FALSE;
+      }
+      set_text(UA_sock->msg, UA_sock->msglen);
+      return;
+   }
+   if (is_bnet_stop(UA_sock)) {        /* error or term request */
+      gtk_main_quit();
+      return;
+   }
+   /* Must be a signal -- either do something or ignore it */
+   if (UA_sock->msglen == BNET_PROMPT) {
+      at_prompt = TRUE;
+      set_status(_(" At prompt waiting for input ..."));
+   }
+   if (UA_sock->msglen == BNET_EOD) {
+      set_status_ready();
+   }
+   return;
+}
+
+static gint tag;
+
+void start_director_reader(gpointer data)
+{
+
+   if (director_reader_running || !UA_sock) {
+      return;
+   }
+   director_reader_running = TRUE;
+
+   tag = gdk_input_add(UA_sock->fd, GDK_INPUT_READ, read_director, NULL);
+}
+
+void stop_director_reader(gpointer data)
+{
+   if (!director_reader_running) {
+      return;
+   }
+   gdk_input_remove(tag);
+   director_reader_running = FALSE;
+}
+
+
+
+/* Cleanup and then exit */
+static void terminate_console(int sig)
+{
+   static int already_here = FALSE;
+
+   if (already_here)                 /* avoid recursive temination problems */
+      exit(1);
+   already_here = TRUE;
+   disconnect_from_director((gpointer)NULL);
+   gtk_main_quit();
+   exit(0);
+}
+
+
+/* Buffer approx 2000 lines -- assume 60 chars/line */
+#define MAX_TEXT_CHARS  (2000 * 60)
+static int text_chars = 0;
+
+static void truncate_text_chars()
+{
+   GtkTextBuffer *textbuf;
+   GtkTextIter iter, iter2;
+   guint len;
+   int del_chars = MAX_TEXT_CHARS / 4;
+
+   textbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text1));
+   len = gtk_text_buffer_get_char_count(textbuf);
+   gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0);
+   gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, del_chars);
+   gtk_text_buffer_delete (textbuf, &iter, &iter2);
+   text_chars -= del_chars;
+   len = gtk_text_buffer_get_char_count(textbuf);
+   gtk_text_iter_set_offset(&iter, len);
+
+/*
+   gtk_text_set_point(GTK_TEXT(text1), del_chars);
+   gtk_text_backward_delete(GTK_TEXT(text1), del_chars);
+   text_chars -= del_chars;
+   gtk_text_set_point(GTK_TEXT(text1), text_chars);
+ */
+}
+
+void set_textf(char *fmt, ...)
+{
+   va_list arg_ptr;
+   char buf[1000];
+   int len;
+   va_start(arg_ptr, fmt);
+   len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
+   set_text(buf, len);
+}
+
+void set_text(char *buf, int len)
+{
+   GtkTextBuffer *textbuf;
+   GtkTextIter iter;
+   guint buf_len;
+
+   textbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text1));
+   buf_len = gtk_text_buffer_get_char_count(textbuf);
+   gtk_text_buffer_get_iter_at_offset(textbuf, &iter, buf_len - 1);
+   gtk_text_buffer_insert(textbuf, &iter, buf, -1);
+/*
+   gtk_text_insert(GTK_TEXT(text1), text_font, NULL, NULL, buf, -1);
+ */
+   text_chars += len;
+   if (text_chars > MAX_TEXT_CHARS) {
+      truncate_text_chars();
+   }
+   buf_len = gtk_text_buffer_get_char_count(textbuf);
+   gtk_text_iter_set_offset(&iter, buf_len);
+   /*
+    * Force the scroll bars to the bottom so that most
+    * recent text is on screen.
+    */
+   vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll1));
+   gtk_adjustment_set_value(vadj, vadj->upper);
+}
+
+void set_statusf(char *fmt, ...)
+{
+   va_list arg_ptr;
+   char buf[1000];
+   int len;
+   va_start(arg_ptr, fmt);
+   len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
+   gtk_label_set_text(GTK_LABEL(status1), buf);
+   ready = FALSE;
+}
+
+void set_status_ready()    
+{
+   gtk_label_set_text(GTK_LABEL(status1), " Ready");
+   ready = TRUE;
+}
+
+void set_status(char *buf)
+{
+   gtk_label_set_text(GTK_LABEL(status1), buf);
+   ready = FALSE;
+}
diff --git a/bacula/src/gnome2-console/interface.c b/bacula/src/gnome2-console/interface.c
new file mode 100644 (file)
index 0000000..95cc1db
--- /dev/null
@@ -0,0 +1,1464 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <bonobo.h>
+#include <gnome.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+  g_object_set_data_full (G_OBJECT (component), name, \
+    gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
+
+#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
+  g_object_set_data (G_OBJECT (component), name, widget)
+
+static GnomeUIInfo file1_menu_uiinfo[] =
+{
+  {
+    GNOME_APP_UI_ITEM, N_("_Connect"),
+    N_("Connect to Director"),
+    (gpointer) on_connect_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_ITEM, N_("_Disconnect"),
+    N_("Disconnect from Director"),
+    (gpointer) on_disconnect_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  GNOMEUIINFO_SEPARATOR,
+  {
+    GNOME_APP_UI_ITEM, N_("gtk-quit"),
+    NULL,
+    (gpointer) on_exit_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  GNOMEUIINFO_END
+};
+
+static GnomeUIInfo edit1_menu_uiinfo[] =
+{
+  {
+    GNOME_APP_UI_ITEM, N_("gtk-cut"),
+    NULL,
+    (gpointer) on_cut1_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_ITEM, N_("gtk-copy"),
+    NULL,
+    (gpointer) on_copy1_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_ITEM, N_("gtk-paste"),
+    NULL,
+    (gpointer) on_paste1_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_ITEM, N_("gtk-clear"),
+    NULL,
+    (gpointer) on_clear1_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  GNOMEUIINFO_SEPARATOR,
+  GNOMEUIINFO_END
+};
+
+static GnomeUIInfo item1_menu_uiinfo[] =
+{
+  {
+    GNOME_APP_UI_ITEM, N_("_Display Messages"),
+    NULL,
+    (gpointer) on_msgs_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  GNOMEUIINFO_END
+};
+
+static GnomeUIInfo settings1_menu_uiinfo[] =
+{
+  {
+    GNOME_APP_UI_ITEM, N_("gtk-preferences"),
+    NULL,
+    (gpointer) on_preferences1_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  GNOMEUIINFO_END
+};
+
+static GnomeUIInfo help1_menu_uiinfo[] =
+{
+  {
+    GNOME_APP_UI_ITEM, N_("gnome-stock-about"),
+    NULL,
+    (gpointer) on_about_activate, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  GNOMEUIINFO_END
+};
+
+static GnomeUIInfo menubar1_uiinfo[] =
+{
+  {
+    GNOME_APP_UI_SUBTREE, N_("_File"),
+    NULL,
+    file1_menu_uiinfo, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_SUBTREE, N_("_Edit"),
+    NULL,
+    edit1_menu_uiinfo, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_SUBTREE, N_("_View"),
+    N_("Display Messages"),
+    item1_menu_uiinfo, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_SUBTREE, N_("_Settings"),
+    NULL,
+    settings1_menu_uiinfo, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  {
+    GNOME_APP_UI_SUBTREE, N_("_Help"),
+    NULL,
+    help1_menu_uiinfo, NULL, NULL,
+    GNOME_APP_PIXMAP_NONE, NULL,
+    0, (GdkModifierType) 0, NULL
+  },
+  GNOMEUIINFO_END
+};
+
+GtkWidget*
+create_app1 (void)
+{
+  GtkWidget *app1;
+  GtkWidget *vbox6;
+  GtkWidget *handlebox1;
+  GtkWidget *menubar1;
+  GtkWidget *handlebox2;
+  GtkWidget *toolbar2;
+  GtkWidget *tmp_toolbar_icon;
+  GtkWidget *connect_button1;
+  GtkWidget *run_button1;
+  GtkWidget *msgs_button;
+  GtkWidget *restore_button;
+  GtkWidget *label_button;
+  GtkWidget *vbox7;
+  GtkWidget *scroll1;
+  GtkWidget *text1;
+  GtkWidget *hbox18;
+  GtkWidget *label38;
+  GtkWidget *entry1;
+  GtkWidget *hbox19;
+  GtkWidget *frame1;
+  GtkWidget *label39;
+  GtkWidget *frame2;
+  GtkWidget *status1;
+  GtkTooltips *tooltips;
+
+  tooltips = gtk_tooltips_new ();
+
+  app1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (app1), _("Bacula Console"));
+  gtk_window_set_position (GTK_WINDOW (app1), GTK_WIN_POS_CENTER);
+
+  vbox6 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox6);
+  gtk_container_add (GTK_CONTAINER (app1), vbox6);
+
+  handlebox1 = gtk_handle_box_new ();
+  gtk_widget_show (handlebox1);
+  gtk_box_pack_start (GTK_BOX (vbox6), handlebox1, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (handlebox1), 1);
+
+  menubar1 = gtk_menu_bar_new ();
+  gtk_widget_show (menubar1);
+  gtk_container_add (GTK_CONTAINER (handlebox1), menubar1);
+  gnome_app_fill_menu (GTK_MENU_SHELL (menubar1), menubar1_uiinfo,
+                       NULL, FALSE, 0);
+
+  handlebox2 = gtk_handle_box_new ();
+  gtk_widget_show (handlebox2);
+  gtk_box_pack_start (GTK_BOX (vbox6), handlebox2, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (handlebox2), 1);
+
+  toolbar2 = gtk_toolbar_new ();
+  gtk_widget_show (toolbar2);
+  gtk_container_add (GTK_CONTAINER (handlebox2), toolbar2);
+  gtk_container_set_border_width (GTK_CONTAINER (toolbar2), 1);
+  gtk_toolbar_set_style (GTK_TOOLBAR (toolbar2), GTK_TOOLBAR_BOTH);
+
+  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-new", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
+  connect_button1 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Connect"),
+                                _("Connect to Director"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  gtk_widget_show (connect_button1);
+
+  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-execute", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
+  run_button1 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Run"),
+                                _("Run a Job"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  gtk_widget_show (run_button1);
+
+  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-find", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
+  msgs_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Msgs"),
+                                _("Display Messages"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  gtk_widget_show (msgs_button);
+
+  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-revert-to-saved", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
+  restore_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Restore"),
+                                NULL, NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  gtk_widget_show (restore_button);
+
+  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-save-as", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
+  label_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Label"),
+                                NULL, NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  gtk_widget_show (label_button);
+
+  vbox7 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox7);
+  gtk_box_pack_start (GTK_BOX (vbox6), vbox7, TRUE, TRUE, 0);
+
+  scroll1 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_show (scroll1);
+  gtk_box_pack_start (GTK_BOX (vbox7), scroll1, TRUE, TRUE, 0);
+  GTK_WIDGET_UNSET_FLAGS (scroll1, GTK_CAN_FOCUS);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll1), GTK_SHADOW_IN);
+
+  text1 = gtk_text_view_new ();
+  gtk_widget_show (text1);
+  gtk_container_add (GTK_CONTAINER (scroll1), text1);
+  GTK_WIDGET_UNSET_FLAGS (text1, GTK_CAN_FOCUS);
+  gtk_text_view_set_editable (GTK_TEXT_VIEW (text1), FALSE);
+  gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text1), GTK_WRAP_WORD);
+
+  hbox18 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox18);
+  gtk_box_pack_start (GTK_BOX (vbox7), hbox18, FALSE, TRUE, 0);
+
+  label38 = gtk_label_new (_(" Command: "));
+  gtk_widget_show (label38);
+  gtk_box_pack_start (GTK_BOX (hbox18), label38, FALSE, TRUE, 0);
+
+  entry1 = gtk_entry_new ();
+  gtk_widget_show (entry1);
+  gtk_box_pack_start (GTK_BOX (hbox18), entry1, TRUE, TRUE, 0);
+  GTK_WIDGET_SET_FLAGS (entry1, GTK_CAN_DEFAULT);
+  gtk_tooltips_set_tip (tooltips, entry1, _("Enter Commands Here"), NULL);
+  gtk_entry_set_max_length (GTK_ENTRY (entry1), 150);
+
+  hbox19 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox19);
+  gtk_box_pack_start (GTK_BOX (vbox7), hbox19, FALSE, FALSE, 0);
+
+  frame1 = gtk_frame_new (NULL);
+  gtk_widget_show (frame1);
+  gtk_box_pack_start (GTK_BOX (hbox19), frame1, FALSE, TRUE, 0);
+
+  label39 = gtk_label_new (_(" Status: "));
+  gtk_widget_show (label39);
+  gtk_container_add (GTK_CONTAINER (frame1), label39);
+
+  frame2 = gtk_frame_new (NULL);
+  gtk_widget_show (frame2);
+  gtk_box_pack_start (GTK_BOX (hbox19), frame2, TRUE, TRUE, 0);
+
+  status1 = gtk_label_new ("");
+  gtk_widget_show (status1);
+  gtk_container_add (GTK_CONTAINER (frame2), status1);
+  gtk_label_set_justify (GTK_LABEL (status1), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (status1), 0, 0.5);
+
+  g_signal_connect ((gpointer) app1, "delete_event",
+                    G_CALLBACK (on_app1_delete_event),
+                    NULL);
+  g_signal_connect ((gpointer) connect_button1, "clicked",
+                    G_CALLBACK (on_connect_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) run_button1, "clicked",
+                    G_CALLBACK (on_run_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) msgs_button, "clicked",
+                    G_CALLBACK (on_msgs_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) restore_button, "clicked",
+                    G_CALLBACK (on_restore_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) label_button, "clicked",
+                    G_CALLBACK (on_label_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) entry1, "key_press_event",
+                    G_CALLBACK (on_entry1_key_press_event),
+                    NULL);
+  g_signal_connect ((gpointer) entry1, "key_release_event",
+                    G_CALLBACK (on_entry1_key_release_event),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (app1, app1, "app1");
+  GLADE_HOOKUP_OBJECT (app1, vbox6, "vbox6");
+  GLADE_HOOKUP_OBJECT (app1, handlebox1, "handlebox1");
+  GLADE_HOOKUP_OBJECT (app1, menubar1, "menubar1");
+  GLADE_HOOKUP_OBJECT (app1, menubar1_uiinfo[0].widget, "file1");
+  GLADE_HOOKUP_OBJECT (app1, file1_menu_uiinfo[0].widget, "connect1");
+  GLADE_HOOKUP_OBJECT (app1, file1_menu_uiinfo[1].widget, "disconnect1");
+  GLADE_HOOKUP_OBJECT (app1, file1_menu_uiinfo[2].widget, "menuitem4");
+  GLADE_HOOKUP_OBJECT (app1, file1_menu_uiinfo[3].widget, "exit1");
+  GLADE_HOOKUP_OBJECT (app1, menubar1_uiinfo[1].widget, "edit1");
+  GLADE_HOOKUP_OBJECT (app1, edit1_menu_uiinfo[0].widget, "cut1");
+  GLADE_HOOKUP_OBJECT (app1, edit1_menu_uiinfo[1].widget, "copy1");
+  GLADE_HOOKUP_OBJECT (app1, edit1_menu_uiinfo[2].widget, "paste1");
+  GLADE_HOOKUP_OBJECT (app1, edit1_menu_uiinfo[3].widget, "clear1");
+  GLADE_HOOKUP_OBJECT (app1, edit1_menu_uiinfo[4].widget, "separator1");
+  GLADE_HOOKUP_OBJECT (app1, menubar1_uiinfo[2].widget, "item1");
+  GLADE_HOOKUP_OBJECT (app1, item1_menu_uiinfo[0].widget, "msgs");
+  GLADE_HOOKUP_OBJECT (app1, menubar1_uiinfo[3].widget, "settings1");
+  GLADE_HOOKUP_OBJECT (app1, settings1_menu_uiinfo[0].widget, "preferences1");
+  GLADE_HOOKUP_OBJECT (app1, menubar1_uiinfo[4].widget, "help1");
+  GLADE_HOOKUP_OBJECT (app1, help1_menu_uiinfo[0].widget, "about1");
+  GLADE_HOOKUP_OBJECT (app1, handlebox2, "handlebox2");
+  GLADE_HOOKUP_OBJECT (app1, toolbar2, "toolbar2");
+  GLADE_HOOKUP_OBJECT (app1, connect_button1, "connect_button1");
+  GLADE_HOOKUP_OBJECT (app1, run_button1, "run_button1");
+  GLADE_HOOKUP_OBJECT (app1, msgs_button, "msgs_button");
+  GLADE_HOOKUP_OBJECT (app1, restore_button, "restore_button");
+  GLADE_HOOKUP_OBJECT (app1, label_button, "label_button");
+  GLADE_HOOKUP_OBJECT (app1, vbox7, "vbox7");
+  GLADE_HOOKUP_OBJECT (app1, scroll1, "scroll1");
+  GLADE_HOOKUP_OBJECT (app1, text1, "text1");
+  GLADE_HOOKUP_OBJECT (app1, hbox18, "hbox18");
+  GLADE_HOOKUP_OBJECT (app1, label38, "label38");
+  GLADE_HOOKUP_OBJECT (app1, entry1, "entry1");
+  GLADE_HOOKUP_OBJECT (app1, hbox19, "hbox19");
+  GLADE_HOOKUP_OBJECT (app1, frame1, "frame1");
+  GLADE_HOOKUP_OBJECT (app1, label39, "label39");
+  GLADE_HOOKUP_OBJECT (app1, frame2, "frame2");
+  GLADE_HOOKUP_OBJECT (app1, status1, "status1");
+  GLADE_HOOKUP_OBJECT_NO_REF (app1, tooltips, "tooltips");
+
+  gtk_widget_grab_focus (entry1);
+  gtk_widget_grab_default (entry1);
+  return app1;
+}
+
+GtkWidget*
+create_about1 (void)
+{
+  GtkWidget *about1;
+  GtkWidget *dialog_vbox5;
+  GtkWidget *vbox8;
+  GtkWidget *vbox9;
+  GtkWidget *about_head;
+  GtkWidget *hseparator1;
+  GtkWidget *copyright;
+  GtkWidget *authors;
+  GtkWidget *theme;
+  GtkWidget *dialog_action_area5;
+  GtkWidget *hbox20;
+  GtkWidget *label44;
+  GtkWidget *about_button;
+
+  about1 = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (about1), _("About Bacula Console"));
+  gtk_window_set_modal (GTK_WINDOW (about1), TRUE);
+
+  dialog_vbox5 = GTK_DIALOG (about1)->vbox;
+  gtk_widget_show (dialog_vbox5);
+
+  vbox8 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox8);
+  gtk_box_pack_start (GTK_BOX (dialog_vbox5), vbox8, TRUE, TRUE, 0);
+
+  vbox9 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox9);
+  gtk_box_pack_start (GTK_BOX (vbox8), vbox9, TRUE, TRUE, 0);
+
+  about_head = gtk_label_new (_("Bacula Console 1.32n (14 Oct 03)\n"));
+  gtk_widget_show (about_head);
+  gtk_box_pack_start (GTK_BOX (vbox9), about_head, FALSE, FALSE, 0);
+
+  hseparator1 = gtk_hseparator_new ();
+  gtk_widget_show (hseparator1);
+  gtk_box_pack_start (GTK_BOX (vbox9), hseparator1, FALSE, FALSE, 0);
+
+  copyright = gtk_label_new (_("Copyright (c) 1999 - 2002, Kern Sibbald and John Walker"));
+  gtk_widget_show (copyright);
+  gtk_box_pack_start (GTK_BOX (vbox9), copyright, TRUE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (copyright), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (copyright), 0.1, 0.5);
+
+  authors = gtk_label_new (_("Authors: Kern Sibbald and John Walker"));
+  gtk_widget_show (authors);
+  gtk_box_pack_start (GTK_BOX (vbox9), authors, TRUE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (authors), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (authors), 0.0400001, 0.5);
+
+  theme = gtk_label_new (_("It comes by night and sucks the essence from your computers"));
+  gtk_widget_show (theme);
+  gtk_box_pack_start (GTK_BOX (vbox9), theme, TRUE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (theme), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (theme), 0.15, 0.5);
+
+  dialog_action_area5 = GTK_DIALOG (about1)->action_area;
+  gtk_widget_show (dialog_action_area5);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area5), GTK_BUTTONBOX_END);
+
+  hbox20 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox20);
+  gtk_container_add (GTK_CONTAINER (dialog_action_area5), hbox20);
+
+  label44 = gtk_label_new ("");
+  gtk_widget_show (label44);
+  gtk_box_pack_start (GTK_BOX (hbox20), label44, TRUE, FALSE, 0);
+
+  about_button = gtk_button_new_from_stock ("gtk-ok");
+  gtk_widget_show (about_button);
+  gtk_box_pack_start (GTK_BOX (hbox20), about_button, FALSE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (about_button), 1);
+  GTK_WIDGET_SET_FLAGS (about_button, GTK_CAN_DEFAULT);
+
+  g_signal_connect ((gpointer) about_button, "clicked",
+                    G_CALLBACK (on_about_button_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (about1, about1, "about1");
+  GLADE_HOOKUP_OBJECT_NO_REF (about1, dialog_vbox5, "dialog_vbox5");
+  GLADE_HOOKUP_OBJECT (about1, vbox8, "vbox8");
+  GLADE_HOOKUP_OBJECT (about1, vbox9, "vbox9");
+  GLADE_HOOKUP_OBJECT (about1, about_head, "about_head");
+  GLADE_HOOKUP_OBJECT (about1, hseparator1, "hseparator1");
+  GLADE_HOOKUP_OBJECT (about1, copyright, "copyright");
+  GLADE_HOOKUP_OBJECT (about1, authors, "authors");
+  GLADE_HOOKUP_OBJECT (about1, theme, "theme");
+  GLADE_HOOKUP_OBJECT_NO_REF (about1, dialog_action_area5, "dialog_action_area5");
+  GLADE_HOOKUP_OBJECT (about1, hbox20, "hbox20");
+  GLADE_HOOKUP_OBJECT (about1, label44, "label44");
+  GLADE_HOOKUP_OBJECT (about1, about_button, "about_button");
+
+  return about1;
+}
+
+GtkWidget*
+create_SelectDirectorDialog (void)
+{
+  GtkWidget *SelectDirectorDialog;
+  GtkWidget *dialog_vbox6;
+  GtkWidget *vbox10;
+  GtkWidget *label48;
+  GtkWidget *label47;
+  GtkWidget *combo1;
+  GList *combo1_items = NULL;
+  GtkWidget *dirselect;
+  GtkWidget *dialog_action_area2;
+  GtkWidget *hbox21;
+  GtkWidget *button11;
+  GtkWidget *label46;
+  GtkWidget *button13;
+
+  SelectDirectorDialog = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (SelectDirectorDialog), _("Select Director"));
+  gtk_window_set_modal (GTK_WINDOW (SelectDirectorDialog), TRUE);
+
+  dialog_vbox6 = GTK_DIALOG (SelectDirectorDialog)->vbox;
+  gtk_widget_show (dialog_vbox6);
+
+  vbox10 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox10);
+  gtk_box_pack_start (GTK_BOX (dialog_vbox6), vbox10, TRUE, TRUE, 0);
+
+  label48 = gtk_label_new ("");
+  gtk_widget_show (label48);
+  gtk_box_pack_start (GTK_BOX (vbox10), label48, FALSE, FALSE, 0);
+  gtk_misc_set_alignment (GTK_MISC (label48), 0.48, 0.46);
+
+  label47 = gtk_label_new (_("Select Director"));
+  gtk_widget_show (label47);
+  gtk_box_pack_start (GTK_BOX (vbox10), label47, FALSE, FALSE, 0);
+
+  combo1 = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo1)->popwin),
+                     "GladeParentKey", combo1);
+  gtk_widget_show (combo1);
+  gtk_box_pack_start (GTK_BOX (vbox10), combo1, FALSE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (combo1), 6);
+  combo1_items = g_list_append (combo1_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo1), combo1_items);
+  g_list_free (combo1_items);
+
+  dirselect = GTK_COMBO (combo1)->entry;
+  gtk_widget_show (dirselect);
+
+  dialog_action_area2 = GTK_DIALOG (SelectDirectorDialog)->action_area;
+  gtk_widget_show (dialog_action_area2);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
+
+  hbox21 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox21);
+  gtk_container_add (GTK_CONTAINER (dialog_action_area2), hbox21);
+
+  button11 = gtk_button_new_from_stock ("gtk-ok");
+  gtk_widget_show (button11);
+  gtk_box_pack_start (GTK_BOX (hbox21), button11, FALSE, FALSE, 0);
+
+  label46 = gtk_label_new (_("         "));
+  gtk_widget_show (label46);
+  gtk_box_pack_start (GTK_BOX (hbox21), label46, FALSE, FALSE, 0);
+  gtk_misc_set_padding (GTK_MISC (label46), 2, 0);
+
+  button13 = gtk_button_new_from_stock ("gtk-cancel");
+  gtk_widget_show (button13);
+  gtk_box_pack_start (GTK_BOX (hbox21), button13, FALSE, FALSE, 0);
+
+  g_signal_connect ((gpointer) button11, "clicked",
+                    G_CALLBACK (on_select_director_OK_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) button13, "clicked",
+                    G_CALLBACK (on_select_director_cancel_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (SelectDirectorDialog, SelectDirectorDialog, "SelectDirectorDialog");
+  GLADE_HOOKUP_OBJECT_NO_REF (SelectDirectorDialog, dialog_vbox6, "dialog_vbox6");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, vbox10, "vbox10");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, label48, "label48");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, label47, "label47");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, combo1, "combo1");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, dirselect, "dirselect");
+  GLADE_HOOKUP_OBJECT_NO_REF (SelectDirectorDialog, dialog_action_area2, "dialog_action_area2");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, hbox21, "hbox21");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, button11, "button11");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, label46, "label46");
+  GLADE_HOOKUP_OBJECT (SelectDirectorDialog, button13, "button13");
+
+  return SelectDirectorDialog;
+}
+
+GtkWidget*
+create_RunDialog (void)
+{
+  GtkWidget *RunDialog;
+  GtkWidget *dialog_vbox7;
+  GtkWidget *vbox11;
+  GtkWidget *vbox12;
+  GtkWidget *label62;
+  GtkWidget *hbox28;
+  GtkWidget *hbox29;
+  GtkWidget *label63;
+  GtkWidget *combo_job;
+  GList *combo_job_items = NULL;
+  GtkWidget *entry_job;
+  GtkWidget *label64;
+  GtkWidget *combo_type;
+  GList *combo_type_items = NULL;
+  GtkWidget *entry_type;
+  GtkWidget *label65;
+  GtkWidget *hbox30;
+  GtkWidget *label66;
+  GtkWidget *combo_client;
+  GList *combo_client_items = NULL;
+  GtkWidget *entry_client;
+  GtkWidget *label67;
+  GtkWidget *hbox31;
+  GtkWidget *label68;
+  GtkWidget *combo_fileset;
+  GList *combo_fileset_items = NULL;
+  GtkWidget *entry_fileset;
+  GtkWidget *view_fileset_button;
+  GtkWidget *label69;
+  GtkWidget *hbox32;
+  GtkWidget *label70;
+  GtkWidget *combo_level;
+  GList *combo_level_items = NULL;
+  GtkWidget *entry_level;
+  GtkWidget *label71;
+  GtkWidget *hbox33;
+  GtkWidget *label72;
+  GtkWidget *combo_pool;
+  GList *combo_pool_items = NULL;
+  GtkWidget *entry_pool;
+  GtkWidget *label73;
+  GtkWidget *hbox39;
+  GtkWidget *label96;
+  GtkWidget *combo_storage;
+  GList *combo_storage_items = NULL;
+  GtkWidget *entry_storage;
+  GtkWidget *label97;
+  GtkWidget *hbox40;
+  GtkWidget *label98;
+  GtkWidget *combo_messages;
+  GList *combo_messages_items = NULL;
+  GtkWidget *entry_messages;
+  GtkWidget *label99;
+  GtkWidget *hbox34;
+  GtkWidget *label77;
+  GtkWidget *entry_where;
+  GtkWidget *label78;
+  GtkWidget *hbox41;
+  GtkWidget *label100;
+  GtkWidget *entry_when;
+  GtkWidget *label101;
+  GtkWidget *label84;
+  GtkWidget *dialog_action_area6;
+  GtkWidget *hbuttonbox1;
+  GtkWidget *run_ok;
+  GtkWidget *run_cancel;
+
+  RunDialog = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (RunDialog), _("Run a Job"));
+
+  dialog_vbox7 = GTK_DIALOG (RunDialog)->vbox;
+  gtk_widget_show (dialog_vbox7);
+
+  vbox11 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox11);
+  gtk_box_pack_start (GTK_BOX (dialog_vbox7), vbox11, TRUE, TRUE, 0);
+
+  vbox12 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox12);
+  gtk_box_pack_start (GTK_BOX (vbox11), vbox12, TRUE, TRUE, 0);
+
+  label62 = gtk_label_new (_("Run a Job"));
+  gtk_widget_show (label62);
+  gtk_box_pack_start (GTK_BOX (vbox12), label62, FALSE, FALSE, 2);
+  gtk_misc_set_padding (GTK_MISC (label62), 0, 9);
+
+  hbox28 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox28);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox28, FALSE, FALSE, 2);
+
+  hbox29 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox29);
+  gtk_box_pack_start (GTK_BOX (hbox28), hbox29, TRUE, TRUE, 0);
+
+  label63 = gtk_label_new (_("Job:"));
+  gtk_widget_show (label63);
+  gtk_box_pack_start (GTK_BOX (hbox29), label63, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label63), GTK_JUSTIFY_RIGHT);
+
+  combo_job = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_job)->popwin),
+                     "GladeParentKey", combo_job);
+  gtk_widget_show (combo_job);
+  gtk_box_pack_start (GTK_BOX (hbox29), combo_job, TRUE, TRUE, 1);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_job), TRUE, FALSE);
+  combo_job_items = g_list_append (combo_job_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_job), combo_job_items);
+  g_list_free (combo_job_items);
+
+  entry_job = GTK_COMBO (combo_job)->entry;
+  gtk_widget_show (entry_job);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_job), FALSE);
+
+  label64 = gtk_label_new (_("   Type:"));
+  gtk_widget_show (label64);
+  gtk_box_pack_start (GTK_BOX (hbox29), label64, FALSE, FALSE, 0);
+
+  combo_type = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_type)->popwin),
+                     "GladeParentKey", combo_type);
+  gtk_widget_show (combo_type);
+  gtk_box_pack_start (GTK_BOX (hbox29), combo_type, FALSE, FALSE, 6);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_type), TRUE, FALSE);
+  combo_type_items = g_list_append (combo_type_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_type), combo_type_items);
+  g_list_free (combo_type_items);
+
+  entry_type = GTK_COMBO (combo_type)->entry;
+  gtk_widget_show (entry_type);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_type), FALSE);
+
+  label65 = gtk_label_new (_(" "));
+  gtk_widget_show (label65);
+  gtk_box_pack_start (GTK_BOX (hbox28), label65, FALSE, FALSE, 30);
+
+  hbox30 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox30);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox30, TRUE, TRUE, 0);
+
+  label66 = gtk_label_new (_("Client:"));
+  gtk_widget_show (label66);
+  gtk_box_pack_start (GTK_BOX (hbox30), label66, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label66), GTK_JUSTIFY_RIGHT);
+
+  combo_client = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_client)->popwin),
+                     "GladeParentKey", combo_client);
+  gtk_widget_show (combo_client);
+  gtk_box_pack_start (GTK_BOX (hbox30), combo_client, TRUE, TRUE, 1);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_client), TRUE, FALSE);
+  combo_client_items = g_list_append (combo_client_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_client), combo_client_items);
+  g_list_free (combo_client_items);
+
+  entry_client = GTK_COMBO (combo_client)->entry;
+  gtk_widget_show (entry_client);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_client), FALSE);
+
+  label67 = gtk_label_new (_(" "));
+  gtk_widget_show (label67);
+  gtk_box_pack_start (GTK_BOX (hbox30), label67, FALSE, FALSE, 123);
+
+  hbox31 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox31);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox31, TRUE, TRUE, 2);
+
+  label68 = gtk_label_new (_("FileSet: "));
+  gtk_widget_show (label68);
+  gtk_box_pack_start (GTK_BOX (hbox31), label68, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label68), GTK_JUSTIFY_RIGHT);
+
+  combo_fileset = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_fileset)->popwin),
+                     "GladeParentKey", combo_fileset);
+  gtk_widget_show (combo_fileset);
+  gtk_box_pack_start (GTK_BOX (hbox31), combo_fileset, TRUE, TRUE, 0);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_fileset), TRUE, FALSE);
+  combo_fileset_items = g_list_append (combo_fileset_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_fileset), combo_fileset_items);
+  g_list_free (combo_fileset_items);
+
+  entry_fileset = GTK_COMBO (combo_fileset)->entry;
+  gtk_widget_show (entry_fileset);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_fileset), FALSE);
+
+  view_fileset_button = gtk_button_new_with_mnemonic (_("  View FileSet  "));
+  gtk_widget_show (view_fileset_button);
+  gtk_box_pack_start (GTK_BOX (hbox31), view_fileset_button, FALSE, TRUE, 10);
+
+  label69 = gtk_label_new (_("  "));
+  gtk_widget_show (label69);
+  gtk_box_pack_start (GTK_BOX (hbox31), label69, FALSE, FALSE, 65);
+
+  hbox32 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox32);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox32, TRUE, TRUE, 2);
+
+  label70 = gtk_label_new (_("Level:"));
+  gtk_widget_show (label70);
+  gtk_box_pack_start (GTK_BOX (hbox32), label70, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label70), GTK_JUSTIFY_RIGHT);
+
+  combo_level = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_level)->popwin),
+                     "GladeParentKey", combo_level);
+  gtk_widget_show (combo_level);
+  gtk_box_pack_start (GTK_BOX (hbox32), combo_level, TRUE, TRUE, 0);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_level), TRUE, FALSE);
+  combo_level_items = g_list_append (combo_level_items, (gpointer) "");
+  combo_level_items = g_list_append (combo_level_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_level), combo_level_items);
+  g_list_free (combo_level_items);
+
+  entry_level = GTK_COMBO (combo_level)->entry;
+  gtk_widget_show (entry_level);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_level), FALSE);
+
+  label71 = gtk_label_new (_("             "));
+  gtk_widget_show (label71);
+  gtk_box_pack_start (GTK_BOX (hbox32), label71, FALSE, FALSE, 100);
+
+  hbox33 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox33);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox33, TRUE, TRUE, 2);
+
+  label72 = gtk_label_new (_("Pool:"));
+  gtk_widget_show (label72);
+  gtk_box_pack_start (GTK_BOX (hbox33), label72, FALSE, FALSE, 0);
+
+  combo_pool = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_pool)->popwin),
+                     "GladeParentKey", combo_pool);
+  gtk_widget_show (combo_pool);
+  gtk_box_pack_start (GTK_BOX (hbox33), combo_pool, TRUE, TRUE, 0);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_pool), TRUE, FALSE);
+  combo_pool_items = g_list_append (combo_pool_items, (gpointer) "");
+  combo_pool_items = g_list_append (combo_pool_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_pool), combo_pool_items);
+  g_list_free (combo_pool_items);
+
+  entry_pool = GTK_COMBO (combo_pool)->entry;
+  gtk_widget_show (entry_pool);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_pool), FALSE);
+
+  label73 = gtk_label_new (_("   "));
+  gtk_widget_show (label73);
+  gtk_box_pack_start (GTK_BOX (hbox33), label73, FALSE, FALSE, 120);
+
+  hbox39 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox39);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox39, TRUE, TRUE, 0);
+
+  label96 = gtk_label_new (_("Storage:"));
+  gtk_widget_show (label96);
+  gtk_box_pack_start (GTK_BOX (hbox39), label96, FALSE, FALSE, 0);
+
+  combo_storage = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_storage)->popwin),
+                     "GladeParentKey", combo_storage);
+  gtk_widget_show (combo_storage);
+  gtk_box_pack_start (GTK_BOX (hbox39), combo_storage, TRUE, TRUE, 0);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_storage), TRUE, FALSE);
+  combo_storage_items = g_list_append (combo_storage_items, (gpointer) "");
+  combo_storage_items = g_list_append (combo_storage_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_storage), combo_storage_items);
+  g_list_free (combo_storage_items);
+
+  entry_storage = GTK_COMBO (combo_storage)->entry;
+  gtk_widget_show (entry_storage);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_storage), FALSE);
+
+  label97 = gtk_label_new (_("   "));
+  gtk_widget_show (label97);
+  gtk_box_pack_start (GTK_BOX (hbox39), label97, FALSE, FALSE, 120);
+
+  hbox40 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox40);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox40, TRUE, TRUE, 0);
+
+  label98 = gtk_label_new (_("Messages:"));
+  gtk_widget_show (label98);
+  gtk_box_pack_start (GTK_BOX (hbox40), label98, FALSE, FALSE, 0);
+
+  combo_messages = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (combo_messages)->popwin),
+                     "GladeParentKey", combo_messages);
+  gtk_widget_show (combo_messages);
+  gtk_box_pack_start (GTK_BOX (hbox40), combo_messages, TRUE, TRUE, 0);
+  gtk_combo_set_value_in_list (GTK_COMBO (combo_messages), TRUE, FALSE);
+  combo_messages_items = g_list_append (combo_messages_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (combo_messages), combo_messages_items);
+  g_list_free (combo_messages_items);
+
+  entry_messages = GTK_COMBO (combo_messages)->entry;
+  gtk_widget_show (entry_messages);
+  gtk_editable_set_editable (GTK_EDITABLE (entry_messages), FALSE);
+
+  label99 = gtk_label_new (_("   "));
+  gtk_widget_show (label99);
+  gtk_box_pack_start (GTK_BOX (hbox40), label99, FALSE, FALSE, 120);
+
+  hbox34 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox34);
+  gtk_box_pack_start (GTK_BOX (vbox12), hbox34, TRUE, TRUE, 2);
+
+  label77 = gtk_label_new (_("Where: "));
+  gtk_widget_show (label77);
+  gtk_box_pack_start (GTK_BOX (hbox34), label77, FALSE, FALSE, 0);
+
+  entry_where = gtk_entry_new ();
+  gtk_widget_show (entry_where);
+  gtk_box_pack_start (GTK_BOX (hbox34), entry_where, TRUE, TRUE, 0);
+
+  label78 = gtk_label_new (_("   "));
+  gtk_widget_show (label78);
+  gtk_box_pack_start (GTK_BOX (hbox34), label78, FALSE, FALSE, 120);
+
+  hbox41 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox41);
+  gtk_box_pack_start (GTK_BOX (vbox11), hbox41, TRUE, TRUE, 0);
+
+  label100 = gtk_label_new (_("When:"));
+  gtk_widget_show (label100);
+  gtk_box_pack_start (GTK_BOX (hbox41), label100, FALSE, FALSE, 0);
+
+  entry_when = gtk_entry_new ();
+  gtk_widget_show (entry_when);
+  gtk_box_pack_start (GTK_BOX (hbox41), entry_when, TRUE, TRUE, 0);
+
+  label101 = gtk_label_new (_("   "));
+  gtk_widget_show (label101);
+  gtk_box_pack_start (GTK_BOX (hbox41), label101, FALSE, FALSE, 120);
+
+  label84 = gtk_label_new (_("   "));
+  gtk_widget_show (label84);
+  gtk_box_pack_start (GTK_BOX (vbox11), label84, FALSE, FALSE, 0);
+
+  dialog_action_area6 = GTK_DIALOG (RunDialog)->action_area;
+  gtk_widget_show (dialog_action_area6);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area6), GTK_BUTTONBOX_END);
+
+  hbuttonbox1 = gtk_hbutton_box_new ();
+  gtk_widget_show (hbuttonbox1);
+  gtk_container_add (GTK_CONTAINER (dialog_action_area6), hbuttonbox1);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
+  gtk_box_set_spacing (GTK_BOX (hbuttonbox1), 8);
+
+  run_ok = gtk_button_new_from_stock ("gtk-ok");
+  gtk_widget_show (run_ok);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox1), run_ok);
+  GTK_WIDGET_SET_FLAGS (run_ok, GTK_CAN_DEFAULT);
+
+  run_cancel = gtk_button_new_from_stock ("gtk-cancel");
+  gtk_widget_show (run_cancel);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox1), run_cancel);
+  GTK_WIDGET_SET_FLAGS (run_cancel, GTK_CAN_DEFAULT);
+
+  g_signal_connect ((gpointer) entry_job, "changed",
+                    G_CALLBACK (on_entry_job_changed),
+                    NULL);
+  g_signal_connect ((gpointer) view_fileset_button, "clicked",
+                    G_CALLBACK (on_view_fileset_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) run_ok, "clicked",
+                    G_CALLBACK (on_run_ok_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) run_cancel, "clicked",
+                    G_CALLBACK (on_run_cancel_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (RunDialog, RunDialog, "RunDialog");
+  GLADE_HOOKUP_OBJECT_NO_REF (RunDialog, dialog_vbox7, "dialog_vbox7");
+  GLADE_HOOKUP_OBJECT (RunDialog, vbox11, "vbox11");
+  GLADE_HOOKUP_OBJECT (RunDialog, vbox12, "vbox12");
+  GLADE_HOOKUP_OBJECT (RunDialog, label62, "label62");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox28, "hbox28");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox29, "hbox29");
+  GLADE_HOOKUP_OBJECT (RunDialog, label63, "label63");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_job, "combo_job");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_job, "entry_job");
+  GLADE_HOOKUP_OBJECT (RunDialog, label64, "label64");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_type, "combo_type");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_type, "entry_type");
+  GLADE_HOOKUP_OBJECT (RunDialog, label65, "label65");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox30, "hbox30");
+  GLADE_HOOKUP_OBJECT (RunDialog, label66, "label66");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_client, "combo_client");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_client, "entry_client");
+  GLADE_HOOKUP_OBJECT (RunDialog, label67, "label67");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox31, "hbox31");
+  GLADE_HOOKUP_OBJECT (RunDialog, label68, "label68");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_fileset, "combo_fileset");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_fileset, "entry_fileset");
+  GLADE_HOOKUP_OBJECT (RunDialog, view_fileset_button, "view_fileset_button");
+  GLADE_HOOKUP_OBJECT (RunDialog, label69, "label69");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox32, "hbox32");
+  GLADE_HOOKUP_OBJECT (RunDialog, label70, "label70");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_level, "combo_level");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_level, "entry_level");
+  GLADE_HOOKUP_OBJECT (RunDialog, label71, "label71");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox33, "hbox33");
+  GLADE_HOOKUP_OBJECT (RunDialog, label72, "label72");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_pool, "combo_pool");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_pool, "entry_pool");
+  GLADE_HOOKUP_OBJECT (RunDialog, label73, "label73");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox39, "hbox39");
+  GLADE_HOOKUP_OBJECT (RunDialog, label96, "label96");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_storage, "combo_storage");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_storage, "entry_storage");
+  GLADE_HOOKUP_OBJECT (RunDialog, label97, "label97");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox40, "hbox40");
+  GLADE_HOOKUP_OBJECT (RunDialog, label98, "label98");
+  GLADE_HOOKUP_OBJECT (RunDialog, combo_messages, "combo_messages");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_messages, "entry_messages");
+  GLADE_HOOKUP_OBJECT (RunDialog, label99, "label99");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox34, "hbox34");
+  GLADE_HOOKUP_OBJECT (RunDialog, label77, "label77");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_where, "entry_where");
+  GLADE_HOOKUP_OBJECT (RunDialog, label78, "label78");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbox41, "hbox41");
+  GLADE_HOOKUP_OBJECT (RunDialog, label100, "label100");
+  GLADE_HOOKUP_OBJECT (RunDialog, entry_when, "entry_when");
+  GLADE_HOOKUP_OBJECT (RunDialog, label101, "label101");
+  GLADE_HOOKUP_OBJECT (RunDialog, label84, "label84");
+  GLADE_HOOKUP_OBJECT_NO_REF (RunDialog, dialog_action_area6, "dialog_action_area6");
+  GLADE_HOOKUP_OBJECT (RunDialog, hbuttonbox1, "hbuttonbox1");
+  GLADE_HOOKUP_OBJECT (RunDialog, run_ok, "run_ok");
+  GLADE_HOOKUP_OBJECT (RunDialog, run_cancel, "run_cancel");
+
+  return RunDialog;
+}
+
+GtkWidget*
+create_restore_files (void)
+{
+  GtkWidget *restore_files;
+  GtkWidget *vbox13;
+  GtkWidget *scrolledwindow4;
+  GtkWidget *ctree2;
+  GtkWidget *hbox38;
+  GtkWidget *label88;
+  GtkWidget *entry25;
+  GtkWidget *hbox44;
+  GtkWidget *label105;
+  GtkWidget *restore_file;
+  GtkTooltips *tooltips;
+
+  tooltips = gtk_tooltips_new ();
+
+  restore_files = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (restore_files), _("Restore File Selection"));
+  gtk_window_set_modal (GTK_WINDOW (restore_files), TRUE);
+
+  vbox13 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox13);
+  gtk_container_add (GTK_CONTAINER (restore_files), vbox13);
+
+  scrolledwindow4 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_show (scrolledwindow4);
+  gtk_box_pack_start (GTK_BOX (vbox13), scrolledwindow4, TRUE, TRUE, 0);
+  GTK_WIDGET_UNSET_FLAGS (scrolledwindow4, GTK_CAN_FOCUS);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_SHADOW_IN);
+
+  ctree2 = gtk_tree_view_new ();
+  gtk_widget_show (ctree2);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow4), ctree2);
+
+  hbox38 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox38);
+  gtk_box_pack_start (GTK_BOX (vbox13), hbox38, FALSE, TRUE, 0);
+
+  label88 = gtk_label_new (_(" cwd:"));
+  gtk_widget_show (label88);
+  gtk_box_pack_start (GTK_BOX (hbox38), label88, FALSE, TRUE, 0);
+
+  entry25 = gtk_entry_new ();
+  gtk_widget_show (entry25);
+  gtk_box_pack_start (GTK_BOX (hbox38), entry25, TRUE, TRUE, 0);
+  GTK_WIDGET_SET_FLAGS (entry25, GTK_CAN_DEFAULT);
+  gtk_tooltips_set_tip (tooltips, entry25, _("Enter Commands Here"), NULL);
+
+  hbox44 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox44);
+  gtk_box_pack_start (GTK_BOX (vbox13), hbox44, FALSE, TRUE, 0);
+
+  label105 = gtk_label_new (_(" "));
+  gtk_widget_show (label105);
+  gtk_box_pack_start (GTK_BOX (hbox44), label105, TRUE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label105), GTK_JUSTIFY_FILL);
+  gtk_misc_set_padding (GTK_MISC (label105), 59, 0);
+
+  restore_file = gtk_button_new_from_stock ("gtk-ok");
+  gtk_widget_show (restore_file);
+  gtk_box_pack_start (GTK_BOX (hbox44), restore_file, TRUE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (restore_file), 9);
+
+  g_signal_connect ((gpointer) entry25, "key_press_event",
+                    G_CALLBACK (on_entry1_key_press_event),
+                    NULL);
+  g_signal_connect ((gpointer) entry25, "key_release_event",
+                    G_CALLBACK (on_entry1_key_release_event),
+                    NULL);
+  g_signal_connect ((gpointer) restore_file, "clicked",
+                    G_CALLBACK (on_restore_file_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (restore_files, restore_files, "restore_files");
+  GLADE_HOOKUP_OBJECT (restore_files, vbox13, "vbox13");
+  GLADE_HOOKUP_OBJECT (restore_files, scrolledwindow4, "scrolledwindow4");
+  GLADE_HOOKUP_OBJECT (restore_files, ctree2, "ctree2");
+  GLADE_HOOKUP_OBJECT (restore_files, hbox38, "hbox38");
+  GLADE_HOOKUP_OBJECT (restore_files, label88, "label88");
+  GLADE_HOOKUP_OBJECT (restore_files, entry25, "entry25");
+  GLADE_HOOKUP_OBJECT (restore_files, hbox44, "hbox44");
+  GLADE_HOOKUP_OBJECT (restore_files, label105, "label105");
+  GLADE_HOOKUP_OBJECT (restore_files, restore_file, "restore_file");
+  GLADE_HOOKUP_OBJECT_NO_REF (restore_files, tooltips, "tooltips");
+
+  gtk_widget_grab_focus (entry25);
+  gtk_widget_grab_default (entry25);
+  return restore_files;
+}
+
+GtkWidget*
+create_restore_dialog (void)
+{
+  GtkWidget *restore_dialog;
+  GtkWidget *dialog_vbox8;
+  GtkWidget *hbox42;
+  GtkWidget *frame3;
+  GtkWidget *hbox43;
+  GtkWidget *label102;
+  GtkWidget *vbox15;
+  GtkWidget *label103;
+  GtkWidget *rb_most_recent;
+  GSList *rb_most_recent_group = NULL;
+  GtkWidget *rb_jobs;
+  GSList *rb_jobs_group = NULL;
+  GtkWidget *rb_file;
+  GSList *rb_file_group = NULL;
+  GtkWidget *label104;
+  GtkWidget *label106;
+  GtkWidget *vbox14;
+  GtkWidget *apply_button;
+  GtkWidget *dialog_action_area7;
+  GtkWidget *hbuttonbox2;
+  GtkWidget *restore_ok;
+  GtkWidget *restore_cancel;
+
+  restore_dialog = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (restore_dialog), _("Restore Files"));
+  gtk_window_set_modal (GTK_WINDOW (restore_dialog), TRUE);
+
+  dialog_vbox8 = GTK_DIALOG (restore_dialog)->vbox;
+  gtk_widget_show (dialog_vbox8);
+
+  hbox42 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox42);
+  gtk_box_pack_start (GTK_BOX (dialog_vbox8), hbox42, TRUE, TRUE, 0);
+
+  frame3 = gtk_frame_new (NULL);
+  gtk_widget_show (frame3);
+  gtk_box_pack_start (GTK_BOX (hbox42), frame3, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (frame3), 8);
+
+  hbox43 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox43);
+  gtk_container_add (GTK_CONTAINER (frame3), hbox43);
+
+  label102 = gtk_label_new (_("         "));
+  gtk_widget_show (label102);
+  gtk_box_pack_end (GTK_BOX (hbox43), label102, FALSE, FALSE, 0);
+
+  vbox15 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox15);
+  gtk_box_pack_start (GTK_BOX (hbox43), vbox15, TRUE, TRUE, 0);
+
+  label103 = gtk_label_new ("");
+  gtk_widget_show (label103);
+  gtk_box_pack_start (GTK_BOX (vbox15), label103, FALSE, FALSE, 0);
+  gtk_misc_set_padding (GTK_MISC (label103), 0, 2);
+
+  rb_most_recent = gtk_radio_button_new_with_mnemonic (NULL, _("Select most recent backup"));
+  gtk_widget_show (rb_most_recent);
+  gtk_box_pack_start (GTK_BOX (vbox15), rb_most_recent, FALSE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (rb_most_recent), 3);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (rb_most_recent), rb_most_recent_group);
+  rb_most_recent_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb_most_recent));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb_most_recent), TRUE);
+
+  rb_jobs = gtk_radio_button_new_with_mnemonic (NULL, _("Select list of Jobs"));
+  gtk_widget_show (rb_jobs);
+  gtk_box_pack_start (GTK_BOX (vbox15), rb_jobs, FALSE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (rb_jobs), 5);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (rb_jobs), rb_jobs_group);
+  rb_jobs_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb_jobs));
+
+  rb_file = gtk_radio_button_new_with_mnemonic (NULL, _("Find a specific file"));
+  gtk_widget_show (rb_file);
+  gtk_box_pack_start (GTK_BOX (vbox15), rb_file, FALSE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (rb_file), 4);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (rb_file), rb_file_group);
+  rb_file_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rb_file));
+
+  label104 = gtk_label_new ("");
+  gtk_widget_show (label104);
+  gtk_box_pack_start (GTK_BOX (vbox15), label104, FALSE, FALSE, 0);
+
+  label106 = gtk_label_new (_("Select by:"));
+  gtk_widget_show (label106);
+  gtk_frame_set_label_widget (GTK_FRAME (frame3), label106);
+  gtk_label_set_justify (GTK_LABEL (label106), GTK_JUSTIFY_LEFT);
+
+  vbox14 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox14);
+  gtk_box_pack_start (GTK_BOX (hbox42), vbox14, FALSE, FALSE, 0);
+
+  apply_button = gtk_button_new_from_stock ("gtk-apply");
+  gtk_widget_show (apply_button);
+  gtk_box_pack_start (GTK_BOX (vbox14), apply_button, FALSE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (apply_button), 50);
+
+  dialog_action_area7 = GTK_DIALOG (restore_dialog)->action_area;
+  gtk_widget_show (dialog_action_area7);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area7), GTK_BUTTONBOX_END);
+
+  hbuttonbox2 = gtk_hbutton_box_new ();
+  gtk_widget_show (hbuttonbox2);
+  gtk_container_add (GTK_CONTAINER (dialog_action_area7), hbuttonbox2);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_END);
+  gtk_box_set_spacing (GTK_BOX (hbuttonbox2), 8);
+
+  restore_ok = gtk_button_new_from_stock ("gtk-ok");
+  gtk_widget_show (restore_ok);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox2), restore_ok);
+  GTK_WIDGET_SET_FLAGS (restore_ok, GTK_CAN_DEFAULT);
+
+  restore_cancel = gtk_button_new_from_stock ("gtk-cancel");
+  gtk_widget_show (restore_cancel);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox2), restore_cancel);
+  GTK_WIDGET_SET_FLAGS (restore_cancel, GTK_CAN_DEFAULT);
+
+  g_signal_connect ((gpointer) apply_button, "clicked",
+                    G_CALLBACK (on_apply_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) restore_ok, "clicked",
+                    G_CALLBACK (on_restore_ok_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) restore_cancel, "clicked",
+                    G_CALLBACK (on_restore_cancel_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (restore_dialog, restore_dialog, "restore_dialog");
+  GLADE_HOOKUP_OBJECT_NO_REF (restore_dialog, dialog_vbox8, "dialog_vbox8");
+  GLADE_HOOKUP_OBJECT (restore_dialog, hbox42, "hbox42");
+  GLADE_HOOKUP_OBJECT (restore_dialog, frame3, "frame3");
+  GLADE_HOOKUP_OBJECT (restore_dialog, hbox43, "hbox43");
+  GLADE_HOOKUP_OBJECT (restore_dialog, label102, "label102");
+  GLADE_HOOKUP_OBJECT (restore_dialog, vbox15, "vbox15");
+  GLADE_HOOKUP_OBJECT (restore_dialog, label103, "label103");
+  GLADE_HOOKUP_OBJECT (restore_dialog, rb_most_recent, "rb_most_recent");
+  GLADE_HOOKUP_OBJECT (restore_dialog, rb_jobs, "rb_jobs");
+  GLADE_HOOKUP_OBJECT (restore_dialog, rb_file, "rb_file");
+  GLADE_HOOKUP_OBJECT (restore_dialog, label104, "label104");
+  GLADE_HOOKUP_OBJECT (restore_dialog, label106, "label106");
+  GLADE_HOOKUP_OBJECT (restore_dialog, vbox14, "vbox14");
+  GLADE_HOOKUP_OBJECT (restore_dialog, apply_button, "apply_button");
+  GLADE_HOOKUP_OBJECT_NO_REF (restore_dialog, dialog_action_area7, "dialog_action_area7");
+  GLADE_HOOKUP_OBJECT (restore_dialog, hbuttonbox2, "hbuttonbox2");
+  GLADE_HOOKUP_OBJECT (restore_dialog, restore_ok, "restore_ok");
+  GLADE_HOOKUP_OBJECT (restore_dialog, restore_cancel, "restore_cancel");
+
+  return restore_dialog;
+}
+
+GtkWidget*
+create_label_dialog (void)
+{
+  GtkWidget *label_dialog;
+  GtkWidget *dialog_vbox9;
+  GtkWidget *vbox16;
+  GtkWidget *label106;
+  GtkWidget *hbox45;
+  GtkWidget *label107;
+  GtkWidget *label_combo_storage;
+  GList *label_combo_storage_items = NULL;
+  GtkWidget *entry26;
+  GtkWidget *hbox46;
+  GtkWidget *label109;
+  GtkWidget *label_combo_pool;
+  GList *label_combo_pool_items = NULL;
+  GtkWidget *entry27;
+  GtkWidget *hbox47;
+  GtkWidget *label111;
+  GtkWidget *label_entry_volume;
+  GtkWidget *hbox48;
+  GtkWidget *slot1;
+  GtkObject *label_slot_adj;
+  GtkWidget *label_slot;
+  GtkWidget *label113;
+  GtkWidget *dialog_action_area8;
+  GtkWidget *hbuttonbox3;
+  GtkWidget *label_ok;
+  GtkWidget *label_cancel;
+
+  label_dialog = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (label_dialog), _("Label a Volume"));
+  gtk_window_set_modal (GTK_WINDOW (label_dialog), TRUE);
+
+  dialog_vbox9 = GTK_DIALOG (label_dialog)->vbox;
+  gtk_widget_show (dialog_vbox9);
+
+  vbox16 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox16);
+  gtk_box_pack_start (GTK_BOX (dialog_vbox9), vbox16, FALSE, TRUE, 0);
+
+  label106 = gtk_label_new (_("Label a Volume"));
+  gtk_widget_show (label106);
+  gtk_box_pack_start (GTK_BOX (vbox16), label106, FALSE, FALSE, 0);
+  gtk_misc_set_padding (GTK_MISC (label106), 0, 9);
+
+  hbox45 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox45);
+  gtk_box_pack_start (GTK_BOX (vbox16), hbox45, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox45), 5);
+
+  label107 = gtk_label_new (_("Storage:"));
+  gtk_widget_show (label107);
+  gtk_box_pack_start (GTK_BOX (hbox45), label107, TRUE, TRUE, 0);
+  gtk_misc_set_alignment (GTK_MISC (label107), 0.15, 0.5);
+
+  label_combo_storage = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (label_combo_storage)->popwin),
+                     "GladeParentKey", label_combo_storage);
+  gtk_widget_show (label_combo_storage);
+  gtk_box_pack_start (GTK_BOX (hbox45), label_combo_storage, TRUE, TRUE, 15);
+  gtk_combo_set_value_in_list (GTK_COMBO (label_combo_storage), TRUE, FALSE);
+  label_combo_storage_items = g_list_append (label_combo_storage_items, (gpointer) "");
+  label_combo_storage_items = g_list_append (label_combo_storage_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (label_combo_storage), label_combo_storage_items);
+  g_list_free (label_combo_storage_items);
+
+  entry26 = GTK_COMBO (label_combo_storage)->entry;
+  gtk_widget_show (entry26);
+  gtk_editable_set_editable (GTK_EDITABLE (entry26), FALSE);
+
+  hbox46 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox46);
+  gtk_box_pack_start (GTK_BOX (vbox16), hbox46, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox46), 5);
+
+  label109 = gtk_label_new (_("Pool:"));
+  gtk_widget_show (label109);
+  gtk_box_pack_start (GTK_BOX (hbox46), label109, TRUE, TRUE, 0);
+  gtk_label_set_justify (GTK_LABEL (label109), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label109), 0.12, 0.5);
+
+  label_combo_pool = gtk_combo_new ();
+  g_object_set_data (G_OBJECT (GTK_COMBO (label_combo_pool)->popwin),
+                     "GladeParentKey", label_combo_pool);
+  gtk_widget_show (label_combo_pool);
+  gtk_box_pack_start (GTK_BOX (hbox46), label_combo_pool, TRUE, TRUE, 14);
+  gtk_combo_set_value_in_list (GTK_COMBO (label_combo_pool), TRUE, FALSE);
+  label_combo_pool_items = g_list_append (label_combo_pool_items, (gpointer) "");
+  label_combo_pool_items = g_list_append (label_combo_pool_items, (gpointer) "");
+  gtk_combo_set_popdown_strings (GTK_COMBO (label_combo_pool), label_combo_pool_items);
+  g_list_free (label_combo_pool_items);
+
+  entry27 = GTK_COMBO (label_combo_pool)->entry;
+  gtk_widget_show (entry27);
+  gtk_editable_set_editable (GTK_EDITABLE (entry27), FALSE);
+
+  hbox47 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox47);
+  gtk_box_pack_start (GTK_BOX (vbox16), hbox47, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox47), 5);
+
+  label111 = gtk_label_new (_("Volume Name:"));
+  gtk_widget_show (label111);
+  gtk_box_pack_start (GTK_BOX (hbox47), label111, TRUE, TRUE, 0);
+  gtk_label_set_justify (GTK_LABEL (label111), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label111), 0.17, 0.5);
+
+  label_entry_volume = gtk_entry_new ();
+  gtk_widget_show (label_entry_volume);
+  gtk_box_pack_start (GTK_BOX (hbox47), label_entry_volume, TRUE, TRUE, 0);
+
+  hbox48 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox48);
+  gtk_box_pack_start (GTK_BOX (vbox16), hbox48, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox48), 5);
+
+  slot1 = gtk_label_new (_("Slot:"));
+  gtk_widget_show (slot1);
+  gtk_box_pack_start (GTK_BOX (hbox48), slot1, FALSE, TRUE, 0);
+  gtk_label_set_justify (GTK_LABEL (slot1), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (slot1), 0.09, 0.5);
+
+  label_slot_adj = gtk_adjustment_new (0, 0, 10000, 1, 10, 10);
+  label_slot = gtk_spin_button_new (GTK_ADJUSTMENT (label_slot_adj), 1, 0);
+  gtk_widget_show (label_slot);
+  gtk_box_pack_start (GTK_BOX (hbox48), label_slot, TRUE, TRUE, 0);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (label_slot), TRUE);
+
+  label113 = gtk_label_new (_("   "));
+  gtk_widget_show (label113);
+  gtk_box_pack_start (GTK_BOX (vbox16), label113, FALSE, FALSE, 0);
+
+  dialog_action_area8 = GTK_DIALOG (label_dialog)->action_area;
+  gtk_widget_show (dialog_action_area8);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area8), GTK_BUTTONBOX_END);
+
+  hbuttonbox3 = gtk_hbutton_box_new ();
+  gtk_widget_show (hbuttonbox3);
+  gtk_container_add (GTK_CONTAINER (dialog_action_area8), hbuttonbox3);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox3), GTK_BUTTONBOX_END);
+  gtk_box_set_spacing (GTK_BOX (hbuttonbox3), 8);
+
+  label_ok = gtk_button_new_from_stock ("gtk-ok");
+  gtk_widget_show (label_ok);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox3), label_ok);
+  GTK_WIDGET_SET_FLAGS (label_ok, GTK_CAN_DEFAULT);
+
+  label_cancel = gtk_button_new_from_stock ("gtk-cancel");
+  gtk_widget_show (label_cancel);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox3), label_cancel);
+  GTK_WIDGET_SET_FLAGS (label_cancel, GTK_CAN_DEFAULT);
+
+  g_signal_connect ((gpointer) label_ok, "clicked",
+                    G_CALLBACK (on_label_ok_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) label_cancel, "clicked",
+                    G_CALLBACK (on_label_cancel_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (label_dialog, label_dialog, "label_dialog");
+  GLADE_HOOKUP_OBJECT_NO_REF (label_dialog, dialog_vbox9, "dialog_vbox9");
+  GLADE_HOOKUP_OBJECT (label_dialog, vbox16, "vbox16");
+  GLADE_HOOKUP_OBJECT (label_dialog, label106, "label106");
+  GLADE_HOOKUP_OBJECT (label_dialog, hbox45, "hbox45");
+  GLADE_HOOKUP_OBJECT (label_dialog, label107, "label107");
+  GLADE_HOOKUP_OBJECT (label_dialog, label_combo_storage, "label_combo_storage");
+  GLADE_HOOKUP_OBJECT (label_dialog, entry26, "entry26");
+  GLADE_HOOKUP_OBJECT (label_dialog, hbox46, "hbox46");
+  GLADE_HOOKUP_OBJECT (label_dialog, label109, "label109");
+  GLADE_HOOKUP_OBJECT (label_dialog, label_combo_pool, "label_combo_pool");
+  GLADE_HOOKUP_OBJECT (label_dialog, entry27, "entry27");
+  GLADE_HOOKUP_OBJECT (label_dialog, hbox47, "hbox47");
+  GLADE_HOOKUP_OBJECT (label_dialog, label111, "label111");
+  GLADE_HOOKUP_OBJECT (label_dialog, label_entry_volume, "label_entry_volume");
+  GLADE_HOOKUP_OBJECT (label_dialog, hbox48, "hbox48");
+  GLADE_HOOKUP_OBJECT (label_dialog, slot1, "slot1");
+  GLADE_HOOKUP_OBJECT (label_dialog, label_slot, "label_slot");
+  GLADE_HOOKUP_OBJECT (label_dialog, label113, "label113");
+  GLADE_HOOKUP_OBJECT_NO_REF (label_dialog, dialog_action_area8, "dialog_action_area8");
+  GLADE_HOOKUP_OBJECT (label_dialog, hbuttonbox3, "hbuttonbox3");
+  GLADE_HOOKUP_OBJECT (label_dialog, label_ok, "label_ok");
+  GLADE_HOOKUP_OBJECT (label_dialog, label_cancel, "label_cancel");
+
+  return label_dialog;
+}
+
diff --git a/bacula/src/gnome2-console/support.c b/bacula/src/gnome2-console/support.c
new file mode 100644 (file)
index 0000000..7f06554
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <gnome.h>
+
+#include "support.h"
+
+GtkWidget*
+lookup_widget                          (GtkWidget       *widget,
+                                        const gchar     *widget_name)
+{
+  GtkWidget *parent, *found_widget;
+
+  for (;;)
+    {
+      if (GTK_IS_MENU (widget))
+        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+      else
+        parent = widget->parent;
+      if (!parent)
+        parent = (GtkWidget *)g_object_get_data (G_OBJECT (widget), "GladeParentKey");
+      if (parent == NULL)
+        break;
+      widget = parent;
+    }
+
+  found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
+                                                 widget_name);
+  if (!found_widget)
+    g_warning ("Widget not found: %s", widget_name);
+  return found_widget;
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap                          (GtkWidget       *widget,
+                                        const gchar     *filename)
+{
+  GtkWidget *pixmap;
+  gchar *pathname;
+
+  if (!filename || !filename[0])
+      return gtk_image_new ();
+
+  pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP,
+                                        filename, TRUE, NULL);
+  if (!pathname)
+    {
+      g_warning (_("Couldn't find pixmap file: %s"), filename);
+      return gtk_image_new ();
+    }
+
+  pixmap = gtk_image_new_from_file (pathname);
+  g_free (pathname);
+  return pixmap;
+}
+
+/* This is an internally used function to create pixmaps. */
+GdkPixbuf*
+create_pixbuf                          (const gchar     *filename)
+{
+  gchar *pathname = NULL;
+  GdkPixbuf *pixbuf;
+  GError *error = NULL;
+
+  if (!filename || !filename[0])
+      return NULL;
+
+  pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP,
+                                        filename, TRUE, NULL);
+
+  if (!pathname)
+    {
+      g_warning (_("Couldn't find pixmap file: %s"), filename);
+      return NULL;
+    }
+
+  pixbuf = gdk_pixbuf_new_from_file (pathname, &error);
+  if (!pixbuf)
+    {
+      fprintf (stderr, "Failed to load pixbuf file: %s: %s\n",
+               pathname, error->message);
+      g_error_free (error);
+    }
+  g_free (pathname);
+  return pixbuf;
+}
+
+/* This is used to set ATK action descriptions. */
+void
+glade_set_atk_action_description       (AtkAction       *action,
+                                        const gchar     *action_name,
+                                        const gchar     *description)
+{
+  gint n_actions, i;
+
+  n_actions = atk_action_get_n_actions (action);
+  for (i = 0; i < n_actions; i++)
+    {
+      if (!strcmp (atk_action_get_name (action, i), action_name))
+        atk_action_set_description (action, i, description);
+    }
+}
+
diff --git a/bacula/src/gnome2-console/support.h b/bacula/src/gnome2-console/support.h
new file mode 100644 (file)
index 0000000..13d1746
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#include <gnome.h>
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget*  lookup_widget              (GtkWidget       *widget,
+                                        const gchar     *widget_name);
+
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps used in the interface. */
+GtkWidget*  create_pixmap              (GtkWidget       *widget,
+                                        const gchar     *filename);
+
+/* This is used to create the pixbufs used in the interface. */
+GdkPixbuf*  create_pixbuf              (const gchar     *filename);
+
+/* This is used to set ATK action descriptions. */
+void        glade_set_atk_action_description (AtkAction       *action,
+                                              const gchar     *action_name,
+                                              const gchar     *description);
+
index 9a35e2d15a915df91bd30722237a00370dff0611..331206d2b8fcdf318db50482e5ed455e6d2f8c76 100644 (file)
@@ -1,9 +1,9 @@
 /* */
 #undef  VERSION
-#define VERSION "1.32b"
+#define VERSION "1.32c"
 #define VSTRING "1"
-#define BDATE   "14 Oct 2003"
-#define LSMDATE "14Oct03"
+#define BDATE   "18 Oct 2003"
+#define LSMDATE "18Oct03"
 
 /* Debug flags */
 #undef  DEBUG