diff --git a/src/modules/punk/args-999999.0a1.0.tm b/src/modules/punk/args-999999.0a1.0.tm index 3307cb05..71743338 100644 --- a/src/modules/punk/args-999999.0a1.0.tm +++ b/src/modules/punk/args-999999.0a1.0.tm @@ -4897,7 +4897,6 @@ tcl::namespace::eval punk::args { lappend PUNKARGS [list { - @dynamic @id -id ::punk::args::usage @cmd -name punk::args::usage -help\ "Return usage information for a command identified by an id. diff --git a/src/modules/punk/netbox/man-999999.0a1.0.tm b/src/modules/punk/netbox/man-999999.0a1.0.tm index a1851799..2db42d74 100644 --- a/src/modules/punk/netbox/man-999999.0a1.0.tm +++ b/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 { # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ @@ -1549,6 +1694,8 @@ namespace eval ::punk::args::register { ::punk::netbox::man::virtualization::virtual-machines\ ::punk::netbox::man::extras\ ::punk::netbox::man::extras::tags\ + ::punk::netbox::man::dcim\ + ::punk::netbox::man::dcim::devices\ } # ----------------------------------------------------------------------------- diff --git a/src/modules/shellfilter-999999.0a1.0.tm b/src/modules/shellfilter-999999.0a1.0.tm index e64e77ca..c714ee5c 100644 --- a/src/modules/shellfilter-999999.0a1.0.tm +++ b/src/modules/shellfilter-999999.0a1.0.tm @@ -2642,8 +2642,12 @@ namespace eval shellfilter { ::shellfilter::log::write $debugname " waitvar '$waitvar'" } lassign [chan pipe] rderr wrerr + + #--------------- #JMN 2025 + # e.g cannot run ansible cmdline tools if non-blocking #chan configure $wrerr -blocking 0 + #------------------ set custom_stderr "" set lastitem [lindex $commandlist end]