#! /usr/bin/perl -w

#  basé sur Configs-Backups/sc.pl de Yann GROSSEL

use Cwd;

my $old_cwd = getcwd();

$t = '/usr/local/Claranet/Logs-Sync';
# Machine sur laquelle les logs sont envoyes : vaucluse
$logshostname = 'vaucluse'; # juste pour les affichages
$logshost = '212.43.194.32';
# user sur le serveur
$logsuser = 'claralogs';

if (`uname -n` eq "tipi\n") {
       $t = '/home/charlybr/work/tmp/Logs-Sync/TEST';
}

##########################################################################################

sub find_command(@)
{
	for my $c (@_) { return $c if (-x $c); }
	return undef;
}

# die "\nCe script doit être lancé en root !\n\n" if $>;
die "\nUtilisation: setup-logs-sync.pl <hostname du client>\n\n" if (scalar(@ARGV) != 1);

system("clear");

$host = $ARGV[0];
$host =~ tr/A-Z/a-z/;
$uhost =  substr($host, 0, 1);
$uhost =~ tr/a-z/A-Z/;
$uhost .= substr($host, 1);

$t =~ s/\/*$//;

umask 077;

system("mkdir -p $t");

chdir($t) or die "$!";

chmod 0700, '.';

# ssh.config

if (! -f 'ssh.config')
{
	open F, ">ssh.config" or die "$!";
	print F "\nHost $logshost\n\tUser $logsuser\n\tIdentityFile $t/logs-sync.key\n\n";
	close F or die "$!";
	chmod 0400, 'ssh.config';
}

# clés publique/privée

if (! -f 'logs-sync.key' or ! -f 'logs-sync.key.pub')
{
	system("ssh-keygen -t dsa -f logs-sync.key -C 'Logs depuis $uhost' -N ''");
	chmod 0400, 'logs-sync.key';
	chmod 0400, 'logs-sync.key.pub';
	$new = "(NOUVELLE CLE, GENEREE IL Y A 2 SECONDES !)";
}
else
{
	$new = "(clé déjà existante, non regénérée)";
}

print "\n\nClé publique à copier-coller sur $logshostname $new :\n\n";

open F, 'logs-sync.key.pub' or die "$!";
print 'command="exec /usr/bin/rsync --server --daemon --config ~' . $logsuser . '/Hosts/' . $host . '/rsyncd.conf ." ';
while (<F>) { print; }
close F;

print "\n\n";

# logs-sync.pl

unlink './logs-sync.pl';

$cmd = find_command( '/usr/bin/wget', '/usr/local/bin/wget', '/usr/bin/fetch');
die "\n\nImpossible de trouver wget ou fetch :(\n\nAbort !\n\n" if (not defined $cmd);

system("$cmd http://svn.fr.clara.net/files/Logs-Sync/logs-sync.pl");

chmod 0700, 'logs-sync.pl';

# Crontab

$found = 0;

open F, '/etc/crontab' or die "$!";
while (<F>) { if (m/Logs-Sync.logs-sync.pl/) { $found = 1; last; } }
close F;

if ($found) { print "\nNot updating crontab.\n\n"; }
else
{
	open F, '>>/etc/crontab' or die "$!";
	print F "\n# Synchronisation des fichiers de log\n";
	print F "# <MINUTE>  4   *   *   *  root  /usr/local/Claranet/Logs-Sync/logs-sync.pl\n\n";
	close F;
	print "\nCrontab UPDATEE - Mais il faut décommenter la ligne ;)\n\n";
}

# backups.conf

if (! -f 'logs-sync.conf')
{
	open F, '>logs-sync.conf';

	print F "#\n";
	print F "# Configuration pour les fichiers de $uhost à envoyer sur $logshostname.\n";
	print F "#\n";
	print F "# Les lignes commen\xe7ant par '/' indiquent les fichiers à envoyer.\n";
	print F "#\n";
	print F "# La ligne contenant 'rsync = '   indique le path de la commande rsync à utiliser.\n";
	print F "# La ligne contenant 'ssh = '     indique le path de la commande ssh à utiliser.\n";
	print F "# La ligne contenant 'targets = ' indique les machines cibles sur lesquelles faire les backups. Les différentes\n";
	print F "#                                 cibles (s'il y en a plusieurs) doivent \xeatre séparées par des espaces. Les cibles\n";
	print F "#                                 sont au format: adresse_ip::module\n";
	print F "#\n\n";

	$ssh = find_command('/usr/local/bin/ssh', '/usr/bin/ssh');
	if (defined($ssh)) { print F "ssh = $ssh\n\n"; }
	else { print F "# ssh = ???\n\n"; print "\n\n===> ATTENTION: SSH NOT FOUND !\n\n"; }

	$rsync = find_command(
		'/usr/local/rsync-2.6.0/bin/rsync',
		'/usr/local/rsync-2.5.7/bin/rsync',
		'/usr/local/rsync-2.5.6/bin/rsync',
		'/usr/local/rsync/bin/rsync',
		'/usr/local/bin/rsync',
		'/usr/bin/rsync'
	);

	if (defined($rsync)) { print F "rsync = $rsync\n\n"; }
	else { print F "# rsync = ???\n\n"; print "\n\n===> ATTENTION: RSYNC NOT FOUND !\n\n"; }

	print F "targets = ".$logshost."::logs-sync\n\n";		# Par défaut, on backupe sur $logshostname

	print F "# Liste des fichiers à envoyer\n\n";

	close F;
}

chmod 0600, 'logs-sync.conf';

# Terminé.

chmod 0500, '.';

print "\n\nOK !\n\n";

chdir($old_cwd) or die "Can't chdir back to $old_cwd: $!\n";

unlink("./setup-logs-sync.pl") or die "Can't unlink(setup-logs-sync.pl): $!\n";

print "(Script setup-logs-sync.pl supprimé).\n\n";

exit 0;

