PowerShell iApp Template Control
Problem this snippet solves:
The following PowerShell script illustrates how to support the BIG-IP .tmpl file format for Application Templates. It includes support for importing and exporting Application Templates to/from .tmpl format.
Code :
#---------------------------------------------------------------------------- # The contents of this file are subject to the "END USER LICENSE AGREEMENT # FOR F5 Software Development Kit for iControl"; you may not use this file # except in compliance with the License. The License is included in the # iControl Software Development Kit. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # # The Original Code is iControl Code and related documentation # distributed by F5. # # The Initial Developer of the Original Code is F5 Networks, Inc. # Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2012 # F5 Networks, Inc. All Rights Reserved. iControl (TM) is a registered # trademark of F5 Networks, Inc. # # Alternatively, the contents of this file may be used under the terms # of the GNU General Public License (the "GPL"), in which case the # provisions of GPL are applicable instead of those above. If you wish # to allow use of your version of this file only under the terms of the # GPL and not to allow others to use your version of this file under the # License, indicate your decision by deleting the provisions above and # replace them with the notice and other provisions required by the GPL. # If you do not delete the provisions above, a recipient may use your # version of this file under either the License or the GPL. #---------------------------------------------------------------------------- param ( $BIGIP = $null, $User = $null, $Pass = $null, $Command = $null, $TemplateFile = $null, $TemplateName = $null, [switch]$Force = $false ) $script:Dir = $(Split-Path $MyInvocation.MyCommand.Definition); $script:Name = $($MyInvocation.MyCommand.Name); #------------------------------------------------------------------------- # function Show-Usage #------------------------------------------------------------------------- function Show-Usage() { Write-Host @" Usage: $($script:Name) [options] -BIGIP bigip_address -User bigip_username -Pass bigip_password -Command [import|export|exportall] -TemplateFile localfile -TemplateName name_of_template [-Force] Examples List local templates. .\$($script:Name) -BIGIP bigip -User user -Pass pass -Command import Import local .tmpl file to BIG-IP. .\$($script:Name) -BIGIP bigip -User user -Pass pass -Command import -TemplateFile filename List templates configured on BIG-IP. .\$($script:Name) -BIGIP bigip -User user -Pass pass -Command export Export specified template to local .\Templates folder. .\$($script:Name) -BIGIP bigip -User user -Pass pass -Command export -TemplateName template_name Export all templates to local .\Templates folder. .\$($script:Name) -BIGIP bigip -User user -Pass pass -Command exportall "@ exit; } #---------------------------------------------------------------------------- function Get-NextToken() #---------------------------------------------------------------------------- { param($Template = $null, $FirstToken); $Value = ""; $idxStart = $Template.IndexOf($FirstToken); if ( -1 -ne $idxStart ) { $idxStart += $FirstToken.Length + 1; $idxEnd = $Template.IndexOfAny( (" ", "`t", "`r", "`n"), $idxStart); if ( -1 -ne $idxEnd ) { $Value = $Template.SubString($idxStart, $idxEnd - $idxStart); } } $Value; } #---------------------------------------------------------------------------- function Extract-Section() #---------------------------------------------------------------------------- { param($Template = $null, $Section = $null ); $Value = $null; $idxStart = $Template.IndexOf("$Section {"); $idxEnd = -1; if ( -1 -ne $idxStart ) { $idxStart += $Section.Length + 2; $p = 1; for($i = $idxStart; $i -lt $Template.Length; $i++) { switch ($Template[$i]) { "{" { $p++; } "}" { $p--; if ( $p -eq 0 ) { $idxEnd = $i; $i = $Template.Length; break; } } } } if ( -1 -ne $idxEnd ) { #Write-Host "START: $idxStart, END: $idxEnd, LEN: $($idxEnd-$idxStart)"; $Value = $Template.SubString($idxStart, $idxEnd-$idxStart).Trim(); } } $Value; } #---------------------------------------------------------------------------- function New-Template() #---------------------------------------------------------------------------- { $t = 1 | Select Name, Description, HtmlHelp, Implementation, Presentation; $t; } #---------------------------------------------------------------------------- function Parse-Template() #---------------------------------------------------------------------------- { param($Template = $null); $t = $null; if ( $Template.StartsWith("sys application template") ) { #Write-Host "Name: '$name'"; $t = New-Template; $t.Name = Get-NextToken $Template "sys application template"; $definition = Extract-Section $Template "definition"; $t.HtmlHelp = Extract-Section $definition "html-help"; $t.Implementation = Extract-Section $definition "implementation"; $t.Presentation = Extract-Section $definition "presentation"; } $t; } #---------------------------------------------------------------------------- function Import-Template() #---------------------------------------------------------------------------- { param( $TemplateFile = $null, [Boolean]$Force = $false ); $content = [System.IO.File]::ReadAllText((Resolve-Path $TemplateFile).Path) $t = Parse-Template -Template $content; $bContinue = $true; if ( $null -ne $t ) { Write-Host "CREATING Template: '$($t.Name)'..."; try { (Get-F5.iControl).ManagementApplicationTemplate.create( @($t.Name) ); } catch { $bContinue = $Force; if ( $bContinue ) { Write-Host "Template exists, overwriting..."; } else { Write-Host "Template exists, stopping import. Use '-Force' to overwrite."; } } if ( $bContinue ) { Write-Host "SETTING IMPLEMENTATION..."; (Get-F5.iControl).ManagementApplicationTemplate.set_action_implementation( @($t.Name), @( @("definition")), @( @($t.Implementation)) ); Write-Host "SETTING PRESENTATION..."; (Get-F5.iControl).ManagementApplicationTemplate.set_action_presentation( @($t.Name), @( @("definition")), @( @($t.Presentation)) ); Write-Host "SETTING PRESENTATION HELP..."; (Get-F5.iControl).ManagementApplicationTemplate.set_action_presentation_help( @($t.Name), @( @("definition")), @( @($t.HtmlHelp)) ); } } } #---------------------------------------------------------------------------- function Export-Template() #---------------------------------------------------------------------------- { param( $TemplateFile = $null, $TemplateName = $null, [Boolean]$Force = $false ); $t = New-Template; $t.Name = $TemplateName; $descA = (Get-F5.iControl).ManagementApplicationTemplate.get_description( @($t.Name) ); $implAofA = (Get-F5.iControl).ManagementApplicationTemplate.get_action_implementation( @($t.Name), @( @("definition")) ); $presAofA = (Get-F5.iControl).ManagementApplicationTemplate.get_action_presentation( @($t.Name), @( @("definition")) ); $helpAofA = (Get-F5.iControl).ManagementApplicationTemplate.get_action_presentation_help( @($t.Name), @( @("definition")) ); $t.Description = $descA[0]; if ( $t.Description.Length -eq 0 ) { $t.Description = "none"; } $t.Implementation = $implAofA[0][0]; $t.Presentation = $presAofA[0][0]; $t.HtmlHelp = $helpAofA[0][0]; $s = "sys application template "; $s += Split-Path -Leaf $t.Name; $s += " {`r`n"; # Begin Action $s += " "*4; $s += "actions {`r`n"; # Begin definition $s += " "*8; $s += "definition {`r`n"; # Help $s += " "*12; $s += "html-help {`r`n"; $s += $t.HtmlHelp; if ( $t.HtmlHelp.Length -gt 0 ) { $s += "`r`n"; } $s += "}`r`n"; # Implementation $s += " "*12; $s += "implementation {`r`n"; $s += $t.Implementation; if ( $t.Implementation.Length -gt 0 ) { $s += "`r`n"; } $s += "}`r`n"; # Presentation $s += " "*12; $s += "presentation {`r`n"; $s += $t.Presentation; if ( $t.Presentation.Length -gt 0 ) { $s += "`r`n"; } $s += "}`r`n"; $s += " "*12; $s += "role-acl none`r`n"; $s += " "*12; $s += "run-as none`r`n"; # End Definition $s += " "*8; $s += "}`r`n"; # End Action $s += " "*4; $s += "}`r`n"; $s += " "*4; $s += "description $($t.Description)`r`n"; $s += " "*4; $s += "partition $( (Split-Path $t.Name).SubString(1) )`r`n"; #End template $s += "}"; if ( $null -eq $TemplateFile ) { $TemplateFile = ".\Templates\" + (Split-Path -Leaf $t.Name) + ".tmpl"; } $s | Out-File $TemplateFile; Write-Host "Template '$TemplateName' saved to file '$TemplateFile'"; } function Export-AllTemplates() { param( [Boolean]$Force = $false ); $templates = List-Templates; foreach($template in $templates) { Export-Template -TemplateName $template -Force $Force; } } #---------------------------------------------------------------------------- function List-Templates() #---------------------------------------------------------------------------- { (Get-F5.iControl).ManagementApplicationTemplate.get_list(); } function List-LocalTemplates() { "Local Templates Available for Import"; "-------------------------"; $files = Get-ChildItem ".\Templates"; foreach($file in $files) { $file.Name; } } #---------------------------------------------------------------------------- function Do-Initialize() #---------------------------------------------------------------------------- { if ( (Get-PSSnapin | Where-Object { $_.Name -eq "iControlSnapIn"}) -eq $null ) { Add-PSSnapIn iControlSnapIn } $success = Initialize-F5.iControl -HostName $BIGIP -Username $User -Password $Pass; return $success; } #------------------------------------------------------------------------- # Main Application Logic #------------------------------------------------------------------------- if ( ($BIGIP -eq $null) -or ($User -eq $null) -or ($Pass -eq $null) ) { Show-Usage; } if ( Do-Initialize ) { if ( $null -eq $Command ) { Show-Usage; } else { switch ($Command) { "import" { if ( $null -eq $TemplateFile ) { List-LocalTemplates; } else { if ( [System.IO.File]::Exists((Resolve-Path $TemplateFile).Path) ) { Import-Template -TemplateFile $TemplateFile ($Force -eq $True); } else { Write-Error "ERROR: File '$TemplateFile' Does Not Exist!"; } } } "export" { if ( $null -eq $TemplateName ) { List-Templates; } elseif ( $null -ne $TemplateName ) { Export-Template -TemplateFile $TemplateFile -TemplateName $TemplateName ($Force -eq $True) } else { Show-Usage; } } "exportall" { Export-AllTemplates ($Force -eq $True) } default { Show-Usage; } } } }
Published Mar 09, 2015
Version 1.0CodeCentral_194
Cirrus
Joined May 05, 2019
CodeCentral_194
Cirrus
Joined May 05, 2019
No CommentsBe the first to comment