<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>TomsBlog</title>
    <link>http://www.toms-blog.com/tags/powershell/index.xml</link>
    <description>Recent content on TomsBlog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-uk</language>
    <atom:link href="http://www.toms-blog.com/tags/powershell/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>F5 iControl script for GTM</title>
      <link>http://www.toms-blog.com/post/f5-icontrol-script-for-gtm/</link>
      <pubDate>Tue, 20 Mar 2012 20:23:58 +0000</pubDate>
      
      <guid>http://www.toms-blog.com/post/f5-icontrol-script-for-gtm/</guid>
      <description>&lt;p&gt;iControl is an inbuilt API to F5 devices which can be used to view and make configuration changes.
Most of the documentation is for LTMs (Local Traffic Manager) but the PowerShell script below will use iControl on a GTM (Gloabl Traffic Manager) to loop through all pool members and see if any are disabled, if any are disabled it will send an email stating which members are disabled.&lt;/p&gt;

&lt;p&gt;To run this script you must first have the iControl PowerShell Script Snapin installed.&lt;/p&gt;

&lt;p&gt;It can be installed from this link below:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/3/aff/2107/showtab/groupforums/Default.aspx&#34;&gt;https://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/3/aff/2107/showtab/groupforums/Default.aspx&lt;/a&gt;&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #f0f3f3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#---------define Functions----------&lt;/span&gt;

&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;###############################################################&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# GetPools() #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# Gets an array of pools from the GTM.&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# The F5 must be initialized before calling this script. #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# $return string[]&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;###############################################################&lt;/span&gt;

&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;function&lt;/span&gt; GetPools() {
	&lt;span style=&#34;color: #003333&#34;&gt;$list&lt;/span&gt; = (&lt;span style=&#34;color: #336666&#34;&gt;Get-F5&lt;/span&gt;.iControl).GlobalLBPool.get_list();
	&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$list&lt;/span&gt;;
}

&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;###############################################################&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# GetMembers() #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# Gets the Members in the Pool provided and returns an Array of Members #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# @param string $Pool Name of the Pool to get Members&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# @return iControl.CommonIPPortDefinition[] #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;###############################################################&lt;/span&gt;

