Custom reuseable iApp data profiles and other Generic useful procedures
Problem this snippet solves:
This library provides the methods for generically importing other service objects, a callback mechanism utilizing per object metadata that allows for dependancies to be correctly handled within iApps, a nice regexp get_items variant for grabbing objects with regex filters, and to generically import a table from the current service with multiple views of the data.
proc import_service { service name }
proc service_callback { }
proc import_table { table_local type }
This proc allows you to import a local table in an iApp.
import_table { table type}
Table must be an APL table object such as $::sectionname_tablename
Types
ary – returns an array in "array set" form and is referenced $name(column__row#) and contains the value for that column__row#
comma – returns an array in "array set" form and is referenced $name(column,row#) and contains the value for that column,row#
names – returns a TCL list of the column names in the stored order – this is crucial for interpreting the "row" TCL lists referenced below
row – returns an array in "array set" form and is referenced $name(row#) and contains row# in a TCL list in the order of "names" list
Col – returns an array in "array set" form and is referenced $name(columnname) and contains columnname in a TCL list in the order of the rows
Rowcol – returns an array in "array set" form and is referenced $name(row#) and contains row# in a TCL list of lists where each sub list is {columnname value}
IMPLEMENTATION CODE
array set hostfile_table [tmsh::run_proc f5.ntr_utils:import_table { $::hostfile__hostfile comma }]
puts "$hostfile_table(names,1)"
APL CODE
section hostfile {
table hostfile {
string hostname
choice record_type { "A", "AAAA" }
string addr validator "IpAddress"
}
}
proc get_items_regexp { field_name field args }
Contributed by: m.earnhart
Code :
cli script f5.ntr_utils_devcentral {
proc import_service { service name } {
tmsh::include "f5.meta_utils"
tmsh::cd /Common
set fullname ${tmsh::app_name}.app/${tmsh::app_name}
set cmd "\"tmsh::modify sys application service $fullname execute-action definition\""
set_service_description_meta ${service} ${fullname} ${cmd}
set objs [lindex [tmsh::get_config sys application service ${service} one-line] 0]
namespace eval ${name} {
proc service_var { objs pre flag } {
set name [namespace current]
set parent_obj $pre
set count 0
foreach obj $objs {
if { ([expr ${count} % 2]) and ($flag eq 0)} {
variable $pre_obj $obj
} elseif { ([expr ${count} % 2]) and ($flag > 0)} {
variable ${parent_obj}__${pre_obj} $obj
}
if {([llength $obj] > 1) && ($pre_obj ne "column-names") && ($pre_obj ne "rows") } {
incr flag
${name}::service_var $obj $pre_obj $flag
incr flag -1
}
set pre_obj $obj
incr count
}
}
proc import_tables { tables } {
set name [namespace current]
set table_count 0
foreach table $tables {
set result ""
# Only process the even elements
if {![expr $table_count % 2]} {
set row_count 0
foreach row [set ${name}::${table}__rows] {
set column_count 0
foreach column [set ${name}::${table}__column-names] {
#puts "Set ${table}(${column}__${row_count}): [lindex [lindex $row 1] $column_count]"
lappend result ${column}__${row_count}
lappend result [lindex [lindex $row 1] $column_count]
lappend result ${column},${row_count}
lappend result [lindex [lindex $row 1] $column_count]
incr column_count
}
incr row_count
}
variable ${table}
array set ${table} ${result}
}
incr table_count
}
}
proc import_variables { vars } {
set var_count 0
foreach var $vars {
if {![expr $var_count % 2]} {
set varname $var
} else {
variable ${varname} [lindex $var 1]
}
incr var_count
}
}
}
${name}::service_var [lindex $objs 4] "" 0
${name}::import_tables [set ${name}::tables]
${name}::import_variables [set ${name}::variables]
}
proc service_callback { } {
tmsh::include "f5.meta_utils"
set name $tmsh::app_name
set fullname ${name}.app/${name}
tmsh::cd /Common
catch { foreach service [get_service_description_meta $fullname] {
tmsh::cd /Common
eval [lindex ${service} 1]
}
}
}
proc import_table { table_local type } {
set row_count 0
array set row_result {}
array set col_result {}
array set rowcol_result {}
foreach row ${table_local} {
set element_count 0
set names ""
foreach element [split $row "\n"] {
if { ($element_count > 0) && ($element_count < [expr [llength [split $row "\n"]] - 1])} {
if { [llength $element] > 1 } {
set value "[lindex $element 1]"
set column "[lindex $element 0]"
lappend ary_result "${column}__${row_count}"
lappend ary_result "${value}"
lappend comma_result "${column},${row_count}"
lappend comma_result "${value}"
lappend row_result($row_count) ${value}
lappend col_result($column) ${value}
lappend rowcol_result($row_count) "[list $column ${value}]"
lappend names $column
}
}
incr element_count
}
incr row_count
}
switch $type {
row
{
foreach row [array names row_result] {
lappend result $row
lappend result $row_result($row)
}
set final_result ${result}
}
col
{
foreach col [array names col_result] {
lappend result $col
lappend result $col_result($col)
}
set final_result ${result}
}
names
{
set final_result ${name}s
}
rowcol
{
foreach row [array names rowcol_result] {
lappend result $row
lappend result $rowcol_result($row)
}
set final_result ${result}
}
comma
{
set final_result $comma_result
}
ary
{
set final_result $ary_result
}
default
{
set final_result $ary_result
}
}
return ${final_result}
}
proc get_items_regexp { field_name field args } {
set results ""
puts "args: $args"
append args " recursive"
set folder [tmsh::pwd]
if { [catch {
set objs [tmsh::get_config $args]
foreach obj $objs {
set name [tmsh::get_name $obj]
puts "name: ${name}"
puts "obj: $objs"
set field_value [tmsh::get_field_value $obj $field_name]
puts "field_value: $field_value"
puts "field: $field"
if { [regexp "$field" $field_value] } {
append results "$folder/"
append results [format "%s\n" ${name}]
}
}
if { $folder != "/Common" } {
tmsh::cd "/Common"
append objs [tmsh::get_config $args]
tmsh::cd $folder
foreach obj $objs {
set name [tmsh::get_name $obj]
set field_value [tmsh::get_field_value $obj $field_name]
if { [regexp "$field" $field_value] } {
append results "/Common/"
append results [format "%s\n" ${name}]
}
}
}
} err] } {
puts "Command failed: tmsh::get_config $args\n $err"
return ${results}
}
return ${results}
}
}Published Mar 11, 2015
Version 1.0Michael_Earnhar
Historic F5 Account
Joined October 30, 2008
Michael_Earnhar
Historic F5 Account
Joined October 30, 2008
No CommentsBe the first to comment
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)