Upload
others
View
14
Download
0
Embed Size (px)
Citation preview
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
FusionInventory
Guillaume Rousse<[email protected]>
Journées francophones de Perl 2011
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Sommaire
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
GLPI
ObjectifsApplication web de gestion de parc
inventairehelpdesk
Détailsapplication PHPmodulaire
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
GLPI
ObjectifsApplication web de gestion de parc
inventairehelpdesk
Détailsapplication PHPmodulaire
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
OCS-NG
ObjectifsSolution autonome de gestion de parc
inventairedéploiement logiciel
Détails
Coté serveur :interface agent Perlinterface utilisateur PHP
Coté agent :
agent Windows C
agent Unix Perl
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
OCS-NG
ObjectifsSolution autonome de gestion de parc
inventairedéploiement logiciel
Détails
Coté serveur :interface agent Perlinterface utilisateur PHP
Coté agent :
agent Windows C
agent Unix Perl
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Tracker
ObjectifsInventaire automatisé pour GLPI de matériels sans agent
découverte matérielinterrogation distante
Détailsplugin GLPI PHPagent Perl
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Tracker
ObjectifsInventaire automatisé pour GLPI de matériels sans agent
découverte matérielinterrogation distante
Détailsplugin GLPI PHPagent Perl
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Avant-hier
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
FusionInventory
ObjectifsAgent multifonction pour GLPI
fusion de l’agent OCS Unix et de l’agent trackermodulaire
Détailsplugin GLPI PHPagent Perl multi-plateformes
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
FusionInventory
ObjectifsAgent multifonction pour GLPI
fusion de l’agent OCS Unix et de l’agent trackermodulaire
Détailsplugin GLPI PHPagent Perl multi-plateformes
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Hier
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Évolution du plugin GLPI
Branches2.2.xcompatibilité GLPI 0.72.x2.3.xcompatibilité GLPI 0.78.x, gestion des inventaires2.4.x (en beta)compatibilité GLPI 0.80.x
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Capture d’écran du plugin GLPI
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Aujourd’hui
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Modularité
Composantsmoteurtaches
Tachesinventaire localwake on landécouverte réseauinventaire distantdéploiement logiciel
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Modularité
Composantsmoteurtaches
Tachesinventaire localwake on landécouverte réseauinventaire distantdéploiement logiciel
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Versatilité
Mode d’exécutionprocessus temporaireprocessus résidant (daemon Unix, service Windows)
Mode de collecte du résultatstockage localenvoi au serveur
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Versatilité
Mode d’exécutionprocessus temporaireprocessus résidant (daemon Unix, service Windows)
Mode de collecte du résultatstockage localenvoi au serveur
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Portabilité
Cible des résultatsdistributionexécution
Exécution
WindowsLinuxMacOSBSD
Solaris
HPUX
AIX
Distribution
sourcespaquetages
installeur interactifarchive autonome
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Portabilité
Cible des résultatsdistributionexécution
Exécution
WindowsLinuxMacOSBSD
Solaris
HPUX
AIX
Distribution
sourcespaquetages
installeur interactifarchive autonome
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Portabilité
Cible des résultatsdistributionexécution
Exécution
WindowsLinuxMacOSBSD
Solaris
HPUX
AIX
Distribution
sourcespaquetages
installeur interactifarchive autonome
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Interopérabilité
Serveur OCScompatibilité : version serveur 1.xfonctionalités :
inventaire localdéploiement logiciel
Serveur GLPIversion serveur 0.72 :
découverte réseauinventaire distant
version serveur 0.78 : fonctionalités complètes
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Interopérabilité
Serveur OCScompatibilité : version serveur 1.xfonctionalités :
inventaire localdéploiement logiciel
Serveur GLPIversion serveur 0.72 :
découverte réseauinventaire distant
version serveur 0.78 : fonctionalités complètes
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Inventaire local
Composants matérielsCPU, mémoire, etc...bus USB, PCI, SCSIpériphériques connectés
Composants logiciels
système d’exploitationliste de paquetages
Configuration
paramètre réseauparamètre affichagevariables d’environnement
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Inventaire local
Composants matérielsCPU, mémoire, etc...bus USB, PCI, SCSIpériphériques connectés
Composants logiciels
système d’exploitationliste de paquetages
Configuration
paramètre réseauparamètre affichagevariables d’environnement
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Inventaire local
Composants matérielsCPU, mémoire, etc...bus USB, PCI, SCSIpériphériques connectés
Composants logiciels
système d’exploitationliste de paquetages
Configuration
paramètre réseauparamètre affichagevariables d’environnement
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Découverte réseau
Principebalayage d’une plage réseauidentification des éléments trouvés
BalayagenmapNetBIOSSNMP
IdentificationSNMPattribution d’un modèle descriptif
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Découverte réseau
Principebalayage d’une plage réseauidentification des éléments trouvés
BalayagenmapNetBIOSSNMP
IdentificationSNMPattribution d’un modèle descriptif
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Découverte réseau
Principebalayage d’une plage réseauidentification des éléments trouvés
BalayagenmapNetBIOSSNMP
IdentificationSNMPattribution d’un modèle descriptif
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Inventaire distant
PrincipeSNMPutilisation d’un modèle descriptif
Matériel réseauports utiliséséquipements branchés
Imprimantescompteurs d’impressionniveaux d’encre
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Inventaire distant
PrincipeSNMPutilisation d’un modèle descriptif
Matériel réseauports utiliséséquipements branchés
Imprimantescompteurs d’impressionniveaux d’encre
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Inventaire distant
PrincipeSNMPutilisation d’un modèle descriptif
Matériel réseauports utiliséséquipements branchés
Imprimantescompteurs d’impressionniveaux d’encre
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Déploiement logiciel
Principetéléchargement d’une charge utileexécution
Intérêttéléchargement pair à pairexécution immédiateutilisation des critères de sélection de GLPI
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Déploiement logiciel
Principetéléchargement d’une charge utileexécution
Intérêttéléchargement pair à pairexécution immédiateutilisation des critères de sélection de GLPI
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
CaractéristiquesCapacitésObjectifs
Versions
Branches2.0.x version initiale2.1.x branche stableajout du support Windows, nettoyage syntaxique2.2.x branche développementnettoyage architecture, maintien de la compatibilité OCS3.x branche expérimentalechangement architecture, abandon de la compatibilité OCS
Version stable2.1.9
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Support syslog
FusionInventory::LoggerBackend::Syslog
set logsock ( ’ un ix ’ ) ;openlog ( " fus ion inven to ry−agent " , ’ cons , p id ’ , $ENV{ ’USER ’ } ) ;sys log ( ’ debug ’ , ’ sys log backend enabled ’ ) ;c lose log ( ) ;
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Extraction des logiciels installés sous HPUX
FusionInventory::Agent::Task::Inventory::OS::HPUX::Software
@sof tL is t = ‘ s w l i s t | grep −v ’ ^ PH ’ | grep −v ’ ^# ’ | t r −s " \ t " " " | t r −s " " ‘
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Export de fonctions
FusionInventory::Agent::Task::Inventory
my $backendSharedFuncs = {can_run => sub {
. . .} ,
} ;
foreach my $package ( @packages ) {foreach my $func ( keys %{$backendSharedFuncs } ) {
$package−>{$func } = $backendSharedFuncs−>{$func } ;}
}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Grand chantier
Nettoyage du codesyntaxestructurationarchitecture
Amélioration des performancesmémoisationindexation
Amélioration fonctionnellesinterface RESTremplacement de XML par JSONmodèle conceptuel homogène
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Grand chantier
Nettoyage du codesyntaxestructurationarchitecture
Amélioration des performancesmémoisationindexation
Amélioration fonctionnellesinterface RESTremplacement de XML par JSONmodèle conceptuel homogène
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Grand chantier
Nettoyage du codesyntaxestructurationarchitecture
Amélioration des performancesmémoisationindexation
Amélioration fonctionnellesinterface RESTremplacement de XML par JSONmodèle conceptuel homogène
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Avancement
1 Solutions de gestion de parc informatique
2 Présentation de l’agentCaractéristiquesCapacitésObjectifs
3 Implémentation de l’agentUn lourd héritageStratégie de test
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Suite de tests
État actuel1330 tests, 76 fichierscouverture très hétérogène
Problèmestester des interactions client-serveurtester l’analyse du résultat d’une commandetester la réponse à un environnement
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Suite de tests
État actuel1330 tests, 76 fichierscouverture très hétérogène
Problèmestester des interactions client-serveurtester l’analyse du résultat d’une commandetester la réponse à un environnement
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Tester des interactions client-serveur
Serveur de testTest::Apache2 :(Net::Server::HTTP :(HTTP::Server::Simple :)
Fonctionnalité additionellesHTTP::Server::Simple::AuthenIO::Socket::SSLHTTP::Proxy
Utilisation de véritable serveurserveur public ou privétest obligatoire ou conditionel
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Tester des interactions client-serveur
Serveur de testTest::Apache2 :(Net::Server::HTTP :(HTTP::Server::Simple :)
Fonctionnalité additionellesHTTP::Server::Simple::AuthenIO::Socket::SSLHTTP::Proxy
Utilisation de véritable serveurserveur public ou privétest obligatoire ou conditionel
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Tester des interactions client-serveur
Serveur de testTest::Apache2 :(Net::Server::HTTP :(HTTP::Server::Simple :)
Fonctionnalité additionellesHTTP::Server::Simple::AuthenIO::Socket::SSLHTTP::Proxy
Utilisation de véritable serveurserveur public ou privétest obligatoire ou conditionel
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Tester l’analyse du résultat d’une commande
Objectiftester le code qui analyse le résultat d’une commande
Code initial
my @output = ‘command ‘ ;foreach my $ l i n e ( @output ) {
i f ( $ l i n e =~ / ^ foo : ( . ∗ ) / ) {$ inventory−>addItem ( $1 ) ;
}}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Tester l’analyse du résultat d’une commande
Objectiftester le code qui analyse le résultat d’une commande
Code initial
my @output = ‘command ‘ ;foreach my $ l i n e ( @output ) {
i f ( $ l i n e =~ / ^ foo : ( . ∗ ) / ) {$ inventory−>addItem ( $1 ) ;
}}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Adapter le code au test
Code intermédiaire
$inventory−>addItems ( $_ ) foreach get I tems ( ) ;
sub get I tems {my @output = ‘command ‘ ;my @items ;foreach my $ l i n e ( @output ) {
push @items , $1 i f $ l i n e =~ / ^ foo : ( . ∗ ) / ;}return @items
}
Code final
$inventory−>addItems ( $_ ) foreach get I tems (command => ’command ’ ) ;
sub get I tems {my $handle = getF i leHandle (@_) ;while (my $ l i n e = <$handle >) {
push @items , $1 i f $ l i n e =~ / ^ foo : ( . ∗ ) / ;}close $handle ;return @items ;
}Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Adapter le code au test
Code intermédiaire
$inventory−>addItems ( $_ ) foreach get I tems ( ) ;
sub get I tems {my @output = ‘command ‘ ;my @items ;foreach my $ l i n e ( @output ) {
push @items , $1 i f $ l i n e =~ / ^ foo : ( . ∗ ) / ;}return @items
}
Code final
$inventory−>addItems ( $_ ) foreach get I tems (command => ’command ’ ) ;
sub get I tems {my $handle = getF i leHandle (@_) ;while (my $ l i n e = <$handle >) {
push @items , $1 i f $ l i n e =~ / ^ foo : ( . ∗ ) / ;}close $handle ;return @items ;
}Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Utiliser une couche d’abstraction
getFileHandle
sub getF i leHandle {my %params = @_;
my $handle ;
SWITCH: {i f ( $params { f i l e } ) {
i f ( ! open $handle , ’ < ’ , $params { f i l e } ) {$params { logger}−>e r r o r ( "Can ’ t open f i l e $params { f i l e } : $ERRNO" ) ;return ;
}l as t SWITCH;
}i f ( $params {command } ) {
i f ( ! open $handle , ’−| ’ , $params {command} . " 2 >/dev / n u l l " ) {$params { logger}−>e r r o r ( "Can ’ t run command $params {command } : $ERRNO" ) ;return ;
}l as t SWITCH;
}die " n e i t h e r command nor f i l e parameter given " ;
}
return $handle ;}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Problème de disponibilité du résultat
Commandes et fichiers exotiqueslsvpd sur AIXmachinfo sur HPUX/proc/cpuinfo sur Linux Alpha
Campagnes de collecte d’échantillons
répertoire resourcesbesoin d’organisation (tri, tracabilité, ...)
Problème sous Windowsbase de registreWMI
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Problème de disponibilité du résultat
Commandes et fichiers exotiqueslsvpd sur AIXmachinfo sur HPUX/proc/cpuinfo sur Linux Alpha
Campagnes de collecte d’échantillons
répertoire resourcesbesoin d’organisation (tri, tracabilité, ...)
Problème sous Windowsbase de registreWMI
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Problème de disponibilité du résultat
Commandes et fichiers exotiqueslsvpd sur AIXmachinfo sur HPUX/proc/cpuinfo sur Linux Alpha
Campagnes de collecte d’échantillons
répertoire resourcesbesoin d’organisation (tri, tracabilité, ...)
Problème sous Windowsbase de registreWMI
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Tester la réponse à un environnement
Objectiftester le code qui sélectionne la commande à utiliser
Code initial
my @packages =−x ’ / b in / rpm ’ ? getRPMPackagesList (command => ’ rpm −qa ’ ) :−x ’ / b in / dpkg ’ ? getDPKGPackagesList (command => ’ dpkg − l ’ ) :−x ’ / b in / equery ’ ? getEqueryPackagesList (command => ’ equery l i s t − i ’ ) :
( ) ;}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Tester la réponse à un environnement
Objectiftester le code qui sélectionne la commande à utiliser
Code initial
my @packages =−x ’ / b in / rpm ’ ? getRPMPackagesList (command => ’ rpm −qa ’ ) :−x ’ / b in / dpkg ’ ? getDPKGPackagesList (command => ’ dpkg − l ’ ) :−x ’ / b in / equery ’ ? getEqueryPackagesList (command => ’ equery l i s t − i ’ ) :
( ) ;}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Adapter son code
Code final
my @packages =canRun ( ’ / b in / rpm ’ ) ? getRPMPackagesList (command => ’ rpm −qa ’ ) :canRun ( ’ / b in / dpkg ’ ) ? getDPKGPackagesList (command => ’ dpkg − l ’ ) :canRun ( ’ / b in / equery ’ ) ? getEqueryPackagesList (command => ’ equery l i s t − i ’ ) :
( ) ;}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Utiliser une couche d’abstraction
canRun
sub canRun {my ( $wanted ) = @_;
return −x $wanted ;}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Redéfinir des fonctions
mockGetRun
sub mockCanRun {my (%params ) = @_;
my $new = sub {my $wanted = $_ [ 0 ] ;return $params {commands}−>{$wanted } ;
} ;
no warnings ’ rede f i ne ’ ;∗Fus ionInventory : : Agent : : Tools : : canRun = $new ;
}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Redéfinir des fonctions
mockGetFileHandle
sub mockGetFileHandle {my (%params ) = @_;
my $old = \& Fus ionInventory : : Agent : : Tools : : ge tF i leHandle ;
my $new = sub {my (%opt ions ) = @_;
my $ f i l e = $params {commands}−>{$wanted } ;
i f ( $ f i l e ) {pr in t STDERR " f i l e ’ $ f i l e ’ de l i ve red \ n " ;return $old−>(@_, f i l e => $ f i l e ) ;
} else {pr in t STDERR " noth ing de l i ve red \ n " ;return ;
}} ;
no warnings ’ rede f i ne ’ ;∗Fus ionInventory : : Agent : : Tools : : ge tF i leHandle = $new ;
}
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Simuler un environnement
Code
package Fus ionInventory : : Test : : MockSystem : : Debian ;
use Fus ionInventory : : Test : : MockSystem ;
mockSystem (commands => {
’ dpkg ’ => ’ resources / packaging / dpkg ’} ,f i l e s => {
’ / e tc / debian_vers ion ’ => ’ resources / re lease / debian ’}
) ;
Utilisation$> perl -MFusionInventory::Test::MockSystem::Debian \
fusioninventory
Guillaume Rousse FusionInventory
Solutions de gestion de parc informatiquePrésentation de l’agent
Implémentation de l’agent
Un lourd héritageStratégie de test
Simuler un environnement
Code
package Fus ionInventory : : Test : : MockSystem : : Debian ;
use Fus ionInventory : : Test : : MockSystem ;
mockSystem (commands => {
’ dpkg ’ => ’ resources / packaging / dpkg ’} ,f i l e s => {
’ / e tc / debian_vers ion ’ => ’ resources / re lease / debian ’}
) ;
Utilisation$> perl -MFusionInventory::Test::MockSystem::Debian \
fusioninventory
Guillaume Rousse FusionInventory