about summary refs log tree commit homepage
path: root/examples/linux-listener-stats.rb
diff options
context:
space:
mode:
Diffstat (limited to 'examples/linux-listener-stats.rb')
-rwxr-xr-xexamples/linux-listener-stats.rb51
1 files changed, 51 insertions, 0 deletions
diff --git a/examples/linux-listener-stats.rb b/examples/linux-listener-stats.rb
new file mode 100755
index 0000000..73b100f
--- /dev/null
+++ b/examples/linux-listener-stats.rb
@@ -0,0 +1,51 @@
+#!/usr/bin/ruby
+$stdout.sync = $stderr.sync = true
+# this is used to show or watch the number of active and queued
+# connections on any listener socket from the command line
+
+require 'raindrops'
+require 'optparse'
+require 'ipaddr'
+usage = "Usage: #$0 [-d delay] ADDR..."
+ARGV.size > 0 or abort usage
+delay = false
+
+# "normal" exits when driven on the command-line
+trap(:INT) { exit 130 }
+trap(:PIPE) { exit 0 }
+
+opts = OptionParser.new('', 24, '  ') do |opts|
+  opts.banner = usage
+  opts.on('-d', '--delay=delay') { |nr| delay = nr.to_i }
+  opts.parse! ARGV
+end
+
+ARGV.each do |addr|
+  addr =~ %r{\A(127\..+):(\d+)\z} or next
+  host, port = $1, $2
+  hex_port = '%X' % port.to_i
+  ip_addr = IPAddr.new(host)
+  hex_host = ip_addr.hton.each_byte.inject('') { |s,o| s << '%02X' % o }
+  socks = File.readlines('/proc/net/tcp')
+  hex_addr = "#{hex_host}:#{hex_port}"
+  if socks.grep(/^\s+\d+:\s+#{hex_addr}\s+/).empty? &&
+     ! socks.grep(/^\s+\d+:\s+00000000:#{hex_port}\s+/).empty?
+    warn "W: #{host}:#{port} (#{hex_addr}) not found in /proc/net/tcp"
+    warn "W: Did you mean 0.0.0.0:#{port}?"
+  end
+end
+
+fmt = "% 19s % 10u % 10u\n"
+printf fmt.tr('u','s'), *%w(address active queued)
+tcp, unix = [], []
+ARGV.each { |addr| (addr =~ %r{\A/} ? unix : tcp) << addr }
+stats = {}
+tcp = nil if tcp.empty?
+unix = nil if unix.empty?
+
+begin
+  stats.clear
+  tcp and stats.merge! Raindrops::Linux.tcp_listener_stats(tcp)
+  unix and stats.merge! Raindrops::Linux.unix_listener_stats(unix)
+  stats.each { |addr,stats| printf fmt, addr, stats.active, stats.queued }
+end while delay && sleep(delay)