#!/usr/bin/perl

use Getopt::Long;

# This script counts the number of queue files in all the drainer
# queues plus the base queue and redistributes them so that 
# all drainer queues have an equal number of files and the 
# base queue has only current files.

my $basedir = '/var/log/nocpulse';
my $move_files = '/usr/bin/drainer repop';



my($help, $debug);
&GetOptions(
  'debug+' => \$debug,
  'help+'  => \$help,
);

die(&help) if ($help);


# Count all non-current files in all queue directories.  (get_file_count
# only counts non-current files.)
my @dirs = glob("$basedir/TSDBLocalQueue*");
my $ndrainers = scalar(@dirs) - 1;

my $nfiles;
foreach my $dir (@dirs) {
  my $queue = "$dir/queue";
  print "+++ Getting file count for $queue\n" if ($debug);
  my $n = &get_file_count($queue);
  print "+++\t$n non-current files\n" if ($debug);
  $nfiles += $n;
}

my $files_per_drainer = int($nfiles / $ndrainers + .5);
if ($debug) {
  print "+++ $nfiles files for $ndrainers drainers == $files_per_drainer per\n";
  print "+++ Would execute:\n";
  print "+++ system(\"$move_files $files_per_drainer\")\n";
} else {
  system("$move_files $files_per_drainer > /dev/null 2>&1");
}





##############################################################################
###############################  Subroutines  ################################
##############################################################################

####################
sub get_file_count {
####################
  my $dir = shift;
  my($file, %files, %links);

  # Read in all directory entries
  opendir(DIR, $dir);
  while ($file = readdir(DIR)) {
    if (-l "$dir/$file") {
      my $target = readlink "$dir/$file";
      $target =~ s,^.*/,,g;
      $links{$file} = $target;
    } elsif ($file =~ /^\d/) {
      $files{$file}++;
    }
  }
  closedir(DIR);

  # Filter out current files (files pointed to by links)
  while (my($link, $target) = each %links) {
    delete($files{$target});
  }

  # Return the count
  return scalar(keys %files);
  
} 



##########
sub help {
##########
  return qq{

  Usage:  $0 [--debug]
    debug     - count but don't move files
  \n};

}
