#!/usr/bin/perl -w
use strict;

###################### En tête CSV pour tous les tests hors Youtube :
# Date;Heure;Client;Serveur;Debit Moyen;Temps DNS;Temps connect;Temps connect+DNS;Temps start transfer+DNS;Temps total;Taille;Remote IP

###################### En tête CSV pour les tests Youtube :
# Date;Heure;Client;Serveur;Debit Moyen;Ping min;Ping avg;Ping max;Ping mdev;Ping perte;Taille;Serveur Youtube

# Débit affichés en Mb/s (1 Mb/s = 1 000 000 bits)
# Taille affichée en Mo (1 Mo = 1 000 000 octets)

###################### ARGUMENTS PASSES EN LIGNE DE COMMANDE ##############################
#   Variable          Liste des arguments
#1- $client_IPv4      Réaliser les tests IPv4    : IPv4      Ignorer les tests IPv4 : n
#2- $client_IPv6      Réaliser les tests IPv4    : IPv6      Ignorer les tests IPv4 : n
#3- $client_Youtube   Réaliser les tests Youtube : y         Ignorer les tests IPv4 : n
#4- $SmokePing        Stoper SmokePing           : y         Ignorer les tests IPv4 : n
my $client_IPv4 = "$ARGV[0]";
my $client_IPv6 = "$ARGV[1]";
my $client_Youtube = "$ARGV[2]";
my $SmokePing = "$ARGV[3]";
if ("$SmokePing" eq "") { print "\nErreur : Manque arguments\n"; die "===> Manque arguments\n"; }

sub curl
{
	# INITIALISATION DES VARIABLES
	my ($Date, $Heure, $client_nom, $serveur_nom, $serveur_proto, $serveur_url) = @_;
	my @curl1 = "";
	my @curl2 = "";

	###################### Téléchargement CURL ######################
	@curl1 = `/usr/bin/curl -$serveur_proto -s -w %{speed_download}-%{time_namelookup}-%{time_connect}-%{time_starttransfer}-%{time_total}-%{size_download}-%{remote_ip} -o /dev/null "$serveur_url"`;
	#print ("retour curl : $curl1[0] \n");

	###################### Post-traitelment données brut CURL ######################

	@curl2 = split(/-/, $curl1[0]);

	##### speed_download
	$curl2[0] =~ s/,/\./; # remplacer la 1ére virgule par un point
	my $speed_download = 8 * $curl2[0] /1000000;
	$speed_download =~ s/\./,/; # remplacer le 1er point par une virgule	

	##### time_namelookup
	$curl2[1] =~ s/,/\./; # remplacer la 1ére virgule par un point
	my $time_namelookup = 1000 * $curl2[1];

	##### time_connect
	$curl2[2] =~ s/,/\./; # remplacer la 1ére virgule par un point
	my $time_connect = 1000 * $curl2[2];

	##### time_starttransfer
	$curl2[3] =~ s/,/\./; # remplacer la 1ére virgule par un point
	my $time_starttransfer = 1000 * $curl2[3];

	##### time_total
	my $time_total = $curl2[4];

	##### size_download
	my $size_download = $curl2[5] /1000000;
	$size_download =~ s/\./,/; # remplacer le 1er point par une virgule	

	##### remote_ip (Avec curl 7.29 et sup)
	my $remote_ip = $curl2[6];

	my $time_connect_sans_dns = $time_connect - $time_namelookup;

	###################### Sortie format .csv Excel ######################
	print ("$Date;$Heure;$client_nom;$serveur_nom;$speed_download;$time_namelookup;$time_connect_sans_dns;$time_connect;$time_starttransfer;$time_total;$size_download;$remote_ip\n");
}


