Question Fonction d'adressage IP

Plus d'informations
il y a 15 ans 8 mois #7421 par Richard Lazaro
Bonjour à tous,

J'ai écris il y a peu un petit script d'adressage IP.
C'est une première version, il me manque à intégrer certaine chose :
- Support IPV6
- Ajout de Verbose et Debug
- Ajout de l'Helper
- Ajout de Commentaire

Mais bon, même si il y a certaines amélioration à apporter, je pense gérer toutes erreurs dans le script.

Si vous avez des idées d'amélioration, faites les moi savoir ;]

Après DotSourcer le script (. ./Get-TMSubnet.ps1), voici son utilisation :

[code:1]PS C:\> . .\Users\richardl.EXAKIS\Desktop\Get-TMSubnet.ps1
PS C:\>
PS C:\> Get-TMSubnet -NetworkAddress 127.0.0.5/22

IpAddress : 127.0.0.5
SubnetMask : 255.255.252.0
WildcardMask : 0.0.3.255
Mask : 22
NumberOfHosts : 1022
NetworkAddress : 127.0.0.0
BroadcastAddress : 127.0.3.255
Hosts : {}

PS C:\> Get-TMSubnet -NetworkAddress 127.0.0.5 -Mask 20

IpAddress : 127.0.0.5
SubnetMask : 255.255.240.0
WildcardMask : 0.0.15.255
Mask : 20
NumberOfHosts : 4094
NetworkAddress : 127.0.0.0
BroadcastAddress : 127.0.15.255
Hosts : {}

PS C:\> '127.4.0.2/22','10.34.0.9/31','165.45.23.0/12' | Get-TMSubnet

IpAddress : 127.4.0.2
SubnetMask : 255.255.252.0
WildcardMask : 0.0.3.255
Mask : 22
NumberOfHosts : 1022
NetworkAddress : 127.4.0.0
BroadcastAddress : 127.4.3.255
Hosts : {}

IpAddress : 10.34.0.9
SubnetMask : 255.255.255.254
WildcardMask : 0.0.0.1
Mask : 31
NumberOfHosts : 0
NetworkAddress : 10.34.0.8
BroadcastAddress : 10.34.0.9
Hosts : {}

IpAddress : 165.45.23.0
SubnetMask : 255.240.0.0
WildcardMask : 0.15.255.255
Mask : 12
NumberOfHosts : 1048574
NetworkAddress : 165.32.0.0
BroadcastAddress : 165.47.255.255
Hosts : {}[/code:1]

Il y a aussi le paramètre Hosts ; qui, quand spécifié en raison des performances, retourne toutes les adresses IP disponible sur ce réseaux :

[code:1]PS C:\> Get-TMSubnet -NetworkAddress 67.45.23.8/26 -Hosts

IpAddress : 67.45.23.8
SubnetMask : 255.255.255.192
WildcardMask : 0.0.0.63
Mask : 26
NumberOfHosts : 62
NetworkAddress : 67.45.23.0
BroadcastAddress : 67.45.23.63
Hosts : {67.45.23.1, 67.45.23.2, 67.45.23.3, 67.45.23.4...}[/code:1]

Bien Cordialement,
Richard Lazaro.

La pièce jointe Get_TMSubnet.ps1 est absente ou indisponible

<br><br>Message édité par: Richard Lazaro, à: 21/07/10 09:34

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Pièces jointes :

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

Plus d'informations
il y a 15 ans 8 mois #7428 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Fonction d'adressage IP
Salut,
pour cette exemple :
[code:1]'127.4.0/22' | Get-TMSubnet[/code:1]Tu demandes la saisie du masque alors que l'adresse est erronée.
Idem pour ceux-ci :
[code:1]
\&quot; \&quot; | Get-TMSubnet
'127.4.0' | Get-TMSubnet
[/code:1]
Pour le dernier l'opération réussi, est-ce une erreur ou une conversion implicite admise ?
Le constructeur System.Net.IPAddress prend en compte ce format d'adresse.

Les préfix (TM, RB ) ont-ils une signification ?

La propriété NumberOfHosts ne devrait-elle pas être en 'R/O' :
[code:1]
public Int64 NumberOfHosts {
get { return _Hosts.Count(); }
}
[/code:1]

Richard Lazaro écrit:

Il y a aussi le paramètre Hosts ; qui, quand spécifié en raison des performances, retourne toutes les adresses IP disponible sur ce réseaux :

Du coup pour ces affectations :
[code:1]
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[0])
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[1])
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[2])
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[3])

$rtnHosts.Add(($ipSplit[0].ToString()+\&quot;.\&quot;+$ipSplit[1].ToString()+\&quot;.\&quot;+$ipSplit[2].ToString()+\&quot;.\&quot;+$ipSplit[3].ToString()))
[/code:1]
tu peux simplifier en :
[code:1]
$rtnNetworkAddress='67.45.23.0'
[int[]]$ipSplit=$rtnNetworkAddress.Split('.')
$ofs=\&quot;.\&quot;
$rtnHosts.Add(\&quot;$ipSplit\&quot;«»)
[/code:1]
Je n'ai pas vérifié dans le détails, mais si on demande une étendue importante, je pense que cela réduit la sollicitation du Garbage Collector.
Tu divises par 4*2 le nombre de création de tableau.

