#!/usr/bin/perl

my $tuxuid = getpwnam('tux');

die "Must run as tux current uid: $> != $tuxuid" if ($> != $tuxuid);

$| = 1;

my $tree = $ARGV[0];

buildcpsync('/home/cpanel/cpanelsync/' . $tree);
buildcpsync('/home/cpanel/cpanelsync/' . $tree . '/base');


sub buildcpsync {
	my $basedir = shift;
	if (! -e $basedir) {
		mkdir($basedir,0755);
	}
	if (! -d $basedir) {
		die "cpanelsync: $!";
	}

	chdir($basedir) || die "cpanelsync: $!";

	my (@FILES) = listdir($basedir);
	@FILES = grep(/\.tar\.bz2$/,@FILES);

	foreach my $file (@FILES) {
		my $basefile = $file;
		$basefile =~ s/\.tar\.bz2$//g;
		if ($file ne 'install.bz2') {
			print "findlatest [root:${basedir}] Decompressing $file ......";
			my(%FLIST);
			my(%CFLIST);
			my @filelist = split(/\n/,saferun('tar','jxfv',$file));
			foreach (@filelist) {
				s/^\.\///g;
				addfile(\%FLIST,$_);
			}
			print "Done\n";
			my @currentfilelist = split(/\n/,saferun('find',$basefile));

			foreach my $file (@currentfilelist) {
				next if (! -e $file);
				next if ($file =~ /\/\.cpanelsyn[^\/]+$/);
				$file =~ s/^\.\///g;
				$file =~ s/\/$//g;
				die ".. in dir .. this should never happen" if ($file =~ /\.\./);
				if (! $FLIST{$file}) {
					print "findlatest [root:${basedir}] Removing old file ${file}....";
					if (! -d $file) {
						unlink($file) || die "Failed to remove $file: $!\n";
					} else {
                        system('rm','-rf',$file);
					}
					print "Done\n";
				}
			}

			if (-d $basefile) {
				chdir($basefile) || die "Unable to chdir into $basefile: $!";
				system('/home/cpanel/buildcpanelsync');
			}
		}
		chdir('/home/cpanel/cpanelsync/' . $tree) || die "Unable to chdir: $!";
	}
}

sub listdir {
   my $dir = shift;
   opendir(RDDF, $dir);
   my @dirlist = readdir(RDDF);
   @dirlist = grep(!/^\.+$/,@dirlist);
   closedir(RDDF);
   return(@dirlist);
}


sub saferun {
   my(@PROGA) = @_;
   return if (substr($PROGA[0],0,1) eq '/' && ! -x $PROGA[0]);

   my($output);
   open(PROG,'-|') || exec(@PROGA);
   while(<PROG>) {
      $output .= $_;
   }
   close(PROG);
   return($output);
}

sub addfile {
	my($flistref,$file) = @_;

	$file =~ s/\/$//g;

	$$flistref{$file} = 1;
	$$flistref{$file . '.bz2'} = 1;

	my @dirs = split(/\//, $file);
	pop(@dirs);
	while($#dirs > -1) {
		$$flistref{join('/',@dirs)} = 1;
		pop(@dirs);
	}
}
