]> git.sur5r.net Git - bacula/docs/commitdiff
Try to clean up a bit
authorKern Sibbald <kern@sibbald.com>
Fri, 18 Sep 2009 16:24:23 +0000 (18:24 +0200)
committerKern Sibbald <kern@sibbald.com>
Fri, 18 Sep 2009 16:24:23 +0000 (18:24 +0200)
39 files changed:
docs/.gitignore [new file with mode: 0644]
docs/bacula-web/Makefile.in [new file with mode: 0644]
docs/bacula-web/bacula-web.css [new file with mode: 0644]
docs/bacula-web/bacula-web.tex [new file with mode: 0644]
docs/bacula-web/bacula.perl [new file with mode: 0755]
docs/bacula-web/bacula.sty [new file with mode: 0644]
docs/bacula-web/check_tex.pl [new file with mode: 0755]
docs/bacula-web/fdl.tex [new file with mode: 0644]
docs/bacula-web/fix_tex.pl [new file with mode: 0755]
docs/bacula-web/general.tex [new file with mode: 0644]
docs/bacula-web/index.perl [new file with mode: 0644]
docs/bacula-web/latex2html-init.pl [new file with mode: 0644]
docs/bacula-web/mtx-changer.txt [new file with mode: 0644]
docs/bacula-web/setup.sm [new file with mode: 0644]
docs/bacula-web/translate_images.pl [new file with mode: 0755]
docs/bacula-web/uploaddoc [new file with mode: 0755]
docs/bacula-web/version.tex.in [new file with mode: 0644]
docs/manuals/bacula.sty.in [new file with mode: 0644]
docs/manuals/en/concepts/concepts.kilepr
docs/manuals/en/concepts/newfeatures.tex
docs/manuals/en/concepts/rescue.tex [new file with mode: 0644]
docs/manuals/en/developers/developers.kilepr
docs/manuals/en/developers/generaldevel.tex
docs/manuals/en/developers/gui-interface.tex [new file with mode: 0644]
docs/manuals/en/developers/regression.tex [new file with mode: 0644]
docs/manuals/es/catalog/update_version [deleted file]
docs/manuals/es/catalog/version.tex [deleted file]
docs/manuals/es/concepts/update_version [deleted file]
docs/manuals/es/concepts/version.tex [deleted file]
docs/manuals/es/console/update_version [deleted file]
docs/manuals/es/console/version.tex [deleted file]
docs/manuals/es/developers/update_version [deleted file]
docs/manuals/es/developers/version.tex [deleted file]
docs/manuals/es/install/update_version [deleted file]
docs/manuals/es/install/version.tex [deleted file]
docs/manuals/es/problems/update_version [deleted file]
docs/manuals/es/problems/version.tex [deleted file]
docs/manuals/es/utility/update_version [deleted file]
docs/manuals/es/utility/version.tex [deleted file]

diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644 (file)
index 0000000..ed01efc
--- /dev/null
@@ -0,0 +1,65 @@
+manuals/*/install/install
+manuals/*/catalog/*.pdf
+manuals/*/*.pdf
+manuals/update_version
+manuals/bacula.sty
+manuals/version.tex
+manuals/*/*.pdf
+manuals/*/concepts/concepts
+manuals/*/console/console
+manuals/*/developers/developers
+manuals/*/catalog/catalog
+manuals/*/*/version.tex
+manuals/*/*/bacula.sty
+manuals/*/*/update_version
+1
+Makefile
+autoconf/Make.common
+bacula-web/Makefile
+bacula-web/version.tex
+config.log
+config.out
+config.status
+manuals/bacula.sty
+manuals/en/*/*.eps
+*.aux
+*.cdx
+*.cnd
+*.ddx
+*.dnd
+*.dvi
+*.fdx
+*.fnd
+*.idx
+*.ilg
+*.ind
+*.log
+*.out
+*.sdx
+*.snd
+*.toc
+manuals/en/*.sty
+manuals/*/install/installi-console.tex
+manuals/*/install/installi-dir.tex
+manuals/*/install/installi-fd.tex
+manuals/*/install/installi-general.tex
+manuals/*/install/installi-sd.tex
+manuals/*/catalog/catalogi-console.tex
+manuals/*/catalog/catalogi-dir.tex
+manuals/*/catalog/catalogi-fd.tex
+manuals/*/catalog/catalogi-general.tex
+manuals/*/catalog/catalogi-sd.tex
+manuals/*/concepts/concepts.pdf
+manuals/*/concepts/conceptsi-console.tex
+manuals/*/concepts/conceptsi-dir.tex
+manuals/*/concepts/conceptsi-fd.tex
+manuals/*/concepts/conceptsi-general.tex
+manuals/*/concepts/conceptsi-sd.tex
+manuals/*/console/console.pdf
+manuals/*/console/consolei-console.tex
+manuals/*/console/consolei-dir.tex
+manuals/*/console/consolei-fd.tex
+manuals/*/console/consolei-general.tex
+manuals/*/console/consolei-sd.tex
+manuals/*/developers/developersi-general.tex
+
diff --git a/docs/bacula-web/Makefile.in b/docs/bacula-web/Makefile.in
new file mode 100644 (file)
index 0000000..587cc59
--- /dev/null
@@ -0,0 +1,101 @@
+#
+#
+#  Makefile for LaTeX  
+#
+# To build everything do
+#    make tex
+#    make web
+#    make html
+#    make dvipdf
+#
+# or simply
+#
+#    make
+#
+
+IMAGES=../images
+
+first_rule: bacula
+
+bacula: tex web html dvipdf
+
+.SUFFIXES:     .tex .html
+.PHONY:
+.DONTCARE:
+
+
+tex:
+       @cp -fp ${IMAGES}/*.eps .
+       @cp -fp ${IMAGES}/hires/*.eps .
+       touch bacula-web.idx bacula-webi-general.tex
+       -latex -interaction=batchmode bacula-web.tex
+       makeindex bacula-web.idx >/dev/null 2>/dev/null
+       -latex -interaction=batchmode bacula-web.tex
+
+pdf:
+       @echo "Making bacula-web pdf manual"
+       @cp -fp ${IMAGES}/*.eps .
+       @cp -fp ${IMAGES}/hires/*.eps .
+       dvipdf bacula-web.dvi bacula-web.pdf
+       @rm -f *.eps *.old
+
+dvipdf:
+       @echo "Making bacula-web pdfm"
+       @cp -fp ${IMAGES}/*.eps .
+       @cp -fp ${IMAGES}/hires/*.eps .
+       dvipdfm -p a4 bacula-web.dvi
+       @rm -f *.eps *.old
+
+html:
+       @echo "Making bacula-web html manual"
+       @cp -fp ${IMAGES}/*.eps .
+       @cp -fp ${IMAGES}/hires/*.eps .
+       @rm -f next.eps next.png prev.eps prev.png up.eps up.png
+       @(if [ -e imagename_translations ] ; then \
+           ./translate_images.pl --from_meaningful_names bacula-web.html; \
+        fi)
+       latex2html -white -no_subdir -split 0 -toc_stars -white -notransparent \
+               -init_file latex2html-init.pl bacula-web >tex.out 2>&1
+       ./translate_images.pl --to_meaningful_names bacula-web.html
+       @rm -f *.gif *.jpg *.old
+
+web:
+       @echo "Making bacula-web web manual"
+       @mkdir -p bacula-web
+       @rm -f bacula-web/*
+       @cp -fp ${IMAGES}/*.eps .
+       @rm -f next.eps next.png prev.eps prev.png up.eps up.png
+       @cp -fp ${IMAGES}/*.eps ${IMAGES}/*.png bacula-web/
+       @rm -f bacula-web/next.eps bacula-web/next.png bacula-web/prev.eps bacula-web/prev.png bacula-web/up.eps bacula-web/up.png
+       @(if [ -e bacula-web/imagename_translations ] ; then \
+          ./translate_images.pl --to_meaningful_names bacula-web/Bacula_Users_Guide.html; \
+        fi)
+       @rm -rf bacula-web/*.html
+       latex2html -split 4 -local_icons -t "Bacula-web Guide" -long_titles 4 \
+               -contents_in_nav -toc_stars -white -notransparent bacula-web >/dev/null
+       ./translate_images.pl --to_meaningful_names bacula-web/Bacula_web_Guide.html
+       @cp -f bacula-web/Bacula_web_Guide.html bacula-web/index.html
+       @rm -f *.gif *.jpg bacula-web/*.eps  *.old
+
+texcheck:
+       ./check_tex.pl bacula-web.tex
+
+main_configs:
+       pic2graph -density 100 <main_configs.pic >main_configs.png
+
+clean:
+       @rm -f 1 2 3
+       @rm -f *.png *.gif *.jpg *.eps
+       @rm -f *.pdf *.aux *.cp *.fn *.ky *.log *.pg
+       @rm -f *.html *.backup *.pdf *.ps *.dvi *.ilg *.lof *.lot
+       @rm -f *.cdx *.cnd *.ddx *.ddn *.fdx *.fnd *.ind *.sdx *.snd
+       @rm -f *.dnd imagename_translations
+       @rm -f *.old WARNINGS *.out *.toc *.idx
+       @rm -f images.pl labels.pl internals.pl
+       @rm -rf bacula-web
+       @rm -f images.tex bacula-webi-general.tex
+
+
+distclean: clean
+       @rm -f images.tex bacula-webi-general.tex
+       @rm -f version.tex Makefile
diff --git a/docs/bacula-web/bacula-web.css b/docs/bacula-web/bacula-web.css
new file mode 100644 (file)
index 0000000..d1824af
--- /dev/null
@@ -0,0 +1,30 @@
+/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */
+.MATH    { font-family: "Century Schoolbook", serif; }
+.MATH I  { font-family: "Century Schoolbook", serif; font-style: italic }
+.BOLDMATH { font-family: "Century Schoolbook", serif; font-weight: bold }
+
+/* implement both fixed-size and relative sizes */
+SMALL.XTINY            { font-size : xx-small }
+SMALL.TINY             { font-size : x-small  }
+SMALL.SCRIPTSIZE       { font-size : smaller  }
+SMALL.FOOTNOTESIZE     { font-size : small    }
+SMALL.SMALL            {  }
+BIG.LARGE              {  }
+BIG.XLARGE             { font-size : large    }
+BIG.XXLARGE            { font-size : x-large  }
+BIG.HUGE               { font-size : larger   }
+BIG.XHUGE              { font-size : xx-large }
+
+/* heading styles */
+H1             {  }
+H2             {  }
+H3             {  }
+H4             {  }
+H5             {  }
+
+/* mathematics styles */
+DIV.displaymath                { }     /* math displays */
+TD.eqno                        { }     /* equation-number cells */
+
+
+/* document-specific styles come next */
diff --git a/docs/bacula-web/bacula-web.tex b/docs/bacula-web/bacula-web.tex
new file mode 100644 (file)
index 0000000..d0b2fa0
--- /dev/null
@@ -0,0 +1,69 @@
+%%
+%%
+
+\documentclass[11pt,a4paper]{report}
+\usepackage{html}
+\usepackage{float}
+\usepackage{graphicx}
+\usepackage{bacula}
+\usepackage{longtable}
+\usepackage{makeidx}
+\usepackage{index}
+\usepackage{setspace}
+\usepackage{hyperref}
+
+
+\makeindex
+\newindex{general}{idx}{ind}{General Index}
+
+\sloppy
+
+\begin{document}
+\sloppy
+
+\newfont{\bighead}{cmr17 at 36pt}
+\parskip 10pt
+\parindent 0pt
+
+\title{\includegraphics{./bacula-logo.eps} \\ \bigskip
+  \begin{center}
+   \large{It comes in the night and sucks 
+          the essence from your computers. }
+  \end{center}
+}
+
+\author{Kern Sibbald}
+\date{\vspace{1.0in}\today \\
+      This manual documents Bacula-web version \input{version} \\
+      The Bacula-web program was written by Juan Luis Frances\\
+      \vspace{0.2in}\\
+      Copyright \copyright 2005-2008, Free Software Foundation Europe e.V.
+      \\
+      \vspace{0.2in}\\
+  Permission is granted to copy, distribute and/or modify this document under the terms of the \\
+  GNU Free Documentation License, Version 1.2 published by the Free Software Foundation; \\ 
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. \\
+  A copy of the license is included in the section entitled "GNU Free Documentation License".
+}
+
+\maketitle
+
+\clearpage
+\tableofcontents
+\clearpage
+\listoffigures
+\clearpage
+\listoftables
+\clearpage
+
+\include{general}
+\include{fdl}
+
+% The following line tells link_resolver.pl to not include these files:
+% nolinks developersi baculai-dir baculai-fd baculai-sd baculai-console baculai-main
+
+% pull in the index
+\clearpage
+\printindex
+
+\end{document}
diff --git a/docs/bacula-web/bacula.perl b/docs/bacula-web/bacula.perl
new file mode 100755 (executable)
index 0000000..de7a7e2
--- /dev/null
@@ -0,0 +1,599 @@
+# This file contains subroutines for use by the latex2html system.
+#  This file is executed due to a \usepackage{bacula} statement
+#  in the LaTeX source. The subroutines here impliment functionality
+#  specific to the generation of html manuals for the Bacula project.
+# Some of the added functionality is designed to extend the capabiltites
+#  of latex2html and some is to change its behavior.
+
+
+# Returns the minimum of any number of numeric arguments.
+sub min {
+       my $tmp = shift;
+       while ($test = shift) {
+               $tmp = $test if ($test < $tmp);
+       }
+       return $tmp;
+}
+
+# These two are copied from 
+#   /usr/lib/latex2html/style/hthtml.perl,
+#   from the subroutine do_cmd_htmladdnormallink.
+#   They have been renamed, then removed the 
+#   name argument and reversed the other two arguments.
+sub do_cmd_elink{
+       local($_) = @_;
+       local($text, $url, $href);
+       local($opt, $dummy) = &get_next_optional_argument;
+       $text = &missing_braces unless
+               ((s/$next_pair_pr_rx/$text = $2; ''/eo)
+               ||(s/$next_pair_rx/$text = $2; ''/eo));
+       $url = &missing_braces unless
+               ((s/$next_pair_pr_rx/$url = $2; ''/eo)
+               ||(s/$next_pair_rx/$url = $2; ''/eo));
+       $*=1; s/^\s+/\n/; $*=0;
+       $href = &make_href($url,$text);
+       print "\nHREF:$href" if ($VERBOSITY > 3);
+       join ('',$href,$_);
+}
+
+sub do_cmd_ilink {
+       local($_) = @_;
+       local($text);
+       local($opt, $dummy) = &get_next_optional_argument;
+       $text = &missing_braces unless
+                       ((s/$next_pair_pr_rx/$text = $2; ''/eo)
+                       ||(s/$next_pair_rx/$text = $2; ''/eo));
+       &process_ref($cross_ref_mark,$cross_ref_mark,$text);
+}
+
+sub do_cmd_lt { join('',"\&lt;",$_[0]); }
+sub do_cmd_gt { join('',"\&gt;",$_[0]); }
+
+# KEC  Copied from latex2html.pl and modified to prevent 
+#  filename collisions. This is done with a static hash of 
+#  already-used filenames. An integer is appended to the 
+#  filename if a collision would result without it.
+#  The addition of the integer is done by removing 
+#  character(s) before .html if adding the integer would result
+#  in a filename longer than 32 characters. Usually just removing
+#  the character before .html would resolve the collision, but we
+#  add the integer anyway. The first integer that resolves the 
+#  collision is used.
+# If a filename is desired that is 'index.html' or any case
+#  variation of that, it is changed to index_page.html,
+#  index_page1.html, etc.
+
+
+#RRM  Extended to allow customised filenames, set $CUSTOM_TITLES
+#     or long title from the section-name, set $LONG_TITLES
+#
+{ my %used_names; # Static hash.
+sub make_name {
+       local($sec_name, $packed_curr_sec_id) = @_;
+       local($title,$making_name,$saved) = ('',1,'');
+       my $final_name;
+       if ($LONG_TITLES) {
+               $saved = $_;
+               # This alerts the subroutine textohtmlindex not to increment its index counter on the next call.
+               &do_cmd_textohtmlindex("\001noincrement"); 
+               &process_command($sections_rx, $_) if /^$sections_rx/;
+               $title = &make_bacula_title($TITLE)
+                       unless ((! $TITLE) || ($TITLE eq $default_title));
+               $_ = $saved;
+       } elsif ($CUSTOM_TITLES) {
+               $saved = $_;
+               # This alerts the subroutine textohtmlindex not to increment its index counter on the next call.
+               &do_cmd_textohtmlindex("\001noincrement"); 
+               &process_command($sections_rx, $_) if /^$sections_rx/;
+               $title = &custom_title_hook($TITLE)
+                       unless ((! $TITLE) || ($TITLE eq $default_title));
+               $_ = $saved;
+       }
+       if ($title) {
+               #ensure no more than 32 characters, including .html extension
+               $title =~ s/^(.{1,27}).*$/$1/;
+               ++$OUT_NODE;
+               $final_name = join("", ${PREFIX}, $title, $EXTN);
+       } else {
+               # Remove 0's from the end of $packed_curr_sec_id
+               $packed_curr_sec_id =~ s/(_0)*$//;
+               $packed_curr_sec_id =~ s/^\d+$//o; # Top level file
+               $final_name = join("",($packed_curr_sec_id ?
+                       "${PREFIX}$NODE_NAME". ++$OUT_NODE : $sec_name), $EXTN);
+       }
+
+       # Change the name from index to index_page to avoid conflicts with
+       #  index.html.
+       $final_name =~ s/^(index)\.html$/$1_Page.html/i;
+
+       # If the $final_name is already used, put an integer before the
+       #     #  .html to make it unique.
+       my $integer = 0;
+       my $saved_name = $final_name;
+       while (exists($used_names{$final_name})) {
+               $final_name = $saved_name;
+               my ($filename,$ext) = $final_name =~ /(.*)(\..*)$/;
+               my $numlen = length(++$integer);
+
+               # If the filename (after adding the integer) would be longer than
+               #  32 characters, insert the integer within it.
+               if (((my $namelen = length($final_name)) + $numlen) >= 32) {
+                       substr($filename,-$numlen) = $integer;
+               } else {
+                       $filename .= $integer;
+               }
+               $final_name = $filename . $ext;
+       }
+
+       # Save the $final_name in the hash to mark it as being used.
+       $used_names{$final_name} = undef;
+
+       # Save the first name evaluated here.  This is the name of the top-level html file, and
+       #  can be used to produce the index.html hard link at the end.
+       $OVERALL_TITLE = $final_name if (!defined $OVERALL_TITLE);
+
+       return $final_name;
+}
+}
+
+sub make_bacula_title {
+    local($_)= @_;
+       local($num_words) = $LONG_TITLES;
+       #RRM:  scan twice for short words, due to the $4 overlap
+       #      Cannot use \b , else words break at accented letters
+       $_ =~ s/(^|\s)\s*($GENERIC_WORDS)(\'|(\s))/$4/ig;
+       $_ =~ s/(^|\s)\s*($GENERIC_WORDS)(\'|(\s))/$4/ig;
+       #remove leading numbering, unless that's all there is.
+       local($sec_num);
+       if (!(/^\d+(\.\d*)*\s*$/)&&(s/^\s*(\d+(\.\d*)*)\s*/$sec_num=$1;''/e))
+               { $num_words-- };
+       &remove_markers; s/<[^>]*>//g; #remove tags
+       #revert entities, etc. to TeX-form...
+       s/([\200-\377])/"\&#".ord($1).";"/eg;
+       $_ = &revert_to_raw_tex($_);
+
+       # get $LONG_TITLES number of words from what remains
+       $_ = &get_bacula_words($_, $num_words) if ($num_words);
+       # ...and cleanup accents, spaces and punctuation
+       $_ = join('', ($SHOW_SECTION_NUMBERS ? $sec_num : ''), $_);
+       s/\\\W\{?|\}//g;
+       s/\s/_/g;
+       s/\'s/s/ig; # Replace 's with just the s.
+       s/\W/_/g;
+       s/__+/_/g;
+       s/_+$//;
+       $_;
+}
+
+       #JCL(jcl-tcl)
+       # changed completely
+       # KEC 2-21-05  Changed completely again. 
+       #
+       # We take the first real words specified by $min from the string.
+       #  REmove all markers and markups.
+       # Split the line into words.
+       # Determine how many words we should process.
+       # Return if no words to process.
+       # Determine lengths of the words.
+       # Reduce the length of the longest words in the list until the
+       #  total length of all the words is acceptable.
+       # Put the words back together and return the result.
+       #
+sub get_bacula_words {
+       local($_, $min) = @_;
+       local($words,$i);
+       local($id,%markup);
+       # KEC
+       my ($oalength,@lengths,$last,$thislen);
+       my $maxlen = 28;
+
+       #no limit if $min is negative
+       $min = 1000 if ($min < 0);
+
+       &remove_anchors;
+       #strip unwanted HTML constructs
+       s/<\/?(P|BR|H)[^>]*>/ /g;
+       #remove leading white space and \001 characters
+       s/^\s+|\001//g;
+       #lift html markup
+       s/(<[^>]*>(#[^#]*#)?)//ge;
+
+       # Split $_ into a list of words.
+       my @wrds = split /\s+|\-{3,}/;
+       $last = &min($min - 1,$#wrds);
+       return '' if ($last < 0);
+
+       # Get a list of word lengths up to the last word we're to process.
+       #  Add one to each for the separator.
+       @lengths = map (length($_)+1,@wrds[0..$last]);
+
+       $thislen = $maxlen + 1; # One more than the desired max length.
+       do {
+               $thislen--;
+               @lengths = map (&min($_,$thislen),@lengths);
+               $oalength = 0;
+               foreach (@lengths) {$oalength += $_;}
+       } until ($oalength <= $maxlen);
+       $words = join(" ",map (substr($wrds[$_],0,$lengths[$_]-1),0..$last));
+       return $words;
+}
+
+sub do_cmd_htmlfilename {
+       my $input = shift;
+
+       my ($id,$filename) = $input =~ /^<#(\d+)#>(.*?)<#\d+#>/;
+}
+
+# KEC 2-26-05
+# do_cmd_addcontentsline adds support for the addcontentsline latex command. It evaluates
+#  the arguments to the addcontentsline command and determines where to put the information.  Three
+#  global lists are kept: for table of contents, list of tables, and list of figures entries.
+#  Entries are saved in the lists in the order they are encountered so they can be retrieved
+#  in the same order.
+my (%toc_data);
+sub do_cmd_addcontentsline { 
+       &do_cmd_real_addcontentsline(@_); 
+}
+sub do_cmd_real_addcontentsline {
+    my $data = shift;
+       my ($extension,$pat,$unit,$entry);
+
+    # The data is sent to us as fields delimited by their ID #'s.  Extract the
+    #  fields.  The first is the extension of the file to which the cross-reference
+       #  would be written by LaTeX, such as {toc}, {lot} or {lof}.  The second is either
+       #  {section}, {subsection}, etc. for a toc entry, or , {table}, or {figure} 
+       #  for a lot, or lof extension (must match the first argument), and 
+       #  the third is the name of the entry.  The position in the document represents
+       #  and anchor that must be built to provide the linkage from the entry.
+    $extension = &missing_braces unless (
+    ($data =~ s/$next_pair_pr_rx/$extension=$2;''/eo)
+    ||($data =~ s/$next_pair_rx/$extension=$2;''/eo));
+    $unit = &missing_braces unless (
+    ($data =~ s/$next_pair_pr_rx/$unit=$2;''/eo)
+    ||($data =~ s/$next_pair_rx/$unit=$2;''/eo));
+    $entry = &missing_braces unless (
+    ($data =~ s/$next_pair_pr_rx/$pat=$1;$entry=$2;''/eo)
+    ||($data =~ s/$next_pair_rx/$pat=$1;$entry=$2;''/eo));
+
+       $contents_entry = &make_contents_entry($extension,$pat,$entry,$unit);
+       return ($contents_entry . $data);
+}
+
+# Creates and saves a contents entry (toc, lot, lof) to strings for later use, 
+#  and returns the entry to be inserted into the stream.
+# 
+sub make_contents_entry {
+    local($extension,$br_id, $str, $unit) = @_;
+       my $words = '';
+       my ($thisref);
+
+    # If TITLE is not yet available use $before.
+    $TITLE = $saved_title if (($saved_title)&&(!($TITLE)||($TITLE eq $default_title)));
+    $TITLE = $before unless $TITLE;
+    # Save the reference
+    if ($SHOW_SECTION_NUMBERS) { 
+               $words = &get_first_words($TITLE, 1);
+       } else { 
+               $words = &get_first_words($TITLE, 4);
+       }
+       $words = 'no title' unless $words;
+
+       #
+       # any \label in the $str will have already
+       # created a label where the \addcontentsline occurred.
+       # This has to be removed, so that the desired label 
+       # will be found on the toc page.
+       #
+       if ($str =~ /tex2html_anchor_mark/ ) {
+               $str =~ s/><tex2html_anchor_mark><\/A><A//g;
+       }
+       #
+       # resolve and clean-up the hyperlink entries 
+       # so they can be saved
+       #
+       if ($str =~ /$cross_ref_mark/ ) {
+               my ($label,$id,$ref_label);
+               $str =~ s/$cross_ref_mark#([^#]+)#([^>]+)>$cross_ref_mark/
+                       do { ($label,$id) = ($1,$2);
+                       $ref_label = $external_labels{$label} unless
+                       ($ref_label = $ref_files{$label});
+                       '"' . "$ref_label#$label" . '">' .
+                       &get_ref_mark($label,$id)}
+               /geo;
+       }
+       $str =~ s/<\#[^\#>]*\#>//go;
+       #RRM
+       # recognise \char combinations, for a \backslash
+       #
+       $str =~ s/\&\#;\'134/\\/g;              # restore \\s
+       $str =~ s/\&\#;\`<BR> /\\/g;    #  ditto
+       $str =~ s/\&\#;*SPMquot;92/\\/g;        #  ditto
+
+       $thisref = &make_named_href('',"$CURRENT_FILE#$br_id",$str);
+       $thisref =~ s/\n//g;
+
+       # Now we build the actual entry that will go in the lot and lof.
+       # If this is the first entry, we have to put a leading newline.
+       if ($unit eq 'table' ) {
+               if (!$table_captions) { $table_captions = "\n";}
+               $table_captions .= "<LI>$thisref\n";
+       } elsif ($unit eq 'figure') {
+               if (!$figure_captions) { $figure_captions = "\n"; }
+               $figure_captions .= "<LI>$thisref\n";
+       }
+    "<A NAME=\"$br_id\">$anchor_invisible_mark<\/A>";
+}
+
+# This is needed to keep latex2html from trying to make an image for the registered
+#  trademark symbol (R).  This wraps the command in a deferred wrapper so it can be
+#  processed as a normal command later on.  If this subroutine is not put in latex2html
+#  invokes latex to create an image for the symbol, which looks bad.
+sub wrap_cmd_textregistered {
+    local($cmd, $_) = @_;
+    (&make_deferred_wrapper(1).$cmd.&make_deferred_wrapper(0),$_)
+}
+
+# KEC
+# Copied from latex2html.pl and modified to create a file of image translations.
+#  The problem is that latex2html creates new image filenames like imgXXX.png, where
+#  XXX is a number sequentially assigned.  This is fine but makes for very unfriendly 
+#  image filenames. I looked into changing this behavior and it seems very much embedded
+#  into the latex2html code, not easy to change without risking breaking something.
+# So I'm taking the approach here to write out a file of image filename translations,
+#  to reference the original filenames from the new filenames.  THis was post-processing
+#  can be done outside of latex2html to rename the files and substitute the meaningful
+#  image names in the html code generated by latex2html.  This post-processing is done
+#  by a program external to latex2html.
+#
+# What we do is this: This subroutine is called to output images.tex, a tex file passed to 
+#  latex to convert the original images to .ps.  The string $latex_body contains info for 
+#  each image file, in the form of a unique id and the orininal filename.  We extract both, use
+#  the id is used to look up the new filename in the %id_map hash.  The new and old filenames
+#  are output into the file 'filename_translations' separated by \001.
+#  
+sub make_image_file {
+    do {
+               print "\nWriting image file ...\n";
+               open(ENV,">.$dd${PREFIX}images.tex")
+                               || die "\nCannot write '${PREFIX}images.tex': $!\n";
+               print ENV &make_latex($latex_body);
+               print ENV "\n";
+               close ENV;
+               &copy_file($FILE, "bbl");
+               &copy_file($FILE, "aux");
+    } if ((%latex_body) && ($latex_body =~ /newpage/));
+}
+
+
+# KEC
+# Copied from latex2html.pl and modified to create a file of image translations.
+
+#  The problem is that latex2html creates new image filenames like imgXXX.png, where
+#  XXX is a number sequentially assigned.  This is fine but makes for very unfriendly 
+#  image filenames. I looked into changing this behavior and it seems very much embedded
+#  into the latex2html code, not easy to change without risking breaking something.
+# So I'm taking the approach here to write out a file of image filename translations,
+#  to reference the original filenames from the new filenames.  THis post-processing
+#  can be done outside of latex2html to rename the files and substitute the meaningful
+#  image names in the html code generated by latex2html.  This post-processing is done
+#  by a program external to latex2html.
+#
+# What we do is this: This subroutine is called to output process images.  Code has been inserted
+#  about 100 lines below this to create the list of filenames to translate.  See comments there for 
+#  details.
+#  
+
+# Generate images for unknown environments, equations etc, and replace
+# the markers in the main text with them.
+# - $cached_env_img maps encoded contents to image URL's
+# - $id_map maps $env$id to page numbers in the generated latex file and after
+# the images are generated, maps page numbers to image URL's
+# - $page_map maps page_numbers to image URL's (temporary map);
+# Uses global variables $id_map and $cached_env_img,
+# $new_page_num and $latex_body
+
+
+sub make_images {
+    local($name, $contents, $raw_contents, $uucontents, $page_num,
+         $uucontents, %page_map, $img);
+    # It is necessary to run LaTeX this early because we need the log file
+    # which contains information used to determine equation alignment
+    if ( $latex_body =~ /newpage/) {
+       print "\n";
+       if ($LATEX_DUMP) {
+           # dump a pre-compiled format
+           if (!(-f "${PREFIX}images.fmt")) {
+               print "$INILATEX ./${PREFIX}images.tex\n" 
+                   if (($DEBUG)||($VERBOSITY > 1));
+               print "dumping ${PREFIX}images.fmt\n"
+                   unless ( L2hos->syswait("$INILATEX ./${PREFIX}images.tex"));
+           }
+           local ($img_fmt) = (-f "${PREFIX}images.fmt");
+           if ($img_fmt) {
+                # use the pre-compiled format
+               print "$TEX \"&./${PREFIX}images\" ./${PREFIX}images.tex\n"
+                   if (($DEBUG)||($VERBOSITY > 1));
+               L2hos->syswait("$TEX \"&./${PREFIX}images\" ./${PREFIX}images.tex");
+           } elsif (-f "${PREFIX}images.dvi") {
+               print "${PREFIX}images.fmt failed, proceeding anyway\n";
+           } else {
+               print "${PREFIX}images.fmt failed, trying without it\n";
+               print "$LATEX ./${PREFIX}images.tex\n"
+                   if (($DEBUG)||($VERBOSITY > 1));
+               L2hos->syswait("$LATEX ./${PREFIX}images.tex");
+           }
+       } else { &make_latex_images() }
+#          local($latex_call) = "$LATEX .$dd${PREFIX}images.tex";
+#          print "$latex_call\n" if (($DEBUG)||($VERBOSITY > 1));
+#          L2hos->syswait("$latex_call");
+##         print "$LATEX ./${PREFIX}images.tex\n" if (($DEBUG)||($VERBOSITY > 1));
+##         L2hos->syswait("$LATEX ./${PREFIX}images.tex");
+##        }
+       $LaTeXERROR = 0;
+       &process_log_file("./${PREFIX}images.log"); # Get image size info
+    }
+    if ($NO_IMAGES) {
+        my $img = "image.$IMAGE_TYPE";
+       my $img_path = "$LATEX2HTMLDIR${dd}icons$dd$img";
+       L2hos->Copy($img_path, ".$dd$img")
+            if(-e $img_path && !-e $img);
+    }
+    elsif ((!$NOLATEX) && ($latex_body =~ /newpage/) && !($LaTeXERROR)) {
+       print "\nGenerating postscript images using dvips ...\n";
+        &make_tmp_dir;  # sets  $TMPDIR  and  $DESTDIR
+       $IMAGE_PREFIX =~ s/^_//o if ($TMPDIR);
+
+       local($dvips_call) = 
+               "$DVIPS -S1 -i $DVIPSOPT -o$TMPDIR$dd$IMAGE_PREFIX .${dd}${PREFIX}images.dvi\n";
+       print $dvips_call if (($DEBUG)||($VERBOSITY > 1));
+       
+       if ((($PREFIX=~/\./)||($TMPDIR=~/\./)) && not($DVIPS_SAFE)) {
+           print " *** There is a '.' in $TMPDIR or $PREFIX filename;\n"
+               . "  dvips  will fail, so image-generation is aborted ***\n";
+       } else {
+           &close_dbm_database if $DJGPP;
+           L2hos->syswait($dvips_call) && print "Error: $!\n";
+           &open_dbm_database if $DJGPP;
+       }
+
+       # append .ps suffix to the filenames
+       if(opendir(DIR, $TMPDIR || '.')) {
+            # use list-context instead; thanks De-Wei Yin <yin@asc.on.ca>
+           my @ALL_IMAGE_FILES = grep /^$IMAGE_PREFIX\d+$/o, readdir(DIR);
+           foreach (@ALL_IMAGE_FILES) {
+               L2hos->Rename("$TMPDIR$dd$_", "$TMPDIR$dd$_.ps");
+           }
+           closedir(DIR);
+        } else {
+            print "\nError: Cannot read dir '$TMPDIR': $!\n";
+        }
+    }
+    do {print "\n\n*** LaTeXERROR"; return()} if ($LaTeXERROR);
+    return() if ($LaTeXERROR); # empty .dvi file
+    L2hos->Unlink(".$dd${PREFIX}images.dvi") unless $DEBUG;
+
+    print "\n *** updating image cache\n" if ($VERBOSITY > 1);
+    while ( ($uucontents, $_) = each %cached_env_img) {
+       delete $cached_env_img{$uucontents}
+           if ((/$PREFIX$img_rx\.$IMAGE_TYPE/o)&&!($DESTDIR&&$NO_SUBDIR));
+       $cached_env_img{$uucontents} = $_
+           if (s/$PREFIX$img_rx\.new/$PREFIX$1.$IMAGE_TYPE/go);
+    }
+
+       # Modified from the original latex2html to translate image filenames to meaningful ones.
+       #  KEC  5-22-05.
+       print "\nWriting imagename_translations file\n";
+       open KC,">imagename_translations" or die "Cannot open filename translation file for writing";
+       my ($oldname_kc,$newname_kc,$temp_kc,%done_kc);
+       while ((undef,$temp_kc) = each %id_map) {
+               # Here we generate the file containing the list if old and new filenames.
+               # The old and new names are extracted from variables in scope at the time
+               #  this is run.  The values of the %id_map has contain either the number of the
+               #  image file to be created (if an old image file doesn't exist) or the tag to be placed
+               #  inside the html file (if an old image file does exist).  We extract the info in either
+               #  case.
+               if ($temp_kc =~ /^\d+\#\d+$/) {
+                       my $kcname;
+                       $kcname = $orig_name_map{$temp_kc};
+                       $kcname =~ s/\*/star/;
+                       ($oldname_kc) = $img_params{$kcname} =~ /ALT=\"\\includegraphics\{(.*?)\}/s;
+                       ($newname_kc) = split (/#/,$temp_kc);
+                       $newname_kc = "img" . $newname_kc . ".png";
+               } else {
+                       ($newname_kc,$oldname_kc) = $temp_kc =~ /SRC=\"(.*?)\".*ALT=\"\\includegraphics\{(.*?)\}/s;
+               }
+               # If this is a math-type image, $oldname_kc will be blank.  Don't do anything in that case since
+               #  there is no meaningful image filename.
+               if (!exists($done_kc{$newname_kc}) and $oldname_kc) {
+                       print KC "$newname_kc\001$oldname_kc\n";
+               }
+               $done_kc{$newname_kc} = '';
+       }
+       close KC;
+
+    print "\n *** removing unnecessary images ***\n" if ($VERBOSITY > 1);
+    while ( ($name, $page_num) = each %id_map) {
+       $contents = $latex_body{$name};
+
+       if ($page_num =~ /^\d+\#\d+$/) { # If it is a page number
+           do {                # Extract the page, convert and save it
+               $img = &extract_image($page_num,$orig_name_map{$page_num});
+               if ($contents =~ /$htmlimage_rx/) {
+                   $uucontents = &special_encoding($env,$2,$contents);
+               } elsif ($contents =~ /$htmlimage_pr_rx/) {
+                   $uucontents = &special_encoding($env,$2,$contents);
+               } else {
+                   $uucontents = &encode(&addto_encoding($contents,$contents));
+               }
+               if (($HTML_VERSION >=3.2)||!($contents=~/$order_sensitive_rx/)){
+                   $cached_env_img{$uucontents} = $img;
+               } else {
+                    # Blow it away so it is not saved for next time
+                   delete $cached_env_img{$uucontents};
+                   print "\nimage $name not recycled, contents may change (e.g. numbering)";
+               }
+               $page_map{$page_num} = $img;
+           } unless ($img = $page_map{$page_num}); # unless we've just done it
+           $id_map{$name} = $img;
+       } else {
+           $img = $page_num;   # it is already available from previous runs
+       }
+       print STDOUT " *** image done ***\n" if ($VERBOSITY > 2);
+    }
+    &write_warnings(
+                   "\nOne of the images is more than one page long.\n".
+                   "This may cause the rest of the images to get out of sync.\n\n")
+       if (-f sprintf("%s%.3d%s", $IMAGE_PREFIX, ++$new_page_num, ".ps"));
+    print "\n *** no more images ***\n"  if ($VERBOSITY > 1);
+    # MRO: The following cleanup seems to be incorrect: The DBM is
+    # still open at this stage, this causes a lot of unlink errors
+    #
+    #do { &cleanup; print "\n *** clean ***\n"  if ($VERBOSITY > 1);}
+    #  unless $DJGPP;
+}
+
+## KEC: Copied &text_cleanup here to modify it. It was filtering out double
+# dashes such as {-}{-}sysconfig.  This would be used as an illustration
+# of a command-line arguement.  It was being changed to a single dash.
+
+# This routine must be called once on the text only,
+# else it will "eat up" sensitive constructs.
+sub text_cleanup {
+    # MRO: replaced $* with /m
+    s/(\s*\n){3,}/\n\n/gom;   # Replace consecutive blank lines with one
+    s/<(\/?)P>\s*(\w)/<$1P>\n$2/gom;      # clean up paragraph starts and ends
+    s/$O\d+$C//go;      # Get rid of bracket id's
+    s/$OP\d+$CP//go;    # Get rid of processed bracket id's
+        # KEC: This is the line causing trouble...
+    #s/(<!)?--?(>)?/(length($1) || length($2)) ? "$1--$2" : "-"/ge;
+    s/(<!)?--?(>)?/(length($1) || length($2)) ? "$1--$2" : $&/ge;
+    # Spacing commands
+    s/\\( |$)/ /go;
+    #JKR: There should be no more comments in the source now.
+    #s/([^\\]?)%/$1/go;        # Remove the comment character
+    # Cannot treat \, as a command because , is a delimiter ...
+    s/\\,/ /go;
+    # Replace tilde's with non-breaking spaces
+    s/ *~/&nbsp;/g;
+
+    ### DANGEROUS ?? ###
+    # remove redundant (not <P></P>) empty tags, incl. with attributes
+    s/\n?<([^PD >][^>]*)>\s*<\/\1>//g;
+    s/\n?<([^PD >][^>]*)>\s*<\/\1>//g;
+    # remove redundant empty tags (not </P><P> or <TD> or <TH>)
+    s/<\/(TT|[^PTH][A-Z]+)><\1>//g;
+    s/<([^PD ]+)(\s[^>]*)?>\n*<\/\1>//g;
+
+
+#JCL(jcl-hex)
+# Replace ^^ special chars (according to p.47 of the TeX book)
+# Useful when coming from the .aux file (german umlauts, etc.)
+    s/\^\^([^0-9a-f])/chr((64+ord($1))&127)/ge;
+    s/\^\^([0-9a-f][0-9a-f])/chr(hex($1))/ge;
+}
+
+
+
+
+1;  # Must be present as the last line.
+
diff --git a/docs/bacula-web/bacula.sty b/docs/bacula-web/bacula.sty
new file mode 100644 (file)
index 0000000..5dc9158
--- /dev/null
@@ -0,0 +1,66 @@
+%% bacula.sty
+%% Provides macros and other stuff for the bacula manual
+%% 
+%% Original Creation -- K. Cunningham 2005-01-09
+%% 
+%% 
+%% 
+%% New Commands Currently implemented:
+%% 
+%% \elink{target}{text}
+%%    Inserts the text indicated (highlighted) and provides
+%%    an external hyperlink to the target.
+%% 
+%% 
+%% \ilink{target}{text}
+%%    Inserts the text indicated (highlighted) and provides
+%%    an internal hyperlink to the target. Target must be a
+%%    \label somewhere in the same document.
+%% 
+%% \lt
+%%    Inserts a less-than character (<).
+%%
+%% \gt
+%%    Inserts a greater-than character (>).
+%% 
+%% 
+\ProvidesPackage{bacula}[2005/01/09]
+%%
+%%
+\newcommand*{\elink}[2]{%
+  \htmladdnormallink{#1}{#2}%
+}
+%%
+\newcommand*{\ilink}[2]{%
+  \htmlref{#1}{#2}%
+}
+%%
+\newcommand{\lt}{$<$}
+\newcommand{\gt}{$>$}
+
+%% copied from /usr/share/texmf/tex/latex/base/book.cls, and
+%%  modified to suit.  KEC 4-28-05
+%% KEC: Removed the two-column arrangement, and added \newpage
+\renewenvironment{theindex}
+               {\if@twocolumn
+                  \@restonecolfalse
+                \else
+                  \@restonecoltrue
+                \fi
+%% KEC:  Switch to one column.
+%%              \columnseprule \z@
+%%              \columnsep 35\p@
+%%              \twocolumn[\@makeschapterhead{\indexname}]%
+                \@mkboth{\MakeUppercase\indexname}%
+                        {\MakeUppercase\indexname}%
+                               \clearpage
+                               \subsection*{\indexname}
+                               \addcontentsline{toc}{subsection}{\indexname}
+                \thispagestyle{plain}\parindent\z@
+                \parskip\z@ \@plus .3\p@\relax
+                \let\item\@idxitem}
+                               {\if@restonecol\onecolumn\else\clearpage\fi}   %% Is this needed???
+
+%% 
+\endinput
+%% 
diff --git a/docs/bacula-web/check_tex.pl b/docs/bacula-web/check_tex.pl
new file mode 100755 (executable)
index 0000000..e12d51b
--- /dev/null
@@ -0,0 +1,152 @@
+#!/usr/bin/perl -w
+# Finds potential problems in tex files, and issues warnings to the console
+#   about what it finds.  Takes a list of files as its only arguments,
+#   and does checks on all the files listed.  The assumption is that these are
+#   valid (or close to valid) LaTeX files.  It follows \include statements
+#   recursively to pick up any included tex files.
+#
+#
+#
+# Currently the following checks are made:
+#
+#   -- Multiple hyphens not inside a verbatim environment (or \verb).  These
+#      should be placed inside a \verb{} contruct so they will not be converted
+#      to single hyphen by latex and latex2html.
+
+
+# Original creation 3-8-05 by Karl Cunningham  karlc -at- keckec -dot- com
+#
+#
+
+use strict;
+
+# The following builds the test string to identify and change multiple
+#   hyphens in the tex files.  Several constructs are identified but only
+#   multiple hyphens are changed; the others are fed to the output 
+#   unchanged.
+my $b = '\\\\begin\\*?\\s*\\{\\s*';  # \begin{
+my $e = '\\\\end\\*?\\s*\\{\\s*';    # \end{
+my $c = '\\s*\\}';                   # closing curly brace
+
+# This captures entire verbatim environments.  These are passed to the output
+#   file unchanged.
+my $verbatimenv = $b . "verbatim" . $c . ".*?" . $e . "verbatim" . $c;  
+
+# This captures \verb{..{ constructs.  They are passed to the output unchanged.
+my $verb = '\\\\verb\\*?(.).*?\\1';
+
+# This captures multiple hyphens with a leading and trailing space.  These are not changed.
+my $hyphsp = '\\s\\-{2,}\\s';
+
+# This identifies other multiple hyphens.
+my $hyphens = '\\-{2,}';
+
+# This identifies \hyperpage{..} commands, which should be ignored.
+my $hyperpage = '\\\\hyperpage\\*?\\{.*?\\}';
+
+# This builds the actual test string from the above strings.
+#my $teststr = "$verbatimenv|$verb|$tocentry|$hyphens";
+my $teststr = "$verbatimenv|$verb|$hyphsp|$hyperpage|$hyphens";
+
+
+sub get_includes {
+       # Get a list of include files from the top-level tex file.  The first
+       #   argument is a pointer to the list of files found. The rest of the 
+       #   arguments is a list of filenames to check for includes.
+       my $files = shift;
+       my ($fileline,$includefile,$includes);
+
+       while (my $filename = shift) {
+               # Get a list of all the html files in the directory.
+               open my $if,"<$filename" or die "Cannot open input file $filename\n";
+               $fileline = 0;
+               $includes = 0;
+               while (<$if>) {
+                       chomp;
+                       $fileline++;
+                       # If a file is found in an include, process it.
+                       if (($includefile) = /\\include\s*\{(.*?)\}/) {
+                               $includes++;
+                               # Append .tex to the filename
+                               $includefile .= '.tex';
+
+                               # If the include file has already been processed, issue a warning 
+                               #   and don't do it again.
+                               my $found = 0;
+                               foreach (@$files) {
+                                       if ($_ eq $includefile) {
+                                               $found = 1;
+                                               last;
+                                       }
+                               }
+                               if ($found) {
+                                       print "$includefile found at line $fileline in $filename was previously included\n";
+                               } else {
+                                       # The file has not been previously found.  Save it and
+                                       #       recursively process it.
+                                       push (@$files,$includefile);
+                                       get_includes($files,$includefile);
+                               }
+                       }
+               }
+               close IF;
+       }
+}
+
+
+sub check_hyphens {
+       my (@files) = @_;
+       my ($filedata,$this,$linecnt,$before);
+       
+       # Build the test string to check for the various environments.
+       #   We only do the conversion if the multiple hyphens are outside of a 
+       #   verbatim environment (either \begin{verbatim}...\end{verbatim} or 
+       #   \verb{--}).  Capture those environments and pass them to the output
+       #   unchanged.
+
+       foreach my $file (@files) {
+               # Open the file and load the whole thing into $filedata. A bit wasteful but
+               #   easier to deal with, and we don't have a problem with speed here.
+               $filedata = "";
+               open IF,"<$file" or die "Cannot open input file $file";
+               while (<IF>) {
+                       $filedata .= $_;
+               }
+               close IF;
+               
+               # Set up to process the file data.
+               $linecnt = 1;
+
+               # Go through the file data from beginning to end.  For each match, save what
+               #   came before it and what matched.  $filedata now becomes only what came 
+               #   after the match.
+               #   Chech the match to see if it starts with a multiple-hyphen.  If so
+               #     warn the user.  Keep track of line numbers so they can be output
+               #     with the warning message.
+               while ($filedata =~ /$teststr/os) {
+                       $this = $&;
+                       $before = $`;
+                       $filedata = $';
+                       $linecnt += $before =~ tr/\n/\n/;
+
+                       # Check if the multiple hyphen is present outside of one of the 
+                       #   acceptable constructs.
+                       if ($this =~ /^\-+/) {
+                               print "Possible unwanted multiple hyphen found in line ",
+                                       "$linecnt of file $file\n";
+                       }
+                       $linecnt += $this =~ tr/\n/\n/;
+               }
+       }
+}
+##################################################################
+#                       MAIN                                  ####
+##################################################################
+
+my (@includes,$cnt);
+
+# Examine the file pointed to by the first argument to get a list of 
+#  includes to test.
+get_includes(\@includes,@ARGV);
+
+check_hyphens(@includes);
diff --git a/docs/bacula-web/fdl.tex b/docs/bacula-web/fdl.tex
new file mode 100644 (file)
index 0000000..ea027bb
--- /dev/null
@@ -0,0 +1,511 @@
+%---------The file header---------------------------------------------
+
+\usepackage[english]{babel} %language selection
+\usepackage[T1]{fontenc}
+
+\pagenumbering{arabic}
+
+\usepackage{hyperref}
+\hypersetup{colorlinks, 
+           citecolor=black,
+           filecolor=black,
+           linkcolor=black,
+           urlcolor=black,
+           pdftex}
+
+           
+%---------------------------------------------------------------------
+\section*{GNU Free Documentation License}
+\index[general]{GNU ree Documentation License}
+\index[general]{License!GNU ree Documentation}        
+\addcontentsline{toc}{section}{GNU ree Documentation License}
+
+%\label{label_fdl}
+
+ \begin{center}
+
+       Version 1.2, November 2002
+
+
+ Copyright \copyright 2000,2001,2002  Free Software Foundation, Inc.
+ \bigskip
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+  
+ \bigskip
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+\end{center}
+
+
+\begin{center}
+{\bf\large Preamble}
+\end{center}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+\begin{center}
+{\Large\bf 1. APPLICABILITY AND DEFINITIONS}
+\addcontentsline{toc}{section}{1. APPLICABILITY AND DEFINITIONS}
+\end{center}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The \textbf{"Document"}, below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as \textbf{"you"}.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A \textbf{"Modified Version"} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A \textbf{"Secondary Section"} is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The \textbf{"Cover Texts"} are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A \textbf{"Transparent"} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called \textbf{"Opaque"}.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The \textbf{"Title Page"} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as \textbf{"Acknowledgements"},
+\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.)  
+To \textbf{"Preserve the Title"}
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\begin{center}
+{\Large\bf 2. VERBATIM COPYING}
+\addcontentsline{toc}{section}{2. VERBATIM COPYING}
+\end{center}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\begin{center}
+{\Large\bf 3. COPYING IN QUANTITY}
+\addcontentsline{toc}{section}{3. COPYING IN QUANTITY}
+\end{center}
+
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\begin{center}
+{\Large\bf 4. MODIFICATIONS}
+\addcontentsline{toc}{section}{4. MODIFICATIONS}
+\end{center}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+\begin{itemize}
+\item[A.] 
+   Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+   
+\item[B.]
+   List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+   
+\item[C.]
+   State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+   
+\item[D.]
+   Preserve all the copyright notices of the Document.
+   
+\item[E.]
+   Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+   
+\item[F.]
+   Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+   
+\item[G.]
+   Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+   
+\item[H.]
+   Include an unaltered copy of this License.
+   
+\item[I.]
+   Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+   
+\item[J.]
+   Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+   
+\item[K.]
+   For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+   
+\item[L.]
+   Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+   
+\item[M.]
+   Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+   
+\item[N.]
+   Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+   
+\item[O.]
+   Preserve any Warranty Disclaimers.
+\end{itemize}
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+\begin{center}
+{\Large\bf 5. COMBINING DOCUMENTS}
+\addcontentsline{toc}{section}{5. COMBINING DOCUMENTS}
+\end{center}
+
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+\begin{center}
+{\Large\bf 6. COLLECTIONS OF DOCUMENTS}
+\addcontentsline{toc}{section}{6. COLLECTIONS OF DOCUMENTS}
+\end{center}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+\begin{center}
+{\Large\bf 7. AGGREGATION WITH INDEPENDENT WORKS}
+\addcontentsline{toc}{section}{7. AGGREGATION WITH INDEPENDENT WORKS}
+\end{center}
+
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+\begin{center}
+{\Large\bf 8. TRANSLATION}
+\addcontentsline{toc}{section}{8. TRANSLATION}
+\end{center}
+
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+\begin{center}
+{\Large\bf 9. TERMINATION}
+\addcontentsline{toc}{section}{9. TERMINATION}
+\end{center}
+
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+\begin{center}
+{\Large\bf 10. FUTURE REVISIONS OF THIS LICENSE}
+\addcontentsline{toc}{section}{10. FUTURE REVISIONS OF THIS LICENSE}
+\end{center}
+
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+\begin{center}
+{\Large\bf ADDENDUM: How to use this License for your documents}
+\addcontentsline{toc}{section}{ADDENDUM: How to use this License for your documents}
+\end{center}
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+\bigskip
+\begin{quote}
+    Copyright \copyright  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+\end{quote}
+\bigskip
+    
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+\bigskip
+\begin{quote}
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+\end{quote}
+\bigskip
+    
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+%---------------------------------------------------------------------
diff --git a/docs/bacula-web/fix_tex.pl b/docs/bacula-web/fix_tex.pl
new file mode 100755 (executable)
index 0000000..9865757
--- /dev/null
@@ -0,0 +1,184 @@
+#!/usr/bin/perl -w
+# Fixes various things within tex files.
+
+use strict;
+
+my %args;
+
+
+sub get_includes {
+       # Get a list of include files from the top-level tex file.
+       my (@list,$file);
+       
+       foreach my $filename (@_) {
+               $filename or next;
+               # Start with the top-level latex file so it gets checked too.
+               push (@list,$filename);
+
+               # Get a list of all the html files in the directory.
+               open IF,"<$filename" or die "Cannot open input file $filename";
+               while (<IF>) {
+                       chomp;
+                       push @list,"$1.tex" if (/\\include\{(.*?)\}/);
+               }
+
+               close IF;
+       }
+       return @list;
+}
+
+sub convert_files {
+       my (@files) = @_;
+       my ($linecnt,$filedata,$output,$itemcnt,$indentcnt,$cnt);
+       
+       $cnt = 0;
+       foreach my $file (@files) {
+               # Open the file and load the whole thing into $filedata. A bit wasteful but
+               #   easier to deal with, and we don't have a problem with speed here.
+               $filedata = "";
+               open IF,"<$file" or die "Cannot open input file $file";
+               while (<IF>) {
+                       $filedata .= $_;
+               }
+               close IF;
+               
+               # We look for a line that starts with \item, and indent the two next lines (if not blank)
+               #  by three spaces.
+               my $linecnt = 3;
+               $indentcnt = 0;
+               $output = "";
+               # Process a line at a time.
+               foreach (split(/\n/,$filedata)) {
+                       $_ .= "\n"; # Put back the return.
+                       # If this line is less than the third line past the \item command,
+                       #  and the line isn't blank and doesn't start with whitespace
+                       #  add three spaces to the start of the line. Keep track of the number
+                       #  of lines changed.
+                       if ($linecnt < 3 and !/^\\item/) {
+                               if (/^[^\n\s]/) {
+                                       $output .= "   " . $_;
+                                       $indentcnt++;
+                               } else {
+                                       $output .= $_;
+                               }
+                               $linecnt++;
+                       } else {
+                               $linecnt = 3;
+                               $output .= $_;
+                       }
+                       /^\\item / and $linecnt = 1;
+               }
+
+               
+               # This is an item line.  We need to process it too. If inside a \begin{description} environment, convert 
+               #  \item {\bf xxx} to \item [xxx] or \item [{xxx}] (if xxx contains '[' or ']'.
+               $itemcnt = 0;
+               $filedata = $output;
+               $output = "";
+               my ($before,$descrip,$this,$between);
+
+               # Find any \begin{description} environment
+               while ($filedata =~ /(\\begin[\s\n]*\{[\s\n]*description[\s\n]*\})(.*?)(\\end[\s\n]*\{[\s\n]*description[\s\n]*\})/s) {
+                       $output .= $` . $1;
+                       $filedata = $3 . $';
+                       $descrip = $2;
+
+                       # Search for \item {\bf xxx}
+                       while ($descrip =~ /\\item[\s\n]*\{[\s\n]*\\bf[\s\n]*/s) {
+                               $descrip = $';
+                               $output .= $`;
+                               ($between,$descrip) = find_matching_brace($descrip);
+                               if (!$descrip) {
+                                       $linecnt = $output =~ tr/\n/\n/;
+                                       print STDERR "Missing matching curly brace at line $linecnt in $file\n" if (!$descrip);
+                               }
+
+                               # Now do the replacement.
+                               $between = '{' . $between . '}' if ($between =~ /\[|\]/);
+                               $output .= "\\item \[$between\]";       
+                               $itemcnt++;
+                       }
+                       $output .= $descrip;
+               }
+               $output .= $filedata;
+       
+               # If any hyphens or \item commnads were converted, save the file.
+               if ($indentcnt or $itemcnt) {
+                       open OF,">$file" or die "Cannot open output file $file";
+                       print OF $output;
+                       close OF;
+                       print "$indentcnt indent", ($indentcnt == 1) ? "" : "s"," added in $file\n";
+                       print "$itemcnt item", ($itemcnt == 1) ? "" : "s"," Changed in $file\n";
+               }
+
+               $cnt += $indentcnt + $itemcnt;
+       }
+       return $cnt;
+}
+
+sub find_matching_brace {
+       # Finds text up to the next matching brace.  Assumes that the input text doesn't contain
+       #  the opening brace, but we want to find text up to a matching closing one.
+       # Returns the text between the matching braces, followed by the rest of the text following
+       #   (which does not include the matching brace).
+       # 
+       my $str = shift;
+       my ($this,$temp);
+       my $cnt = 1;
+
+       while ($cnt) {
+               # Ignore verbatim constructs involving curly braces, or if the character preceding
+               #  the curly brace is a backslash.
+               if ($str =~ /\\verb\*?\{.*?\{|\\verb\*?\}.*?\}|\{|\}/s) {
+                       $this .= $`;
+                       $str = $';
+                       $temp = $&;
+
+                       if ((substr($this,-1,1) eq '\\') or 
+                               $temp =~ /^\\verb/) {
+                                       $this .= $temp;
+                                       next;
+                       }
+                               
+                       $cnt +=  ($temp eq '{') ? 1 : -1;
+                       # If this isn't the matching curly brace ($cnt > 0), include the brace.
+                       $this .= $temp if ($cnt);
+               } else {
+                       # No matching curly brace found.
+                       return ($this . $str,'');
+               }
+       }
+       return ($this,$str);
+}
+
+sub check_arguments {
+       # Checks command-line arguments for ones starting with --  puts them into
+       #   a hash called %args and removes them from @ARGV.
+       my $args = shift;
+       my $i;
+
+       for ($i = 0; $i < $#ARGV; $i++) {
+               $ARGV[$i] =~ /^\-+/ or next;
+               $ARGV[$i] =~ s/^\-+//;
+               $args{$ARGV[$i]} = "";
+               delete ($ARGV[$i]);
+               
+       }
+}
+
+##################################################################
+#                       MAIN                                  ####
+##################################################################
+
+my @includes;
+my $cnt;
+
+check_arguments(\%args);
+die "No Files given to Check\n" if ($#ARGV < 0);
+
+# Examine the file pointed to by the first argument to get a list of 
+#  includes to test.
+@includes = get_includes(@ARGV);
+
+$cnt = convert_files(@includes);
+print "No lines changed\n" unless $cnt;
diff --git a/docs/bacula-web/general.tex b/docs/bacula-web/general.tex
new file mode 100644 (file)
index 0000000..cd48842
--- /dev/null
@@ -0,0 +1,220 @@
+%%
+%%      
+
+\section*{What is Bacula-web?}
+\label{_ChapterStart1}
+\index[general]{Bacula-web!What is }
+\index[general]{What is Bacula-web? }
+\addcontentsline{toc}{section}{What is Bacula-web?}
+
+
+Bacula-web is a php based web program that provides you a
+summarized output of jobs that have already run. It obtains 
+its information from your Bacula catalog database. Aside from a
+nice graphical display, it provides summaries of your 
+jobs, as well as graphs of job usage. This is a fairly high
+level Bacula management tool.
+
+\section*{Requirements}
+\index[general]{Requirements}
+\addcontentsline{toc}{section}{Requirements}
+
+\begin{itemize}
+\item You must have a web server
+\item You must have PHP installed and working
+      with your web server. We have tested 
+      php versions 4.3.4 and 5.0.4.  For more information
+      on php, please see:
+      \elink{http://www.php.net}{http://www.php.net}.
+\item The following packages should be installed
+      or configured as part of PHP.
+   \begin{itemize}
+   \item Gettext (optional)
+   \item GD 2.x or greater
+   \item TrueType (optional)
+   \item Pear DB (http://pear.php.net/package/DB)
+   \item MySQL or PostgreSQL (SQLite is not supported)
+   \item The dbsize contrib package if you use PostgreSQL
+   \end{itemize}
+\item Bacula must also be installed and working, but does not
+      need to be running to use Bacula-web.
+\item Your MySQL or PostgreSQL program must be running.
+\end{itemize}
+
+\section*{Installation}
+\index[general]{Installation}
+\addcontentsline{toc}{section}{Installation}
+
+\begin{itemize}
+\item Copy the bacula-web distribution to the root
+   directory or a subdirectory of your web server root.
+\item Edit {\bf configs/bacula.conf} and put your preferences
+   as well as ensuring that the database configuration parameters
+   point to the Bacula database you are using.
+\item Make sure that {\bf short_open_tag} is turned on in your
+   php.ini file.
+\end{item}
+
+
+\section*{Testing the Installation}
+\index[general]{Testing the Installation}
+\addcontentsline{toc}{section}{Testing the Installation}
+
+\begin{itemize}
+\item Run {\bf test.php} from your web browser.
+   It should produce output that looks like:
+\begin{verbatim}
+Checking system for dependencies...
+
+ Checking gettext:  YES   Language support enabled    
+ Checking Pear(DB): YES   Pear DB enabled    
+ Checking GD:       YES   GD support enabled    
+
+
+ Please, click the link below to test your graph system capabilities
+ (Bacula-web only use PNG): Test
+\end{verbatim}
+
+\item If gettext, Pear(DB) and GD all indicate yes, then things are going
+   in the right direction. If not, you should correct each one before 
+   proceeding.
+
+\item If Pear(DB) is not installed and you have PHP 4.3.11 or newer, you
+   can use the command:
+
+\begin{verbatim}
+pear install DB
+\end{verbatim}
+to install it.
+
+After installing it, check by doing:
+
+\begin{verbatim}
+pear list
+\end{verbatim}
+
+On my machine (Kern), I get:
+\begin{verbatim}
+Installed packages:
+===================
+Package              Version State
+Archive_Tar          1.1     stable
+Console_Getopt       1.2     stable
+DB                   1.7.6   stable
+HTML_Template_IT     1.1     stable
+HTTP                 1.3.5   stable
+Mail                 1.1.4   stable
+Net_SMTP             1.2.6   stable
+Net_Socket           1.0.6   stable
+Net_UserAgent_Detect 2.0.1   stable
+PEAR                 1.3.5   stable
+XML_Parser           1.2.6   stable
+XML_RPC              1.4.0   stable
+\end{verbatim}
+
+
+
+\item When everything is installed, click on the {\bf Test} link at the
+   bottom, which will bring up a new page with a number of PHPlot test graphs,
+   using GD. It should be pretty obvious if they work, if not, you must
+   correct the problems.
+
+\item If your graphs are not being reproduced, check that your PHP was built
+   with the {\bf --with-gd} option, and possibly with {\bf --with-png-dir=DIR}
+   where DIR is the path to the {\bf libpng} installation directory.
+
+\item One of the most common problem is improper configuration of the
+   variables in {\bf bacula.config} that define the database.  If you see
+   nothing but a blank screen or error messages, please recheck your database
+   definitions paying careful attention to ensure that the database name and
+   password are correct and that the database engine is running.  
+
+\item If you get an error such as {\bf DB Error: not found} assuming your 
+   database is MySQL, try using the following command:
+
+   mysql -h\lt{}host\gt{} -u\lt{}login\gt{} -p \lt{}db_name\gt{}
+
+   where, \lt{}host\gt{}, \lt{}login\gt{}, and \lt{}db_name\gt{} are
+   the values you put in your {\bf bacula.conf} file under the 
+   DATABASE section as in:
+\begin{verbatim}
+[.DATABASE]
+host = 192.168.1.120
+login = bacula-user
+pass =
+db_name = bacula
+db_type = mysql
+\end{verbatim}
+
+   in this case, the mysql command would be:
+
+   mysql -h192.168.1.120 -ubacula-user -p bacula
+
+\item If you get an error such as {\bf DB Error: connection failed} assuming your
+   database is PostgreSQL, make sure that TCP/IP-Connections to your
+   bacula database are allowed via pg_hba.conf.
+
+
+\item If nothing seems to be working and you are using SELinix, please
+   remember that you must have the correct contexts for the bacula-web
+   files. Assuming you have installed the files in
+   /var/www/html/bacula-web, you can most likely fix the contexts with 
+   a command such as:
+
+   chcon -t httpd_sys_content_t /var/www/html/bacula-web/ -R
+
+\end{itemize}
+
+\section*{Screen Shots}
+\index[general]{Screen Shots}
+\addcontentsline{toc}{section}{Screen Shots}
+
+\includegraphics{./bweb-index.eps} \\
+\includegraphics{./bweb-report.eps} \\
+
+
+\section*{Notes}
+\index[general]{Notes}
+\addcontentsline{toc}{section}{Notes}
+The output from bacula-web is best viewed with a resolution of
+1024x768 or better. Most browsers will produce good results including 
+MS Internet Explorer.
+
+If you have configured bacula-web for a language other than English,
+and the language changes are not being correctly displayed, restart
+your web server.
+
+\section*{Bugs}
+\index[general]{Bugs}
+\addcontentsline{toc}{section}{Bugs}
+
+\begin{itemize}
+\item In the Pie graphs, the margins don't work. It is a phplot bug.
+\item The total elapsed time "calculation" is rudimentary.  If you have 2
+or more concurrent jobs this is not real.
+\end{itemize}
+
+Submit your bugs at this link: 
+\elink{http://indpnday.com/bacula_stuff/bacula-web/mantisbt/login_page.php}
+{http://indpnday.com/bacula_stuff/bacula-web/mantisbt/login_page.php}.
+
+
+\section*{Translations}
+\index[general]{Translations}
+\addcontentsline{toc}{section}{Translations}
+If you want add a new language not supported by bacula-web please, follow
+the following instructions:
+
+Extract strings with this command (tsmarty2c.php is with bacula-web 
+package):\\
+
+\begin{verbatim}
+./tsmarty2c.php templates > lang.c
+xgettext lang.c
+\end{verbatim}
+
+Now you must have this file: messages.po \\
+Edit messages.po to have your translations, then
+send us a copy of the file.\\
diff --git a/docs/bacula-web/index.perl b/docs/bacula-web/index.perl
new file mode 100644 (file)
index 0000000..bc4e1b6
--- /dev/null
@@ -0,0 +1,564 @@
+# This module does multiple indices, supporting the style of the LaTex 'index'
+#  package.
+
+# Version Information:
+#  16-Feb-2005 -- Original Creation.  Karl E. Cunningham
+#  14-Mar-2005 -- Clarified and Consolodated some of the code.
+#                   Changed to smoothly handle single and multiple indices.
+
+# Two LaTeX index formats are supported...
+#  --- SINGLE INDEX ---
+#  \usepackage{makeidx}
+#  \makeindex
+#  \index{entry1}
+#  \index{entry2}
+#  \index{entry3}
+#    ...
+#  \printindex
+#
+#  --- MULTIPLE INDICES ---
+#
+#  \usepackage{makeidx}
+#  \usepackage{index}
+#  \makeindex   -- latex2html doesn't care but LaTeX does.
+#  \newindex{ref1}{ext1}{ext2}{title1}
+#  \newindex{ref2}{ext1}{ext2}{title2}
+#  \newindex{ref3}{ext1}{ext2}{title3}
+#  \index[ref1]{entry1}
+#  \index[ref1]{entry2}
+#  \index[ref3]{entry3}
+#  \index[ref2]{entry4}
+#  \index{entry5}
+#  \index[ref3]{entry6}
+#    ...
+#  \printindex[ref1]
+#  \printindex[ref2]
+#  \printindex[ref3]
+#  \printindex
+#  ___________________
+#
+#  For the multiple-index  style, each index is identified by the ref argument to \newindex, \index, 
+#   and \printindex. A default index is allowed, which is indicated by omitting the optional
+#   argument.  The default index does not require a \newindex command.  As \index commands 
+#   are encountered, their entries are stored according
+#   to the ref argument.  When the \printindex command is encountered, the stored index
+#   entries for that argument are retrieved and printed. The title for each index is taken
+#   from the last argument in the \newindex command.
+#  While processing \index and \printindex commands, if no argument is given the index entries
+#   are built into a default index.  The title of the default index is simply "Index".  
+#   This makes the difference between single- and multiple-index processing trivial.
+# 
+#  Another method can be used by omitting the \printindex command and just using \include to 
+#   pull in index files created by the makeindex program. These files will start with
+#   \begin{theindex}.  This command is used to determine where to print the index.  Using this
+#   approach, the indices will be output in the same order as the newindex commands were 
+#   originally found (see below).  Using a combination of \printindex and \include{indexfile} has not
+#   been tested and may produce undesireable results.
+#
+#  The index data are stored in a hash for later sorting and output.  As \printindex
+#   commands are handled, the order in which they were found in the tex filea is saved,
+#   associated with the ref argument to \printindex.
+#
+#  We use the original %index hash to store the index data into.  We append a \002 followed by the
+#    name of the index to isolate the entries in different indices from each other.  This is necessary
+#    so that different indices can have entries with the same name.  For the default index, the \002 is
+#    appended without the name.
+#
+#  Since the index order in the output cannot be determined if the \include{indexfile} 
+#   command is used, the order will be assumed from the order in which the \newindex
+#   commands were originally seen in the TeX files.  This order is saved as well as the
+#   order determined from any printindex{ref} commands.  If \printindex commnads are used
+#   to specify the index output, that order will be used.  If the \include{idxfile} command
+#   is used, the order of the original newindex commands will be used.  In this case the
+#   default index will be printed last since it doesn't have a corresponding \newindex
+#   command and its order cannot be determined.  Mixing \printindex and \include{idxfile} 
+#   commands in the same file is likely to produce less than satisfactory results.
+#   
+#  
+#  The hash containing index data is named %indices.  It contains the following data:
+#{
+#      'title' => { 
+#                $ref1 => $indextitle ,
+#                $ref2 => $indextitle ,
+#                ...
+#              },
+#      'newcmdorder' => [ ref1, ref2, ..., * ], # asterisk indicates the position of the default index.
+#      'printindorder' => [ ref1, ref2, ..., * ], # asterisk indicates the position of the default index.
+#}
+       
+
+# Globals to handle multiple indices.
+my %indices;
+
+# This tells the system to use up to 7 words in index entries.
+$WORDS_IN_INDEX = 10;
+
+# KEC 2-18-05
+# Handles the \newindex command.  This is called if the \newindex command is 
+#  encountered in the LaTex source.  Gets the index ref and title from the arguments.
+#  Saves the index ref and title.
+#  Note that we are called once to handle multiple \newindex commands that are 
+#    newline-separated.
+sub do_cmd_newindex {
+       my $data = shift;
+       # The data is sent to us as fields delimited by their ID #'s.  We extract the 
+       #  fields.
+       foreach my $line (split("\n",$data)) {
+               my @fields = split (/(?:\<\#\d+?\#\>)+/,$line);
+
+               # The index name and title are the second and fourth fields in the data.
+               if ($line =~ /^</ or $line =~ /^\\newindex/) {
+                       my ($indexref,$indextitle) = ($fields[1],$fields[4]);
+                       $indices{'title'}{$indexref} = $indextitle;
+                       push (@{$indices{'newcmdorder'}},$indexref);
+               }
+       }
+}
+
+
+# KEC -- Copied from makeidx.perl and modified to do multiple indices.
+# Processes an \index entry from the LaTex file.  
+#  Gets the optional argument from the index command, which is the name of the index
+#    into which to place the entry.
+#  Drops the brackets from the index_name
+#  Puts the index entry into the html stream
+#  Creates the tokenized index entry (which also saves the index entry info
+sub do_real_index {
+       local($_) = @_;
+       local($pat,$idx_entry,$index_name);
+       # catches opt-arg from \index commands for index.sty
+       $index_name = &get_next_optional_argument;
+       $index_name = "" unless defined $index_name;
+       # Drop leading and trailing brackets from the index name.
+       $index_name =~ s/^\[|\]$//g;
+
+       $idx_entry = &missing_braces unless (
+               (s/$next_pair_pr_rx/$pat=$1;$idx_entry=$2;''/e)
+               ||(s/$next_pair_rx/$pat=$1;$idx_entry=$2;''/e));
+
+       if ($index_name and defined $idx_entry and 
+               !defined $indices{'title'}{$index_name}) {
+                       print STDERR "\nInvalid Index Name: \\index \[$index_name\]\{$idx_entry\}\n";
+       }
+
+       $idx_entry = &named_index_entry($pat, $idx_entry,$index_name);
+       $idx_entry.$_;
+}
+
+# Creates and saves an index entry in the index hashes.
+#  Modified to do multiple indices. 
+#    Creates an index_key that allows index entries to have the same characteristics but be in
+#      different indices. This index_key is the regular key with the index name appended.
+#    Save the index order for the entry in the %index_order hash.
+sub named_index_entry {
+    local($br_id, $str, $index_name) = @_;
+       my ($index_key);
+    # escape the quoting etc characters
+    # ! -> \001
+    # @ -> \002
+    # | -> \003
+    $* = 1; $str =~ s/\n\s*/ /g; $* = 0; # remove any newlines
+    # protect \001 occurring with images
+    $str =~ s/\001/\016/g;                     # 0x1 to 0xF
+    $str =~ s/\\\\/\011/g;                     # Double backslash -> 0xB
+    $str =~ s/\\;SPMquot;/\012/g;      # \;SPMquot; -> 0xC
+    $str =~ s/;SPMquot;!/\013/g;       # ;SPMquot; -> 0xD
+    $str =~ s/!/\001/g;                        # Exclamation point -> 0x1
+    $str =~ s/\013/!/g;                        # 0xD -> Exclaimation point
+    $str =~ s/;SPMquot;@/\015/g;       # ;SPMquot;@ to 0xF
+    $str =~ s/@/\002/g;                        # At sign -> 0x2
+    $str =~ s/\015/@/g;                        # 0xF to At sign
+    $str =~ s/;SPMquot;\|/\017/g;      # ;SMPquot;| to 0x11
+    $str =~ s/\|/\003/g;                       # Vertical line to 0x3
+    $str =~ s/\017/|/g;                        # 0x11 to vertical line
+    $str =~ s/;SPMquot;(.)/\1/g;       # ;SPMquot; -> whatever the next character is
+    $str =~ s/\012/;SPMquot;/g;        # 0x12 to ;SPMquot;
+    $str =~ s/\011/\\\\/g;                     # 0x11 to double backslash
+    local($key_part, $pageref) = split("\003", $str, 2);
+
+       # For any keys of the form: blablabla!blablabla, which want to be split at the
+       #   exclamation point, replace the ! with a comma and a space.  We don't do it
+       #   that way for this index.
+       $key_part =~ s/\001/, /g;
+    local(@keys) = split("\001", $key_part);
+    # If TITLE is not yet available use $before.
+    $TITLE = $saved_title if (($saved_title)&&(!($TITLE)||($TITLE eq $default_title)));
+    $TITLE = $before unless $TITLE;
+    # Save the reference
+    local($words) = '';
+    if ($SHOW_SECTION_NUMBERS) { $words = &make_idxnum; }
+               elsif ($SHORT_INDEX) { $words = &make_shortidxname; }
+               else { $words = &make_idxname; }
+    local($super_key) = '';
+    local($sort_key, $printable_key, $cur_key);
+    foreach $key (@keys) {
+               $key =~ s/\016/\001/g; # revert protected \001s
+               ($sort_key, $printable_key) = split("\002", $key);
+               #
+               # RRM:  16 May 1996
+               # any \label in the printable-key will have already
+               # created a label where the \index occurred.
+               # This has to be removed, so that the desired label 
+               # will be found on the Index page instead. 
+               #
+               if ($printable_key =~ /tex2html_anchor_mark/ ) {
+                       $printable_key =~ s/><tex2html_anchor_mark><\/A><A//g;
+                       local($tmpA,$tmpB) = split("NAME=\"", $printable_key);
+                       ($tmpA,$tmpB) = split("\"", $tmpB);
+                       $ref_files{$tmpA}='';
+                       $index_labels{$tmpA} = 1;
+               }
+               #
+               # resolve and clean-up the hyperlink index-entries 
+               # so they can be saved in an  index.pl  file
+               #
+               if ($printable_key =~ /$cross_ref_mark/ ) {
+                       local($label,$id,$ref_label);
+       #           $printable_key =~ s/$cross_ref_mark#(\w+)#(\w+)>$cross_ref_mark/
+                       $printable_key =~ s/$cross_ref_mark#([^#]+)#([^>]+)>$cross_ref_mark/
+                               do { ($label,$id) = ($1,$2);
+                               $ref_label = $external_labels{$label} unless
+                               ($ref_label = $ref_files{$label});
+                               '"' . "$ref_label#$label" . '">' .
+                               &get_ref_mark($label,$id)}
+                       /geo;
+               }
+               $printable_key =~ s/<\#[^\#>]*\#>//go;
+               #RRM
+               # recognise \char combinations, for a \backslash
+               #
+               $printable_key =~ s/\&\#;\'134/\\/g;            # restore \\s
+               $printable_key =~ s/\&\#;\`<BR> /\\/g;  #  ditto
+               $printable_key =~ s/\&\#;*SPMquot;92/\\/g;      #  ditto
+               #
+               #       $sort_key .= "@$printable_key" if !($printable_key);    # RRM
+               $sort_key .= "@$printable_key" if !($sort_key); # RRM
+               $sort_key =~ tr/A-Z/a-z/;
+               if ($super_key) {
+                       $cur_key = $super_key . "\001" . $sort_key;
+                       $sub_index{$super_key} .= $cur_key . "\004";
+               } else {
+                       $cur_key = $sort_key;
+               }
+
+               # Append the $index_name to the current key with a \002 delimiter.  This will 
+               #  allow the same index entry to appear in more than one index.
+               $index_key = $cur_key . "\002$index_name";
+
+               $index{$index_key} .= "";  
+
+               #
+               # RRM,  15 June 1996
+               # if there is no printable key, but one is known from
+               # a previous index-entry, then use it.
+               #
+               if (!($printable_key) && ($printable_key{$index_key}))
+                       { $printable_key = $printable_key{$index_key}; } 
+#              if (!($printable_key) && ($printable_key{$cur_key}))
+#                      { $printable_key = $printable_key{$cur_key}; } 
+               #
+               # do not overwrite the printable_key if it contains an anchor
+               #
+               if (!($printable_key{$index_key} =~ /tex2html_anchor_mark/ ))
+                       { $printable_key{$index_key} = $printable_key || $key; }
+#              if (!($printable_key{$cur_key} =~ /tex2html_anchor_mark/ ))
+#                      { $printable_key{$cur_key} = $printable_key || $key; }
+
+               $super_key = $cur_key;
+    }
+       #
+       # RRM
+       # page-ranges, from  |(  and  |)  and  |see
+       #
+    if ($pageref) {
+               if ($pageref eq "\(" ) { 
+                       $pageref = ''; 
+                       $next .= " from ";
+               } elsif ($pageref eq "\)" ) { 
+                       $pageref = ''; 
+                       local($next) = $index{$index_key};
+#                      local($next) = $index{$cur_key};
+       #           $next =~ s/[\|] *$//;
+                       $next =~ s/(\n )?\| $//;
+                       $index{$index_key} = "$next to ";
+#                      $index{$cur_key} = "$next to ";
+               }
+    }
+
+    if ($pageref) {
+               $pageref =~ s/\s*$//g;  # remove trailing spaces
+               if (!$pageref) { $pageref = ' ' }
+               $pageref =~ s/see/<i>see <\/i> /g;
+               #
+               # RRM:  27 Dec 1996
+               # check if $pageref corresponds to a style command.
+               # If so, apply it to the $words.
+               #
+               local($tmp) = "do_cmd_$pageref";
+               if (defined &$tmp) {
+                       $words = &$tmp("<#0#>$words<#0#>");
+                       $words =~ s/<\#[^\#]*\#>//go;
+                       $pageref = '';
+               }
+    }
+       #
+       # RRM:  25 May 1996
+       # any \label in the pageref section will have already
+       # created a label where the \index occurred.
+       # This has to be removed, so that the desired label 
+       # will be found on the Index page instead. 
+       #
+    if ($pageref) {
+               if ($pageref =~ /tex2html_anchor_mark/ ) {
+                       $pageref =~ s/><tex2html_anchor_mark><\/A><A//g;
+                       local($tmpA,$tmpB) = split("NAME=\"", $pageref);
+                       ($tmpA,$tmpB) = split("\"", $tmpB);
+                       $ref_files{$tmpA}='';
+                       $index_labels{$tmpA} = 1;
+               }
+               #
+               # resolve and clean-up any hyperlinks in the page-ref, 
+               # so they can be saved in an  index.pl  file
+               #
+               if ($pageref =~ /$cross_ref_mark/ ) {
+                       local($label,$id,$ref_label);
+                       #           $pageref =~ s/$cross_ref_mark#(\w+)#(\w+)>$cross_ref_mark/
+                       $pageref =~ s/$cross_ref_mark#([^#]+)#([^>]+)>$cross_ref_mark/
+                               do { ($label,$id) = ($1,$2);
+                               $ref_files{$label} = ''; # ???? RRM
+                               if ($index_labels{$label}) { $ref_label = ''; } 
+                                       else { $ref_label = $external_labels{$label} 
+                                               unless ($ref_label = $ref_files{$label});
+                               }
+                       '"' . "$ref_label#$label" . '">' . &get_ref_mark($label,$id)}/geo;
+               }
+               $pageref =~ s/<\#[^\#>]*\#>//go;
+
+               if ($pageref eq ' ') { $index{$index_key}='@'; }
+                       else { $index{$index_key} .= $pageref . "\n | "; }
+    } else {
+               local($thisref) = &make_named_href('',"$CURRENT_FILE#$br_id",$words);
+               $thisref =~ s/\n//g;
+               $index{$index_key} .= $thisref."\n | ";
+    }
+       #print "\nREF: $sort_key : $index_key :$index{$index_key}";
+       #join('',"<A NAME=$br_id>$anchor_invisible_mark<\/A>",$_);
+
+    "<A NAME=\"$br_id\">$anchor_invisible_mark<\/A>";
+}
+
+
+# KEC. -- Copied from makeidx.perl, then modified to do multiple indices.
+#  Feeds the index entries to the output. This is called for each index to be built.
+#
+#  Generates a list of lookup keys for index entries, from both %printable_keys
+#    and %index keys.
+#  Sorts the keys according to index-sorting rules.
+#  Removes keys with a 0x01 token. (duplicates?)
+#  Builds a string to go to the index file.
+#    Adds the index entries to the string if they belong in this index.
+#    Keeps track of which index is being worked on, so only the proper entries
+#      are included.
+#  Places the index just built in to the output at the proper place.
+{ my $index_number = 0;
+sub add_real_idx {
+       print "\nDoing the index ... Index Number $index_number\n";
+       local($key, @keys, $next, $index, $old_key, $old_html);
+       my ($idx_ref,$keyref);
+       # RRM, 15.6.96:  index constructed from %printable_key, not %index
+       @keys = keys %printable_key;
+
+       while (/$idx_mark/) {
+               # Get the index reference from what follows the $idx_mark and
+               #  remove it from the string.
+               s/$idxmark\002(.*?)\002/$idxmark/;
+               $idx_ref = $1;
+               $index = '';
+               # include non- makeidx  index-entries
+               foreach $key (keys %index) {
+                       next if $printable_key{$key};
+                       $old_key = $key;
+                       if ($key =~ s/###(.*)$//) {
+                               next if $printable_key{$key};
+                               push (@keys, $key);
+                               $printable_key{$key} = $key;
+                               if ($index{$old_key} =~ /HREF="([^"]*)"/i) {
+                                       $old_html = $1;
+                                       $old_html =~ /$dd?([^#\Q$dd\E]*)#/;
+                                       $old_html = $1;
+                               } else { $old_html = '' }
+                               $index{$key} = $index{$old_key} . $old_html."</A>\n | ";
+                       };
+               }
+               @keys = sort makeidx_keysort @keys;
+               @keys = grep(!/\001/, @keys);
+               my $cnt = 0;
+               foreach $key (@keys) {
+                       my ($keyref) = $key =~ /.*\002(.*)/;
+                       next unless ($idx_ref eq $keyref);              # KEC.
+                       $index .= &add_idx_key($key);
+                       $cnt++;
+               }
+               print "$cnt Index Entries Added\n";
+               $index = '<DD>'.$index unless ($index =~ /^\s*<D(D|T)>/);
+               $index_number++;        # KEC.
+               if ($SHORT_INDEX) {
+                       print "(compact version with Legend)";
+                       local($num) = ( $index =~ s/\<D/<D/g );
+                       if ($num > 50 ) {
+                               s/$idx_mark/$preindex<HR><DL>\n$index\n<\/DL>$preindex/o;
+                       } else {
+                               s/$idx_mark/$preindex<HR><DL>\n$index\n<\/DL>/o;
+                       }
+               } else { 
+               s/$idx_mark/<DL COMPACT>\n$index\n<\/DL>/o; }
+       }
+}
+}
+
+# KEC.  Copied from latex2html.pl and modified to support multiple indices.
+# The bibliography and the index should be treated as separate sections
+# in their own HTML files. The \bibliography{} command acts as a sectioning command
+# that has the desired effect. But when the bibliography is constructed
+# manually using the thebibliography environment, or when using the
+# theindex environment it is not possible to use the normal sectioning
+# mechanism. This subroutine inserts a \bibliography{} or a dummy
+# \textohtmlindex command just before the appropriate environments
+# to force sectioning.
+sub add_bbl_and_idx_dummy_commands {
+       local($id) = $global{'max_id'};
+
+       s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg;
+       ## if ($bbl_cnt == 1) {
+               s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo;
+       #}
+       $global{'max_id'} = $id;
+       # KEC. Modified to global substitution to place multiple index tokens.
+       s/[\\]begin\s*($O\d+$C)\s*theindex/\\textohtmlindex$1/go;
+       # KEC. Modified to pick up the optional argument to \printindex
+       s/[\\]printindex\s*(\[.*?\])?/
+               do { (defined $1) ? "\\textohtmlindex $1" : "\\textohtmlindex []"; } /ego;
+       &lib_add_bbl_and_idx_dummy_commands() if defined(&lib_add_bbl_and_idx_dummy_commands);
+}
+
+# KEC.  Copied from latex2html.pl and modified to support multiple indices.
+#  For each textohtmlindex mark found, determine the index titles and headers.
+#  We place the index ref in the header so the proper index can be generated later.
+#  For the default index, the index ref is blank.
+# 
+#  One problem is that this routine is called twice..  Once for processing the 
+#    command as originally seen, and once for processing the command when 
+#    doing the name for the index file. We can detect that by looking at the 
+#    id numbers (or ref) surrounding the \theindex command, and not incrementing
+#    index_number unless a new id (or ref) is seen.  This has the side effect of 
+#    having to unconventionally start the index_number at -1. But it works.
+#
+#  Gets the title from the list of indices.
+#  If this is the first index, save the title in $first_idx_file. This is what's referenced
+#    in the navigation buttons.
+#  Increment the index_number for next time.  
+#  If the indexname command is defined or a newcommand defined for indexname, do it.  
+#  Save the index TITLE in the toc 
+#  Save the first_idx_file into the idxfile. This goes into the nav buttons.  
+#  Build index_labels if needed.
+#  Create the index headings and put them in the output stream.
+
+{ my $index_number = 0;  # Will be incremented before use.
+       my $first_idx_file;  # Static
+       my $no_increment = 0;
+
+sub do_cmd_textohtmlindex {
+       local($_) = @_;
+       my ($idxref,$idxnum,$index_name);
+
+       # We get called from make_name with the first argument = "\001noincrement". This is a sign
+       #  to not increment $index_number the next time we are called. We get called twice, once
+       #  my make_name and once by process_command.  Unfortunately, make_name calls us just to set the name
+       #  but doesn't use the result so we get called a second time by process_command.  This works fine
+       #  except for cases where there are multiple indices except if they aren't named, which is the case
+       #  when the index is inserted by an include command in latex. In these cases we are only able to use
+       #  the index number to decide which index to draw from, and we don't know how to increment that index
+       #  number if we get called a variable number of times for the same index, as is the case between
+       #  making html (one output file) and web (multiple output files) output formats.
+       if (/\001noincrement/) {
+               $no_increment = 1;
+               return;
+       }
+
+       # Remove (but save) the index reference 
+       s/^\s*\[(.*?)\]/{$idxref = $1; "";}/e;
+
+       # If we have an $idxref, the index name was specified.  In this case, we have all the
+       #  information we need to carry on.  Otherwise, we need to get the idxref
+       #  from the $index_number and set the name to "Index".
+       if ($idxref) {
+               $index_name = $indices{'title'}{$idxref};
+       } else {
+               if (defined ($idxref = $indices{'newcmdorder'}->[$index_number])) {
+                       $index_name = $indices{'title'}{$idxref};
+               } else { 
+                       $idxref = '';
+                       $index_name = "Index";
+               }
+       }
+
+       $idx_title = "Index"; # The name displayed in the nav bar text.
+
+       # Only set $idxfile if we are at the first index.  This will point the 
+       #  navigation panel to the first index file rather than the last.
+       $first_idx_file = $CURRENT_FILE if ($index_number == 0);
+       $idxfile = $first_idx_file; # Pointer for the Index button in the nav bar.
+       $toc_sec_title = $index_name; # Index link text in the toc.
+       $TITLE = $toc_sec_title; # Title for this index, from which its filename is built.
+       if (%index_labels) { &make_index_labels(); }
+       if (($SHORT_INDEX) && (%index_segment)) { &make_preindex(); }
+               else { $preindex = ''; }
+       local $idx_head = $section_headings{'textohtmlindex'};
+       local($heading) = join(''
+               , &make_section_heading($TITLE, $idx_head)
+               , $idx_mark, "\002", $idxref, "\002" );
+       local($pre,$post) = &minimize_open_tags($heading);
+       $index_number++ unless ($no_increment);
+       $no_increment = 0;
+       join('',"<BR>\n" , $pre, $_);
+}
+}
+
+# Returns an index key, given the key passed as the first argument.
+#  Not modified for multiple indices.
+sub add_idx_key {
+    local($key) = @_;
+       local($index, $next);
+       if (($index{$key} eq '@' )&&(!($index_printed{$key}))) {
+               if ($SHORT_INDEX) { $index .= "<DD><BR>\n<DT>".&print_key."\n<DD>"; }
+                       else { $index .= "<DT><DD><BR>\n<DT>".&print_key."\n<DD>"; }
+       } elsif (($index{$key})&&(!($index_printed{$key}))) {
+               if ($SHORT_INDEX) {
+                       $next = "<DD>".&print_key."\n : ". &print_idx_links;
+               } else {
+                       $next = "<DT>".&print_key."\n<DD>". &print_idx_links;
+               }
+               $index .= $next."\n";
+               $index_printed{$key} = 1;
+       }
+
+       if ($sub_index{$key}) {
+               local($subkey, @subkeys, $subnext, $subindex);
+               @subkeys = sort(split("\004", $sub_index{$key}));
+               if ($SHORT_INDEX) {
+                       $index .= "<DD>".&print_key  unless $index_printed{$key};
+                       $index .= "<DL>\n"; 
+               } else {
+                       $index .= "<DT>".&print_key."\n<DD>"  unless $index_printed{$key};
+                       $index .= "<DL COMPACT>\n"; 
+               }
+               foreach $subkey (@subkeys) {
+                       $index .= &add_sub_idx_key($subkey) unless ($index_printed{$subkey});
+               }
+               $index .= "</DL>\n";
+       }
+       return $index;
+}
+
+1;  # Must be present as the last line.
diff --git a/docs/bacula-web/latex2html-init.pl b/docs/bacula-web/latex2html-init.pl
new file mode 100644 (file)
index 0000000..14b5c31
--- /dev/null
@@ -0,0 +1,10 @@
+# This file serves as a place to put initialization code and constants to 
+#  affect the behavior of latex2html for generating the bacula manuals.
+
+# $LINKPOINT specifies what filename to use to link to when creating 
+#  index.html.  Not that this is a hard link.
+$LINKPOINT='"$OVERALL_TITLE"';
+
+
+# The following must be the last line of this file.
+1;
diff --git a/docs/bacula-web/mtx-changer.txt b/docs/bacula-web/mtx-changer.txt
new file mode 100644 (file)
index 0000000..10ef6d1
--- /dev/null
@@ -0,0 +1,215 @@
+#!/bin/sh
+#
+# Bacula interface to mtx autoloader
+#
+#   Created  OCT/31/03 by Alexander Kuehn, derived from Ludwig Jaffe's script
+#
+#  Works with the HP C1537A L708 DDS3
+#
+#set -x
+# these are the labels of the tapes in each virtual slot, not the slots!
+labels="PSE-0001 PSE-0002 PSE-0003 PSE-0004 PSE-0005 PSE-0006 PSE-0007 PSE-0008 PSE-0009 PSE-0010 PSE-0011 PSE-0012"
+
+# who to send a mail to?
+recipient=root@localhost
+logfile=/var/log/mtx.log
+
+# Delay in seconds how often to check whether a new tape has been inserted
+TAPEDELAY=10   # the default is every 10 seconds
+echo `date` ":" $@ >>$logfile
+
+# change this if mt is not in the path (use different quotes!)
+mt=`which mt`
+grep=`which grep`
+#
+# how to run the console application?
+console="/usr/local/sbin/console -c /usr/local/etc/console.conf"
+
+command="$1"
+
+#TAPEDRIVE0 holds the device/name of your 1st and only drive (Bacula supports only 1 drive currently)
+#Read TAPEDRIVE from command line parameters
+if [ -z "$2" ] ; then
+  TAPEDRIVE0=/dev/nsa0 
+else
+  TAPEDRIVE0=$2 
+fi
+
+#Read slot from command line parameters
+if [ -z "$3" ] ; then
+  slot=`expr 1`
+else
+  slot=`expr $3`
+fi
+
+if [ -z "$command" ] ; then
+  echo ""
+  echo "The mtx-changer script for Bacula"
+  echo "---------------------------------"
+  echo ""
+  echo "usage: mtx-changer <command> <devicename of tapedrive> [slot]"
+  echo "       mtx-changer"
+  echo ""
+  echo "Valid commands:"
+  echo ""
+  echo "unload          Unloads a tape into the slot"
+  echo "                from where it was loaded."
+  echo "load <slot>     Loads a tape from the slot <slot>"
+  echo "list            Lists full storage slots"
+  echo "loaded          Gives slot from where the tape was loaded."
+  echo "                0 means the tape drive is empty."
+  echo "slots           Gives Number of avialable slots." 
+  echo "volumes         List avialable slots and the label of the." 
+  echo "                tape in it (slot:volume)"
+  echo "Example:"
+  echo "  mtx-changer load /dev/nst0 1   loads a tape from slot1"
+  echo "  mtx-changer %a %o %S   "
+  echo ""
+  exit 0
+fi
+
+
+case "$command" in 
+       unload)
+               # At first do mt -f /dev/st0 offline to unload the tape 
+               #
+               # Check if you want to fool me
+               echo "unmount"|$console >/dev/null 2>/dev/null
+               echo "mtx-changer: Checking if drive is loaded before we unload. Request unload" >>$logfile
+               if $mt -f $TAPEDRIVE0 status >/dev/null 2>/dev/null ; then              # mt says status ok
+                       echo "mtx-changer: Doing mt -f $TAPEDRIVE0 rewoffl to rewind and unload the tape!" >>$logfile
+                       $mt -f $TAPEDRIVE0 rewoffl
+               else
+                       echo "mtx-changer:  *** Don't fool me! *** The Drive $TAPEDRIVE0 is empty." >>$logfile
+               fi
+               exit 0
+               ;;
+       
+   load)
+               #Let's check if drive is loaded before we load it
+               echo "mtx-changer: Checking if drive is loaded before we load. I Request loaded" >>$logfile
+               LOADEDVOL=`echo "status Storage"|$console|$grep $TAPEDRIVE0|grep ^Device|grep -v "not open."|grep -v "ERR="|grep -v "no Bacula volume is mounted"|sed -e s/^.*Volume\ //|cut -d\" -f2`
+#              if [ -z "$LOADEDVOL" ] ; then   # this is wrong, becaus Bacula would try to use the tape if we mount it!
+#                      LOADEDVOL=`echo "mount"|$console|$grep $TAPEDRIVE0|grep Device|grep -v "not open."|grep -v "ERR="|sed -e s/^.*Volume\ //|cut -d\" -f2`
+#                      if [ -z "$LOADEDVOL" ] ; then 
+#                              echo "mtx-changer: The Drive $TAPEDRIVE0 is empty." >>$logfile
+#                      else                                                    # restore state?
+#                              if [ $LOADEDVOL = $3 ] ; then           # requested Volume mounted -> exit
+#                                      echo "mtx-changer: *** Don't fool me! *** Tape $LOADEDVOL is already in drive $TAPEDRIVE0!" >>$logfile
+#                                      exit
+#                              else                                    # oops, wrong volume
+#                                      echo "unmount"|$console >/dev/null 2>/dev/null
+#                              fi
+#                      fi
+#              fi
+               if [ -z "$LOADEDVOL" ] ; then
+                       echo "unmount"|$console >/dev/null 2>/dev/null
+                       LOADEDVOL=0
+               else
+                       #Check if you want to fool me
+                       if [ $LOADEDVOL = $3 ] ; then 
+                               echo "mtx-changer: *** Don't fool me! *** Tape $LOADEDVOL is already in drive $TAPEDRIVE0!" >>$logfile
+                               exit
+                       fi
+                       echo "mtx-changer: The Drive $TAPEDRIVE0 is loaded with the tape $LOADEDVOL" >>$logfile
+                       echo "mtx-changer: Unmounting..." >>$logfile
+                       echo "unmount"|$console >/dev/null 2>/dev/null
+               fi
+               echo "mtx-changer: Unloading..." >>$logfile
+               echo "mtx-changer: Doing mt -f $TAPEDRIVE0 rewoffl to rewind and unload the tape!" >>$logfile
+               mt -f $TAPEDRIVE0 rewoffl 2>/dev/null
+               #Now we can load the drive as desired 
+               echo "mtx-changer: Doing mtx -f $1 $2 $3" >>$logfile
+               # extract label for the mail
+               count=`expr 1`
+               for label in $labels ; do
+                       if [ $slot -eq $count ] ; then volume=$label ; fi
+                       count=`expr $count + 1`
+               done
+
+               mail -s "Bacula needs volume $volume." $recipient <<END_OF_DATA
+Please insert volume $volume from slot $slot into $TAPEDRIVE0 .
+Kind regards,
+Bacula.
+END_OF_DATA
+               sleep 15
+               $mt status >/dev/null 2>/dev/null
+               while [ $? -ne 0 ] ; do
+                       sleep $TAPEDELAY
+                       $mt status >/dev/null 2>/dev/null
+               done
+               mail -s "Bacula says thank you." $recipient <<END_OF_DATA
+Thank you for inserting the new tape! (I requested volume $volume from slot $slot.)
+Kind regards,
+Bacula.
+END_OF_DATA
+               echo "Successfully loaded a tape into drive $TAPEDRIVE0 (requested $volume from slot $slot)." >>$logfile
+               echo "Loading finished." ; >>$logfile
+               echo "$slot"
+               exit 0
+               ;;
+
+       list) 
+               echo "mtx-changer: Requested list" >>$logfile
+               LOADEDVOL=`echo "status Storage"|$console|$grep $TAPEDRIVE0|grep ^Device|grep -v "not open."|grep -v "ERR="|grep -v "no Bacula volume is mounted"|sed -e s/^.*Volume\ //|cut -d\" -f2`
+               if [ -z $LOADEDVOL ] ; then             # try mounting
+                       LOADEDVOL=`echo "mount"|$console|$grep $TAPEDRIVE0|grep Device|grep -v "not open."|grep -v "ERR="|sed -e s/^.*Volume\ //|cut -d\" -f2`
+                       if [ -z $LOADEDVOL ] ; then             # no luck
+                               LOADEDVOL="_no_tape"
+                       else                                                    # restore state
+                               echo "unmount"|$console >/dev/null 2>/dev/null
+                       fi
+               fi
+               count=`expr 1`
+               for label in $labels ; do
+                       if [ "$label" != "$LOADEDVOL" ] ; then
+                               printf "$count "
+                       fi
+                       count=`expr $count + 1`
+               done
+               printf "\n"
+      ;;
+
+   loaded)
+               echo "mtx-changer: Request loaded, dev $TAPEDRIVE0" >>$logfile
+               LOADEDVOL=`echo "status Storage"|$console|$grep $TAPEDRIVE0|grep ^Device|grep -v "not open."|grep -v "ERR="|grep -v "no Bacula volume is mounted"|sed -e s/^.*Volume\ //|cut -d\" -f2`
+               if [ -z $LOADEDVOL ] ; then
+                       LOADEDVOL=`echo "mount"|$console|$grep $TAPEDRIVE0|grep Device|grep -v "not open."|grep -v "ERR="|grep -v "no Bacula volume is mounted"|sed -e s/^.*Volume\ //|cut -d\" -f2`
+                       if [ -z "$LOADEDVOL" ] ; then           # no luck
+                               echo "$TAPEDRIVE0 not mounted!" >>$logfile
+                       else                                                    # restore state
+                               echo "unmount"|$console >/dev/null 2>/dev/null
+                       fi
+               fi
+               if [ -z "$LOADEDVOL" ] ; then 
+                       LOADEDVOL="_no_tape" >>$logfile
+                       echo "0"
+               else
+                       count=`expr 1`
+                       for label in $labels ; do
+                               if [ $LOADEDVOL = $label ] ; then echo $count ; fi
+                               count=`expr $count + 1`
+                       done
+               fi
+               exit 0
+               ;;
+
+   slots)
+               echo "mtx-changer: Request slots" >>$logfile
+               count=`expr 0`
+               for label in $labels ; do
+                       count=`expr $count + 1`
+               done
+               echo $count
+      ;;
+
+   volumes)
+               echo "mtx-changer: Request volumes" >>$logfile
+               count=`expr 1`
+               for label in $labels ; do
+                       printf "$count:$label "
+                       count=`expr $count + 1`
+               done
+               printf "\n"
+      ;;
+esac
diff --git a/docs/bacula-web/setup.sm b/docs/bacula-web/setup.sm
new file mode 100644 (file)
index 0000000..7c88dc6
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ *  html2latex
+ */
+
+available {
+   sun4_sunos.4
+   sun4_solaris.2
+   rs_aix.3
+   rs_aix.4
+   sgi_irix
+}
+
+description {
+   From Jeffrey Schaefer, Geometry Center. Translates HTML document to LaTeX 
+}
+
+install {
+  bin/html2latex  /afs/rpi.edu/dept/acs/rpinfo/filters/GChtml2latex/html2latex
+  bin/html2latex.tag  /afs/rpi.edu/dept/acs/rpinfo/filters/GChtml2latex/html2latex.tag
+  bin/html2latex-local.tag  /afs/rpi.edu/dept/acs/rpinfo/filters/GChtml2latex/html2latex-local.tag
+  bin/webtex2latex.tag  /afs/rpi.edu/dept/acs/rpinfo/filters/GChtml2latex/webtex2latex.tag
+  man/man1/html2latex.1  /afs/rpi.edu/dept/acs/rpinfo/filters/GChtml2latex/html2latex.1
+}
diff --git a/docs/bacula-web/translate_images.pl b/docs/bacula-web/translate_images.pl
new file mode 100755 (executable)
index 0000000..c722511
--- /dev/null
@@ -0,0 +1,185 @@
+#!/usr/bin/perl -w
+#
+use strict;
+
+# Used to change the names of the image files generated by latex2html from imgxx.png
+#  to meaningful names.  Provision is made to go either from or to the meaningful names.
+#  The meaningful names are obtained from a file called imagename_translations, which
+#  is generated by extensions to latex2html in the make_image_file subroutine in 
+#  bacula.perl.
+
+# Opens the file imagename_translations and reads the contents into a hash.
+# The hash is creaed with the imgxx.png files as the key if processing TO
+#  meaningful filenames, and with the meaningful filenames as the key if 
+#  processing FROM meaningful filenames.
+# Then opens the html file(s) indicated in the command-line arguments and
+#  changes all image references according to the translations described in the 
+#  above file.  Finally, it renames the image files.
+#
+# Original creation: 3-27-05  by Karl Cunningham.
+#   Modified 5-21-05 to go FROM and TO meaningful filenames.
+#
+my $TRANSFILE = "imagename_translations";
+my $path;
+
+# Loads the contents of $TRANSFILE file into the hash referenced in the first 
+#  argument. The hash is loaded to translate old to new if $direction is 0, 
+#  otherwise it is loaded to translate new to old.  In this context, the 
+#  'old' filename is the meaningful name, and the 'new' filename is the 
+#  imgxx.png filename.  It is assumed that the old image is the one that
+#  latex2html has used as the source to create the imgxx.png filename.
+# The filename extension is taken from the file 
+sub read_transfile {
+       my ($trans,$direction) = @_;
+
+       if (!open IN,"<$path$TRANSFILE") {
+               print "WARNING:  Cannot open image translation file $path$TRANSFILE for reading\n";
+               print "   Image filename translation aborted\n\n";
+               exit 0;
+       }
+
+       while (<IN>) {
+               chomp;
+               my ($new,$old) = split(/\001/);
+
+               # Old filenames will usually have a leading ./ which we don't need.
+               $old =~ s/^\.\///;
+
+               # The filename extension of the old filename must be made to match
+               #  the new filename because it indicates the encoding format of the image.
+               my ($ext) = $new =~ /(\.[^\.]*)$/;
+               $old =~ s/\.[^\.]*$/$ext/;
+               if ($direction == 0) {
+                       $trans->{$new} = $old;
+               } else {
+                       $trans->{$old} = $new;
+               }
+       }
+       close IN;
+}
+       
+# Translates the image names in the file given as the first argument, according to 
+#  the translations in the hash that is given as the second argument.
+#  The file contents are read in entirely into a string, the string is processed, and
+#  the file contents are then written. No particular care is taken to ensure that the
+#  file is not lost if a system failure occurs at an inopportune time.  It is assumed
+#  that the html files being processed here can be recreated on demand.
+#
+# Links to other files are added to the %filelist for processing.  That way,
+#  all linked files will be processed (assuming they are local).
+sub translate_html {
+       my ($filename,$trans,$filelist) = @_;
+       my ($contents,$out,$this,$img,$dest);
+       my $cnt = 0;
+
+       # If the filename is an external link ignore it.  And drop any file:// from
+       #  the filename.
+       $filename =~ /^(http|ftp|mailto)\:/ and return 0;
+       $filename =~ s/^file\:\/\///;
+       # Load the contents of the html file.
+       if (!open IF,"<$path$filename") {
+               print "WARNING:  Cannot open $path$filename for reading\n";
+               print "  Image Filename Translation aborted\n\n";
+               exit 0;
+       }
+
+       while (<IF>) {
+               $contents .= $_;
+       }
+       close IF;
+
+       # Now do the translation...
+       #  First, search for an image filename.
+       while ($contents =~ /\<\s*IMG[^\>]*SRC=\"/si) {
+               $contents = $';
+               $out .= $` . $&;
+               
+               # The next thing is an image name.  Get it and translate it.
+               $contents =~ /^(.*?)\"/s;
+               $contents = $';
+               $this = $&;
+               $img = $1;
+               # If the image is in our list of ones to be translated, do it
+               #  and feed the result to the output.
+               $cnt += $this =~ s/$img/$trans->{$img}/ if (defined($trans->{$img}));
+               $out .= $this;
+       }
+       $out .= $contents;
+
+       # Now send the translated text to the html file, overwriting what's there.
+       open OF,">$path$filename" or die "Cannot open $path$filename for writing\n";
+       print OF $out;
+       close OF;
+
+       # Now look for any links to other files and add them to the list of files to do.
+       while ($out =~ /\<\s*A[^\>]*HREF=\"(.*?)\"/si) {
+               $out = $';
+               $dest = $1;
+               # Drop an # and anything after it.
+               $dest =~ s/\#.*//;
+               $filelist->{$dest} = '' if $dest;
+       }
+       return $cnt;
+}
+       
+# REnames the image files spefified in the %translate hash.
+sub rename_images {
+       my $translate = shift;
+       my ($response);
+
+       foreach (keys(%$translate)) {
+               if (! $translate->{$_}) {
+                       print "    WARNING: No destination Filename for $_\n";
+               } else {
+                       $response = `mv -f $path$_ $path$translate->{$_} 2>&1`;
+                       $response and print "ERROR from system    $response\n";
+               }
+       }
+}
+
+#################################################
+############# MAIN #############################
+################################################
+
+# %filelist starts out with keys from the @ARGV list.  As files are processed,
+#  any links to other files are added to the %filelist.  A hash of processed
+#  files is kept so we don't do any twice.
+
+# The first argument must be either --to_meaningful_names or --from_meaningful_names
+
+my (%translate,$search_regex,%filelist,%completed,$thisfile);
+my ($cnt,$direction);
+
+my $arg0 = shift(@ARGV);
+$arg0 =~ /^(--to_meaningful_names|--from_meaningful_names)$/ or
+       die "ERROR: First argument must be either \'--to_meaningful_names\' or \'--from_meaningful_names\'\n";
+
+$direction = ($arg0 eq '--to_meaningful_names') ? 0 : 1;
+
+(@ARGV) or die "ERROR: Filename(s) to process must be given as arguments\n";
+
+# Use the first argument to get the path to the file of translations.
+my $tmp = $ARGV[0];
+($path) = $tmp =~ /(.*\/)/;
+$path = '' unless $path;
+
+read_transfile(\%translate,$direction);
+
+foreach (@ARGV) {
+       # Strip the path from the filename, and use it later on.
+       if (s/(.*\/)//) {
+               $path = $1;
+       } else {
+               $path = '';
+       }
+       $filelist{$_} = '';
+
+       while ($thisfile = (keys(%filelist))[0]) {
+               $cnt += translate_html($thisfile,\%translate,\%filelist) if (!exists($completed{$thisfile}));
+               delete($filelist{$thisfile});
+               $completed{$thisfile} = '';
+       }
+       print "translate_images.pl: $cnt image filenames translated ",($direction)?"from":"to"," meaningful names\n";
+}
+
+rename_images(\%translate);
diff --git a/docs/bacula-web/uploaddoc b/docs/bacula-web/uploaddoc
new file mode 100755 (executable)
index 0000000..02668a1
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+ftp -i ftp.sectoor.de <<END_OF_DATA
+cd www/htdocs/dev-manual
+lcd /home/kern/bacula/docs/manual/bacula
+mput *
+cd ..
+lcd ..
+put dev-bacula.pdf dev-bacula.pdf
+quit
+END_OF_DATA
diff --git a/docs/bacula-web/version.tex.in b/docs/bacula-web/version.tex.in
new file mode 100644 (file)
index 0000000..ff66dfc
--- /dev/null
@@ -0,0 +1 @@
+@VERSION@ (@DATE@)
diff --git a/docs/manuals/bacula.sty.in b/docs/manuals/bacula.sty.in
new file mode 100644 (file)
index 0000000..5597193
--- /dev/null
@@ -0,0 +1,79 @@
+%% bacula.sty
+%% Provides macros and other stuff for the bacula manual
+%% 
+%% Original Creation -- K. Cunningham 2005-01-09
+%% 
+%% 
+%% 
+%% New Commands Currently implemented:
+%% 
+%% \elink{target}{text}
+%%    Inserts the text indicated (highlighted) and provides
+%%    an external hyperlink to the target.
+%% 
+%% 
+%% \ilink{target}{text}
+%%    Inserts the text indicated (highlighted) and provides
+%%    an internal hyperlink to the target. Target must be a
+%%    \label somewhere in the same document.
+%% 
+%% \lt
+%%    Inserts a less-than character (<).
+%%
+%% \gt
+%%    Inserts a greater-than character (>).
+%%
+%% \idir
+%%    Inserts the path to the images
+%%
+%% 
+%% 
+\ProvidesPackage{bacula}[2008/10/03]
+%%
+%%
+%% define images directory -- KES 15Aug08
+\def\idir{@BUILD_DIR@/images/}  %% images directory
+
+\def\version{@VERSION@}
+
+\def\fullversion{@VERSION@ (@DATE@)}
+
+%%
+\newcommand*{\elink}[2]{%
+  \htmladdnormallink{#1}{#2}%
+}
+%%
+\newcommand*{\ilink}[2]{%
+  \htmlref{#1}{#2}%
+}
+%%
+\newcommand{\vb}{$|$}
+\newcommand{\lt}{$<$}
+\newcommand{\gt}{$>$}
+
+%% copied from /usr/share/texmf/tex/latex/base/book.cls, and
+%%  modified to suit.  KEC 4-28-05
+%% KEC: Removed the two-column arrangement, and added \newpage
+\renewenvironment{theindex}
+               {\if@twocolumn
+                  \@restonecolfalse
+                \else
+                  \@restonecoltrue
+                \fi
+%% KEC:  Switch to one column.
+%%              \columnseprule \z@
+%%              \columnsep 35\p@
+%%              \twocolumn[\@makeschapterhead{\indexname}]%
+                \@mkboth{\MakeUppercase\indexname}%
+                        {\MakeUppercase\indexname}%
+                                \clearpage
+                                \subsection*{\indexname}
+                                \addcontentsline{toc}{subsection}{\indexname}
+                \thispagestyle{plain}\parindent\z@
+                \parskip\z@ \@plus .3\p@\relax
+                \let\item\@idxitem}
+                                {\if@restonecol\onecolumn\else\clearpage\fi}   %% Is this needed???
+
+%% 
+\endinput
+%% 
index de0f89845932344435bdefe011be841b2454c605..d49f3d3a328a29df0d4121e2cdaa60d2377bbfe4 100644 (file)
@@ -161,10 +161,10 @@ order=-1
 
 [item:newfeatures.tex]
 archive=true
-column=0
+column=20
 encoding=UTF-8
 highlight=LaTeX
-line=209
+line=181
 open=true
 order=0
 
index ca2471cc4c5de340969f534d6ba9b8b37f82f3a8..ad0b843e9f84697cb78878c0b20ad3052776ed75 100644 (file)
@@ -170,16 +170,16 @@ To help developers in restore GUI interfaces, we have added new \textsl{dot
   commands} that permit to browse the catalog in a very simple way.
 
 \begin{itemize}
-\item \texttt{.bvfs_update [jobid=x,y,z]} This command is required to update the
+\item \texttt{.bvfs\_update [jobid=x,y,z]} This command is required to update the
   Bvfs cache in the catalog. You need to run it before any access to the Bvfs
   layer.
 
-\item \texttt{.bvfs_lsdirs jobid=x,y,z path=/path | pathid=101} This command
+\item \texttt{.bvfs\_lsdirs jobid=x,y,z path=/path | pathid=101} This command
   will list all directories in the specified \texttt{path} or
   \texttt{pathid}. Using \texttt{pathid} avoids problems with caracters
   encoding.
 
-\item \texttt{.bvfs_lsfiles jobid=x,y,z path=/path | pathid=101} This command
+\item \texttt{.bvfs\_lsfiles jobid=x,y,z path=/path | pathid=101} This command
   will list all files in the specified \texttt{path} or \texttt{pathid}. Using
   \texttt{pathid} avoids problems with caracters encoding.
 \end{itemize}
diff --git a/docs/manuals/en/concepts/rescue.tex b/docs/manuals/en/concepts/rescue.tex
new file mode 100644 (file)
index 0000000..573bf01
--- /dev/null
@@ -0,0 +1,804 @@
+%%
+%%
+
+\chapter{Disaster Recovery Using Bacula}
+\label{RescueChapter}
+\index[general]{Disaster Recovery Using Bacula}
+\index[general]{Bacula!Disaster Recovery Using}
+\index[general]{Recovery!Disaster Recovery}
+\index[general]{Rescue!Disaster Recovery}
+
+\section{General}
+\index[general]{General}
+
+When disaster strikes, you must have a plan, and you must have prepared in
+advance otherwise the work of recovering your system and your files will be
+considerably greater.  For example, if you have not previously saved the
+partitioning information for your hard disk, how can you properly rebuild
+it if the disk must be replaced?
+
+Unfortunately, many of the steps one must take before and immediately after
+a disaster are very operating system dependent.  As a consequence, this
+chapter will discuss in detail disaster recovery (also called Bare Metal
+Recovery) for {\bf Linux} and {\bf Solaris}.  For Solaris, the procedures
+are still quite manual.  For FreeBSD the same procedures may be used but
+they are not yet developed.  For Win32, a number of Bacula users have
+reported success using BartPE.
+
+
+\label{considerations1}
+\section{Important Considerations}
+\index[general]{Important Considerations}
+\index[general]{Considerations!Important}
+
+Here are a few important considerations concerning disaster recovery that
+you should take into account before a disaster strikes.
+
+\begin{itemize}
+\item If the building which houses your computers burns down or is otherwise 
+   destroyed, do you have off-site backup data? 
+\item Disaster recovery is much easier if you have several machines. If  you
+   have a single machine, how will you handle unforeseen events  if your only
+   machine is down? 
+\item Do you want to protect your whole system and use Bacula to  recover
+   everything? or do you want to try to restore your system from  the original
+   installation disks and apply any other updates and  only restore user files? 
+\end{itemize}
+
+\label{steps1}
+\section{Steps to Take Before Disaster Strikes}
+\index[general]{Steps to Take Before Disaster Strikes}
+\index[general]{Strikes!Steps to Take Before Disaster}
+
+\begin{itemize}
+\item Create a rescue or CDROM for each of your Linux systems. Generally,
+   they are offered by each distribution, and there are many good 
+   rescue disks on the Web (Knoppix, sysrescuecd, PLD Linux rescue CD,
+   tomsrtbt, RIP ...
+
+\item Create a bacula-hostname directory on 
+   each machine and save it somewhere -- possibly on a USB key.
+\item Ensure that you always have a valid bootstrap file for your backup and 
+   that it is saved to an alternate machine.  This will permit you to
+   easily do a full restore of your system.
+\item If possible copy your catalog nightly to an alternate machine.  If you
+   have a valid bootstrap file, this is not necessary, but  can be very useful if
+   you do not want to reload everything. .  
+\item Ensure that you always have a valid bootstrap file for your  catalog
+   backup that is saved to an alternate machine. This will  permit you to restore
+   your catalog more easily if needed.  
+\item Test using the Rescue CDROM before you are forced to use it in
+   an emergency situation.
+\item Make a copy of your Bacula .conf files, particularly your
+   bacula-dir.conf, and your bacula-sd.conf files, because if your server
+   goes down, these files will be needed to get it back up and running,
+   and they can be difficult to rebuild from memory.
+\end{itemize}
+
+\label{rescueCDROM}
+\section{Bare Metal Recovery on Linux with a Rescue CD}
+\index[general]{Bare Metal Recovery on Linux with a Rescue CD}
+\index[general]{CDROM!Bare Metal Recovery on Linux with a Rescue}
+
+As an alternative to creating a Rescue CD, please see the
+section below entitled \ilink{Bare Metal Recovery using a LiveCD}{LiveCD}.
+
+Bacula previously had a Rescue CD.  Unfortunately, this CD did not work
+on every Linux Distro, and in addition, Linux is evolving with different
+boot methods, more and more complex hardware configurations (LVM, RAID, 
+WiFi, USB, ...).  As a consequence, the Bacula Rescue CD as it was
+originally envisioned no longer exists.
+
+However there are many other good rescue disks available.
+A so called "Bare Metal" recovery is one where you start with an empty hard
+disk and you restore your machine. There are also cases where you may lose a
+file or a directory and want it restored. Please see the previous chapter for
+more details for those cases. 
+
+Bare Metal Recovery assumes that you have the following items for your system:
+
+\begin{itemize}
+\item A Rescue CDROM containing a copy of your OS.
+\item Perhaps a copy of your
+   hard disk information, as well as a statically linked version of the
+   Bacula File daemon.  
+\item A full Bacula backup of your system possibly including  Incremental or
+   Differential backups since the last Full  backup 
+\item A second system running the Bacula Director, the Catalog, and the
+   Storage daemon.  (this is not an absolute requirement, but how to get
+   around it is not yet documented here)
+\end{itemize}
+
+\section{Requirements}
+\index[general]{Requirements}
+
+
+\label{restore_client}
+\section{Restoring a Client System}
+\index[general]{Restoring a Client System}
+\index[general]{System!Restoring a Client}
+
+Now, let's assume that your hard disk has just died and that you have replaced
+it with an new identical drive. In addition, we assume that you have: 
+
+\begin{enumerate}
+\item A recent Bacula backup (Full plus Incrementals)  
+\item A Rescue CDROM.  
+\item Your Bacula Director, Catalog, and Storage daemon running  on another
+   machine on your local network. 
+\end{enumerate}
+
+This is a relatively simple case, and later in this chapter, as time permits,
+we will discuss how you might recover from a situation where the machine that
+crashes is your main Bacula server (i.e. has the Director, the Catalog, and
+the Storage daemon). 
+
+You will take the following steps to get your system back up and running: 
+
+\begin{enumerate}
+\item Boot with your Rescue CDROM.  
+\item Start the Network (local network)  
+\item Re-partition your hard disk(s) as it was before  
+\item Re-format your partitions  
+\item Restore the Bacula File daemon (static version)  
+\item Perform a Bacula restore of all your files  
+\item Re-install your boot loader  
+\item Reboot 
+\end{enumerate}
+
+Now for the details ... 
+
+\section{Boot with your Rescue CDROM}
+\index[general]{CDROM!Boot with your Rescue}
+\index[general]{Boot with your Rescue CDROM}
+
+Each rescue disk boots somewhat differently.  Please see the
+instructions that go with your CDROM.
+
+
+\paragraph*{Start the Network:}
+
+\normalsize
+
+You can test it by pinging another machine, or pinging your broken machine
+machine from another machine. Do not proceed until your network is up. 
+
+\paragraph*{Partition Your Hard Disk(s):}
+
+\paragraph*{Format Your Hard Disk(s):}
+
+\paragraph*{Mount the Newly Formatted Disks:}
+
+
+\paragraph*{Somehow get the static File daemon loaded on your system}
+Put the static file daemon and its conf file in /tmp.
+
+\paragraph*{Restore and Start the File Daemon:}
+\footnotesize
+\begin{verbatim}
+chroot /mnt/disk /tmp/bacula-fd -c /tmp/bacula-fd.conf
+\end{verbatim}
+\normalsize
+
+The above command starts the Bacula File daemon with the proper root disk
+location (i.e. {\bf /mnt/disk/tmp}. If Bacula does not start, correct the
+problem and start it. You can check if it is running by entering: 
+
+\footnotesize
+\begin{verbatim}
+ps fax
+\end{verbatim}
+\normalsize
+
+You can kill Bacula by entering: 
+
+\footnotesize
+\begin{verbatim}
+kill -TERM <pid>
+\end{verbatim}
+\normalsize
+
+where {\bf pid} is the first number printed in front of the first occurrence
+of {\bf bacula-fd} in the {\bf ps fax} command. 
+
+Now, you should be able to use another computer with Bacula installed to check
+the status by entering: 
+
+\footnotesize
+\begin{verbatim}
+status client=xxxx
+\end{verbatim}
+\normalsize
+
+into the Console program, where xxxx is the name of the client you are
+restoring. 
+
+One common problem is that your {\bf bacula-dir.conf} may contain machine
+addresses that are not properly resolved on the stripped down system to be
+restored because it is not running DNS. This is particularly true for the
+address in the Storage resource of the Director, which may be very well
+resolved on the Director's machine, but not on the machine being restored and
+running the File daemon. In that case, be prepared to edit {\bf
+bacula-dir.conf} to replace the name of the Storage daemon's domain name with
+its IP address. 
+
+\paragraph*{Restore Your Files:}
+
+On the computer that is running the Director, you now run a {\bf restore}
+command and select the files to be restored (normally everything), but before
+starting the restore, there is one final change you must make using the {\bf
+mod} option. You must change the {\bf Where} directory to be the root by using
+the {\bf mod} option just before running the job and selecting {\bf Where}.
+Set it to: 
+
+\footnotesize
+\begin{verbatim}
+/
+\end{verbatim}
+\normalsize
+
+then run the restore. 
+
+You might be tempted to avoid using {\bf chroot} and running Bacula directly
+and then using a {\bf Where} to specify a destination of {\bf /mnt/disk}. This
+is possible, however, the current version of Bacula always restores files to
+the new location, and thus any soft links that have been specified with
+absolute paths will end up with {\bf /mnt/disk} prefixed to them. In general
+this is not fatal to getting your system running, but be aware that you will
+have to fix these links if you do not use {\bf chroot}. 
+
+\paragraph*{Final Step:}
+
+
+
+\footnotesize
+\begin{verbatim}
+/sbin/grub-install --root-directory=/mnt/disk /dev/hda
+\end{verbatim}
+\normalsize
+
+Note, in this case, you omit the chroot command, and you must
+replace /dev/hda with your boot device.  If you don't know what your
+boot device is, run the ./run\_grub script once and it will tell
+you.
+
+Finally, I've even run into a case where grub-install was unable to
+rewrite the boot block. In my case, it produced the following error
+message:
+
+\footnotesize
+\begin{verbatim}
+/dev/hdx does not have any corresponding BIOS drive.
+\end{verbatim}
+\normalsize
+
+The solution is to insure that all your disks are properly mounted on
+/mnt/disk, then do the following:
+
+\footnotesize
+\begin{verbatim}
+chroot /mnt/disk
+mount /dev/pts
+\end{verbatim}
+\normalsize
+
+Then edit the file {\bf /boot/grub/grub.conf} and uncomment the line
+that reads:
+
+\footnotesize
+\begin{verbatim}
+#boot=/dev/hda
+\end{verbatim}
+\normalsize
+
+So that it reads:
+
+\footnotesize
+\begin{verbatim}
+boot=/dev/hda
+\end{verbatim}
+\normalsize
+
+Note, the /dev/hda may be /dev/sda or possibly some other drive depending
+on your configuration, but in any case, it is the same as the one that
+you previously tried with {\bf grub-install}.
+
+Then, enter the following commands:
+
+\footnotesize
+\begin{verbatim}
+grub --batch --device-map=/boot/grub/device.map \
+  --config-file=/boot/grub/grub.conf --no-floppy
+root (hd0,0)
+setup (hd0)
+quit
+\end{verbatim}
+\normalsize
+
+If the {\bf grub} call worked, you will get a prompt of {\bf grub\gt{}}   
+before the {\bf root}, {\bf setup}, and {\bf quit} commands, and after 
+entering the {\bf setup} command, it should indicate that it successfully
+wrote the MBR (master boot record).
+
+
+\paragraph*{Reboot:}
+
+First unmount all your hard disks, otherwise they will not be cleanly
+shutdown, then reboot your machine by entering {\bf exit} until you get to the
+main prompt then enter {\bf Ctrl-d}. Once back to the main CDROM prompt, you
+will need to turn the power off, then back on to your machine to get it to
+reboot. 
+
+If everything went well, you should now be back up and running. If not,
+re-insert the emergency boot CDROM, boot, and figure out what is wrong. 
+
+\label{restore_server}
+\section{Restoring a Server}
+\index[general]{Restoring a Server}
+\index[general]{Server!Restoring a}
+
+Above, we considered how to recover a client machine where a valid Bacula
+server was running on another machine. However, what happens if your server
+goes down and you no longer have a running Director, Catalog, or Storage
+daemon? There are several solutions: 
+
+\begin{enumerate}
+\item Bring up static versions of your Director, Catalog, and Storage  daemon 
+   on the damaged machine.
+
+\item Move your server to another machine. 
+
+\item Use a Hot Spare Server on another Machine.
+\end{enumerate}
+
+The first option, is very difficult because it requires you to have created a
+static version of the Director and the Storage daemon as well as the Catalog.
+If the Catalog uses MySQL or PostgreSQL, this may or may not be possible. In
+addition, to loading all these programs on a bare system (quite possible), you
+will need to make sure you have a valid driver for your tape drive. 
+
+The second suggestion is probably a much simpler solution, and one I have done
+myself. To do so, you might want to consider the following steps: 
+
+\begin{itemize}
+\item If you are using MySQL or PostgreSQL, configure, build and install it
+   from source (or use rpms) on your new system.  
+\item Load the Bacula source code onto your new system, configure,  install
+   it, and create the Bacula database.  
+\item Ideally, you will have a copy of all the Bacula conf files that
+   were being used on your server. If not, you will at a minimum need
+   create a bacula-dir.conf that has the same Client resource that
+   was used to backup your system.
+\item If you have a valid saved Bootstrap file as created for your  damaged
+   machine with WriteBootstrap, use it to restore the files to the damaged
+   machine, where you have loaded a static Bacula File daemon using the
+   Rescue disk).  This is done by using the restore command and at
+   the yes/mod/no prompt, selecting {\bf mod} then specifying the path to
+   the bootstrap file.
+\item If you have the Bootstrap file, you should now be back up and  running,
+   if you do not have a Bootstrap file, continue with the  suggestions below.  
+\item Using {\bf bscan} scan the last set of backup tapes into your  MySQL,
+   PostgreSQL or SQLite database.  
+\item Start Bacula, and using the Console {\bf restore} command,  restore the
+   last valid copy of the Bacula database and the Bacula configuration
+   files.  
+\item Move the database to the correct location. 
+\item Start the database, and restart Bacula. Then use the Console {\bf
+   restore} command, restore all the files  on the damaged machine, where you
+   have loaded a Bacula File  daemon using the Rescue disk. 
+\end{itemize}
+
+For additional details of restoring your database, please see the
+\ilink{Restoring When Things Go Wrong}{database_restore} section
+of the Console Restore Command chapter of this manual.
+
+
+\label{problems2}
+\section{Linux Problems or Bugs}
+\index[general]{Bugs!Linux Problems or}
+\index[general]{Linux Problems or Bugs}
+
+Since every flavor and every release of Linux is different, there are likely
+to be some small difficulties with the scripts, so please be prepared to edit
+them in a minimal environment. A rudimentary knowledge of {\bf vi} is very
+useful. Also, these scripts do not do everything. You will need to reformat
+Windows partitions by hand, for example. 
+
+Getting the boot loader back can be a problem if you are using {\bf grub}
+because it is so complicated. If all else fails, reboot your system from your
+floppy but using the restored disk image, then proceed to a reinstallation of
+grub (looking at the run-grub script can help). By contrast, lilo is a piece
+of cake. 
+
+\label{LiveCD}
+\section{Bare Metal Recovery using a LiveCD}
+\index[general]{Bare Metal Recovery using a LiveCD}
+\index[general]{Recovery!Bare Metal Recovery using a LiveCD}
+\index[general]{Rescue!Bare Metal Recovery using a LiveCD}
+\index[general]{LiveCD!Bare Metal Recovery using a LiveCD}
+
+As an alternative to the old now defunct Bacula Rescue CDROM, you can use any
+system rescue or LiveCD to recover your system. The big problem
+with most rescue or LiveCDs is that they are not designed to
+capture the current state of your system, so when you boot them on
+a damaged system, you might be somewhat lost -- e.g. how many of
+you remember your exact hard disk partitioning.
+
+This lack can be easily corrected by running the part of the
+Bacula Rescue code that creates a directory containing a   
+static-bacula-fd, a snapshot of your current system disk
+configuration, and scripts that help restoring it.
+
+Before a disaster strikes:
+\begin{enumerate}
+\item Run only the {\bf make bacula} part of the
+  Bacula Rescue procedure to create the static Bacula
+  File daemon, and system disk snapshot. 
+\item Save the directory generated (more details below)
+  preferrably on a CDROM or alternatively to some other
+  system.
+\item Possibly run {\bf make bacula} every night as
+  part of your backup process to ensure that you have
+  a current snapshot of your system.
+\end{enumerate}
+
+Then when disaster strikes, do the following:
+
+\begin{enumerate}
+\item Boot with your system rescue disk or LiveCD
+   (e.g. Knoppix).
+\item Start the Network (local network).  
+\item Copy the Bacula recovery directory to the 
+   damaged system using ftp, scp, wget or if your
+   boot disk permits it reading it directly from a
+   CDROM.
+\item Continue as documented above.
+\item Re-partition your hard disk(s) as it was before,  
+   if necessary.
+\item Re-format your partitions, if necessary.  
+\item Restore the Bacula File daemon (static version).  
+\item Perform a Bacula restore of all your files.  
+\item Re-install your boot loader.  
+\item Reboot. 
+\end{enumerate}
+
+In order to create the Bacula recovery directory, you need
+a copy of the Bacula Rescue code as described above, and
+you must first configure that directory.
+
+Once the configuration is done, you can do the following
+to create the Bacula recovery directory:
+
+\footnotesize
+\begin{verbatim}
+cd <bacula-rescue-source>/linux/cdrom
+su (become root)
+make bacula
+\end{verbatim}
+\normalsize
+
+The directory you want to save will be created in
+the current directory with the name {\bf bacula}.  You
+need only save that directory either as a directory or
+possibly as a compressed tar file.  If you run this procedure
+on multiple machines, you will probably want to rename this directory
+to something like {\bf bacula-hostname}.
+
+
+
+\label{FreeBSD1}
+\section{FreeBSD Bare Metal Recovery}
+\index[general]{Recovery!FreeBSD Bare Metal}
+\index[general]{Rescue!FreeBSD Bare Metal}
+\index[general]{FreeBSD Bare Metal Recovery}
+
+The same basic techniques described above also apply to FreeBSD. Although we
+don't yet have a fully automated procedure, Alex Torres Molina has provided us
+with the following instructions with a few additions from Jesse Guardiani and
+Dan Langille: 
+
+\begin{enumerate}
+\item Boot with the FreeBSD installation disk 
+\item Go to Custom, Partition and create your slices and go to Label and 
+   create the partitions that you want. Apply changes. 
+\item Go to Fixit to start an emergency console. 
+\item Create devs ad0 .. .. if they don't exist under /mnt2/dev (in my  situation)
+   with MAKEDEV. The device or devices you  create depend on what hard drives you
+   have. ad0 is your  first ATA drive. da0 would by your first SCSI drive.  Under
+OS version 5 and greater, your device files are  most likely automatically
+created for you. 
+\item mkdir /mnt/disk
+   this is the root of the new disk 
+\item mount /mnt2/dev/ad0s1a /mnt/disk
+   mount /mnt2/dev/ad0s1c /mnt/disk/var
+   mount /mnt2/dev/ad0s1d /mnt/disk/usr
+.....
+The same hard drive issues as above apply here too.  Note, under OS version 5
+or higher, your disk devices may  be in /dev not /mnt2/dev. 
+\item Network configuration (ifconfig xl0 ip/mask + route add default 
+   ip-gateway) 
+\item mkdir /mnt/disk/tmp 
+\item cd /mnt/disk/tmp 
+\item Copy bacula-fd and bacula-fd.conf to this path 
+\item If you need to, use sftp to copy files, after which you must do this:
+   ln -s /mnt2/usr/bin /usr/bin 
+\item chmod u+x bacula-fd 
+\item Modify bacula-fd.conf to fit this machine 
+\item Copy /bin/sh to /mnt/disk, necessary for chroot 
+\item Don't forget to put your bacula-dir's IP address and domain  name in
+   /mnt/disk/etc/hosts if it's not on a public net.  Otherwise the FD on the
+   machine you are restoring to  won't be able to contact the SD and DIR on the
+remote machine. 
+\item mkdir -p /mnt/disk/var/db/bacula 
+\item chroot /mnt/disk /tmp/bacula-fd -c /tmp/bacula-fd.conf
+   to start bacula-fd 
+\item Now you can go to bacula-dir and restore the job with the entire 
+   contents of the broken server. 
+\item You must create /proc 
+\end{enumerate}
+
+\label{solaris}
+\section{Solaris Bare Metal Recovery}
+\index[general]{Solaris Bare Metal Recovery}
+\index[general]{Recovery!Solaris Bare Metal}
+
+The same basic techniques described above apply to Solaris: 
+
+\begin{itemize}
+\item the same restrictions as those given for Linux apply  
+\item you will need to create a Rescue disk 
+   \end{itemize}
+
+However, during the recovery phase, the boot and disk preparation procedures
+are different: 
+
+\begin{itemize}
+\item there is no need to create an emergency boot disk  since it is an
+   integrated part of the Solaris boot.  
+\item you must partition and format your hard disk by hand  following manual
+   procedures as described in W. Curtis Preston's  book "Unix Backup \&
+   Recovery" 
+\end{itemize}
+
+Once the disk is partitioned, formatted and mounted, you can continue with
+bringing up the network and reloading Bacula. 
+
+\section{Preparing Solaris Before a Disaster}
+\index[general]{Preparing Solaris Before a Disaster}
+\index[general]{Disaster!Preparing Solaris Before a}
+
+As mentioned above, before a disaster strikes, you should prepare the
+information needed in the case of problems. To do so, in the {\bf
+rescue/solaris} subdirectory enter: 
+
+\footnotesize
+\begin{verbatim}
+su
+./getdiskinfo
+./make_rescue_disk
+\end{verbatim}
+\normalsize
+
+The {\bf getdiskinfo} script will, as in the case of Linux described above,
+create a subdirectory {\bf diskinfo} containing the output from several system
+utilities. In addition, it will contain the output from the {\bf SysAudit}
+program as described in Curtis Preston's book. This file {\bf
+diskinfo/sysaudit.bsi} will contain the disk partitioning information that
+will allow you to manually follow the procedures in the "Unix Backup \&
+Recovery" book to repartition and format your hard disk. In addition, the
+{\bf getdiskinfo} script will create a {\bf start\_network} script. 
+
+Once you have your disks repartitioned and formatted, do the following: 
+
+\begin{itemize}
+\item Start Your Network with the {\bf start\_network} script  
+\item Restore the Bacula File daemon as documented above  
+\item Perform a Bacula restore of all your files using the same  commands as
+   described above for Linux  
+\item Re-install your boot loader using the instructions outlined  in the
+   "Unix Backup \& Recovery" book  using installboot 
+\end{itemize}
+
+\label{genbugs}
+
+\section{Bugs and Other Considerations}
+\index[general]{Considerations!Bugs and Other}
+\index[general]{Bugs and Other Considerations}
+
+\paragraph*{Directory Modification and Access Times are Modified on pre-1.30
+Baculas :}
+
+When a pre-1.30 version of Bacula restores a directory, it first must create
+the directory, then it populates the directory with its files and
+subdirectories. The act of creating the files and subdirectories updates both
+the modification and access times associated with the directory itself. As a
+consequence, all modification and access times of all directories will be
+updated to the time of the restore. 
+
+This has been corrected in Bacula version 1.30 and later. The directory
+modification and access times are reset to the value saved in the backup after
+all the files and subdirectories have been restored. This has been tested and
+verified on normal restore operations, but not verified during a bare metal
+recovery. 
+
+\paragraph*{Strange Bootstrap Files:}
+
+If any of you look closely at the bootstrap file that is produced and used for
+the restore (I sure do), you will probably notice that the FileIndex item does
+not include all the files saved to the tape. This is because in some instances
+there are duplicates (especially in the case of an Incremental save), and in
+such circumstances, {\bf Bacula} restores only the last of multiple copies of
+a file or directory. 
+
+\label{Win3233}
+\section{Disaster Recovery of Win32 Systems}
+\index[general]{Systems!Disaster Recovery of Win32}
+\index[general]{Disaster Recovery of Win32 Systems}
+
+Due to open system files, and registry problems, Bacula cannot save and
+restore a complete Win2K/XP/NT environment. 
+
+A suggestion by Damian Coutts using Microsoft's NTBackup utility in
+conjunction with Bacula should permit a Full bare metal restore of Win2K/XP
+(and possibly NT systems). His suggestion is to do an NTBackup of the critical
+system state prior to running a Bacula backup with the following command: 
+
+\footnotesize
+\begin{verbatim}
+ntbackup backup systemstate /F c:\systemstate.bkf
+\end{verbatim}
+\normalsize
+
+The {\bf backup} is the command, the {\bf systemstate} says to backup only the
+system state and not all the user files, and the {\bf /F
+c:\textbackslash{}systemstate.bkf} specifies where to write the state file.
+this file must then be saved and restored by Bacula. This command
+can be put in a Client Run Before Job directive so that it is automatically
+run during each backup, and thus saved to a Bacula Volume.
+
+To restore the system state, you first reload a base operating system, then
+you would use Bacula to restore all the users files and to recover the {\bf
+c:\textbackslash{}systemstate.bkf} file, and finally, run {\bf NTBackup} and
+{\bf catalogue} the system statefile, and then select it for restore. The
+documentation says you can't run a command line restore of the systemstate. 
+
+This procedure has been confirmed to work by Ludovic Strappazon -- many
+thanks! 
+
+A new tool is provided in the form of a bacula plugin for the BartPE rescue
+CD. BartPE is a self-contained WindowsXP boot CD which you can make using the
+PeBuilder tools available at 
+\elink{http://www.nu2.nu/pebuilder/}{\url{http://www.nu2.nu/pebuilder/}} and a valid
+Windows XP SP1 CDROM. The plugin is provided as a zip archive. Unzip the file
+and copy the bacula directory into the plugin directory of your BartPE
+installation. Edit the configuration files to suit your installation and build
+your CD according to the instructions at Bart's site. This will permit you to
+boot from the cd, configure and start networking, start the bacula file client
+and access your director with the console program. The programs menu on the
+booted CD contains entries to install the file client service, start the file
+client service, and start the WX-Console. You can also open a command line
+window and CD Programs\textbackslash{}Bacula and run the command line console
+bconsole. 
+
+\section{Ownership and Permissions on Win32 Systems}
+\index[general]{Systems!Resetting Directory and File Ownership and Permissions
+on Win32}
+\index[general]{Resetting Directory and File Ownership and Permissions on
+Win32 Systems}
+% TODO: should this be in the win32 chapter?
+
+Bacula versions after 1.31 should properly restore ownership and permissions
+on all WinNT/XP/2K systems. If you do experience problems, generally in
+restores to alternate directories because higher level directories were not
+backed up by Bacula, you can correct any problems with the {\bf SetACL}
+available under the GPL license at: 
+\elink{http://sourceforge.net/projects/setacl/}{\url{http://sourceforge.net/project%
+s/setacl/}}. 
+
+\section{Alternate Disaster Recovery Suggestion for Win32 Systems}
+\index[general]{Systems!Alternate Disaster Recovery Suggestion for Win32}
+\index[general]{Alternate Disaster Recovery Suggestion for Win32 Systems}
+% TODO: should this be in the win32 chapter??
+
+Ludovic Strappazon has suggested an interesting way to backup and restore
+complete Win32 partitions. Simply boot your Win32 system with a Linux Rescue
+disk as described above for Linux, install a statically linked Bacula, and
+backup any of the raw partitions you want. Then to restore the system, you
+simply restore the raw partition or partitions. Here is the email that Ludovic
+recently sent on that subject: 
+
+\footnotesize
+\begin{verbatim}
+I've just finished testing my brand new cd LFS/Bacula
+with a raw Bacula backup and restore of my portable.
+I can't resist sending you the results: look at the rates !!!
+hunt-dir: Start Backup JobId 100, Job=HuntBackup.2003-04-17_12.58.26
+hunt-dir: Bacula 1.30 (14Apr03): 17-Apr-2003 13:14
+JobId:                  100
+Job:                    HuntBackup.2003-04-17_12.58.26
+FileSet:                RawPartition
+Backup Level:           Full
+Client:                 sauvegarde-fd
+Start time:             17-Apr-2003 12:58
+End time:               17-Apr-2003 13:14
+Files Written:          1
+Bytes Written:          10,058,586,272
+Rate:                   10734.9 KB/s
+Software Compression:   None
+Volume names(s):        000103
+Volume Session Id:      2
+Volume Session Time:    1050576790
+Last Volume Bytes:      10,080,883,520
+FD termination status:  OK
+SD termination status:  OK
+Termination:            Backup OK
+hunt-dir: Begin pruning Jobs.
+hunt-dir: No Jobs found to prune.
+hunt-dir: Begin pruning Files.
+hunt-dir: No Files found to prune.
+hunt-dir: End auto prune.
+hunt-dir: Start Restore Job RestoreFilesHunt.2003-04-17_13.21.44
+hunt-sd: Forward spacing to file 1.
+hunt-dir: Bacula 1.30 (14Apr03): 17-Apr-2003 13:54
+JobId:                  101
+Job:                    RestoreFilesHunt.2003-04-17_13.21.44
+Client:                 sauvegarde-fd
+Start time:             17-Apr-2003 13:21
+End time:               17-Apr-2003 13:54
+Files Restored:         1
+Bytes Restored:         10,056,130,560
+Rate:                   5073.7 KB/s
+FD termination status:  OK
+Termination:            Restore OK
+hunt-dir: Begin pruning Jobs.
+hunt-dir: No Jobs found to prune.
+hunt-dir: Begin pruning Files.
+hunt-dir: No Files found to prune.
+hunt-dir: End auto prune.
+\end{verbatim}
+\normalsize
+
+\label{running}
+
+\section{Restoring to a Running System}
+\index[general]{System!Restoring to a Running}
+\index[general]{Restoring to a Running System}
+
+If for some reason you want to do a Full restore to a system that has a
+working kernel (not recommended), you will need to take care not to
+overwrite the following files:
+
+\footnotesize
+\begin{verbatim}
+/etc/grub.conf
+/etc/X11/Conf
+/etc/fstab
+/etc/mtab
+/lib/modules
+/usr/modules
+/usr/X11R6
+/etc/modules.conf
+\end{verbatim}
+\normalsize
+
+\label{Resources}
+
+\section{Additional Resources}
+\index[general]{Additional Resources}
+\index[general]{Resources!Additional}
+
+Many thanks to Charles Curley who wrote 
+\elink{Linux Complete Backup and Recovery HOWTO}
+{\url{http://www.tldp.org/HOWTO/Linux-Complete-Backup-and-Recovery-HOWTO/index.html%
+}} for the 
+\elink{The Linux Documentation Project}{\url{http://www.tldp.org/}}. This is an
+excellent document on how to do Bare Metal Recovery on Linux systems, and it
+was this document that made me realize that Bacula could do the same thing. 
+
+You can find quite a few additional resources, both commercial and free at 
+\elink{Storage Mountain}{\url{http://www.backupcentral.com}}, formerly known as
+Backup Central. 
+
+And finally, the O'Reilly book, "Unix Backup \& Recovery" by W. Curtis
+Preston covers virtually every backup and recovery topic including bare metal
+recovery for a large range of Unix systems. 
index 893ce4ac705c6501ba82881fd190014e59c71286..62fc85b92d120b9a788d37b05e1ec2a034d5350d 100644 (file)
@@ -3,7 +3,7 @@ img_extIsRegExp=false
 img_extensions=.eps .jpg .jpeg .png .pdf .ps .fig .gif
 kileprversion=2
 kileversion=2.0
-lastDocument=generaldevel.tex
+lastDocument=developers.tex
 masterDocument=
 name=Developers
 pkg_extIsRegExp=false
@@ -80,7 +80,7 @@ order=-1
 
 [item:generaldevel.tex]
 archive=true
-column=75
+column=71
 encoding=
 highlight=LaTeX
 line=553
@@ -152,10 +152,10 @@ order=-1
 
 [item:regression.tex]
 archive=true
-column=28
+column=0
 encoding=
 highlight=LaTeX
-line=497
+line=0
 open=true
 order=0
 
index fbda0a1cb01c93ea81feaa7489096e10640603e9..f29b02006819d38933955560919848c56b7594be 100644 (file)
@@ -39,28 +39,23 @@ The following text describes some of the requirements for such code.
 \addcontentsline{toc}{subsubsection}{Patches}
 
 Subject to the copyright assignment described below, your patches should be
-sent in {\bf diff -u} format relative to the current contents of the Source
-Forge GIT repository or SVN repository.  The diff -u format is the easiest
-for us to understand and integrate.  Please be sure to use the Bacula
+sent in {\bf git format-patch} format relative to the current contents of the 
+master branch of the Source Forge Git repository.  Please attach the
+output file or files generated by the {\bf git format-patch} to the email
+rather than include them directory to avoid wrapping of the lines
+in the patch.  Please be sure to use the Bacula
 indenting standard (see below) for source code.  If you have checked out
-the source with GIT or SVN, you can get a diff using.
+the source with Git, you can get a diff using.
 
-For the bacula, gui, and regress directories:
 \begin{verbatim}
 git pull
-git diff >change.patch
+git format-patch -M
 \end{verbatim}
 
-For the docs or rescue directories:
-\begin{verbatim}
-svn update 
-svn diff > change.patch
-\end{verbatim}
-     
 If you plan on doing significant development work over a period of time,
 after having your first patch reviewed and approved, you will be eligible
-for having developer GIT or SVN write access so that you can commit your changes
-directly to the GIT or SVN repository.  To do so, you will need a userid on Source
+for having developer Git write access so that you can commit your changes
+directly to the Git repository.  To do so, you will need a userid on Source
 Forge.
 
 \subsection{Copyrights}
@@ -164,7 +159,7 @@ to confirm reception of the signed FLA.
 \index{Cycle!Developement}
 \addcontentsline{toc}{subsubsection}{Development Cycle}
 
-As I noted in previous emails the number of contributions are
+As discussed on the email lists, the number of contributions are
 increasing significantly.  We expect this positive trend
 will continue.  As a consequence, we have modified how we do
 development, and instead of making a list of all the features that we will
@@ -302,7 +297,7 @@ Getting code implemented in Bacula works roughly as follows:
 
 \item Kern is the project manager, but prefers not to be a "gate keeper".
       This means that the developers are expected to be self-motivated,
-      and once they have experience submit directly to the GIT or SVN
+      and once they have experience submit directly to the Git
       repositories. However,
       it is a good idea to have your patches reviewed prior to submitting,
       and it is a bad idea to submit monster patches because no one will
@@ -344,7 +339,7 @@ If you fix a bug in a released version, you should, unless it is
 an absolutely trivial bug, create and release a patch file for the
 bug.  The procedure is as follows:
 
-Fix the bug in the branch and in the trunk.
+Fix the bug in the released branch and in the develpment master branch.
 
 Make a patch file for the branch and add the branch patch to 
 the patches directory in both the branch and the trunk.
@@ -359,7 +354,8 @@ follows:
   (input description)
   (end edit)
 
-   git diff >>2.2.4-restore.patch
+   git format-patch -M
+   mv 0001-xxx 2.2.4-restore.patch
 \end{verbatim}
 
 check to make sure no extra junk got put into the patch file (i.e.
@@ -384,51 +380,51 @@ So, end the end, the patch file is:
 \end{itemize}
 
 
-\section{Bacula GIT and SVN repositories}
-\index{GIT and SVN}
-\addcontentsline{toc}{subsection}{GIT and SVN repositories}
-As of August 2009, the Bacula source code has been split into
-two repositories.  One is a GIT repository that holds the
+\section{Bacula Git repositories}
+\index{Git}
+\addcontentsline{toc}{subsection}{Git repositories}
+As of September 2009, the Bacula source code has been split into
+three Git repositories.  One is a repository that holds the
 main Bacula source code with directories {\bf bacula}, {\bf gui},
-and {\bf regress}.  The second repository (SVN) contains
-the directories {\bf rescue} and {\bf docs}. Both repositories are 
+and {\bf regress}.  The second repository contains
+the directories {\bf docs} directory, and the third repository
+contains the {\bf rescue} directory. All three repositories are 
 hosted on Source Forge.
 
 Previously everything was in a single SVN repository.
-We have split the SVN repository into two because GIT
+We have split the SVN repository into three because Git
 offers significant advantages for ease of managing and integrating
-developer's changes.  However, one of the disadvantages of GIT is that you
+developer's changes.  However, one of the disadvantages of Git is that you
 must work with the full repository, while SVN allows you to checkout
-individual directories.  If we put everything into a single GIT
+individual directories.  If we put everything into a single Git
 repository it would be far bigger than most developers would want
-to checkout, so we have left the docs and rescue in the old SVN
-repository, and moved only the parts that are most actively 
-worked on by the developers (bacula, gui, and regress) to a GIT
-repository.  
+to checkout, so we have separted the docs and rescue into their own
+repositories, and moved only the parts that are most actively 
+worked on by the developers (bacula, gui, and regress) to a the
+Git Bacula repository.  
 
-Unfortunately, Bacula developers must now have a certain knowledege
-of both GIT and SVN, and if you are a core Bacula developer knowledge of
-GIT is particularly important.
+Bacula developers must now have a certain knowledege
+of Git.
 
-\section{GIT Usage}
-\index{GIT Usage}
-\addcontentsline{toc}{subsection}{GIT Usage}
+\section{Git Usage}
+\index{Git Usage}
+\addcontentsline{toc}{subsection}{Git Usage}
 
-Please note that if you are familiar with SVN, GIT is similar,
+Please note that if you are familiar with SVN, Git is similar,
 (and better), but there can be a few surprising differences that
 can lead to damaging the history of the repository (repo) if
-you attempt to force pushing data into the GIT repo.
+you attempt to force pushing data into the Git repo.
 
-The Bacula GIT repo contains the subdirectories {\bf bacula}, {\bf gui},
-and {\bf regress}. With GIT it is not possible to pull only a
-single directory, because of the hash code nature of git, you
+The Bacula Git repo contains the subdirectories {\bf bacula}, {\bf gui},
+and {\bf regress}. With Git it is not possible to pull only a
+single directory, because of the hash code nature of Git, you
 must take all or nothing.
 
-For developers, the most important thing to remember about GIT and
+For developers, the most important thing to remember about Git and
 the Source Forge repository is not to "force" a {\bf push} to the
 repository, and not to use the {\bf rebase} command on the {\bf
 master} branch of the repository.  Doing so, will possibly rewrite
-the GIT repository history and cause a lot of problems for the 
+the Git repository history and cause a lot of problems for the 
 project.
 
 You may and should use {\bf rebase} on your own branches that you
@@ -436,7 +432,7 @@ want to synchronize with the {\bf master} branch, but please
 do not use {\bf rebase} on the {\bf master} branch.  The proper
 way of merging changes will be discussed below.
 
-You can get a full copy of the Source Forge Bacula GIT repository with the
+You can get a full copy of the Source Forge Bacula Git repository with the
 following command:
 
 \begin{verbatim}
@@ -447,7 +443,7 @@ This will put a read-only copy into the directory {\bf trunk}
 in your current directory, and {\bf trunk} will contain
 the subdirectories: {\bf bacula}, {\bf gui}, and {\bf regress}.
 
-If you have write permission, you can get a copy of the GIT
+If you have write permission, you can get a copy of the Git
 repo with:
 
 \begin{verbatim}
@@ -470,18 +466,18 @@ example) will be approximately 55 Megabytes.  However, if you build
 from source in this directory and do a lot of updates and regression
 testing, the directory could become several hundred megabytes.
 
-\subsection{Learning GIT}
-\index{Learning GIT}
-If you want to learn more about GIT, we recommend that you visit:\\
+\subsection{Learning Git}
+\index{Learning Git}
+If you want to learn more about Git, we recommend that you visit:\\
 \elink{http://book.git-scm.com/}{http://book.git-scm.com/}.
 
-Some of the differences between GIT and SVN are:
+Some of the differences between Git and SVN are:
 \begin{itemize}
-\item Your main git directory is a full git repository to which you can
+\item Your main Git directory is a full Git repository to which you can
   and must commit.
-\item The git database is kept in the directory {\bf .git} at the 
+\item The Git database is kept in the directory {\bf .git} at the 
   top level of the directory.
-\item all the important git configuration information is kept in the
+\item all the important Git configuration information is kept in the
   file {\bf .git/config} in ASCII format that is easy to manually edit.
 \item When you do a {\bf commit} the changes are put in {\bf .git}
   rather than in the external repository.
@@ -489,9 +485,9 @@ Some of the differences between GIT and SVN are:
   the command {\bf git push}.
 \item You can download all the current changes in the external repository
   and merge them into your {\bf master} branch using the command
-  {\bf git pull}.
+  {\bf gGit pull}.
 \item The command {\bf git add} is used to add a new file to the
-  repository AND to tell git that you want a file that has changed
+  repository AND to tell Git that you want a file that has changed
   to be in the next commit.  This has lots of advantages, because
   a {\bf git commit} only commits those files that have been 
   explicitly added.
@@ -504,7 +500,7 @@ Some of the differences between GIT and SVN are:
   easily group small changes and commit them.
 \item If you {\bf git pull} from the main repository and make
   some changes, and before you do a {\bf git push}, someone
-  else pushes changes to the git repository, you will probably
+  else pushes changes to the Git repository, you will probably
   get an error message such as:
 
 \begin{verbatim}
@@ -514,15 +510,15 @@ Some of the differences between GIT and SVN are:
   error: failed to push some refs to 'git@github.com:bacula/bacula.git'
 \end{verbatim}
 
- which is git's way of telling you that the main repository has changed
+ which is Git's way of telling you that the main repository has changed
  and that if you push your changes, they will not be integrated properly.
- As we have noted, you should never ask git to force the push.
+ As we have noted, you should never ask Git to force the push.
  See below for an explanation of why.
 \item To integrate (merge) your changes properly, you should always do 
  a {\bf git pull} just prior to doing a {\bf git push}.
-\item If git is unable to merge your changes or finds a conflict it
+\item If Git is unable to merge your changes or finds a conflict it
   will tell you and you must do conflict resolution, which is much
-  easier in git than in SVN.
+  easier in Git than in SVN.
 \item Resolving conflicts is described below in the {\bf github} section.
 \end{itemize}
 
@@ -555,14 +551,14 @@ exact commands to accomplish this are shown in the next couple of sections.
 
 \subsection{Publishing your changes}
 \index{Publishing}
-Since GIT is more complex than SVN, it takes a bit of time to learn how
+Since Git is more complex than SVN, it takes a bit of time to learn how
 to use it properly, and if you are not careful, you can potentially create
-a new history in the repository. In addition, since GIT is a distributed 
+a new history in the repository. In addition, since Git is a distributed 
 version control system, we prefer to receive a full branch submission rather
 than simply a patch.  To accomplish this, you must create your changes in
 a branch, then {\bf push} them to some public repository -- it can be your
 own repository that you publish or another.  To simplify this phase for you, we
-have created a publich Bacula GIT repository on {\bf github} where you can
+have created a publich Bacula Git repository on {\bf github} where you can
 push your branch containing changes you would like integrated into the Bacula
 source code.
 
@@ -570,9 +566,9 @@ Once you have pushed your branch to {\bf github} or told us where we can pull
 from your public repository, one of the senior Bacula devlopers will fetch your 
 changes, examine them, possibly make comments for changes they would like to
 see, and as the final step, the senior developer will commit it to the
-Bacula Source Forge GIT repository.
+Bacula Source Forge Git repository.
 
-\subsection{Github}
+\subsection{github}
 \index{github}
 If you are going to submit code, you create a login on
 the Github website:\\
@@ -588,7 +584,7 @@ you clone the Bacula repository with:
 \end{verbatim}
 
 where you replace \verb+<xxx>+ with the name
-of a directory that you want git to create to hold your local Bacula git
+of a directory that you want Git to create to hold your local Bacula Git
 repository.
 
 Normally, you will work by creating a branch of the master branch of your
@@ -608,7 +604,7 @@ git commit -m "<comment about commit>"
 ...
 \end{verbatim}
 
-Note, we request you to create the branch name ({\bf \verb+<your-name>+/newbranch} with your github
+Note, we request you to create the branch name ({\bf \verb+<your-name>+/newbranch} with your Github
 login name. This guarantees that the branch name will be unique and
 easily identified as well.
 
@@ -624,8 +620,8 @@ git rebase master
 If you have completed your edits before anyone has modified the repository,
 the {\bf git rebase master} will report that there was nothing to do. Otherwise,
 it will merge the changes that were made in the repository before your changes.
-If there are any conflicts, git will tell you. Typically resolving conflicts with
-git is relatively easy.  You simply make a diff:
+If there are any conflicts, Git will tell you. Typically resolving conflicts with
+Git is relatively easy.  You simply make a diff:
 
 \begin{verbatim}
 git diff
@@ -679,388 +675,6 @@ git push origin :<your-name>/newbranch
 \end{verbatim}
 
 
-
-\section{SVN Usage}
-\index{SVN Usage}
-\addcontentsline{toc}{subsection}{SVN Usage}
-
-Note: this section is somewhat out of date, since the SVN now
-contains only the docs and rescue subdirectories.  The bacula,
-gui, and regress directories are now maintained in a GIT
-repository.
-
-Please note that if you are familiar with CVS, SVN is very
-similar (and better), but there can be a few surprising
-differences.
-
-The Bacula  SourceForge.net Subversion repository that contains
-the documentation and the rescue scripts checked out through SVN with the
-following command:
-
-\begin{verbatim}
-svn checkout https://bacula.svn.sourceforge.net/svnroot/bacula bacula
-\end{verbatim}
-
-With the above command, you will get everything, which is a very large
-amount of data:
-
-\begin{verbatim}
-branches/
-  Branch-1.32a/
-  ...
-  Branch-2.0/
-  import/
-  vendor/
-tags/
-  Release-1.1/
-  ...
-  Release-2.0.2/
-trunk/
-  bacula/
-  docs/
-  gui/
-  regress/
-  rescue/
-\end{verbatim}
-
-Note, you should NEVER commit code to any checkout that you have
-done of a tag.  All tags (e.g. Release-1.1, ... Release-2.0.2) 
-should be considered read-only.
-
-You may commit code to the most recent item in
-branches (in the above the most recent one is Branch-2.0).  If
-you want to commit code to an older branch, then please contact
-Kern first.
-
-You may create your own tags and/or branches, but they should
-have a name clearly distinctive from Branch-, Release-, or Beta-,
-which are official names used by the project.  If you create a
-tag, then you should NEVER commit code to it, for the same 
-reason noted above -- it should serve as a marker for something
-you released.  If you create a branch, then you are free to
-commit to it as you wish.
-
-You may, of course, commit to the trunk.
-
-In summary:
-
-\begin{verbatim}
-branches
-  Branch-nnn
-tags
-  Release-nnn
-  Beta-nnn
-\end{verbatim}
-
-are reserved names to be created only by the project manager (or
-with his OK), where the nnn is any sequence of numbers and
-periods (e.g. 2.0, 2.0.1, ...).  
-
-In addition all tags even those that you create are read-only
-forever. Typically tags represent release points either in the
-trunk or in a branch.
-
-
-Coming back to getting source code. 
-If you only want the current Bacula source code, you should see
-the above section that describes the GIT repository.
-
-To view what is in the SVN, point your browser at the following URL:
-http://bacula.svn.sourceforge.net/viewvc/bacula/  
-
-Many of the Subversion (svn) commands are almost identical to those that
-you have used for cvs, but some (such as a checkout) can have surprising
-results, so you should take a careful look at the documentation. 
-
-The following documentation on the new
-svn repository will help you know how to use it:
-
-Here is the list of branches:
-\begin{verbatim}
-        Branch-1.32a
-        Branch-1.32e
-        Branch-1.34.2
-        Branch-1.34.5
-        Branch-1.36
-        Branch-1.36.1
-        Branch-1.36.2
-        Branch-1.38
-        Branch-2.0
-        import
-        vendor
-\end{verbatim}
-
-The list of tags is:
-\begin{verbatim}
-        Release-1.1     Release-1.19    Release-1.19a   Release-1.19b
-        Release-1.20    Release-1.21    Release-1.22    Release-1.23
-        Release-1.23a   Release-1.24    Release-1.25    Release-1.25a
-        Release-1.26    Release-1.27    Release-1.27a   Release-1.27b
-        Release-1.27c   Release-1.28    Release-1.29    Release-1.30
-        Release-1.31    Release-1.31a   Release-1.32    Release-1.32a
-        Release-1.32b   Release-1.32c   Release-1.32d   Release-1.32e
-        Release-1.32f   Release-1.32f-2 Release-1.32f-3 Release-1.32f-4
-        Release-1.32f-5 Release-1.34.0  Release-1.34.1  Release-1.34.3
-        Release-1.34.4  Release-1.34.5  Release-1.34.6  Release-1.35.1
-        Release-1.35.2  Release-1.35.3  Release-1.35.6  Release-1.35.7
-        Release-1.35.8  Release-1.36.0  Release-1.36.1  Release-1.36.2
-        Release-1.36.3  Release-1.38.0  Release-1.38.1  Release-1.38.10
-        Release-1.38.11 Release-1.38.2  Release-1.38.3  Release-1.38.4
-        Release-1.38.5  Release-1.38.6  Release-1.38.7  Release-1.38.8
-        Release-1.38.9  Release-1.8.1   Release-1.8.2   Release-1.8.3
-        Release-1.8.4   Release-1.8.5   Release-1.8.6   Release-2.0.0
-        Release-2.0.1   Release-2.0.2
-\end{verbatim}
-
-Here is a list of commands to get you started.  The recommended book is
-"Version Control with Subversion", by Ben Collins-Sussmann,
-Brian W. Fitzpatrick, and Michael Pilato, O'Reilly.  The book is
-Open Source, so it is also available on line at:
-
-\begin{verbatim}
-   http://svnbook.red-bean.com
-\end{verbatim}
-
-Get a list of commands
-
-\begin{verbatim}
-   svn help
-\end{verbatim}
-
-Get a help with a command
-
-\begin{verbatim}
-   svn help command
-\end{verbatim}
-
-Checkout the HEAD revision of all modules from the project into the
-directory bacula-new
-
-\begin{verbatim}
-   svn co https://bacula.svn.sourceforge.net/svnroot/bacula/trunk bacula.new
-\end{verbatim}
-
-Checkout the HEAD revision of the bacula module into the bacula subdirectory
-
-\begin{verbatim}
-   svn checkout https://bacula.svn.sourceforge.net/svnroot/bacula/trunk/bacula
-\end{verbatim}
-
-See which files have changed in the working copy
-
-\begin{verbatim}
-   svn status
-\end{verbatim}
-
-See which files are out of date
-
-\begin{verbatim}
-   svn status -u
-\end{verbatim}
-
-Add a new file file.c
-
-\begin{verbatim}
-   svn add file.c
-\end{verbatim}
-
-Create a new directory
-
-\begin{verbatim}
-   svn mkdir newdir
-\end{verbatim}
-
-Delete an obsolete file
-
-\begin{verbatim}
-   svn delete file.c
-\end{verbatim}
-
-Rename a file
-
-\begin{verbatim}
-   svn move file.c newfile.c
-\end{verbatim}
-
-Move a file to a new location
-
-\begin{verbatim}
-   svn move file.c ../newdir/file.c
-\end{verbatim}
-
-Copy a file retaining the original history in the new file
-
-\begin{verbatim}
-   svn copy file.c newfile.c
-\end{verbatim}
-
-Update the working copy with the outstanding changes
-
-\begin{verbatim}
-   svn update
-\end{verbatim}
-
-Compare working copy with the repository
-
-\begin{verbatim}
-   svn diff file.c
-\end{verbatim}
-
-Commit the changes in the local working copy
-
-\begin{verbatim}
-   svn commit
-\end{verbatim}
-
-Specify which files are ignored in the current directory
-
-\begin{verbatim}
-   svn propedit svn:ignore .
-\end{verbatim}
-
-Mark a file to be executable
-
-\begin{verbatim}
-   svn propset svn:executable '*' prog.sh
-\end{verbatim}
-
-Unmark a file as executable
-
-\begin{verbatim}
-   svn propdel svn:executable prog.sh
-\end{verbatim}
-
-List a file's properties
-
-\begin{verbatim}
-   svn proplist file.c
-\end{verbatim}
-
-Create a branch for a new version
-
-\begin{verbatim}
-   svn copy https://bacula.svn.sourceforge.net/svnroot/bacula/trunk \
-          https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Branch-2.1
-\end{verbatim}
-
-Tag a version for a new release
-
-\begin{verbatim}
-   svn copy https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Branch-2.1 \
-          https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Release-2.1
-\end{verbatim}
-
-
-Let's say you are working in the directory scripts.  You would then do:
-
-\begin{verbatim}
-cd scripts
-(edit some files)
-\end{verbatim}
-
-when you are happy with your changes, you can do the following:
-
-\begin{verbatim}
-cd bacula   (to your top level directory)
-svn diff  my-changes.patch
-\end{verbatim}
-
-When the command is done, you can look in the file my-changes.patch
-and you will see all the changes you have made to your copy of the
-repository.  Make sure that you understand all the changes that
-it reports before proceeding.  If you modified files that you do
-do not want to commit to the main repository, you can simply delete
-them from your local directory, and they will be restored from the
-repository with the "svn update" that is shown below.  Normally, you
-should not find changes to files that you do not want to commit, and
-if you find yourself in that position a lot, you are probably doing
-something wrong.
-
-Let's assume that now you want to commit your changes to the main
-SVN repository.
-
-First do:
-
-\begin{verbatim}
-cd bacula
-svn update
-\end{verbatim}
-
-When you do this, it will pull any changes made by other developers into
-your local copy of the repository, and it will check for conflicts. If there
-are any, it will tell you, and you will need to resolve them.  The problems
-of resolving conflicts are a bit more than this document can cover, but
-you can examine the files it claims have conflicts and look for \lt{}\lt{}\lt{}\lt{}
-or look in the .rej files that it creates.  If you have problems, just ask
-on the developer's list.
-
-Note, doing the above "svn update" is not absolutely necessary.  There are
-times when you may be working on code and you want to commit it, but you
-explicitly do not want to move up to the latest version of the code in
-the SVN.  If that is the case, you can simply skip the "svn update" and
-do the commit shown below.  If the commit fails because of a conflict, it
-will tell you, and you must resolve the conflict before it will permit
-you to do the commit.
-
-Once your local copy of the repository has been updated, you can now
-commit your changes:
-
-\begin{verbatim}
-svn commit -m "Some comment about what you changed"
-\end{verbatim}
-
-or if you really only want to commit a single file, you can
-do:
-
-\begin{verbatim}
-svn commit -m "comment" scripts/file-I-edited
-\end{verbatim}
-
-Note, if you have done a build in your directory, or you have added
-other new files, the commit will update only the files that are
-actually in the repository.  For example, none of the object files
-are stored in the repository, so when you do a commit, those object
-files will simply be ignored.
-
-If you want to add new files or remove files from the main SVN
-repository, and you are not experienced with SVN, please ask Kern
-to do it.  If you follow the simple steps above, it is unlikely that
-you will do any damage to the repository, and if you do, it is always
-possible for us to recover, but it can be painful.
-
-If you are only working in one subdirectory of say the bacula project,
-for example, the scripts directory, you can do your commit from
-that subdirectory, and only the changes in that directory and all its
-subdirectories will be committed.  This can be helpful for translators.
-If you are doing a French translation, you will be working in
-docs/manual-fr, and if you are always cd'ed into that directory when
-doing your commits, your commit will effect only that directory.  As
-long as you are careful only to change files that you want changed,
-you have little to worry about.
-
-\section{Subversion Resources}
-\index{Subversion (svn) Resources}
-\addcontentsline{toc}{subsection}{Subversion Resources}
-
-Main Subversion Web Page
-\elink{http://subversion.tigris.org}{http://subversion.tigris.org}
-
-Subversion Book
-\elink{http://svnbook.red-bean.com}{http://svnbook.red-bean.com}
-
-Subversion Clients
-\elink{http://subversion.tigris.org/project\_packages.html}{http://subversion.tigris.org/project\_packages.html}
-
- (For Windows users the TortoiseSVN package is awesome)
-
-GUI UNIX client link
-\elink{http://rapidsvn.tigris.org/}{http://rapidsvn.tigris.org/}
-
-A nice KDE GUI client:
-kdesvn
-
-
-
 \section{Developing Bacula}
 \index{Developing Bacula}
 \index{Bacula!Developing}
diff --git a/docs/manuals/en/developers/gui-interface.tex b/docs/manuals/en/developers/gui-interface.tex
new file mode 100644 (file)
index 0000000..2733cda
--- /dev/null
@@ -0,0 +1,102 @@
+%%
+%%
+
+\chapter*{Implementing a GUI Interface}
+\label{_ChapterStart}
+\index[general]{Interface!Implementing a Bacula GUI }
+\index[general]{Implementing a Bacula GUI Interface }
+\addcontentsline{toc}{section}{Implementing a Bacula GUI Interface}
+
+\section{General}
+\index[general]{General }
+\addcontentsline{toc}{subsection}{General}
+
+This document is intended mostly for developers who wish to develop a new GUI
+interface to {\bf Bacula}. 
+
+\subsection{Minimal Code in Console Program}
+\index[general]{Program!Minimal Code in Console }
+\index[general]{Minimal Code in Console Program }
+\addcontentsline{toc}{subsubsection}{Minimal Code in Console Program}
+
+Until now, I have kept all the Catalog code in the Directory (with the
+exception of dbcheck and bscan). This is because at some point I would like to
+add user level security and access. If we have code spread everywhere such as
+in a GUI this will be more difficult. The other advantage is that any code you
+add to the Director is automatically available to both the tty console program
+and the GNOME program. The major disadvantage is it increases the size of the
+code -- however, compared to Networker the Bacula Director is really tiny. 
+
+\subsection{GUI Interface is Difficult}
+\index[general]{GUI Interface is Difficult }
+\index[general]{Difficult!GUI Interface is }
+\addcontentsline{toc}{subsubsection}{GUI Interface is Difficult}
+
+Interfacing to an interactive program such as Bacula can be very difficult
+because the interfacing program must interpret all the prompts that may come.
+This can be next to impossible. There are are a number of ways that Bacula is
+designed to facilitate this: 
+
+\begin{itemize}
+\item The Bacula network protocol is packet based, and  thus pieces of
+information sent can be ASCII or binary.  
+\item The packet interface permits knowing where the end of  a list is.  
+\item The packet interface permits special ``signals''  to be passed rather
+than data.  
+\item The Director has a number of commands that are  non-interactive. They
+all begin with a period,  and provide things such as the list of all Jobs, 
+list of all Clients, list of all Pools, list of  all Storage, ... Thus the GUI
+interface can get  to virtually all information that the Director has  in a
+deterministic way. See  \lt{}bacula-source\gt{}/src/dird/ua\_dotcmds.c for 
+more details on this.  
+\item Most console commands allow all the arguments to  be specified on the
+command line: e.g.  {\bf run job=NightlyBackup level=Full} 
+\end{itemize}
+
+One of the first things to overcome is to be able to establish a conversation
+with the Director. Although you can write all your own code, it is probably
+easier to use the Bacula subroutines. The following code is used by the
+Console program to begin a conversation. 
+
+\footnotesize
+\begin{verbatim}
+static BSOCK *UA_sock = NULL;
+static JCR *jcr;
+...
+  read-your-config-getting-address-and-pasword;
+  UA_sock = bnet_connect(NULL, 5, 15, "Director daemon", dir->address,
+                          NULL, dir->DIRport, 0);
+   if (UA_sock == NULL) {
+      terminate_console(0);
+      return 1;
+   }
+   jcr.dir_bsock = UA_sock;
+   if (!authenticate_director(\&jcr, dir)) {
+      fprintf(stderr, "ERR=%s", UA_sock->msg);
+      terminate_console(0);
+      return 1;
+   }
+   read_and_process_input(stdin, UA_sock);
+   if (UA_sock) {
+      bnet_sig(UA_sock, BNET_TERMINATE); /* send EOF */
+      bnet_close(UA_sock);
+   }
+   exit 0;
+\end{verbatim}
+\normalsize
+
+Then the read\_and\_process\_input routine looks like the following: 
+
+\footnotesize
+\begin{verbatim}
+   get-input-to-send-to-the-Director;
+   bnet_fsend(UA_sock, "%s", input);
+   stat = bnet_recv(UA_sock);
+   process-output-from-the-Director;
+\end{verbatim}
+\normalsize
+
+For a GUI program things will be a bit more complicated. Basically in the very
+inner loop, you will need to check and see if any output is available on the
+UA\_sock. For an example, please take a look at the GNOME GUI interface code
+in: \lt{}bacula-source\&gt/src/gnome-console/console.c 
diff --git a/docs/manuals/en/developers/regression.tex b/docs/manuals/en/developers/regression.tex
new file mode 100644 (file)
index 0000000..2d4c90b
--- /dev/null
@@ -0,0 +1,619 @@
+%%
+%%
+
+\chapter{Bacula Regression Testing}
+\label{_ChapterStart8}
+\index{Testing!Bacula Regression}
+\index{Bacula Regression Testing}
+\addcontentsline{toc}{section}{Bacula Regression Testing}
+
+\section{General}
+\index{General}
+\addcontentsline{toc}{section}{General}
+
+This document is intended mostly for developers who wish to ensure that their
+changes to Bacula don't introduce bugs in the base code.  However, you
+don't need to be a developer to run the regression scripts, and we 
+recommend them before putting your system into production, and before each
+upgrade, especially if you build from source code.  They are
+simply shell scripts that drive Bacula through bconsole and then typically
+compare the input and output with {\bf diff}.
+
+You can find the existing regression scripts in the Bacula developer's
+{\bf git} repository on SourceForge.  We strongly recommend that you {\bf
+clone} the repository because afterwards, you can easily get pull the
+updates that have been made.
+
+To get started, we recommend that you create a directory named {\bf
+bacula}, under which you will put the current source code and the current
+set of regression scripts.  Below, we will describe how to set this up.
+
+The top level directory that we call {\bf bacula} can be named anything you
+want.  Note, all the standard regression scripts run as non-root and can be
+run on the same machine as a production Bacula system (the developers run
+it this way).
+
+To create the directory structure for the current trunk and to
+clone the repository, do the following (note, we assume you
+are working in your home directory in a non-root account):
+
+\footnotesize
+\begin{verbatim}
+cd
+git clone git://bacula.git.sourceforge.net/gitroot/bacula bacula
+\end{verbatim}
+\normalsize
+
+This will create the directory {\bf bacula} and populate it with
+three directories: {\bf bacula}, {\bf gui}, and {\bf regress}.
+{\bf bacula} contains the Bacula source code; {\bf gui} contains
+certain gui programs that you will not need, and {\bf regress} contains
+all the regression scripts.  The above should be needed only
+once. Thereafter to update to the latest code, you do:
+
+\footnotesize
+\begin{verbatim}
+cd bacula
+git pull
+\end{verbatim}
+\normalsize
+
+If you want to test with SQLite and it is not installed on your system,
+you will need to download the latest depkgs release from Source Forge and       
+unpack it into {\bf depkgs}, then simply: 
+
+\footnotesize
+\begin{verbatim}
+cd depkgs
+make
+\end{verbatim}
+\normalsize
+
+
+There are two different aspects of regression testing that this document will
+discuss: 1. Running the Regression Script, 2. Writing a Regression test. 
+
+\section{Running the Regression Script}
+\index{Running the Regression Script}
+\index{Script!Running the Regression}
+\addcontentsline{toc}{section}{Running the Regression Script}
+
+There are a number of different tests that may be run, such as: the standard
+set that uses disk Volumes and runs under any userid; a small set of tests
+that write to tape; another set of tests where you must be root to run them.
+Normally, I run all my tests as non-root and very rarely run the root
+tests.  The tests vary in length, and running the full tests including disk
+based testing, tape based testing, autochanger based testing, and multiple
+drive autochanger based testing can take 3 or 4 hours.
+
+\subsection{Setting the Configuration Parameters}
+\index{Setting the Configuration Parameters}
+\index{Parameters!Setting the Configuration}
+\addcontentsline{toc}{subsection}{Setting the Configuration Parameters}
+
+There is nothing you need to change in the source directory.  
+To begin:
+
+\footnotesize
+\begin{verbatim}
+cd bacula/regress
+\end{verbatim}
+\normalsize
+
+
+The        
+very first time you are going to run the regression scripts, you will
+need to create a custom config file for your system. 
+We suggest that you start by:
+
+\footnotesize
+\begin{verbatim}
+cp prototype.conf config
+\end{verbatim}
+\normalsize
+
+Then you can edit the {\bf config} file directly.
+
+\footnotesize
+\begin{verbatim}
+                                                                                        
+# Where to get the source to be tested
+BACULA_SOURCE="${HOME}/bacula/bacula"
+
+# Where to send email   !!!!! Change me !!!!!!!
+EMAIL=your-name@your-domain.com
+SMTP_HOST="localhost"
+
+# Full "default" path where to find sqlite (no quotes!)
+SQLITE3_DIR=${HOME}/depkgs/sqlite3
+SQLITE_DIR=${HOME}/depkgs/sqlite
+
+TAPE_DRIVE="/dev/nst0"
+# if you don't have an autochanger set AUTOCHANGER to /dev/null
+AUTOCHANGER="/dev/sg0"
+# For two drive tests -- set to /dev/null if you do not have it 
+TAPE_DRIVE1="/dev/null"
+
+# This must be the path to the autochanger including its name
+AUTOCHANGER_PATH="/usr/sbin/mtx"
+
+# Set your database here
+#WHICHDB="--with-sqlite=${SQLITE_DIR}"
+#WHICHDB="--with-sqlite3=${SQLITE3_DIR}"
+#WHICHDB="--with-mysql"
+WHICHDB="--with-postgresql"
+
+# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers"
+TCPWRAPPERS="--with-tcp-wrappers"
+
+# Set this to "" to disable OpenSSL support, "--with-openssl=yes"
+# to enable it, or provide the path to the OpenSSL installation,
+# eg "--with-openssl=/usr/local"
+OPENSSL="--with-openssl"
+
+# You may put your real host name here, but localhost is valid also
+#  and it has the advantage that it works on a non-newtworked machine
+HOST="localhost"
+                                                                                        
+\end{verbatim}
+\normalsize
+
+\begin{itemize}
+\item {\bf BACULA\_SOURCE} should be the full path to the Bacula source code 
+   that you wish to test. It will be loaded configured, compiled, and
+   installed with the "make setup" command, which needs to be done only
+   once each time you change the source code.
+
+\item {\bf EMAIL} should be your email addres. Please remember  to change this
+   or I will get a flood of unwanted  messages. You may or may not want to see
+   these emails. In  my case, I don't need them so I direct it to the bit bucket.
+
+\item {\bf SMTP\_HOST} defines where your SMTP server is.
+
+\item {\bf SQLITE\_DIR} should be the full path to the sqlite package,  must
+   be build before running a Bacula regression, if you are  using SQLite. This
+   variable is ignored if you are using  MySQL or PostgreSQL. To use PostgreSQL,
+   edit the Makefile  and change (or add) WHICHDB?=``\verb{--{with-postgresql''.  For
+   MySQL use ``WHICHDB=''\verb{--{with-mysql``. 
+   
+   The advantage of using SQLite is that it is totally independent of any
+   installation you may have running on your system, and there is no
+   special configuration or authorization that must be done to run it.
+   With both MySQL and PostgreSQL, you must pre-install the packages,
+   initialize them and ensure that you have authorization to access the 
+   database and create and delete tables.
+
+\item {\bf TAPE\_DRIVE} is the full path to your tape drive.  The base set of
+   regression tests do not use a tape, so this is only important if you want to
+   run the full tests. Set this to  /dev/null if you do not have a tape drive.
+
+\item {\bf TAPE\_DRIVE1} is the full path to your second tape drive, if
+   have one. The base set of
+   regression tests do not use a tape, so  this is only important if you want to
+   run the full two drive tests.  Set this to  /dev/null if you do not have a
+   second tape drive.
+
+\item {\bf AUTOCHANGER} is the name of your autochanger control device.  Set this to
+   /dev/null if you do not have an autochanger. 
+
+\item {\bf AUTOCHANGER\_PATH} is the full path including the  program name for
+   your autochanger program (normally  {\bf mtx}. Leave the default value if you
+   do not have one. 
+
+\item {\bf TCPWRAPPERS} defines whether or not you want the ./configure
+   to be performed with tcpwrappers enabled.
+
+\item {\bf OPENSSL} used to enable/disable SSL support for Bacula
+   communications and data encryption.
+
+\item {\bf HOST} is the hostname that it will use when building the
+   scripts. The Bacula daemons will be named <HOST>-dir, <HOST>-fd,
+   ... It is also the name of the HOST machine that to connect to the
+   daemons by the network.  Hence the name should either be your real
+   hostname (with an appropriate DNS or /etc/hosts entry) or {\bf
+   localhost} as it is in the default file.
+
+\item {\bf bin} is the binary location.
+
+\item {\bf scripts} is the bacula scripts location (where we could find
+  database creation script, autochanger handler, etc.)
+
+\end{itemize}
+
+\subsection{Building the Test Bacula}
+\index{Building the Test Bacula}
+\index{Bacula!Building the Test}
+\addcontentsline{toc}{subsection}{Building the Test Bacula}
+
+Once the above variables are set, you can build the Makefile by entering: 
+
+\footnotesize
+\begin{verbatim}
+./config xxx.conf
+\end{verbatim}
+\normalsize
+
+Where xxx.conf is the name of the conf file containing your system parameters.
+This will build a Makefile from Makefile.in, and you should not need to
+do this again unless you want to change the database or other regression
+configuration parameter.
+
+
+\subsection{Setting up your SQL engine}
+\index{Setting up your SQL engine}
+\addcontentsline{toc}{subsection}{Setting up your SQL engine}
+If you are using SQLite or SQLite3, there is nothing more to do; you can   
+simply run the tests as described in the next section.
+
+If you are using MySQL or PostgreSQL, you will need to establish an
+account with your database engine for the user name {\bf regress} and
+you will need to manually create a database named {\bf regress} that can be
+used by user name regress, which means you will have to give the user
+regress sufficient permissions to use the database named regress.
+There is no password on the regress account.
+
+You have probably already done this procedure for the user name and
+database named bacula.  If not, the manual describes roughly how to
+do it, and the scripts in bacula/regress/build/src/cats named
+create\_mysql\_database, create\_postgresql\_database, grant\_mysql\_privileges,
+and grant\_postgresql\_privileges may be of a help to you.
+
+Generally, to do the above, you will need to run under root to 
+be able to create databases and modify permissions within MySQL and
+PostgreSQL.
+
+
+\subsection{Running the Disk Only Regression}
+\index{Regression!Running the Disk Only}
+\index{Running the Disk Only Regression}
+\addcontentsline{toc}{subsection}{Running the Disk Only Regression}
+
+The simplest way to copy the source code, configure it, compile it, link
+it, and run the tests is to use a helper script:
+
+\footnotesize
+\begin{verbatim}
+./do_disk
+\end{verbatim}
+\normalsize
+
+
+
+
+This will run the base set of tests using disk Volumes.
+If you are testing on a
+non-Linux machine several of the of the tests may not be run.  In any case,
+as we add new tests, the number will vary.  It will take about 1 hour
+and you don't need to be root
+to run these tests (I run under my regular userid).  The result should be
+something similar to:
+
+\footnotesize
+\begin{verbatim}
+Test results
+  ===== auto-label-test OK 12:31:33 =====
+  ===== backup-bacula-test OK 12:32:32 =====
+  ===== bextract-test OK 12:33:27 =====
+  ===== bscan-test OK 12:34:47 =====
+  ===== bsr-opt-test OK 12:35:46 =====
+  ===== compressed-test OK 12:36:52 =====
+  ===== compressed-encrypt-test OK 12:38:18 =====
+  ===== concurrent-jobs-test OK 12:39:49 =====
+  ===== data-encrypt-test OK 12:41:11 =====
+  ===== encrypt-bug-test OK 12:42:00 =====
+  ===== fifo-test OK 12:43:46 =====
+  ===== backup-bacula-fifo OK 12:44:54 =====
+  ===== differential-test OK 12:45:36 =====
+  ===== four-concurrent-jobs-test OK 12:47:39 =====
+  ===== four-jobs-test OK 12:49:22 =====
+  ===== incremental-test OK 12:50:38 =====
+  ===== query-test OK 12:51:37 =====
+  ===== recycle-test OK 12:53:52 =====
+  ===== restore2-by-file-test OK 12:54:53 =====
+  ===== restore-by-file-test OK 12:55:40 =====
+  ===== restore-disk-seek-test OK 12:56:29 =====
+  ===== six-vol-test OK 12:57:44 =====
+  ===== span-vol-test OK 12:58:52 =====
+  ===== sparse-compressed-test OK 13:00:00 =====
+  ===== sparse-test OK 13:01:04 =====
+  ===== two-jobs-test OK 13:02:39 =====
+  ===== two-vol-test OK 13:03:49 =====
+  ===== verify-vol-test OK 13:04:56 =====
+  ===== weird-files2-test OK 13:05:47 =====
+  ===== weird-files-test OK 13:06:33 =====
+  ===== migration-job-test OK 13:08:15 =====
+  ===== migration-jobspan-test OK 13:09:33 =====
+  ===== migration-volume-test OK 13:10:48 =====
+  ===== migration-time-test OK 13:12:59 =====
+  ===== hardlink-test OK 13:13:50 =====
+  ===== two-pool-test OK 13:18:17 =====
+  ===== fast-two-pool-test OK 13:24:02 =====
+  ===== two-volume-test OK 13:25:06 =====
+  ===== incremental-2disk OK 13:25:57 =====
+  ===== 2drive-incremental-2disk OK 13:26:53 =====
+  ===== scratch-pool-test OK 13:28:01 =====
+Total time = 0:57:55 or 3475 secs
+
+\end{verbatim}
+\normalsize
+
+and the working tape tests are run with
+
+\footnotesize
+\begin{verbatim}
+make full_test
+\end{verbatim}
+\normalsize
+
+
+\footnotesize
+\begin{verbatim}
+Test results
+  
+  ===== Bacula tape test OK =====
+  ===== Small File Size test OK =====
+  ===== restore-by-file-tape test OK =====
+  ===== incremental-tape test OK =====
+  ===== four-concurrent-jobs-tape OK =====
+  ===== four-jobs-tape OK =====
+\end{verbatim}
+\normalsize
+
+Each separate test is self contained in that it initializes to run Bacula from
+scratch (i.e. newly created database). It will also kill any Bacula session
+that is currently running. In addition, it uses ports 8101, 8102, and 8103 so
+that it does not intefere with a production system. 
+
+Alternatively, you can do the ./do\_disk work by hand with:
+
+\footnotesize
+\begin{verbatim}
+make setup
+\end{verbatim}
+\normalsize
+
+The above will then copy the source code within
+the regression tree (in directory regress/build), configure it, and build it.
+There should be no errors. If there are, please correct them before
+continuing. From this point on, as long as you don't change the Bacula
+source code, you should not need to repeat any of the above steps.  If
+you pull down a new version of the source code, simply run {\bf make setup}
+again.
+
+
+Once Bacula is built, you can run the basic disk only non-root regression test
+by entering: 
+
+\footnotesize
+\begin{verbatim}
+make test
+\end{verbatim}
+\normalsize
+
+
+\subsection{Other Tests}
+\index{Other Tests}
+\index{Tests!Other}
+\addcontentsline{toc}{subsection}{Other Tests}
+
+There are a number of other tests that can be run as well. All the tests are a
+simply shell script keep in the regress directory. For example the ''make
+test`` simply executes {\bf ./all-non-root-tests}. The other tests, which
+are invoked by directly running the script are:
+
+\begin{description}
+
+\item [all\_non-root-tests]
+   \index{all\_non-root-tests}
+   All non-tape tests not requiring root.  This is the standard set of tests,
+that in general, backup some  data, then restore it, and finally compares the
+restored data  with the original data.  
+
+\item [all-root-tests]
+   \index{all-root-tests}
+   All non-tape tests requiring root permission.  These are a relatively small
+number of tests that require running  as root. The amount of data backed up
+can be quite large. For  example, one test backs up /usr, another backs up
+/etc. One  or more of these tests reports an error -- I'll fix it one  day. 
+
+\item [all-non-root-tape-tests]
+   \index{all-non-root-tape-tests}
+   All tape test not requiring root.  There are currently three tests, all run
+without being root,  and backup to a tape. The first two tests use one volume,
+and the third test requires an autochanger, and uses two  volumes. If you
+don't have an autochanger, then this script  will probably produce an error. 
+
+\item [all-tape-and-file-tests]
+   \index{all-tape-and-file-tests}
+   All tape and file tests not requiring  root. This includes just about
+everything, and I don't run it  very often. 
+\end{description}
+
+\subsection{If a Test Fails}
+\index{Fails!If a Test}
+\index{If a Test Fails}
+\addcontentsline{toc}{subsection}{If a Test Fails}
+
+If you one or more tests fail, the line output will be similar to: 
+
+\footnotesize
+\begin{verbatim}
+  !!!!! concurrent-jobs-test failed!!! !!!!!
+\end{verbatim}
+\normalsize
+
+If you want to determine why the test failed, you will need to rerun the
+script with the debug output turned on.  You do so by defining the
+environment variable {\bf REGRESS\_DEBUG} with commands such as:
+
+\begin{verbatim}
+REGRESS_DEBUG=1
+export REGRESS_DEBUG
+\end{verbatim}
+
+Then from the "regress" directory (all regression scripts assume that
+you have "regress" as the current directory), enter:
+
+\begin{verbatim}
+tests/test-name
+\end{verbatim}
+
+where test-name should be the name of a test script -- for example:
+{\bf tests/backup-bacula-test}.
+
+\section{Testing a Binary Installation}
+\index{Test!Testing a Binary Installation}
+
+If you have installed your Bacula from a binary release such as (rpms or debs),
+you can still run regression tests on it.
+First, make sure that your regression {\bf config} file uses the same catalog backend as
+your installed binaries. Then define the variables \texttt{bin} and \texttt{scripts} variables
+in your config file.
+
+Example:
+\begin{verbatim}
+bin=/opt/bacula/bin
+scripts=/opt/bacula/scripts
+\end{verbatim}
+
+The \texttt{./scripts/prepare-other-loc} will tweak the regress scripts to use
+your binary location. You will need to run it manually once before you run any
+regression tests.
+
+\begin{verbatim}
+$ ./scripts/prepare-other-loc
+$ ./tests/backup-bacula-test
+...
+\end{verbatim}
+
+All regression scripts must be run by hand or by calling the test scripts.  
+These are principally scripts that begin with {\bf all\_...} such as {\bf all\_disk\_tests},
+{\bf ./all\_test} ...
+None of the 
+{\bf ./do\_disk}, {\bf ./do\_all}, {\bf ./nightly...}  scripts will work.
+
+If you want to switch back to running the regression scripts from source, first
+remove the {\bf bin} and {\bf scripts} variables from your {\bf config} file and
+rerun the {\bf make setup} step.
+
+\section{Running a Single Test}
+\index{Running a Single Test}
+\addcontentsline{toc}{section}{Running a Single Test}
+
+If you wish to run a single test, you can simply:
+
+\begin{verbatim}
+cd regress
+tests/<name-of-test>
+\end{verbatim}
+
+or, if the source code has been updated, you would do:
+
+\begin{verbatim}
+cd bacula
+git pull
+cd regress
+make setup
+tests/backup-to-null
+\end{verbatim}
+
+
+\section{Writing a Regression Test}
+\index{Test!Writing a Regression}
+\index{Writing a Regression Test}
+\addcontentsline{toc}{section}{Writing a Regression Test}
+
+Any developer, who implements a major new feature, should write a regression
+test that exercises and validates the new feature. Each regression test is a
+complete test by itself. It terminates any running Bacula, initializes the
+database, starts Bacula, then runs the test by using the console program. 
+
+\subsection{Running the Tests by Hand}
+\index{Hand!Running the Tests by}
+\index{Running the Tests by Hand}
+\addcontentsline{toc}{subsection}{Running the Tests by Hand}
+
+You can run any individual test by hand by cd'ing to the {\bf regress}
+directory and entering: 
+
+\footnotesize
+\begin{verbatim}
+tests/<test-name>
+\end{verbatim}
+\normalsize
+
+\subsection{Directory Structure}
+\index{Structure!Directory}
+\index{Directory Structure}
+\addcontentsline{toc}{subsection}{Directory Structure}
+
+The directory structure of the regression tests is: 
+
+\footnotesize
+\begin{verbatim}
+  regress                - Makefile, scripts to start tests
+    |------ scripts      - Scripts and conf files
+    |-------tests        - All test scripts are here
+    |
+    |------------------ -- All directories below this point are used
+    |                       for testing, but are created from the
+    |                       above directories and are removed with
+    |                       "make distclean"
+    |
+    |------ bin          - This is the install directory for
+    |                        Bacula to be used testing
+    |------ build        - Where the Bacula source build tree is
+    |------ tmp          - Most temp files go here
+    |------ working      - Bacula working directory
+    |------ weird-files  - Weird files used in two of the tests.
+\end{verbatim}
+\normalsize
+
+\subsection{Adding a New Test}
+\index{Adding a New Test}
+\index{Test!Adding a New}
+\addcontentsline{toc}{subsection}{Adding a New Test}
+
+If you want to write a new regression test, it is best to start with one of
+the existing test scripts, and modify it to do the new test. 
+
+When adding a new test, be extremely careful about adding anything to any of
+the daemons' configuration files. The reason is that it may change the prompts
+that are sent to the console. For example, adding a Pool means that the
+current scripts, which assume that Bacula automatically selects a Pool, will
+now be presented with a new prompt, so the test will fail. If you need to
+enhance the configuration files, consider making your own versions. 
+
+\subsection{Running a Test Under The Debugger}
+\index{Debugger}
+\addcontentsline{toc}{subsection}{Running a Test Under The Debugger}
+You can run a test under the debugger (actually run a Bacula daemon
+under the debugger) by first setting the environment variable
+{\bf REGRESS\_WAIT} with commands such as:
+
+\begin{verbatim}
+REGRESS_WAIT=1
+export REGRESS_WAIT
+\end{verbatim}
+
+Then executing the script.  When the script prints the following line:
+
+\begin{verbatim}
+Start Bacula under debugger and enter anything when ready ...
+\end{verbatim}
+
+You start the Bacula component you want to run under the debugger in a
+different shell window.  For example:
+
+\begin{verbatim}
+cd .../regress/bin
+gdb bacula-sd 
+(possibly set breakpoints, ...)
+run -s -f
+\end{verbatim}
+
+Then enter any character in the window with the above message. 
+An error message will appear saying that the daemon you are debugging
+is already running, which is the case. You can simply ignore the
+error message.  
diff --git a/docs/manuals/es/catalog/update_version b/docs/manuals/es/catalog/update_version
deleted file mode 100755 (executable)
index 9773ff2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-#
-# Script file to update the Bacula version
-#
-out=/tmp/$$
-VERSION=`sed -n -e 's/^.*VERSION.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-DATE=`sed -n -e 's/^.*[ \t]*BDATE.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-. ./do_echo
-sed -f ${out} /home/kern/bacula/docs/manuals/version.tex.in >version.tex
-rm -f ${out}
diff --git a/docs/manuals/es/catalog/version.tex b/docs/manuals/es/catalog/version.tex
deleted file mode 100644 (file)
index b45e38c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0.3 (15 August 2009)
diff --git a/docs/manuals/es/concepts/update_version b/docs/manuals/es/concepts/update_version
deleted file mode 100755 (executable)
index 9773ff2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-#
-# Script file to update the Bacula version
-#
-out=/tmp/$$
-VERSION=`sed -n -e 's/^.*VERSION.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-DATE=`sed -n -e 's/^.*[ \t]*BDATE.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-. ./do_echo
-sed -f ${out} /home/kern/bacula/docs/manuals/version.tex.in >version.tex
-rm -f ${out}
diff --git a/docs/manuals/es/concepts/version.tex b/docs/manuals/es/concepts/version.tex
deleted file mode 100644 (file)
index b45e38c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0.3 (15 August 2009)
diff --git a/docs/manuals/es/console/update_version b/docs/manuals/es/console/update_version
deleted file mode 100755 (executable)
index 9773ff2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-#
-# Script file to update the Bacula version
-#
-out=/tmp/$$
-VERSION=`sed -n -e 's/^.*VERSION.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-DATE=`sed -n -e 's/^.*[ \t]*BDATE.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-. ./do_echo
-sed -f ${out} /home/kern/bacula/docs/manuals/version.tex.in >version.tex
-rm -f ${out}
diff --git a/docs/manuals/es/console/version.tex b/docs/manuals/es/console/version.tex
deleted file mode 100644 (file)
index b45e38c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0.3 (15 August 2009)
diff --git a/docs/manuals/es/developers/update_version b/docs/manuals/es/developers/update_version
deleted file mode 100755 (executable)
index 9773ff2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-#
-# Script file to update the Bacula version
-#
-out=/tmp/$$
-VERSION=`sed -n -e 's/^.*VERSION.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-DATE=`sed -n -e 's/^.*[ \t]*BDATE.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-. ./do_echo
-sed -f ${out} /home/kern/bacula/docs/manuals/version.tex.in >version.tex
-rm -f ${out}
diff --git a/docs/manuals/es/developers/version.tex b/docs/manuals/es/developers/version.tex
deleted file mode 100644 (file)
index b45e38c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0.3 (15 August 2009)
diff --git a/docs/manuals/es/install/update_version b/docs/manuals/es/install/update_version
deleted file mode 100755 (executable)
index 9773ff2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-#
-# Script file to update the Bacula version
-#
-out=/tmp/$$
-VERSION=`sed -n -e 's/^.*VERSION.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-DATE=`sed -n -e 's/^.*[ \t]*BDATE.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-. ./do_echo
-sed -f ${out} /home/kern/bacula/docs/manuals/version.tex.in >version.tex
-rm -f ${out}
diff --git a/docs/manuals/es/install/version.tex b/docs/manuals/es/install/version.tex
deleted file mode 100644 (file)
index b45e38c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0.3 (15 August 2009)
diff --git a/docs/manuals/es/problems/update_version b/docs/manuals/es/problems/update_version
deleted file mode 100755 (executable)
index 9773ff2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-#
-# Script file to update the Bacula version
-#
-out=/tmp/$$
-VERSION=`sed -n -e 's/^.*VERSION.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-DATE=`sed -n -e 's/^.*[ \t]*BDATE.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-. ./do_echo
-sed -f ${out} /home/kern/bacula/docs/manuals/version.tex.in >version.tex
-rm -f ${out}
diff --git a/docs/manuals/es/problems/version.tex b/docs/manuals/es/problems/version.tex
deleted file mode 100644 (file)
index b45e38c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0.3 (15 August 2009)
diff --git a/docs/manuals/es/utility/update_version b/docs/manuals/es/utility/update_version
deleted file mode 100755 (executable)
index 9773ff2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-#
-# Script file to update the Bacula version
-#
-out=/tmp/$$
-VERSION=`sed -n -e 's/^.*VERSION.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-DATE=`sed -n -e 's/^.*[ \t]*BDATE.*"\(.*\)"$/\1/p' /home/kern/bacula/k/bacula/src/version.h`
-. ./do_echo
-sed -f ${out} /home/kern/bacula/docs/manuals/version.tex.in >version.tex
-rm -f ${out}
diff --git a/docs/manuals/es/utility/version.tex b/docs/manuals/es/utility/version.tex
deleted file mode 100644 (file)
index b45e38c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0.3 (15 August 2009)