#! /usr/bin/perl
use Getopt::Std;
use File::Copy;
use vars qw($opt_d);


require '/usr/lib/kwartz/control/sharelib.pl';		#load common fonctions and defintion

my $varlogfile = "/var/log/kwartz-rembo6.log";
my $logfile = "/root/kwartz-configuration.log";
my $ver;
my ($licence, $key);

sub mklogfile
{
    my $log_rep = "/root/kwartz";
    my $date = `date '+%Y%m%d'`; chomp ($date);

    print "pas rep" if ( ! -d "$log_rep" );
    mkdir ($log_rep) if ( ! -d "$log_rep" );
    if ( -f $logfile ) {
		system ("mv $logfile $log_rep/.");
		symlink ("$log_rep/kwartz-configuration.log", $logfile);
    }

	my $name = "$log_rep/kwartz-configuration.log.$date";
	for (my $loop=0; ( -f "$name" ); $loop++ ) {
#		print "loop\n";
		$name = "$log_rep/kwartz-configuration.log.$date-$loop";
    }
    if ( ! open (FH, ">$name")) {
	    warn "cannot touch $name: $!";
		return 1;
	} else {
		unlink ($logfile) if ( -l $logfile );
		symlink ($name, $logfile);
		close (FH);
	}
	return 0;
}


sub mysystem 
{
	print "$_[0]\n" if ($opt_d); 
	system ($_[0]);
}

# récupération de l'url
# proxy sur la connexion isp?
$workfile=$workfile{"isp"};
#initialize data values...
my $http_proxy='';
if (-f $workfile) {
  #... from work file
  &read_file($workfile,\%ispconf);
  if ($ispconf{"ProxyAddress"}) {
    $http_proxy="http://$ispconf{'ProxyAddress'}";
    $http_proxy.=":$ispconf{'ProxyPort'}"
      if ( $ispconf{'ProxyPort'} );
  }
}
$ENV{'http_proxy'}="$http_proxy";
$ENV{'DEBIAN_FRONTEND'}='noninteractive';

# vérification de la licence
my $keyfile=$workfile{'kwartzkey'};
if ( ! -f $keyfile) {
	print "Vous devez au préalable inscrire la clé Kwartz pour bénéficier de cette fonctionnalité\n";
	exit 1;
}
&read_file($keyfile,\%kwartzkey);
$licence = $kwartzkey{'licence'};

open (KEY, "<$workfile{'kwartzkey'}");
my @keyfile = <KEY>;
close KEY;
$key;
foreach (@keyfile) {
	$key = $1 if (m/^key:(\d+)/) ;
}
# TODO transformer d'éventuels @ en %40

my $upd_user=$licence;
my $upd_pass=$key;

# nettoyage
mysystem ("apt-get autoclean >/dev/null 2>&1");

# verif repository dpkg
my @dpkgok = `dpkg -C`;
my $pklist;
if ( $#dpkgok >= 0) {
	print "Une installation précédente à échoué. Il est impossible de réaliser de nouvelle mise à jour à distance\n";
	foreach (@dpkgok) {
		$pklist.=" $1" if (m/^ (\S+)/);
	}
	print "$pklist\n";
	exit 1;
}

