#!perl

use FindBin;
use lib "$FindBin::Bin/../lib";
use Rex::Repositorio;

use common::sense;
use Carp;
use Config::General;
use Log::Log4perl;
use Data::Dumper;
use Getopt::Long;

my @config_file_locations = (
  "/etc/rex/repositorio.conf", "/usr/local/etc/rex/repositorio.conf",
  "./repositorio.conf"
);

my ($config_file) = grep { -f $_ } @config_file_locations;

if ( !$config_file ) {
  confess "No configuration file found.\nLocations: "
    . join( ", ", @config_file_locations );
}

my $conf_o = Config::General->new($config_file);
my %conf   = $conf_o->getall;

if(! exists $conf{Log4perl}) {
  print "No configuration for log4perl found. Exiting.\n";
  exit 1;
}

Log::Log4perl::init( $conf{Log4perl}{config} );
my $logger = Log::Log4perl->get_logger();

$logger->info("repositorio started.");
$logger->debug("Logger initialized.");
$logger->debug("Configuration Dump:");
$logger->debug( Dumper( \%conf ) );

my %cli;
GetOptions(
  \%cli,        "mirror",          "tag=s",        "repo=s",
  "help",       "update-metadata", "update-files", "list",
  "add-file=s", "remove-file=s",   "init"
);

my $app = Rex::Repositorio->new( config => \%conf, logger => $logger );
$app->run(%cli);

__END__

=pod

=head1 repositor.io - Linux Repository Management

repositor.io is a tool to create and manage linux repositories.
You can mirror online repositories so that you don't need to download the
package every time you set up a new server. You can also secure your servers
behind a firewall and disable outgoing http traffic.

With repositor.io it is easy to create custom repositories for your own
packages. With the integration of a configuration management tool you can
create consistant installations of your server.

=head2 GETTING HELP

=over 4

=item * Web Site: L<http://repositor.io/>

=item * IRC: irc.freenode.net #repositorio

=item * Bug Tracker: L<https://github.com/krimdomu/repositorio/issues>

=item * Twitter: L<http://twitter.com/jfried83>

=back

=head2 COMMAND LINE

=over 4

=item --mirror            mirror a configured repository (needs --repo)

=item --tag=tagname       tag a repository (needs --repo)

=item --repo=reponame     the name of the repository to use

=item --update-metadata   update the metadata of a repository

=item --update-files      download files even if they are already downloaded

=item --init              initialize an empty repository

=item --add-file=file     add a file to a repository (needs --repo)

=item --remove-file=file  remove a file from a repository (needs --repo)

=item --list              list known repositories

=item --help              display this help message

=back

=head2 CONFIGURATION

To configure repositor.io create a configuration file
I</etc/rex/repositorio.conf>.
 RepositoryRoot = /srv/html/repo/

 # log4perl configuration file
 <Log4perl>
   config = /etc/rex/io/log4perl.conf
 </Log4perl>

 # create a mirror of the nightly rex repository
 # the files will be stored in
 # /srv/html/repo/head/rex-centos-6-x86-64/CentOS/6/rex/x86_64/
 <Repository rex-centos-6-x86-64>
   url   = http://nightly.rex.linux-files.org/CentOS/6/rex/x86_64/
   local = rex-centos-6-x86-64/CentOS/6/rex/x86_64/
   type  = Yum
 </Repository>

 # create a mirror of centos 6
 # and download the pxe boot files, too.
 <Repository centos-6-x86-64>
   url    = http://ftp.hosteurope.de/mirror/centos.org/6/os/x86_64/
   local  = centos-6-x86-64/CentOS/6/os/x86_64/
   type   = Yum
   images = true
 </Repository>

 # create a custom repository
 <Repository centos-6-x86-64-mixed>
   local = centos-6-x86-64-mixed/mixed/6/x86_64/
   type  = Yum
 </Repository>

If you want to sign your custom repositories you have to configure the gpg key to use.
repositorio automatically exports the public key into the root of the repository, so it can be imported from the clients.
If you don't specify the gpg password repositorio will ask you for the password.

An example for YUM repositories:

 <Repository centos-6-x86-64-mixed>
   local = centos-6-x86-64-mixed/mixed/6/x86_64/
   type  = Yum
   <gpg>
     key      = DA95F273
     password = test
   </gpg>
 </Repository>

An example for APT repositories:

 <Repository debian-7-x86-64-mixed>
   local     = debian-7-x86-64-mixed/debian
   type      = Apt
   arch      = amd64
   dist      = wheezy
   component = mixed
   <gpg>
     key      = DA95F273
     password = test
   </gpg>
 </Repository>

An example log4perl.conf file:

 log4perl.rootLogger                    = DEBUG, FileAppndr1

 log4perl.appender.FileAppndr1          = Log::Log4perl::Appender::File
 log4perl.appender.FileAppndr1.filename = /var/log/repositorio.log
 log4perl.appender.FileAppndr1.layout   = Log::Log4perl::Layout::SimpleLayout