sub youtube
{
	# INITIALISATION DES VARIABLES
	my ($Date, $Heure, $client_nom, $serveur_nom, $serveur_url) = @_;
	my @youtube1 = "";
	my @youtube2 = "";
	my @youtube3 = "";

	###################### Téléchargement Youtube-DL ######################
	@youtube2 = `/usr/local/bin/youtube-dl -o '/dev/null' $serveur_url |/bin/grep "ETA 00:00"`;
	#Les données sont toutes sur une même ligne avec des caractére pour revenir au début de la ligne
	#print ("retour youtube :\n$youtube2[0]\n");

	###################### Post-traitelment données brut Youtube-DL ######################
	$youtube2[0] =~ s/ +/ /g; # Supressions des espaces multiples. "g" (global) = pas seulement la première occurrence. 
	@youtube3 = split(/ /, $youtube2[0]); # Séparation des champs par les espaces
	my $youtube_taille = @youtube3; #On identifie la taille du tableau

	##### size_download
	#1ére étape, déterminer si ce sont des "MiB" ou des "KiB"
	@youtube1 = split(/iB/, $youtube3[$youtube_taille-5]); #La taille est le 5éme élément a partir de la fin
	my $youtube_unite = chop($youtube1[0]); # On retir le dernier caractére de $youtube1[0] et on le met dans youtube
	my $size_download = 0; # Si inférieur à 1 Kio sera affiché 0
	if ($youtube_unite eq 'M'){ # Taille en MiB
		$size_download = $youtube1[0] * 1048576 /1000000; # on passe en Mo (x1024x1024/1000000)
		$size_download =~ s/\./,/; # remplacer le 1er point par une virgule
	}

	if ($youtube_unite eq 'K'){ # Taille en KiB
		$size_download = $youtube1[0] * 1024 /1000000; # on passe en Mo (x1024/1000000)
		$size_download =~ s/\./,/; # remplacer le 1er point par une virgule
	}

	##### speed_download
	#1ére étape, déterminer si ce sont des "MiB/s" ou des "KiB/s"
	@youtube1 = split(/iB/, $youtube3[$youtube_taille-3]); #La débit est le 3éme élément a partir de la fin
	$youtube_unite = chop($youtube1[0]); # On retir le dernier caractére de $youtube1[0] et on le met dans youtube

	my $speed_download = 0; # Si inférieur à 1 Kio/s sera affiché 0
	if ($youtube_unite eq 'M'){ # Débit en MiB/s
		$speed_download = $youtube1[0] * 8388608 /1000000; # on passe en Mbit/s (x8x1024x1024/1000000)
		$speed_download =~ s/\./,/; # remplacer le 1er point par une virgule
	}

	if ($youtube_unite eq 'K'){ # Débit en KiB/s
		$speed_download = $youtube1[0] * 8192 /1000000; # on passe en Mbit/s (x8x1024/1000000)
		$speed_download =~ s/\./,/; # remplacer le 1er point par une virgule
	}

	###################### Récupération URL Youtube-DL ######################
	@youtube2 = `/usr/local/bin/youtube-dl -g $serveur_url`;
	#print ("retour youtube2 : $youtube2[0]\n");
	@youtube3 = split(/\//, $youtube2[0]);
	my $remote_ip = $youtube3[2];
	###################### 20 Ping32 IPv4 ######################
	#@youtube1 = `/bin/ping -c 20 -i 0.2 -s 32 -W 1 google.fr`;
	@youtube1 = `/bin/ping -c 20 -A -W 4 $remote_ip`;
	@youtube2 = split(/ /, $youtube1[$#youtube1-1]);
	@youtube3 = split(/%/, $youtube2[5]);
	my $Ping32_perte = $youtube3[0];
	@youtube2 = split(/ /, $youtube1[$#youtube1]);
	@youtube3 = split(/\//, $youtube2[3]);
	my $Ping32_min = $youtube3[0];
	$Ping32_min =~ s/\./,/; # remplacer le 1er point par une virgule
	my $Ping32_avg = $youtube3[1];
	$Ping32_avg =~ s/\./,/; # remplacer le 1er point par une virgule
	my $Ping32_max = $youtube3[2];
	$Ping32_max =~ s/\./,/; # remplacer le 1er point par une virgule
	my $Ping32_mdev = $youtube3[3];
	$Ping32_mdev =~ s/\./,/; # remplacer le 1er point par une virgule

	###################### Sortie format .csv Excel ######################
	print ("$Date;$Heure;$client_nom;$serveur_nom;$speed_download;$Ping32_min;$Ping32_avg;$Ping32_max;$Ping32_mdev;$Ping32_perte;$size_download;$remote_ip\n");
}



###################### GENERATION DE LA DATE ######################
my $time = localtime(time);
my $Annee = substr($time,length($time)-4);
my $Jour = substr($time,8,2);
if ($Jour < 10){ $Jour = "0".substr($Jour,1); }
my $Mois = substr($time,4,3);
if ($Mois eq 'Jan'){ $Mois = "01"; }
if ($Mois eq 'Feb'){ $Mois = "02"; }
if ($Mois eq 'Mar'){ $Mois = "03"; }
if ($Mois eq 'Apr'){ $Mois = "04"; }
if ($Mois eq 'May'){ $Mois = "05"; }
if ($Mois eq 'Jun'){ $Mois = "06"; }
if ($Mois eq 'Jul'){ $Mois = "07"; }
if ($Mois eq 'Aug'){ $Mois = "08"; }
if ($Mois eq 'Sep'){ $Mois = "09"; }
if ($Mois eq 'Oct'){ $Mois = "10"; }
if ($Mois eq 'Nov'){ $Mois = "11"; }
if ($Mois eq 'Dec'){ $Mois = "12"; }
#my $Date = $Annee."-".$Mois."-".$Jour;

#my $Heure = substr($time,length($time)-13,8); # Avec les secondes
#my $DateHeure = $Annee."-".$Mois."-".$Jour." ".$Heure; # Avec les secondes

#my $Heure = substr($time,length($time)-13,5); # Sans les secondes
#my $DateHeure = $Annee."-".$Mois."-".$Jour." ".$Heure.":00"; # Sans les secondes

# Création d'un ID unique pour sauvegarder les fichiers .cap définitivement
#my @main1 = split(/:/, $Heure);
#my $Capture_id = "$Annee$Mois$Jour-$main1[0]$main1[1]";

my $Heure = substr($time,length($time)-13,2); # Calcul de l'heure sans les minutes, ni les secondes
#my $Heure2 = $Heure.":00:00"; # Format MySQL

my $Date = $Jour."/".$Mois."/".$Annee; # Date pour fichier CSV

############# Nom du client (via hostname) #################
my $client_nom = `/bin/hostname -s`;
chomp($client_nom);

############# INITIALISATION DES VARIABLES #################
my $serveur_proto = "0";
my $serveur_nom = "0";
my $serveur_url = "0";

############# Arret SmokePing #############
if ($SmokePing eq 'y'){
	`/usr/bin/sudo /usr/bin/service smokeping stop`;
	`/bin/sleep 10`;
}

############# TEST IPv4 #############
if ($client_IPv4 eq 'IPv4'){
	$serveur_proto = "4";

	#############
	$serveur_nom = "OVH IPv4";
	$serveur_url = "http://proof.ovh.net/speedtest/random4000x4000.jpg";
	curl ($Date, $Heure, $client_nom, $serveur_nom, $serveur_proto, $serveur_url);

	#############
	$serveur_nom = "Bytel srv1";
	$serveur_url = "http://testdebit.info/fichiers/random4000x4000.jpg";
	curl ($Date, $Heure, $client_nom, $serveur_nom, $serveur_proto, $serveur_url);
	#############
	$serveur_nom = "Bytel srv2";
	$serveur_url = "http://2.testdebit.info/fichiers/random4000x4000.jpg";
	curl ($Date, $Heure, $client_nom, $serveur_nom, $serveur_proto, $serveur_url);
	#############
	$serveur_nom = "Bytel srv3";
	$serveur_url = "http://3.testdebit.info/fichiers/random4000x4000.jpg";
	curl ($Date, $Heure, $client_nom, $serveur_nom, $serveur_proto, $serveur_url);
	#############
	$serveur_nom = "Bytel srv4";
	$serveur_url = "http://4.testdebit.info/fichiers/random4000x4000.jpg";
	curl ($Date, $Heure, $client_nom, $serveur_nom, $serveur_proto, $serveur_url);

}


############# TEST IPv6 #############
if ($client_IPv6 eq 'IPv6'){
	$serveur_proto = "6";

	#############
	$serveur_nom = "OVH IPv6";
	$serveur_url = "http://proof.ovh.net/speedtest/random4000x4000.jpg";
	curl ($Date, $Heure, $client_nom, $serveur_nom, $serveur_proto, $serveur_url);

}


############# TEST Youtube #############
if ($client_Youtube eq 'y'){

	$serveur_nom = "Youtube";
	#$serveur_url = "youtube.com/watch?v=Wch3gJG2GJ4"; # vidéo test de 1sec
	#$serveur_url = "youtube.com/watch?v=-tlBs-bgzS4"; # je veux joindre ma hotline (sans pub)
	$serveur_url = "youtube.com/watch?v=9bZkp7q19f0"; # PSY - GANGNAM STYLE
	youtube ($Date, $Heure, $client_nom, $serveur_nom, $serveur_url);
}


############# Lancement SmokePing #############
if ($SmokePing eq 'y'){
	`/usr/bin/sudo /usr/bin/service smokeping start`;
}
