Question Nouveau projet Codeplex : Psionic

Plus d'informations
il y a 10 ans 2 mois #17055 par Laurent Dardenne
Salut Richard,
Richard Lazaro écrit:

Cela fait longtemps que je suis pas venu sur le forum et je ramasse une migraine de bon matin :o

:-)

Richard Lazaro écrit:

Félicitation les mecs, un beau projet.

Merci.
De notre côté les migraines sont fréquentes sur ce projet. Ah la gestion des PSpath, sponsorisé par Aspirine :evil: ...

On aboutit à du code relevé, sans trop de C#, mais PS n'est clairement pas fait pour ça, certains principes des langages POO lui font défaut.
Lorsque nous avons commencé, nous savions que cela prendrait du temps, mais pas à ce point :ohmy:<br><br>Message édité par: Laurent Dardenne, à: 21/02/14 12:50

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 1 mois #17109 par Laurent Dardenne
Une version stable devrait être publiée ce Week end, le code actuel corrige un bug de la v2 et un de la DLL Ionic.
Du moins un cas d'utilisation sous Powershell posant problème, pour le résoudre nous avons dû include au module un programme console ConvertZipToSfx.exe .

Les pages HTML de la documentation du projet Codeplex sont générées à l'aide de l'application PowerShell Cmdlet Help Editor .
Il suffit de les intégrer dans un template :
[code:1]
&lt;!DOCTYPE HTML PUBLIC \&quot;-//W3C//DTD HTML 4.01 Transitional//EN\&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=\&quot;content-type\&quot; content=\&quot;text/html; charset=windows-1250\&quot;&gt;
&lt;meta name=\&quot;generator\&quot; content=\&quot;PSPad editor, www.pspad.com\&quot;&gt;
&lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
PLACEZ le code html généré ici
&lt;/body&gt;
&lt;/html&gt;
[/code:1]
Le fichier de formatage suivant permet de partager une même déclaration pour une classe dotnet et un objet personnalisé Powershell typé et dérivé de cette même classe :
[code:1]
$Logger.Debug(\&quot;Create PSZipEntry\&quot;«»)
$ZipFile.Entries|
Select $PSZipEntryProperties|
Foreach {
$_.PSObject.TypeNames.Insert(0, 'PSZipEntry')
$_
}
[/code:1]
Le détail des balises XML de formatage .<br><br>Message édité par: Laurent Dardenne, à: 4/03/14 15:47

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 1 mois #17142 par Laurent Dardenne
L'aide HTML est en ligne sur le site du projet .
L'aide XML offline la référence (Get-help -Online).

Le projet utilise Psake , un outil d'automatisation de tâches pouvant avoir des dépendances :
[code:1]
Include \&quot;$PsIonicTools\Common.ps1\&quot;

Task default -Depends Delivery,CompilePsIonicTools,BuildXmlHelp,TestBomFinal,Finalize

