package RackMan::Format::Bacula;

use strict;
use Carp;
use RackMan::File;


use constant {
    CONFIG_SECTION  => "format:bacula",
    DEFAULT_PATH    => "/etc/bacula/hosts",
};


#
# write()
# -----
sub write {
    my ($class, $args) = @_;

    my $rackdev = $args->{rackdev};
    my $rackman = $args->{rackman};
    my $name    = $rackdev->object_name;
    my $fqdn    = $rackdev->attributes->{FQDN} || $name;
    my ($short) = split /\./, $name;

    # fetch Bacula parameters
    my $password= $rackman->config->val(CONFIG_SECTION, "password", "***");
    my $catalog = $rackman->config->val(CONFIG_SECTION, "catalog", "MyCatalog");
    my $fdport  = $rackman->config->val(CONFIG_SECTION, "fdport");
    my $file_ret= $rackman->config->val(CONFIG_SECTION, "file_retention");
    my $job_ret = $rackman->config->val(CONFIG_SECTION, "job_retention");
    my $max_jobs= $rackman->config->val(CONFIG_SECTION, "max_jobs");
    my $bs_path = $rackman->config->val(CONFIG_SECTION, "write_bootstrap");

    # generate the config files
    my $config_client = RackMan::File->new;
    $config_client->name("$name-fd.conf");
    $config_client->add_content(
        "Client {\n",
        "    Name = $short-fd\n",
        "    Address = $fqdn\n",
        "    FDPort = $fdport\n"                    x!! $fdport,
        "    Catalog = $catalog\n",
        "    Password = \"$password\"\n",
        "    File Retention = $file_ret\n"          x!! $file_ret,
        "    Job Retention = $job_ret\n"            x!! $job_ret,
        "    Maximum Concurrent Jobs = $max_jobs\n" x!! $max_jobs,
        "}\n",
    );

    my $config_fileset = RackMan::File->new;
    my @files = $rackman->config->val(CONFIG_SECTION, "add_file");

    if (@files) {
        $config_fileset->name("$name.fileset.conf");
        $config_fileset->add_content(
            "FileSet {\n",
            "    Name = \"$short\"\n",
            "    Include {\n",
            "        Options {\n",
            "            signature = MD5\n",
            "        }\n",
        );
        $config_fileset->add_content(
            map "        File = $_\n", @files
        );
        $config_fileset->add_content(
            "    }\n",
            "}\n",
        );
    }

    my $config_job = RackMan::File->new;
    $config_job->name("$name.job.conf");
    $config_job->add_content(
        "Job {\n",
        "    Name = \"$short\"\n",
        "    JobDefs = \"Monthly\"\n",
        "    Client = $short-fd\n",
        "    FileSet = $short\n",
        "    Write Bootstrap = \"$bs_path\"\n"      x!! $bs_path,
        "    Maximum Concurrent Jobs = $max_jobs\n" x!! $max_jobs,
        "}\n",
    );

    # write the configuration files on disk
    my $path = $rackman->config->val(CONFIG_SECTION, "path", DEFAULT_PATH);
    my $scm = $rackman->get_scm({ path => $path });
    $scm->update;

    for my $file ($config_client, $config_fileset, $config_job) {
        next unless defined $file->name;
        $file->path($path);
        print "  + writing ", $file->fullpath, $/ if $args->{verbose};
        $file->write;
        $scm->add($file->name);
        $scm->commit($file->name, "generated by $class / $::PROGRAM v$::VERSION");
    }
}


__PACKAGE__

__END__

=pod

=head1 NAME

RackMan::Format::Bacula - Generate the Bacula config files for a given RackObject

=head1 SYNOPSIS

    use RackMan::Format::Bacula;

    RackMan::Format::Bacula->write({
        rackdev => $rackdev,  # a RackMan::Device instance
        rackman => $rackman,  # a RackMan instance
    });


=head1 DESCRIPTION

This module generates the Bacula configuration files for the given RackObject.


=head1 METHODS

=head2 write

Generate the file.

B<Arguments>

Arguments are expected as a hashref with the following keys:

=over

=item *

C<rackdev> - I<(mandatory)> a RackMan::Device instance

=item *

C<rackman> - I<(mandatory)> a RackMan instance

=item *

C<verbose> - I<(optional)> boolean, set to true to be verbose

=back


=head1 CONFIGURATION

This module gets its configuration from the C<[format:bacula]> section
of the main F<rack.conf>, with the following parameters:

=head2 path

Path of the directory to store the generated files.

=head2 catalog

Specify the name of the catalog resource to be used.
This parameter is required.

=head2 password

Specify the Bacula password.  This parameter is required.

=head2 fdport

Port number of the Bacula server.

=head2 file_retention

Bacula parameter C<File Retention>.

=head2 job_retention

Bacula parameter C<Job Retention>.

=head2 max_jobs

Bacula parameter C<Maximum Concurrent Jobs>.

=head2 write_bootstrap

Bacula parameter C<Write Bootstrap>.

=head2 add_file

Add the given path to the FileSet.

=head2 scm

Specify the SCM tool to use for versionning generated files.


=head1 AUTHOR

Sebastien Aperghis-Tramoni

=cut