# verif espace libre
my @diskused = `df -m / /var`;
foreach (@diskused) {
	next if (! m/^\//);
	my @fields = split;
    if ($fields[3] < 30) {
		print ("L'espace système est trop petit pour faire une mise à jour à distance");
		exit 1;
	}
}

# récupération de la version
open (VER, "</etc/debian_version");
my @version = <VER>;
close VER;
$version[0] =~ m/(.+) (?:kwartz|KWARTZ)~*(\D*)(\d+.\w+)/;
my $debver = $1;
my $type = $2;
$type = "Server" if ( $type eq "" );

$ver = $3;


# mise à jour
sub CreateSourceList
{
	my ($source, @uri)= @_;

	if (open (SOURCE, ">$source")) {
		print SOURCE join "\n", @uri;
		close SOURCE;
	}
}

sub GetUpdate
{
	my ($source, @uri)= @_;
	my $error = 0;
	my $res = 0;
	
	my @gooduri=();
	my $tmplog='/tmp/kwartz-update.log';
	# boucle pour tester les uri
	foreach (@uri) {	
		warn $_ if ($opt_d);
		CreateSourceList($source, $_);
		# on reset log pour chaque test sinon analyse fichier ne fonctionne pas
		mysystem ("apt-get -qqy --no-list-cleanup -o Dir::Etc::SourceList=$source update > $tmplog 2>&1");
		if ($? == 0) {
			#OK
			push @gooduri, $_;
			next;
		}
		if ($? == -1) {
			print "erreur d'exécution apt-get";
				unlink $tmplog;
			return -1;
		}
		# erreurs ignorees si pas site kwartz (ie security.debian plus accessible)
		if (/kwartz.com/ || /iris-tech.com/) {
		    $error = -1;
			open (LOG, "<$tmplog");
		    my @varlog = <LOG>;
		    close LOG;
		    foreach (@varlog) {
			  if (m/ 401\s+Authorization Required/) {$error=401; last;};
			  if (m/ 404\s+Not Found/) {$error=404; last;};
			  if (m/ connect\s+\(113/) {$error=113; last;};
			  if (m/ connect\s+\(101/) {$error=101; last;};
		    }
		}
	}
	unlink $tmplog;
	if (@gooduri && !$error) {
		CreateSourceList($source, @gooduri);
		mysystem ("apt-get -qqy --no-list-cleanup -o Dir::Etc::SourceList=$source update >> $varlogfile 2>&1");
	} else {
	    if ($error == 401) {print "La clé Kwartz n'est pas à jour\n";}
	    elsif ($error == 404) {print "Pas de mise à jour disponible\n";}
	    elsif ($error == 113) {print "Problème réseau: Aucun chemin d'accès\n";}
	    elsif ($error == 101) {print "Problème réseau: Non accessible\n";}
	    else {print "Impossible de récupérer les informations de mise à jour\n";}
		return 1;
	}
}

sub Debconf
{
	open (DEBCONF, "|debconf-set-selections");
	print DEBCONF <<EOF;
#Java
sun-java6-bin   shared/accepted-sun-dlj-v1-1    boolean true
sun-java6-jre   shared/accepted-sun-dlj-v1-1    boolean true
sun-java6-jre   sun-java6-jre/stopthread        boolean true
sun-java6-jre   sun-java6-jre/jcepolicy note
sun-java6-bin   shared/present-sun-dlj-v1-1     note
sun-java6-jre   shared/present-sun-dlj-v1-1     note
EOF
	close DEBCONF;
}

# mise à jour des paquets kwartz
sub Update
{
	my ($info) = @_;
	my $source="/etc/kwartz/sources.list";
	my @uri = ("deb http://$upd_user\:$upd_pass\@kwartz.iris-tech.com/update/   $autoupdate/rembo6/");
 
	my $res = 0;
	my $badkey = 0;

	return 1 if (GetUpdate($source, @uri) != 0);

	my $res=0;

	Debconf();
	my $aptcmd0="apt-get -qy -o Dir::Etc::SourceList=$source -o DPKG::Options::=--force-overwrite -o DPKG::Options::=--force-confold dist-upgrade";
	mysystem ("$aptcmd0 >> $varlogfile 2>&1");
	$res = ($?>>8);
	mysystem ("apt-get autoclean >/dev/null 2>&1");
	if ($res != 0) {
		print "Une erreur est survenue lors de la mise à jour d'un composant\n";
		return 1;
	}
	return 0;
}

sub url_to_list
{
    my ($url) = @_;
    $url =~ s/^(http|ftp):\/\///;
    $url =~ s/\//_/g;
	$url =~ s/\.gz$//;
    $url =~ s/\.bz2$//;
	return $url;
}

sub url_to_uri
{
	my ($url) = @_;
	my $uri = "";

	$uri = "deb $1 $2 $3" if ($url =~ m/^((?:http|ftp):\/\/[\w.]+)\/dists\/([\w\/]+)\/(main|contrib|non-free)\/binary-i386/);
	return $uri;
}

my $res = 0;

getopts('d');

unlink "$varlogfile";
mklogfile

system ("echo -n Update: >> $varlogfile");
$res = Update (0);
system ("echo $? >> $varlogfile");

copy($varlogfile,$logfile);

exit $res;