&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;function&lt;/span&gt; GetMembers() {
	&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;param&lt;/span&gt;(&lt;span style=&#34;color: #336600&#34;&gt;[string]&lt;/span&gt;&lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt;);
	&lt;span style=&#34;color: #003333&#34;&gt;$Members&lt;/span&gt; = (&lt;span style=&#34;color: #336666&#34;&gt;get-f5&lt;/span&gt;.icontrol).GlobalLBPool.get_member((,&lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt;));

	&lt;span style=&#34;color: #003333&#34;&gt;$MemberA&lt;/span&gt; = &lt;span style=&#34;color: #003333&#34;&gt;$Members&lt;/span&gt;[0]; &lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$MemberA&lt;/span&gt;;
}

&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;###############################################################&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# GetMemberState() #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# Pass in a member. Then it receives the state of that member. #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# @param iControl.CommonIPPortDefinition[] Member, string Pool&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;# @return string #&lt;/span&gt;
&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;###############################################################&lt;/span&gt;

&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;function&lt;/span&gt; GetMemberState() {
&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;param&lt;/span&gt;(&lt;span style=&#34;color: #336600&#34;&gt;[iControl.CommonIPPortDefinition[]]&lt;/span&gt;&lt;span style=&#34;color: #003333&#34;&gt;$Member&lt;/span&gt;, &lt;span style=&#34;color: #336600&#34;&gt;[string]&lt;/span&gt;&lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt;);

	&lt;span style=&#34;color: #003333&#34;&gt;$PoolA&lt;/span&gt; = (, &lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt;); &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#Set Pool [iControl.CommonIPPortDefinition[][]]&lt;/span&gt;
	&lt;span style=&#34;color: #003333&#34;&gt;$MemberAofA&lt;/span&gt; = &lt;span style=&#34;color: #336600&#34;&gt;[iControl.CommonIPPortDefinition[][]]&lt;/span&gt;(, &lt;span style=&#34;color: #003333&#34;&gt;$Member&lt;/span&gt;); &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#Set Object F5 is expecting&lt;/span&gt;
	&lt;span style=&#34;color: #003333&#34;&gt;$EnabledStateAofA&lt;/span&gt; = (&lt;span style=&#34;color: #336666&#34;&gt;Get-F5&lt;/span&gt;.iControl).GlobalLBPoolMember.get_enabled_state(&lt;span style=&#34;color: #003333&#34;&gt;$PoolA&lt;/span&gt;, &lt;span style=&#34;color: #003333&#34;&gt;$MemberAofA&lt;/span&gt;)
	&lt;span style=&#34;color: #003333&#34;&gt;$EnabledStateA&lt;/span&gt; = &lt;span style=&#34;color: #003333&#34;&gt;$EnabledStateAofA&lt;/span&gt;[0]; &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#Get first object value&lt;/span&gt;

	&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color: #003333&#34;&gt;$EnabledState&lt;/span&gt; &lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$EnabledStateA&lt;/span&gt;) {
		&lt;span style=&#34;color: #003333&#34;&gt;$state&lt;/span&gt; = &lt;span style=&#34;color: #003333&#34;&gt;$EnabledState&lt;/span&gt;.state; &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#loop through Memers and get State&lt;/span&gt;
	}
	&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #336600&#34;&gt;[string]&lt;/span&gt;&lt;span style=&#34;color: #003333&#34;&gt;$state&lt;/span&gt; &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#return the state of the member passed in&lt;/span&gt;
}

&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#-----------Main Application-------------&lt;/span&gt;

&lt;span style=&#34;color: #003333&#34;&gt;$SnapinSet&lt;/span&gt; = &lt;span style=&#34;color: #336666&#34;&gt;Get-PSSnapin&lt;/span&gt; | &lt;span style=&#34;color: #336666&#34;&gt;select-string&lt;/span&gt; -Quiet -Pattern &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;iControlSnapin&amp;quot;&lt;/span&gt;

&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;if&lt;/span&gt;(!&lt;span style=&#34;color: #003333&#34;&gt;$SnapinSet&lt;/span&gt;) { &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#check to see iControlSnapin has been added&lt;/span&gt;
	&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#if it hasn&amp;#39;t been added then add it&lt;/span&gt;
	&lt;span style=&#34;color: #336666&#34;&gt;Add-PSSnapin&lt;/span&gt; iControlSnapin
}

&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#attempt to initilize connection to the correct IP&lt;/span&gt;
&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;if&lt;/span&gt;(Initialize-f5.icontrol -hostname 1.1.1.1 -Username username -password password) {
	&lt;span style=&#34;color: #336666&#34;&gt;start-transcript&lt;/span&gt; -Path &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;Log.txt&amp;quot;&lt;/span&gt; -Append -Force &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#log output&lt;/span&gt;

	&lt;span style=&#34;color: #003333&#34;&gt;$Pools&lt;/span&gt; = GetPools

	&lt;span style=&#34;color: #003333&#34;&gt;$DisabledState&lt;/span&gt; = &lt;span style=&#34;color: #003333&#34;&gt;$FALSE&lt;/span&gt;
          &lt;span style=&#34;color: #003333&#34;&gt;$DisabledNodes&lt;/span&gt; = @()

	&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt; &lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$Pools&lt;/span&gt;) &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#loop through pools {&lt;/span&gt;
		&lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt; = &lt;span style=&#34;color: #336600&#34;&gt;[string]&lt;/span&gt;&lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt;

		&lt;span style=&#34;color: #003333&#34;&gt;$Members&lt;/span&gt; = GetMembers -Pool &lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt;

		&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#loop through members in a pool&lt;/span&gt;
		&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color: #003333&#34;&gt;$Mem&lt;/span&gt; &lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$Members&lt;/span&gt;) {
			&lt;span style=&#34;color: #003333&#34;&gt;$addr&lt;/span&gt; = &lt;span style=&#34;color: #003333&#34;&gt;$Mem&lt;/span&gt;.member.address;
			&lt;span style=&#34;color: #003333&#34;&gt;$port&lt;/span&gt; = &lt;span style=&#34;color: #003333&#34;&gt;$Mem&lt;/span&gt;.member.port;

			&lt;span style=&#34;color: #003333&#34;&gt;$MemberDef&lt;/span&gt; = &lt;span style=&#34;color: #336666&#34;&gt;New-Object&lt;/span&gt; -TypeName iControl.CommonIPPortDefinition;
			&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#set object&lt;/span&gt;
			&lt;span style=&#34;color: #003333&#34;&gt;$MemberDef&lt;/span&gt;.address = &lt;span style=&#34;color: #003333&#34;&gt;$addr&lt;/span&gt;
			&lt;span style=&#34;color: #003333&#34;&gt;$MemberDef&lt;/span&gt;.port = &lt;span style=&#34;color: #003333&#34;&gt;$port&lt;/span&gt;
			&lt;span style=&#34;color: #336600&#34;&gt;[iControl.CommonIPPortDefinition[]]&lt;/span&gt;&lt;span style=&#34;color: #003333&#34;&gt;$MembersA&lt;/span&gt; = &lt;span style=&#34;color: #336600&#34;&gt;[iControl.CommonIPPortDefinition[]]&lt;/span&gt;(, &lt;span style=&#34;color: #003333&#34;&gt;$MemberDef&lt;/span&gt;)
			&lt;span style=&#34;color: #003333&#34;&gt;$state&lt;/span&gt; = GetMemberState -Member &lt;span style=&#34;color: #003333&#34;&gt;$MembersA&lt;/span&gt; -Pool &lt;span style=&#34;color: #003333&#34;&gt;$Pool&lt;/span&gt;
			&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#get state of the member&lt;/span&gt;
			&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color: #003333&#34;&gt;$state&lt;/span&gt; &lt;span style=&#34;color: #555555&#34;&gt;-eq&lt;/span&gt; &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;STATE_DISABLED&amp;quot;&lt;/span&gt;) {
				&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#if member is disabled add it to the output to send in an email&lt;/span&gt;
				&lt;span style=&#34;color: #003333&#34;&gt;$Node&lt;/span&gt; = &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;${addr}:${port}&amp;quot;&lt;/span&gt;
				&lt;span style=&#34;color: #003333&#34;&gt;$DisabledNodes&lt;/span&gt; += &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;$Pool -&amp;gt; $Node&amp;quot;&lt;/span&gt;
				&lt;span style=&#34;color: #003333&#34;&gt;$DisabledState&lt;/span&gt; = &lt;span style=&#34;color: #003333&#34;&gt;$TRUE&lt;/span&gt;
			}
		}
	}

	&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color: #003333&#34;&gt;$DisabledState&lt;/span&gt;) {
		&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#if a disabled member has been found&lt;/span&gt;
		&lt;span style=&#34;color: #003333&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;The following nodes are disabled:&amp;quot;&lt;/span&gt;
		&lt;span style=&#34;color: #336666&#34;&gt;write-host&lt;/span&gt; &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;the following are disabled&amp;quot;&lt;/span&gt;

		&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color: #003333&#34;&gt;$Node&lt;/span&gt; &lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$DisabledNodes&lt;/span&gt;) {
			&lt;span style=&#34;color: #336666&#34;&gt;write-host&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$Node&lt;/span&gt; &lt;span style=&#34;color: #003333&#34;&gt;$Content&lt;/span&gt; += &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;$Node &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#create html content to send in an email&lt;/span&gt;
		}

		&lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#send email&lt;/span&gt;
		&lt;span style=&#34;color: #336666&#34;&gt;Send-MailMessage&lt;/span&gt; -To &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;&amp;lt;a href=&amp;quot;&lt;/span&gt;mailto&lt;span style=&#34;color: #AA0000; background-color: #FFAAAA&#34;&gt;:&lt;/span&gt;to&lt;span style=&#34;color: #003333&#34;&gt;@example&lt;/span&gt;.com&lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;&amp;gt;to@example.com&amp;lt;/a&amp;gt;&amp;quot;&lt;/span&gt; -From &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;&amp;lt;a href=&amp;quot;&lt;/span&gt;mailto&lt;span style=&#34;color: #AA0000; background-color: #FFAAAA&#34;&gt;:&lt;/span&gt;from&lt;span style=&#34;color: #003333&#34;&gt;@example&lt;/span&gt;.com&lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;&amp;gt;from@example.com&amp;lt;/a&amp;gt;&amp;quot;&lt;/span&gt; -subject &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;Nodes Disabled In GTM&amp;quot;&lt;/span&gt; -body &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;$Content&amp;quot;&lt;/span&gt; -bodyashtml -smtpServer 1.1.1.1

	}
	&lt;span style=&#34;color: #336666&#34;&gt;stop-transcript&lt;/span&gt; &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#stop logging&lt;/span&gt;
}
&lt;span style=&#34;color: #006699; font-weight: bold&#34;&gt;else&lt;/span&gt; {
	&lt;span style=&#34;color: #336666&#34;&gt;write-host&lt;/span&gt; &lt;span style=&#34;color: #CC3300&#34;&gt;&amp;quot;Critical Error Has Occurred. Cannot Initialize iControl&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #0099FF; font-style: italic&#34;&gt;#if connection to F5 fails produce error&lt;/span&gt;
}
&lt;/pre&gt;&lt;/div&gt;

</description>
    </item>
    
  </channel>
</rss>