Juste pour rigoler ( après 30 mn tout de même :P ) :
[code:1]
$res='127.4.0' | Get-TMSubnet -hosts
Mask: 1
Une exception de type 'System.OutOfMemoryException' a été levée.
Au niveau de ligne : 166 Caractère : 87
+ $rtnHosts.Add(($ipSplit[0].ToString()+\&quot;.\&quot;+$ipSplit[1].ToString &lt;&lt;&lt;&lt; ()+\&quot;.\&quot;+$ipSplit[2].ToString()+\&quot;.\&quot;+$ipSplit[3].ToString()))
+ CategoryInfo : InvalidOperation: (:«») [], RuntimeException
+ FullyQualifiedErrorId : MethodInvocationException
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 8 mois #7429 par Richard Lazaro
Réponse de Richard Lazaro sur le sujet Re:Fonction d'adressage IP
Ok, merci.
J'ai codé ça en grappillant dans de vieux code ... et j'ai pas fait gaffe à mes Split inutile -_-'

Alors, pour le TM et RB ... en fait à la base j'ai fait cela pour un projet (RB) mais je compte le publier plus tard sur mon blog quand il sera ouvert (Think-MS) d'où le TM; donc j'ai du en oublier lors de la conversion ... désolé.

Pour moi, il est très important de mettre des préfixes, travaillant énormément avec les modules, j'ai déjà vu des Cmdlets qui avaient le même nom ...

Par exemple avec le module PsHyperV et le Snapin VmWare qui renseignent une cmdlet du nom de Get-Vm ...


Sinon, J'utilise la classe .Net pour la vérification du format d'Ip ça doit être pour cela que '127.4.0' est admise. Je remarque que je n'ai pas testé toute les possibilités de Mme Michu :]

Je vais améliorer le tout (dès ce soir je pense) et vous proposer quelque chose de mieux.

Merci bien pour ton coup d'œil Laurent.
(Bon sinon, tu en penses quoi du script ? :p)

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

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

Plus d'informations
il y a 15 ans 8 mois #7430 par Richard Lazaro
Réponse de Richard Lazaro sur le sujet Re:Fonction d'adressage IP
Heu pour les propriétés en R/O, je suis d'accord.
Mais je ne suis pas d'accord avec toi avec ta déclaration.

En faisant ta méthode, si on ne demande pas les hosts il ne sera pas possible d'avoir le nombre d'hosts du réseaux. Ce qui est dommage, car c'est un calcul basique.

(Je suis en train de travailler dessus ^^)

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

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

Plus d'informations
il y a 15 ans 8 mois #7431 par Richard Lazaro
Réponse de Richard Lazaro sur le sujet Re:Fonction d'adressage IP
@Laurent : Je regarde pour les 30min ... mais je pense que ça viens d'une limitation de mon algo. Donc faut que je regarde à le repenser, même si à première vu je ne trouve pas d'amélioration majeure ...

Dans un sens, retourner 2 milliards d'adresse (mask 1) ... c'est normal que cela prenne du temps Oo


Sinon, voici la version 1.4 :
- Amélioration des performances;
- Propriété en lecture seule;
- Meilleure gestion des erreurs de Mme Michu;
- Prise en compte des abréviations d'adressage IP (172.4.0 pour 172.4.0.0 par exemple)

Bien Cordialement,
Richard Lazaro.

La pièce jointe Get_TMSubnet-bc6bbf24cd57cd1c8bbdc5878f2219d3.ps1 est absente ou indisponible


Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

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

Plus d'informations
il y a 15 ans 8 mois #7432 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Fonction d'adressage IP
Richard Lazaro écrit:

Pour moi, il est très important de mettre des préfixes, travaillant énormément avec les modules, j'ai déjà vu des Cmdlets qui avaient le même nom ...

Import-Module permet de le faire automatiquement via -Prefix.
Richard Lazaro écrit:

Je remarque que je n'ai pas testé toute les possibilités de Mme Michu :]

Je serais tenté de dire que c'est surtout celles-ci qu'il faut tester.
Richard Lazaro écrit:

Bon sinon, tu en penses quoi du script ?

Qu'il sera très utile pour les admins, bilbao avait déjà proposé ceci .
Du coup il y a peut être redondance.
Le couplage C#-PS est judicieux pour la déclaration de classe, comme je m'efforce de tout faire en natif je vais peut être succomber à cet usage ;-)
Mais cela limite le script à PS v2
Ensuite je trouve sa rédaction lisible et bien structuré, c'est appréciable.
Reste un point que je n'ai pas mentionné, la présence du Read-Host est à reconsidérer dans un contexte d'automatisation.
Mieux vaut un contrat clairement défini, \&quot;J'ai impérativement besoin de telle information pour fonctionner.\&quot;
Les attributs permettent une programmation par contrat (pré-condition seulement), enfin je les considére de la sorte, même s'ils ne sont pas aussi riche que sous le Fx 4.0.
Richard Lazaro écrit:

En faisant ta méthode, si on ne demande pas les hosts il ne sera pas possible d'avoir le nombre d'hosts du réseaux.

Effectivement, je n'avais pas poussé plus loin ma réflexion.
Richard Lazaro écrit:

Dans un sens, retourner 2 milliards d'adresse (mask 1) ... c'est normal que cela prenne du temps Oo

Je plaisantais.
Richard Lazaro écrit:

mais je pense que ça viens d'une limitation de mon algo.

Non, mais c'est un bon sujet d'étude pour de l'optimisation de code sous PS, enfin si on a le temps.
On peut par exemple retarder la conversion de l'adresse IP, peut être la coder sur un int32 en C# ?
Ensuite coder qqc comme un ConvertTo-String ou une interface de formatage spécifique.
Mais bon, c'est du luxe...

ps
Pour la variable $OFS j'ai un doute sur sa portée globale ou locale à la fonction ou au pipe ?

De renommer la propriété Hosts ou de lui coller un alias permettrait de lier la sortie de ta fonction à Test-Connection. Voir ce post , si ce n'est pas déjà fait.<br><br>Message édité par: Laurent Dardenne, à: 21/07/10 19:08

Tutoriels PowerShell

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

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