diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2016-10-27 19:39:39 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2016-10-27 19:39:39 (GMT) |
commit | ea28451286d3ea4a772fa174483f9a7a66bb1ab3 (patch) | |
tree | 6ee9d8a7848333a7ceeee3b13d492e40225f8b86 /tcllib/modules/nettool/platform_unix_macosx.tcl | |
parent | b5ca09bae0d6a1edce939eea03594dd56383f2c8 (diff) | |
parent | 7c621da28f07e449ad90c387344f07a453927569 (diff) | |
download | blt-ea28451286d3ea4a772fa174483f9a7a66bb1ab3.zip blt-ea28451286d3ea4a772fa174483f9a7a66bb1ab3.tar.gz blt-ea28451286d3ea4a772fa174483f9a7a66bb1ab3.tar.bz2 |
Merge commit '7c621da28f07e449ad90c387344f07a453927569' as 'tcllib'
Diffstat (limited to 'tcllib/modules/nettool/platform_unix_macosx.tcl')
-rw-r--r-- | tcllib/modules/nettool/platform_unix_macosx.tcl | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/tcllib/modules/nettool/platform_unix_macosx.tcl b/tcllib/modules/nettool/platform_unix_macosx.tcl new file mode 100644 index 0000000..6854c03 --- /dev/null +++ b/tcllib/modules/nettool/platform_unix_macosx.tcl @@ -0,0 +1,232 @@ +::namespace eval ::nettool {} + +### +# topic: 825cd25953c2cc896a96006b7f454e00 +# title: Return pairings of MAC numbers to IP addresses on the local network +# description: Under macosx, we call the arp command for arp table resolution +### +proc ::nettool::arp_table {} { + set result {} + set dat [exec arp -a] + foreach line [split $dat \n] { + set host [lindex $line 0] + set ip [lindex $line 1] + set macid [lindex $line 3] + lappend result $macid [string range $ip 1 end-1] + } + return $result +} + +### +# topic: 92ebbfa155883ad41c37d3f843392be4 +# title: Return list of broadcast addresses for local networks +### +proc ::nettool::broadcast_list {} { + set result {} + lappend result 127.0.0.1 + foreach {iface info} [dump] { + if {[dict exists $info broadcast:]} { + lappend result [dict get $info broadcast:] + } + } + return [lsort -unique -dictionary $result] +} + +### +# topic: 187cfa1827097c5cdf1c40c656cedfcc +# description: Return time since booted +### +proc ::nettool::cpuinfo args { + variable cpuinfo + if {![info exists cpuinfo]} { + set cpuinfo {} + dict set cpuinfo machine [exec sysctl -n hw.machine] + dict set cpuinfo cpus [exec sysctl -n hw.ncpu] + # Normalize to MB + dict set cpuinfo memory [expr {[exec sysctl -n hw.memsize] / 1048576}] + + dict set cpuinfo vendor [exec sysctl -n machdep.cpu.vendor] + dict set cpuinfo brand [exec sysctl -n machdep.cpu.brand_string] + + dict set cpuinfo model [exec sysctl -n machdep.cpu.model] + dict set cpuinfo speed [expr {[exec sysctl -n hw.cpufrequency]/1000000}] + + dict set cpuinfo family [exec sysctl -n machdep.cpu.family] + dict set cpuinfo stepping [exec sysctl -n machdep.cpu.stepping] + dict set cpuinfo features [exec sysctl -n machdep.cpu.features] + dict set cpuinfo diskless [] + } + if {$args eq "<list>"} { + return [dict keys $cpuinfo] + } + if {[llength $args]==0} { + return $cpuinfo + } + if {[llength $args]==1} { + return [dict get $cpuinfo [lindex $args 0]] + } + set result {} + foreach item $args { + if {[dict exists $cpuinfo $item]} { + dict set result $item [dict get $cpuinfo $item] + } else { + dict set result $item {} + } + } + return $result +} + +### +# topic: aa8eda4fb59296a1a34d8d600ca54e28 +# description: Dump interfaces +### +proc ::nettool::dump {} { + set data [exec ifconfig] + set iface {} + set result {} + foreach line [split $data \n] { + if {[string index $line 0] in {" " "\t"} } { + # Indented line appends the prior iface + foreach {field value} $line { + dict set result $iface [string trimright $field :]: $value + } + } else { + # Non-intended line - new iface + set iface [lindex $line 0] + } + } + return $result +} + +### +# topic: dd2e2c0810cea69909399808f2a68949 +# title: Return a list of unique hardware addresses +### +proc ::nettool::hwid_list {} { + variable cached_data + set result {} + if {![info exists cached_data]} { + if {[catch {exec system_profiler SPHardwareDataType} hwlist]} { + set cached_data {} + } else { + set cached_data $hwlist + + } + } + set serial {} + set hwuuid {} + set result {} + catch { + foreach line [split $cached_data \n] { + if { [lindex $line 0] == "Serial" && [lindex $line 1] == "Number" } { + set serial [lindex $line end] + } + if { [lindex $line 0] == "Hardware" && [lindex $line 1] == "UUID:" } { + set hwuuid [lindex $line end] + } + } + } + if { $hwuuid != {} } { + lappend result 0x[string map {- {}} $hwuuid] + } + # Blank serial number? + if { $serial != {} } { + set sn [binary scan $serial H* hash] + lappend result 0x$hash + } + if {[llength $result]} { + return $result + } + foreach mac [::nettool::mac_list] { + lappend result 0x[string map {: {}} $mac] + } + if {[llength $result]} { + return $result + } + return 0x010203040506 +} + +### +# topic: d2932eb0ea8cc9f6a865c1ab7cdd4572 +# description: +# Called on package load to build any static +# structures to cache data that would be time +# consuming to call on the fly +### +proc ::nettool::init {} { + unset -nocomplain [namespace current]::cpuinfo + +} + +### +# topic: 417672d3f31b80d749588365af88baf6 +# title: Return list of ip addresses for this computer (primary first) +### +proc ::nettool::ip_list {} { + set result {} + foreach {iface info} [dump] { + if {[dict exists $info inet:]} { + lappend result [dict get $info inet:] + } + } + ldelete result 127.0.0.1 + return $result +} + +### +# topic: ac9d6815d47f60d45930f0c8c8ae8f16 +# title: Return list of mac numbers for this computer (primary first) +### +proc ::nettool::mac_list {} { + set result {} + foreach {iface info} [dump] { + if {[dict exists $info ether:]} { + lappend result [dict get $info ether:] + } + } + return $result +} + +### +# topic: a43b6f42141820e0ba1094840d0f6fc0 +### +proc ::nettool::network_list {} { + foreach {iface info} [dump] { + if {![dict exists $info inet:]} continue + if {![dict exists $info netmask:]} continue + #set mask [::ip::maskToInt $netmask] + set addr [dict get $info inet:] + set mask [dict get $info netmask:] + set addri [::ip::toInteger $addr] + lappend result [ip::nativeToPrefix [list [expr {$addri & $mask}] $mask] -ipv4] + } + return $result +} + +### +# topic: e7db1ae1b5b98a1bb4384f0a4fe81f42 +### +proc ::nettool::status {} { + set result {} + set loaddat [lindex [exec sysctl -n vm.loadavg] 0] + set cpus [cpuinfo cpus] + dict set result cpus $cpus + dict set result load [expr {[lindex $loaddat 0]*100.0/$cpus}] + dict set result load_average_1 [lindex $loaddat 0] + dict set result load_average_5 [lindex $loaddat 1] + dict set result load_average_15 [lindex $loaddat 2] + + set total [exec sysctl -n hw.memsize] + dict set result memory_total [expr {$total / 1048576}] + set used 0 + foreach {amt} [exec sysctl -n machdep.memmap] { + incr used $amt + } + dict set result memory_free [expr {($total - $used) / 1048576}] + + return $result +} + +proc ::nettool::user_data_root {appname} { + return [file join $::env(HOME) Library {Application Support} $appname] +} |