Action sur Clipboard

Je ne sais pas vous, mais moi, j’ai longtemps cherché un moyen d’analyser le contenu de mon presse-papier(Clipboard) windows. Je fais du SAV, et je dois souvent copier / coller des références, des adresses IPs ou des numéros de téléphones… dans 80% des cas ce sont les mêmes actions qui suivent:

  • telnet/ssh sur les IPs
  • les mêmes outils pour les références
  • ouvrir des ticket d’incidents

Bref, je me suis développé un petit outils en perl qui évolue régulièrement et qui me permet d’automatiser des actions en fonction du contenu de mon clipboard. Je l’ai appelé MTC (MegaTool Clipboard [pas du tout prétentieux]).

La base

Le principe est simple et ce base sur des bibliothèques existantes:

# VARIABLES
my $CLIP = Win32::Clipboard();
my $contenu;
while(1){
  	$CLIP->WaitForChange();
  	$contenu = $CLIP->get();
  	#on repère des formes, on fait des modif et on actualise le contenu du presse-papier
  	$CIP->set('bla bla bla');
}

Un squelette plutôt simple en somme. Qu’il suffit d’habiller pour reconnaitre des formes. Comme je ‘lai déjà dit je ne suis pas un pro du script ou du code. Je fais comme je peux, avec ce que j’ai. Et souvent la contrainte du temps est forte.

L’épuration

Donc, pour habiller ce script, je fais une choses au tout début:

	$contenu =~ s/(\s+)$//g;
	$contenu =~ s/^(\s+)//g;
	$CLIP->Set($contenu);

Je supprime les espaces à la fin et au début de la chaîne. Parce que les outils au boulot interprète les espaces… même si la référence n’est pas censée en avoir… par exemple  » XXXXXXX  » avec un espace au début et/ou à la fin, ne passera pas dans l’outil… Je ne suis pas spécialiste mais si je peux le faire, je pense qu’il doit y avoir une fonction dans tous les langage Web pour ne pas prendre en compte les caractères de types espaces ou autre.

Le problème de l’épuration

Et c’est la que mon plus gros problème (toujours d’actualité) arrive… Quand je ne copie pas une chaine de caractère mais une image par exemple… la suppression de ces espaces détruise souvent l’objet. Je suis obligé de couper le script pour pouvoir faire des copier coller d’images ou d’excel. Heureusement je n’en fait pas tous les jours.

Reconnaitre et modifier les chaines

Une fois que j’ai « épuré » la chaîne, je passe à la reconnaissance avec une série if/elsif:

  • Un numéro de téléphone avec espace (que je supprime… oui je n’aime pas les espace)
if($contenu =~ m/^(\d{2}\s){4}(\d{2}|\d{2}\s)/){
		$contenu2 = $contenu;
		$contenu2 =~ s/\s//g;
		print "Mise a jour du contenu du clipboard.\n";
		$CLIP->Set($contenu2);
}
  • Un numéro de téléphone pointé (avec des points… que je supprime :p)

Sans rire, je supprime tous les caractères qui ne sont pas indispensables et qui pourrait me faire perdre du temps plus tard (une appli par exemple)

  • Et une dernière pour les numéros de téléphones au format international (mais français)
  • Une adresse IP (mon expression régulière préférée <3)
contenu =~ m/^( *)([O1]?\d\d?|2[0-4]\d|25[0-5])\.([O1]?\d\d?|2[0-4]\d|25[0-5])\.([O1]?\d\d?|2[0-4]\d|25[0-5])\.([O1]?\d\d?|2[0-4]\d|25[0-5])( *)$/

Vous avez compris, après ce sont surtout des références en internes qui sont plutôt simple à à identifier.

Je vais m’attarder sur l’utilité limité du script tel que je vous en parle actuellement:

Il ne fait pas grand chose, j’épure le clipboard, les numéros de téléphone. J’ajoute un « t » ou un « p » devant les IPs pour telnet ou ping (on utilise très peu SSH, on reste sur le réseau d’administration Opérateur).

Auto Hot Key

Du coup j’ai ajouté un autre langage, que j’ai découvert grâce à un collègue: AHK (Auto Hot Key). Qui permet de (je cite wikipédia) « automatiser certaines tâches sous windows ». Comme bouger des fenêtre, cliquer, des raccourcis ou encore des détections.

Je vais prendre un exemple concret: les IPs. J’utilise une bibliothèque (Net::IP;) que j’utilise uniquement pour reconnaitre le type d’IP (publique ou privée). Nous avons les deux types, même si les publiques sont de moins en moins utilisées au profit des privées.

J’ai quelques choses du genre:

		$ip = new Net::IP($contenu) or die (Net::IP::Error());
		# ADRESSE IP PUBLIQUE OU PRIVEE
		$type = $ip->iptype();
		# ON TELNET
		# ON ACTUALISE LE CONTENU DU CLIPBOARD
		system('megatools.ahk');
		print "Que veux tu faire ?\n";
		print "1/ Telnet\n";
		print "2/ Ping\n";
		print "3/ Rien\n";
		$ok = 1;
		while($ok == 1){
			print "=> ";
			$subchoix = <STDIN>;
			if($subchoix =~ m/\d/){
				$ok = 0;
			}
		}
		if($subchoix == 1){
			$CLIP->Set("t ".$contenu);
			if($type =~ m/PRIVATE/){
				system('privee.ahk');
			}
			elsif($type =~ m/PUBLIC/){
				system('public.ahk');
			}
		}elsif($subchoix == 2){
			$CLIP->Set("p ".$contenu);
			if($type =~ m/PRIVATE/){
				system('privee.ahk');
			}
			elsif($type =~ m/PUBLIC/){
				system('public.ahk');
			}
		}elsif($subchoix == 3){
			$CLIP->Set($contenu);
			system('mini.ahk');
		}

Qui me propose quand je copie une IP de faire un telnet, un ping ou de ne rien faire. Si je choisi ping ou telnet le bon terminal (publique ou privée) s’ouvre.

Exemple pour les adresses IPs Privées:

;IfWinExist, ahk_class VanDyke Software - SecureCRT
;{
;	WinActivate
;}
IfWinExist, PRIVEE
{
	WinActivate
}
else
{
	Run, C:\My Program Files\Secur CRT\SecureCRT.exe /S PRIVEE
}

Si le terminal n’est pas lancé (typiquement, le matin ou si j’ai modifié le nom du premier pour une observation) il est automatiquement lancé.

Voila, je posterai une base de code. Si vous avez des idées pour améliorer n’hésitez pas à reprendre ou à me contacter.

Bonne nav’

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *