Browse Source

punk::netbox:👨:dcim, minor punk::args fix

master
Julian Noble 2 weeks ago
parent
commit
e4604fc9a9
  1. 1
      src/modules/punk/args-999999.0a1.0.tm
  2. 147
      src/modules/punk/netbox/man-999999.0a1.0.tm
  3. 4
      src/modules/shellfilter-999999.0a1.0.tm

1
src/modules/punk/args-999999.0a1.0.tm

@ -4897,7 +4897,6 @@ tcl::namespace::eval punk::args {
lappend PUNKARGS [list { lappend PUNKARGS [list {
@dynamic
@id -id ::punk::args::usage @id -id ::punk::args::usage
@cmd -name punk::args::usage -help\ @cmd -name punk::args::usage -help\
"Return usage information for a command identified by an id. "Return usage information for a command identified by an id.

147
src/modules/punk/netbox/man-999999.0a1.0.tm

@ -133,6 +133,151 @@ tcl::namespace::eval punk::netbox::man {
} }
} }
tcl::namespace::eval punk::netbox::man::dcim {
namespace export {[a-z]*}
namespace ensemble create -parameters {apicontextid}
tcl::namespace::eval devices {
namespace export {[a-z]*}
namespace ensemble create -parameters {apicontextid}
variable PUNKARGS
namespace eval argdoc {
variable PUNKARGS
#mark as @dynamic and ensure double-substitution present for dynamic parts
set DYN_CONTEXTNAMES {${[punk::netbox::api_context_names]}}
lappend PUNKARGS [::list\
{@dynamic}\
[punk::args::resolved_def\
-antiglobs {@leaders @values -RETURN}\
-override {
@id {-id ::punk::netbox::man::dcim::devices::list }
apicontextid {-choices {${$DYN_CONTEXTNAMES}} }
}\
::punk::netbox::dcim::devices_list\
]\
{-RETURN -default table -choices {table tableobject list}}\
{-MAXRESULTS -type integer -default -1}\
{@values -min 0 -max 0}\
]
}
#caution: must use ::list to avoid loop
proc list {args} {
set argd [punk::args::parse $args withid "::punk::netbox::man::dcim::devices::list"]
set urlnext ""
set requests_allowed 1000 ;#review
set resultlist [::list]
set token [dict get $argd leaders apicontextid]
set opts [dict get $argd opts]
set vals [dict get $argd values]
set multis [dict get $argd multis]
set maxresults [dict get $opts -MAXRESULTS]
set initial_pagelimit [dict get $opts -limit]
set opts [dict remove $opts -MAXRESULTS]
set outer_return [dict get $opts -RETURN]
set opts [dict remove $opts -RETURN] ;#opts from punk::args::parse is a dict (no dup keys) - can use 'dict remove' safely
#we can't just pass through 'multi' opts even if only one was supplied - list level is wrong
set nextopts [::list]
dict for {opt val} $opts {
if {$opt ni $multis} {
lappend nextopts $opt $val
} else {
foreach v $val {
lappend nextopts $opt $v
}
}
}
#Now opts is a list with possible repeated options! (for flags that have -multiple true)
if {$maxresults == -1} {
set maxresults $initial_pagelimit
}
if {$maxresults < $initial_pagelimit} {
punk::netbox::man::system::dupkeylist_setfirst nextopts -limit $maxresults
}
set to_go [expr {$maxresults - [llength $resultlist]}]
while {$urlnext ne "null"} {
if {$urlnext ne ""} {
set urlnext_params [punk::netbox::man::system::uri_get_querystring_as_keyval_list $urlnext]
if {[punk::netbox::man::system::dupkeylist_getfirst $nextopts -limit] > $to_go} {
punk::netbox::man::system::dupkeylist_setfirst urlnext_params limit $to_go
}
#sync to -limit,-offset from the url's limit, offset values
punk::netbox::man::system::optionlistvar_sync_from_urlparams nextopts $urlnext_params
}
puts "-->next:$urlnext nextopts:$nextopts vals:$vals"
set resultd [punk::netbox::dcim::devices_list $token {*}$nextopts -RETURN dict {*}$vals]
set urlnext [dict get $resultd next]
set batch [dict get $resultd results]
lappend resultlist {*}$batch
set to_go [expr {$maxresults - [llength $resultlist]}]
if {$to_go <= 0} {break}
incr requests_allowed -1
if {$requests_allowed < 1} {break}
}
if {$outer_return in {table tableobject}} {
package require textblock
set t [textblock::list_as_table -return tableobject -colheaders {id device cluster primary_ip tenant site platform status comments}]
foreach dev $resultlist {
if {[dict exists $dev cluster id]} {
set cluster "[dict get $dev cluster id]: [dict get $dev cluster name]"
} else {
set cluster [dict get $dev cluster]
}
if {[dict exists $dev primary_ip id]} {
set primary_ip "[dict get $dev primary_ip id]: [dict get $dev primary_ip address]"
} else {
set primary_ip [dict get $dev primary_ip]
}
if {[dict exists $dev tenant id]} {
set tenant "[dict get $dev tenant id]: [dict get $dev tenant slug]"
} else {
set tenant [dict get $dev tenant] ;#probably null
}
if {[dict exists $dev site id]} {
set site "[dict get $dev site id]: [dict get $dev site name]"
} else {
set site [dict get $dev site] ;#probably null
}
if {[dict exists $dev platform id]} {
set platform "[dict get $dev platform id]: [dict get $dev platform name]"
} else {
set platform [dict get $dev platform] ;#probably null
}
set r [::list\
[dict get $dev id]\
[dict get $dev name]\
$cluster\
$primary_ip\
$tenant\
$site\
$platform\
[dict get $dev status value]\
[dict get $dev comments]\
]
$t add_row $r
}
}
switch -- $outer_return {
table {
set result [$t print]
$t destroy
return $result
}
tableobject {
return $t
}
}
return $resultlist
#return [showdict $resultd]
}
}
}
tcl::namespace::eval punk::netbox::man::prefixes { tcl::namespace::eval punk::netbox::man::prefixes {
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
@ -1549,6 +1694,8 @@ namespace eval ::punk::args::register {
::punk::netbox::man::virtualization::virtual-machines\ ::punk::netbox::man::virtualization::virtual-machines\
::punk::netbox::man::extras\ ::punk::netbox::man::extras\
::punk::netbox::man::extras::tags\ ::punk::netbox::man::extras::tags\
::punk::netbox::man::dcim\
::punk::netbox::man::dcim::devices\
} }
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------

4
src/modules/shellfilter-999999.0a1.0.tm

@ -2642,8 +2642,12 @@ namespace eval shellfilter {
::shellfilter::log::write $debugname " waitvar '$waitvar'" ::shellfilter::log::write $debugname " waitvar '$waitvar'"
} }
lassign [chan pipe] rderr wrerr lassign [chan pipe] rderr wrerr
#---------------
#JMN 2025 #JMN 2025
# e.g cannot run ansible cmdline tools if non-blocking
#chan configure $wrerr -blocking 0 #chan configure $wrerr -blocking 0
#------------------
set custom_stderr "" set custom_stderr ""
set lastitem [lindex $commandlist end] set lastitem [lindex $commandlist end]

Loading…
Cancel
Save