Task Delivery -Depends Clean,RemoveConditionnal,FindTodo {
#Recopie les fichiers dans le répertoire de livraison
...
[/code:1]

Les tâches exécutées se charge de :

-vérifier l'encodage des fichiers du projet avant et après la génération effectuée,
-supprimer et reconstruire l'arborescence du répertoire de livraison,
-valider le contenu des fichiers de localisation .psd1 ( recherche des clés inutilisées ou absentes),
-exécuter le parsing condionnel, Function Remove-Conditionnal, c'est à dire inclus des fichiers PS1 externes au projet, supprime les lignes de DEBUG,
-recopier les fichiers du référentiel dans l'arborescence du répertoire $PsIonicLivraison,
-valider la syntaxe des scripts,
-compiler la DLL PsionicTools,
-construire l'aide offline XML,
-et enfin, en utilisant le module du projet, génère une archive (.zip) et une archive auto extractible (.exe) exécutant un script de setup.

En un mot, ces tâches automatisent la construction du livrable et les contrôles préliminaires associés.<br><br>Message édité par: Laurent Dardenne, à: 6/03/14 19:24

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 1 mois #17156 par Laurent Dardenne
Comme le projet utilise des logs de debug et que ce module peut être utilisé simultanément dans plusieurs sessions Powershell ou dans une seule session exécutant des job, nous avons ajouté des propriétés contextuelles Log4Net (portée globale).

La configuration XML du format de la chaîne à afficher déclare les propriétés contextuelles de la manière suivante :
[code:1]
&lt;layout type=\&quot;log4net.Layout.PatternLayout\&quot;&gt;
&lt;param name=\&quot;ConversionPattern\&quot; value=\&quot;[PID:%property{Owner}] [%property{JobName}] %-5p %d{yyyy-MM-dd hh:mm:«»ss} – %message%newline\&quot;/&gt;
[/code:1]
'Owner' est le PID de la session Powershell. Si le module est exécuté dans un job, on recherche l'ID du process parent ce qui facilitera le filtrage des lignes de log.
'JobName' est le nom du job, paramétrable via la propriété $JobName publiée par le module Log4Posh.
Ainsi on sait d'où proviennent les logs, mais pour retrouver le nom du producteur on utilisera la méthode synthétique, d'un Logger, nommée PSDebug.
Celle-ci préfixe le message de log du nom du module où a été appelé la méthode.

Le code d'usage suivant :
[code:1]
Import-Module log4posh
ipmo psionic
Get-ZipFile c:\temp\test.zip -list

# LastModified Size CompressedSize Ratio Encrypted Crc FileName
#
----


---
# 05/02/2014 16:14:50 426978 13864 97% False t3.log
# 09/03/2014 13:14:00 6274 1950 69% False MyText
# 09/03/2014 13:14:00 27 26 4% False File1
# 09/03/2014 13:14:00 859 330 62% False PSVersiontable_clixml
# 01/03/2013 20:54:04 822 156 81% False PS/psionic/Revisions.txt
# 09/03/2014 13:14:00 6 8 -33% False Clés1
# 09/03/2014 13:14:00 6 8 -33% False Clés2
# 09/03/2014 15:46:12 6639 1808 73% False HashTable_clixml
[/code:1]
renvoi la ligne de log ci dessous :
[code:1]
[PID:5380] [ConsoleHost] DEBUG 2014-03-11 07:29:23 – PsIonic : The file name is 'c:\temp\test.zip'
[/code:1]
[PID:5380] est l'ID du process Powershell.
[ConsoleHost] est le nom par défaut du job, ici c'est la console Powershell. Pour un job le nom par défaut est 'ServerRemoteHost'.
\&quot;PsIonic : The file name is 'c:\temp\test.zip'\&quot;, est le message préfixé du nom du module.

Cette dernière partie est produite par cet appel :
[code:1]
$Logger.PSDebug(\&quot;The file name is '$ArchivePath'\&quot;«») #&lt;%REMOVE%&gt;
[/code:1]
Pour modifier le nom du Job :
[code:1]
$JobName.Value=\&quot;UnScript\&quot;
Get-ZipFile c:\temp\test.zip -list
[/code:1]
Ce qui génère la ligne suivante
[code:1]
[PID:5380] [UnScript] DEBUG 2014-03-11 07:29:24 – PsIonic : The file name is 'c:\temp\test.zip'
[/code:1]
La même chose, mais dans deux jobs :
[code:1]
$action={
param($MyJobname)
Import-Module log4posh
ipmo psionic
$JobName.Value=$MyJobName
#gzf est un alias PsIonic
gzf c:\temp\test.zip -list
}

start-job -ArgumentList 'Job1' -ScriptBlock $action
start-job -ArgumentList 'Job2' -ScriptBlock $action
[/code:1]
Le résultat dans le fichier de log :
[code:1]
[PID:5380] [Job2] DEBUG 2014-03-11 07:30:02 – PsIonic : The file name is 'c:\temp\test.zip'
[PID:5380] [Job1] DEBUG 2014-03-11 07:30:02 – PsIonic : The file name is 'c:\temp\test.zip'
[/code:1]
Pour ce cas les lignes se chevaucheront.

Enfin le nom du fichier de log est paramétrable à l'aide d'une variable d'environnement :
[code:1]
&lt;file type=\&quot;log4net.Util.PatternString\&quot; value=\&quot;%env{PSIONICLOGPATH}\\PsIonic.log\&quot; /&gt;
[/code:1]
On peut soit la déclarer au niveau machine, soit dans le profile PS utilisateur soit directement dans le script avant le chargement du module.

Le code par défaut du module :
[code:1]
if (-not (Test-Path env:«»PSIONICLOGPATH))
{
Write-Warning \&quot;The environment variable %PSIONICLOGPATH% is not declared, the logs are stored into the directory : $psScriptRoot\Logs\&quot;
$env:«»PSIONICLOGPATH=\&quot;$psScriptRoot\Logs\&quot;
}
Start-Log4Net \&quot;$psScriptRoot\Log4Net.Config.xml\&quot;
$Script:Logger=Get-Log4NetLogger 'File'
[/code:1]
Une fois le module chargé, la variable d'environnement est accessible dans la session :
[code:1]PS C:\Users\Laurent&gt; dir Env:\PSIONICLOGPATH

Name Value
----
PSIONICLOGPATH C:\Users\Laurent\Documents\WindowsPowerShell\Modules\psionic\Logs[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 11/03/14 20:23

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 1 mois #17188 par Laurent Dardenne
Dorénavant, sous réserve de configurer le module à l'aide d'un code spécifique, chaque module utilisant Log4Posh à son propre fichier de configuration et son propre repository.

La conception de la précédente version de Log4Posh supposait que le script principal, ainsi que les modules qu'il référençait, utilisait un fichier de configuration, une variable logger et un fichier de log unique.
Cette approche suffit pour des traitements exécutés dans une nouvelle session et se terminant par la fermeture de celle-ci.

Pour Psionic, on ne connait pas l'usage qui en sera fait, c'est pourquoi j'ai réécrit qq fonctions et revu ce mécanisme de log basé sur Log4Net .
Jusqu'à maintenant le module Log4Posh utilisait le repository par défaut, comme on utilisait le même nom de logger le chargement d'un nouveau fichier de configuration XML impliquait l'écrasement de la configuration existante.

L'usage d'un repository Log4net par module cloisonne désormais les logs et lors du chargement d'un module on configure en interne son repository.
De plus, dans chaque module on sépare la production des traces de debug techniques des traces fonctionnelles.

Ces dernières, similaire à un Write-Verbose, contiennent des infos de progression d'un traitement et pourront être utilisées par le script principal.

Le module Log4Posh configure quand à lui le repository Log4net par défaut et c'est celui-ci que le ou les scripts principaux utiliseront.

La configuration, chargée dans un repository public dédié au module, déclare deux loggers dans la portée privé du module :
[code:1]
&lt;logger name=\&quot;DebugLogger\&quot;&gt;
&lt;level value=\&quot;Debug\&quot; /&gt;
&lt;appender-ref ref=\&quot;Console\&quot; /&gt;
&lt;appender-ref ref=\&quot;FileInternal\&quot;/&gt;
&lt;appender-ref ref=\&quot;Debugger\&quot;/&gt;
&lt;/logger&gt;

&lt;logger name=\&quot;InfoLogger\&quot;&gt;
&lt;level value=\&quot;Info\&quot; /&gt;
&lt;appender-ref ref=\&quot;Console\&quot; /&gt;
&lt;appender-ref ref=\&quot;FileExternal\&quot;/&gt;
&lt;appender-ref ref=\&quot;Debugger\&quot;/&gt;
&lt;/logger&gt;
[/code:1]
Chaque logger crée les appenders suivants :
[code:1]
&lt;appender name=\&quot;Console\&quot; type=\&quot;log4net.Appender.ColoredConsoleAppender\&quot;&gt;
&lt;appender name=\&quot;Debugger\&quot; type=\&quot;log4net.Appender.OutputDebugStringAppender\&quot;&gt;
[/code:1]
L'appender nommé Debugger est un dispositif unique pour une session Windows d'une machine.
L'appender nommé Console est un dispositif unique pour chaque console Powershell, il peut donc exister plusieurs appender Console.

Le logger DebugLogger crée l'appender suivant :
[code:1]
&lt;appender name=\&quot;FileInternal\&quot; type=\&quot;log4net.Appender.RollingFileAppender\&quot;&gt;
[/code:1]
Ce logger de niveau 'Debug' est dédié aux traces de debug internes à un module.

Le logger InfoLogger crée l'appender suivant :
[code:1]
&lt;appender name=\&quot;FileExternal\&quot; type=\&quot;log4net.Appender.RollingFileAppender\&quot;&gt;
[/code:1]
Ce logger de niveau 'Info' est dédié aux traces de debug fonctionnelles à un module.

Par défaut le nom de chemin du fichier de ces FileAppenders pointe sur [code:1]\&quot;$psScriptRoot\Logs\$ModuleName.log\&quot;[/code:1]
Cette propriété peut être reconfigurée dynamiquement dans le code du script principal.

Le principe :
Plusieurs FileAppenders, ou dérivés, peuvent pointer sur un même fichier, que ces FileAppenders soient déclarés dans un ou plusieurs Loggers ne modifie pas cette possibilité.
Par défaut les appenders FileExternal et FileInternal utilisent le même fichier, leur mode de gestion des verrous est positionné au minimum.

Ainsi les logs fonctionnels d'un ou plusieurs modules peuvent être enregistrés dans le fichier de log du script principal.
On redirige un des loggers du module vers le fichier du logger du script principal
[code:1]
\&quot;ADHerms\&quot;,\&quot;ExchgInventory\&quot;,\&quot;PSObjectHelper\&quot;|
Switch-AppenderFileName FileExternal \&quot;$env:MyProject\TraitementXYZ.log\&quot;
[/code:1]
A partir de là, les logs fonctionnelles des 3 modules et ceux du script principal sont écrit dans le même fichier

Initialisation du module.
Le module dépend du module log4Posh via un manifeste. Les premières lignes de code du module doivent initialiser le repository Log4Net :
[code:1]
$Script:ModuleName=$MyInvocation.MyCommand.ScriptBlock.Module.Name
$InitializeLogging=$MyInvocation.MyCommand.ScriptBlock.Module.NewBoundScriptBlock(${function:Initialize-Log4NetModule})
&amp;$InitializeLogging $Script:ModuleName \&quot;$psScriptRoot\Log4Net.Config.xml\&quot;
[/code:1]
La variable privée $ModuleName est référencée dans le fichier de type 'log4net.Core.LogImpl.Types.ps1xml' et permet d'ajouter le nom du producteur du log.

Finalisation du module.
Le scriptBlock OnRemove doit contenir l'arrêt du repository lié au module:
[code:1]
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove= {Stop-Log4Net $Script:ModuleName }
[/code:1]
Le repository n'est pas supprimé, mais réinitialisé.

Enfin l'initialisation du script principal :
[code:1]
ipmo Log4Posh

#Configure les loggers pour ce script
#Le chemins des FileAppenders nommés FileExternal sont redirigés
#Les appenders console sont activés
#Les variables logger sont créées dans la portée de l'appelant de ce script
Initialize-Log4NetScript -FileExternal \&quot;C:\temp\Main.log\&quot; -Scope 2

$InfoLogger.PSInfo(\&quot;Logger info ready.\&quot;«»)
$DebugLogger.PSDebug(\&quot;Logger debug ready.\&quot;«»)
[/code:1]
C'est tout :-)

La doc US est en cours de rédaction, un exemple online.<br><br>Message édité par: Laurent Dardenne, à: 18/03/14 19:36

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 1 mois #17204 par Laurent Dardenne
La version 0.5 stable est en ligne .

La variable d'environnement PSIONICLOGPATH n'est plus utilisé.
Par défaut les logs se trouvent dans le répertoire Logs du module PsIonic, ceux de log4Posh, en cas d'usage, dans $env:temp.

Usage :
[code:1]
ipmo Log4posh,PsIonic
#Configure les loggers pour ce script
#Le chemins des FileAppenders nommés FileExternal sont redirigés
#Les appenders console sont activés
#Les variables logger sont crées dans la portée de l'appelant de ce script
Initialize-Log4NetScript -FileExternal \&quot;C:\temp\Main.log\&quot; -Scope 2 -Console All

$InfoLogger.PSInfo(\&quot;Logger info ready.\&quot;«»)
$DebugLogger.PSDebug(\&quot;Logger debug ready.\&quot;«»)
[/code:1]
Ne pas utiliser le paramètre -Console dans un job.<br><br>Message édité par: Laurent Dardenne, à: 24/03/14 15:39

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.090 secondes
Propulsé par Kunena