#!/usr/bin/perl -w
use strict;
use Fcntl ':flock';
use Getopt::Std;
require 5.000;
use vars qw/$opt_v/;

getopts('v');
my $verbose = $opt_v || 0;
my $entriesdir = "/usr/lib/xlogmaster/entries/";
my $defaultdir = "/usr/lib/xlogmaster/entries/default/";
my $admindir = "/etc/xlogmaster/entries/";
my $configname = "/etc/xlogmaster/config";
my (@entries, %files, $line, $valid, $filename);

# sanity checks
chdir $entriesdir or die "Cant change to $entriesdir: $!";
#die "Defaultfile $entriesdir/$defaultname not present: $!" if (! -f $defaultname );

# Locking
open (LOCK, ">/var/run/update-xlogmaster") or die "Can't create lockfile: $!";;
flock (LOCK, LOCK_EX);
print LOCK $$;

# Get entryfiles from a directory

sub add_entries {
  my $dir = shift;
  my $list = shift;
  my (@entries, $file); 
  opendir (DIR, $dir) or $verbose and warn "Can't open $dir: $!";;
  while (defined($file = readdir(DIR))){
    next if (-d $file);
    next if ($file =~ /^README/);
    push @entries, $file
  }
  @entries = map {$_, $dir.$_} @entries;
  return \@entries
}

%files = ( @{add_entries($defaultdir)}, @{add_entries($entriesdir)}, @{add_entries($admindir)});

if ($verbose) {
  print STDERR "Using the following entry files:\n";
  foreach my $key (sort keys %files) {
    print STDERR "$key -> $files{$key}\n"
  }
  print STDERR "\n";
}

# Build the configfile from the entry files

  open (OUT, ">$configname") or die "Can't open $configname for writing: $!";
  foreach my $file (sort values %files){
    $valid = 0;
    $verbose && print STDERR "Processing $file:\n\t";
    open (IN, $file) or $verbose and warn "Can't open $file";
    while (defined($line = <IN>)) {
      next if ($line =~ /^#/);
      $line =~ /.*?{(.*?),/;
      $filename = $1;
      $valid = 1 if ((defined $filename) and (-e $filename));
      last
    }
    if ($valid) {
      seek IN,0,0 or die "$!";
      $verbose && print STDERR "Entry for $filename added\n";
      print OUT "# Configfile $file\n";
      while (<IN>) { print OUT }; print OUT "\n";
    } elsif ($verbose) {
      if (defined $filename) {
	print STDERR "$filename does not exist on this box. Not using this entry\n";
      } else {
	print STDERR "No valid entry found\n";
      }	
    }
  }

flock (LOCK, LOCK_UN)
