hyperic-sigar 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. data/COPYING +339 -0
  2. data/EXCEPTIONS +104 -0
  3. data/README +2 -0
  4. data/Rakefile +87 -0
  5. data/bindings/SigarWrapper.pm +2934 -0
  6. data/bindings/ruby/examples/cpu_info.rb +16 -0
  7. data/bindings/ruby/examples/df.rb +32 -0
  8. data/bindings/ruby/examples/free.rb +19 -0
  9. data/bindings/ruby/examples/ifconfig.rb +67 -0
  10. data/bindings/ruby/examples/netstat.rb +54 -0
  11. data/bindings/ruby/examples/pargs.rb +18 -0
  12. data/bindings/ruby/examples/penv.rb +14 -0
  13. data/bindings/ruby/examples/route.rb +31 -0
  14. data/bindings/ruby/examples/who.rb +13 -0
  15. data/bindings/ruby/extconf.rb +110 -0
  16. data/bindings/ruby/rbsigar.c +628 -0
  17. data/include/sigar.h +901 -0
  18. data/include/sigar_fileinfo.h +141 -0
  19. data/include/sigar_format.h +65 -0
  20. data/include/sigar_getline.h +18 -0
  21. data/include/sigar_log.h +82 -0
  22. data/include/sigar_private.h +365 -0
  23. data/include/sigar_ptql.h +55 -0
  24. data/include/sigar_util.h +192 -0
  25. data/src/os/aix/aix_sigar.c +1927 -0
  26. data/src/os/aix/sigar_os.h +71 -0
  27. data/src/os/darwin/darwin_sigar.c +3450 -0
  28. data/src/os/darwin/sigar_os.h +82 -0
  29. data/src/os/hpux/dlpi.c +284 -0
  30. data/src/os/hpux/hpux_sigar.c +1205 -0
  31. data/src/os/hpux/sigar_os.h +51 -0
  32. data/src/os/linux/linux_sigar.c +2595 -0
  33. data/src/os/linux/sigar_os.h +84 -0
  34. data/src/os/netware/netware_sigar.c +719 -0
  35. data/src/os/netware/sigar_os.h +26 -0
  36. data/src/os/osf1/osf1_sigar.c +593 -0
  37. data/src/os/osf1/sigar_os.h +42 -0
  38. data/src/os/solaris/get_mib2.c +321 -0
  39. data/src/os/solaris/get_mib2.h +127 -0
  40. data/src/os/solaris/hmekstat.h +77 -0
  41. data/src/os/solaris/kstats.c +182 -0
  42. data/src/os/solaris/procfs.c +99 -0
  43. data/src/os/solaris/sigar_os.h +225 -0
  44. data/src/os/solaris/solaris_sigar.c +2561 -0
  45. data/src/os/stub/sigar_os.h +8 -0
  46. data/src/os/stub/stub_sigar.c +303 -0
  47. data/src/os/win32/peb.c +213 -0
  48. data/src/os/win32/sigar_os.h +623 -0
  49. data/src/os/win32/sigar_pdh.h +49 -0
  50. data/src/os/win32/win32_sigar.c +3718 -0
  51. data/src/sigar.c +2292 -0
  52. data/src/sigar_cache.c +181 -0
  53. data/src/sigar_fileinfo.c +792 -0
  54. data/src/sigar_format.c +649 -0
  55. data/src/sigar_getline.c +1849 -0
  56. data/src/sigar_ptql.c +1966 -0
  57. data/src/sigar_signal.c +218 -0
  58. data/src/sigar_util.c +1061 -0
  59. data/version.properties +11 -0
  60. metadata +112 -0
@@ -0,0 +1,16 @@
1
+ require 'rbsigar'
2
+
3
+ sigar = Sigar.new
4
+
5
+ infos = sigar.cpu_info_list
6
+
7
+ num = infos.length
8
+
9
+ puts num.to_s + " total CPUs.."
10
+
11
+ infos.each do |info|
12
+ puts "Vendor........" + info.vendor
13
+ puts "Model........." + info.model
14
+ puts "Mhz..........." + info.mhz.to_s
15
+ puts "Cache size...." + info.cache_size.to_s
16
+ end
@@ -0,0 +1,32 @@
1
+ require 'rbsigar'
2
+
3
+ def format_size(size)
4
+ return Sigar.format_size(size * 1024)
5
+ end
6
+
7
+ sigar = Sigar.new
8
+ fslist = sigar.file_system_list
9
+
10
+ puts "Filesystem\tSize\tUsed\tAvail\tUse%\tMounted on\tType\n"
11
+
12
+ fslist.each do |fs|
13
+ dir_name = fs.dir_name
14
+ begin
15
+ usage = sigar.file_system_usage(dir_name)
16
+ total = usage.total
17
+ used = total - usage.free
18
+ avail = usage.avail
19
+ pct = usage.use_percent * 100
20
+ rescue Exception => e
21
+ #e.g. floppy or cdrom drive
22
+ used = avail = total = pct = 0;
23
+ end
24
+
25
+ puts fs.dev_name + "\t" +
26
+ format_size(total) + "\t" +
27
+ format_size(used) + "\t" +
28
+ format_size(avail) + "\t" +
29
+ (pct == 0.0 ? '-' : pct.to_s) + "\t" +
30
+ dir_name + "\t" +
31
+ fs.sys_type_name + "/" + fs.type_name
32
+ end
@@ -0,0 +1,19 @@
1
+ require 'rbsigar'
2
+
3
+ sigar = Sigar.new
4
+ mem = sigar.mem
5
+ swap = sigar.swap
6
+
7
+ puts "\tTotal\tUsed\tFree"
8
+
9
+ puts "Mem: " +
10
+ (mem.total / 1024).to_s + "\t" +
11
+ (mem.used / 1024).to_s + "\t" +
12
+ (mem.free/ 1024).to_s
13
+
14
+ puts "Swap: " +
15
+ (swap.total / 1024).to_s + "\t" +
16
+ (swap.used / 1024).to_s + "\t" +
17
+ (swap.free/ 1024).to_s
18
+
19
+ puts "RAM: " + mem.ram.to_s + "MB";
@@ -0,0 +1,67 @@
1
+ require 'rbsigar'
2
+
3
+ sigar = Sigar.new
4
+ iflist = sigar.net_interface_list
5
+
6
+ iflist.each do |ifname|
7
+ ifconfig = sigar.net_interface_config(ifname)
8
+ flags = ifconfig.flags
9
+ encap = ifconfig.type
10
+
11
+ hwaddr = ifconfig.hwaddr
12
+ if hwaddr == Sigar::NULL_HWADDR
13
+ hwaddr = ""
14
+ else
15
+ hwaddr = " HWaddr " + hwaddr
16
+ end
17
+
18
+ puts ifname + "\t" + "Link encap:" + encap + hwaddr
19
+
20
+ if (flags & Sigar::IFF_POINTOPOINT) != 0
21
+ ptp = " P-t-P:" + ifconfig.destination
22
+ else
23
+ ptp = ""
24
+ end
25
+
26
+ if (flags & Sigar::IFF_BROADCAST) != 0
27
+ bcast = " Bcast:" + ifconfig.broadcast
28
+ else
29
+ bcast = ""
30
+ end
31
+
32
+ puts "\t" + "inet addr:" + ifconfig.address +
33
+ ptp + bcast + " Mask:" + ifconfig.netmask
34
+
35
+ puts "\t" +
36
+ Sigar.net_interface_flags_to_s(flags) +
37
+ " MTU:" + ifconfig.mtu.to_s +
38
+ " Metric:" + ifconfig.metric.to_s
39
+
40
+ ifstat = sigar.net_interface_stat(ifname)
41
+
42
+ puts "\t" +
43
+ "RX packets:" + ifstat.rx_packets.to_s +
44
+ " errors:" + ifstat.rx_errors.to_s +
45
+ " dropped:" + ifstat.rx_dropped.to_s +
46
+ " overruns:" + ifstat.rx_overruns.to_s +
47
+ " frame:" + ifstat.rx_frame.to_s
48
+
49
+ puts "\t" +
50
+ "TX packets:" + ifstat.tx_packets.to_s +
51
+ " errors:" + ifstat.tx_errors.to_s +
52
+ " dropped:" + ifstat.tx_dropped.to_s +
53
+ " overruns:" + ifstat.tx_overruns.to_s +
54
+ " carrier:" + ifstat.tx_carrier.to_s
55
+
56
+ puts "\t" + "collisions:" + ifstat.tx_collisions.to_s
57
+
58
+ rx_bytes = ifstat.rx_bytes
59
+ tx_bytes = ifstat.tx_bytes
60
+
61
+ print "\t" +
62
+ "RX bytes:" + rx_bytes.to_s +
63
+ " (" + Sigar.format_size(rx_bytes) + ")" +
64
+ " " +
65
+ "TX bytes:" + tx_bytes.to_s +
66
+ " (" + Sigar.format_size(tx_bytes) + ")" + "\n";
67
+ end
@@ -0,0 +1,54 @@
1
+ require 'rbsigar'
2
+ require 'socket'
3
+
4
+ #XXX this example is incomplete wrt:
5
+ #../../java/src/org/hyperic/sigar/cmd/Netstat.java
6
+
7
+ is_numeric = false
8
+ flags = Sigar::NETCONN_CLIENT|Sigar::NETCONN_SERVER
9
+ flags |= Sigar::NETCONN_TCP
10
+
11
+ def format_port(sigar, proto, port, is_numeric)
12
+ if port == 0
13
+ return "*"
14
+ end
15
+ if !is_numeric
16
+ service = sigar.net_services_name(proto, port)
17
+ if service != nil
18
+ return service
19
+ end
20
+ end
21
+ port.to_s
22
+ end
23
+
24
+ def format_address(sigar, proto, ip, portnum, is_numeric)
25
+ port = format_port(sigar, proto, portnum, is_numeric)
26
+ address = ""
27
+ if ip == "0.0.0.0" || ip == "::"
28
+ address = "*"
29
+ elsif is_numeric
30
+ address = ip.to_s
31
+ else
32
+ begin
33
+ name = Socket.gethostbyname(ip)
34
+ address = name[0]
35
+ rescue SocketError
36
+ address = ip.to_s
37
+ end
38
+ end
39
+ return address + ":" + port
40
+ end
41
+
42
+ sigar = Sigar.new
43
+
44
+ connections = sigar.net_connection_list(flags)
45
+ puts "Proto\tLocal Address\tForeign Address\tState"
46
+
47
+ connections.each do |conn|
48
+ proto = Sigar.net_connection_type_to_s(conn.type)
49
+ state = Sigar.net_connection_state_to_s(conn.state)
50
+ local = format_address(sigar, conn.type, conn.local_address, conn.local_port, is_numeric)
51
+ remote = format_address(sigar, conn.type, conn.remote_address, conn.remote_port, is_numeric)
52
+ puts proto + "\t" + local + "\t" + remote + "\t" + state
53
+ end
54
+
@@ -0,0 +1,18 @@
1
+ require 'rbsigar'
2
+
3
+ def output(sigar, pid)
4
+ args = sigar.proc_args(pid)
5
+ exe = sigar.proc_exe(pid);
6
+ puts "exe=" + exe.name
7
+ puts "cwd=" + exe.cwd
8
+
9
+ args.each do |arg|
10
+ puts " " + "=>" + arg + "<="
11
+ end
12
+ end
13
+
14
+ sigar = Sigar.new
15
+
16
+ ARGV.each do |pid|
17
+ output(sigar, pid)
18
+ end
@@ -0,0 +1,14 @@
1
+ require 'rbsigar'
2
+
3
+ def output(sigar, pid)
4
+ env = sigar.proc_env(pid)
5
+ env.each do |key, val|
6
+ puts key + "=" + val
7
+ end
8
+ end
9
+
10
+ sigar = Sigar.new
11
+
12
+ ARGV.each do |pid|
13
+ output(sigar, pid)
14
+ end
@@ -0,0 +1,31 @@
1
+ require 'rbsigar'
2
+
3
+ def flags(flags)
4
+ f = ""
5
+ if (flags & Sigar::RTF_UP) != 0
6
+ f += "U"
7
+ end
8
+ if (flags & Sigar::RTF_GATEWAY) != 0
9
+ f += "G"
10
+ end
11
+ if (flags & Sigar::RTF_HOST) != 0
12
+ f += "H"
13
+ end
14
+ f
15
+ end
16
+
17
+ def gw(addr)
18
+ addr == "0.0.0.0" ? "*" : addr
19
+ end
20
+ def dest(addr)
21
+ addr == "0.0.0.0" ? "default" : addr
22
+ end
23
+
24
+ puts "Kernel IP routing table"
25
+ fmt = "%-15s %-15s %-15s %-5s %-6s %-3s %-s\n"
26
+ printf fmt, "Destination", "Gateway", "Genmask", "Flags", "Metric", "Ref", "Iface"
27
+
28
+ Sigar.new.net_route_list.each do |route|
29
+ printf fmt, dest(route.destination), gw(route.gateway), route.mask,
30
+ flags(route.flags), route.metric.to_s, route.refcnt.to_s, route.ifname
31
+ end
@@ -0,0 +1,13 @@
1
+ require 'rbsigar'
2
+
3
+ def format_time(who)
4
+ return Time.at(who.time).strftime("%b %e %H:%M")
5
+ end
6
+
7
+ sigar = Sigar.new
8
+
9
+ whos = sigar.who_list
10
+
11
+ whos.each do |who|
12
+ puts who.user + "\t" + who.device + "\t" + format_time(who) + who.host
13
+ end
@@ -0,0 +1,110 @@
1
+ require 'mkmf'
2
+ require 'rbconfig'
3
+
4
+ extension_name = 'rbsigar'
5
+
6
+ print 'Ruby platform=' + RUBY_PLATFORM + "\n"
7
+
8
+ case RUBY_PLATFORM
9
+ when /darwin/
10
+ os = 'darwin'
11
+ sdks = Dir.glob('/Developer/SDKs/MacOSX10.*.sdk').sort.reverse
12
+ if sdks.length == 0
13
+ print "Xcode Developer Tools not installed\n"
14
+ print "Download from http://developer.apple.com/technology/xcode.html\n"
15
+ exit 1
16
+ else
17
+ print "Available SDKs...\n(*) " + sdks.join("\n ") + "\n"
18
+ sdk = sdks[0]
19
+ end
20
+ if File.file?("/usr/include/libproc.h")
21
+ $CPPFLAGS += ' -DDARWIN_HAS_LIBPROC_H'
22
+ end
23
+ $CPPFLAGS += ' -DDARWIN -I/Developer/Headers/FlatCarbon -isysroot ' + sdk
24
+ $LDFLAGS += ' -Wl,-syslibroot,' + sdk + ' -framework CoreServices -framework IOKit'
25
+ when /bsd/
26
+ os = 'darwin'
27
+ have_library("kvm")
28
+ when /mswin|mingw|cygwin|bccwin/
29
+ os = 'win32'
30
+ require 'ftools'
31
+ $CPPFLAGS += ' -DWIN32'
32
+ is_win32 = true
33
+ have_library("kernel32")
34
+ have_library("user32")
35
+ have_library("advapi32")
36
+ have_library("ws2_32")
37
+ have_library("netapi32")
38
+ have_library("shell32")
39
+ have_library("pdh")
40
+ have_library("version")
41
+ when /linux/
42
+ os = 'linux'
43
+ when /solaris|sun/
44
+ os = 'solaris'
45
+ have_library("nsl")
46
+ have_library("socket")
47
+ have_library("kstat")
48
+ when /hpux/
49
+ os = 'hpux'
50
+ #XXX have_libary no workie on hpux?
51
+ $LDFLAGS += ' -lnsl -lnm'
52
+ when /aix/
53
+ os = 'aix'
54
+ have_library("odm")
55
+ have_library("cfg")
56
+ have_library("perfstat")
57
+ else
58
+ os = RUBY_PLATFORM
59
+ end
60
+
61
+ osdir = "../../src/os/#{os}"
62
+ $CPPFLAGS += ' -I../../include' + ' -I' + osdir
63
+ $CPPFLAGS += ' -U_FILE_OFFSET_BITS' unless is_win32
64
+
65
+ if RUBY_VERSION > '1.8.4'
66
+ $CPPFLAGS += ' -DRB_HAS_RE_ERROR'
67
+ end
68
+ if RUBY_VERSION >= '1.9.0'
69
+ $CPPFLAGS += ' -DRB_RUBY_19'
70
+ end
71
+
72
+ #incase of nfs shared dir...
73
+ unless is_win32
74
+ if File.exist?('Makefile')
75
+ cmd = 'make distclean'
76
+ print cmd + "\n"
77
+ system(cmd)
78
+ end
79
+ Dir["./*.c"].each do |file|
80
+ if File.lstat(file).symlink?
81
+ print "unlink #{file}\n"
82
+ File.delete(file)
83
+ end
84
+ end
85
+ end
86
+
87
+ system('perl -Mlib=.. -MSigarWrapper -e generate Ruby .')
88
+ libname = extension_name + '.' + CONFIG['DLEXT']
89
+ system('perl -Mlib=.. -MSigarBuild -e version_file ' +
90
+ 'ARCHNAME=' + RUBY_PLATFORM + ' ' +
91
+ 'ARCHLIB=' + libname + ' ' +
92
+ 'BINNAME=' + libname)
93
+
94
+ $distcleanfiles = ['rbsigar_generated.rx','sigar_version.c']
95
+ #XXX seems mkmf forces basename on srcs
96
+ #XXX should be linking against libsigar anyhow
97
+ (Dir["../../src/*.c"] + Dir["#{osdir}/*.c"]).each do |file|
98
+ cf = File.basename(file)
99
+ print file + ' -> ' + cf + "\n"
100
+ if is_win32
101
+ File.copy(file, cf)
102
+ else
103
+ File.symlink(file, cf) unless File.file?(cf)
104
+ end
105
+ $distcleanfiles.push(cf)
106
+ end
107
+
108
+ dir_config(extension_name)
109
+
110
+ create_makefile(extension_name)
@@ -0,0 +1,628 @@
1
+ /*
2
+ * Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
3
+ * This file is part of SIGAR.
4
+ *
5
+ * SIGAR is free software; you can redistribute it and/or modify
6
+ * it under the terms version 2 of the GNU General Public License as
7
+ * published by the Free Software Foundation. This program is distributed
8
+ * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
9
+ * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10
+ * PARTICULAR PURPOSE. See the GNU General Public License for more
11
+ * details.
12
+ *
13
+ * You should have received a copy of the GNU General Public License
14
+ * along with this program; if not, write to the Free Software
15
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
16
+ * USA.
17
+ */
18
+
19
+ #include <ruby.h>
20
+ #ifdef RB_RUBY_19
21
+ #include <ruby/re.h>
22
+ #else
23
+ #include <re.h>
24
+ #endif
25
+
26
+ #include <errno.h>
27
+ #include "sigar.h"
28
+ #include "sigar_fileinfo.h"
29
+ #include "sigar_format.h"
30
+ #include "sigar_ptql.h"
31
+
32
+ #define RB_SIGAR_RAISE(msg) rb_raise(rb_eArgError, "%s", msg)
33
+ #define RB_SIGAR_CROAK RB_SIGAR_RAISE(sigar_strerror(sigar, status))
34
+ #define OBJ2PID(pid) rb_sigar_pid_get(sigar, pid)
35
+
36
+ #ifndef RSTRING_PTR
37
+ #define RSTRING_PTR(s) RSTRING(s)->ptr
38
+ #endif
39
+
40
+ #ifndef RSTRING_LEN
41
+ #define RSTRING_LEN(s) RSTRING(s)->len
42
+ #endif
43
+
44
+ #ifdef RB_HAS_RE_ERROR
45
+ # define RB_REGEX_ERROR rb_eRegexpError
46
+ #else
47
+ # define RB_REGEX_ERROR rb_eArgError
48
+ #endif
49
+
50
+ static sigar_t *rb_sigar_get(VALUE obj)
51
+ {
52
+ sigar_t *sigar;
53
+ Data_Get_Struct(obj, sigar_t, sigar);
54
+ return sigar;
55
+ }
56
+
57
+ static int rbsigar_ptql_re_impl(void *data,
58
+ char *haystack, char *needle)
59
+ {
60
+ #ifdef RB_RUBY_19
61
+ /* XXX no more regex.h */
62
+ return 0;
63
+ #else
64
+ struct re_pattern_buffer *regex;
65
+ int len = strlen(haystack);
66
+ int retval;
67
+ const char *err;
68
+
69
+ regex = ALLOC(struct re_pattern_buffer);
70
+ MEMZERO((char *)regex, struct re_pattern_buffer, 1);
71
+ /* XXX cache */
72
+ if ((err = re_compile_pattern(needle, strlen(needle), regex))) {
73
+ re_free_pattern(regex);
74
+ rb_raise(RB_REGEX_ERROR, "%s", err);
75
+ return 0;
76
+ }
77
+
78
+ retval = re_match(regex, haystack, len, 0, NULL);
79
+ re_free_pattern(regex);
80
+ return retval > 0;
81
+ #endif
82
+ }
83
+
84
+ #define sigar_isdigit(c) \
85
+ (isdigit(((unsigned char)(c))))
86
+
87
+ static sigar_pid_t rb_sigar_pid_get(sigar_t *sigar, VALUE obj)
88
+ {
89
+ if (TYPE(obj) == T_STRING) {
90
+ char *pid = StringValuePtr(obj);
91
+
92
+ if (sigar_isdigit(*pid)) {
93
+ obj = rb_str2inum(obj, 10);
94
+ /* fallthru */
95
+ }
96
+ else if ((RSTRING_LEN(obj) == 2) &&
97
+ (*pid == '$') && (*(pid + 1) == '$'))
98
+ {
99
+ return sigar_pid_get(sigar);
100
+ }
101
+ else {
102
+ /* XXX cache queries */
103
+ sigar_ptql_query_t *query;
104
+ sigar_ptql_error_t error;
105
+ int status =
106
+ sigar_ptql_query_create(&query, (char *)pid, &error);
107
+
108
+ if (status == SIGAR_OK) {
109
+ sigar_pid_t qpid;
110
+
111
+ sigar_ptql_re_impl_set(sigar, NULL, rbsigar_ptql_re_impl);
112
+ status = sigar_ptql_query_find_process(sigar, query, &qpid);
113
+ sigar_ptql_re_impl_set(sigar, NULL, NULL);
114
+ sigar_ptql_query_destroy(query);
115
+ if (status == SIGAR_OK) {
116
+ return qpid;
117
+ }
118
+ else {
119
+ RB_SIGAR_RAISE(sigar_strerror(sigar, status));
120
+ }
121
+ }
122
+ else {
123
+ RB_SIGAR_RAISE(error.message);
124
+ }
125
+ }
126
+ }
127
+ return NUM2UINT(obj);
128
+ }
129
+
130
+ static void rb_sigar_free(void *obj)
131
+ {
132
+ free(obj);
133
+ }
134
+
135
+ static void rb_sigar_close(void *obj)
136
+ {
137
+ sigar_close((sigar_t *)obj);
138
+ }
139
+
140
+ static VALUE rb_sigar_new(VALUE module)
141
+ {
142
+ sigar_t *sigar;
143
+ sigar_open(&sigar);
144
+ return Data_Wrap_Struct(module, 0, rb_sigar_close, sigar);
145
+ }
146
+
147
+ static VALUE rb_sigar_format_size(VALUE rclass, VALUE size)
148
+ {
149
+ char buffer[56];
150
+ return rb_str_new2(sigar_format_size(NUM2LL(size), buffer));
151
+ }
152
+
153
+ static VALUE rb_sigar_net_interface_flags_to_s(VALUE rclass, VALUE flags)
154
+ {
155
+ char buffer[1024];
156
+ return rb_str_new2(sigar_net_interface_flags_to_string(NUM2LL(flags), buffer));
157
+ }
158
+
159
+ static VALUE rb_sigar_net_connection_type_to_s(VALUE rclass, VALUE type)
160
+ {
161
+ return rb_str_new2(sigar_net_connection_type_get(NUM2INT(type)));
162
+ }
163
+
164
+ static VALUE rb_sigar_net_connection_state_to_s(VALUE rclass, VALUE state)
165
+ {
166
+ return rb_str_new2(sigar_net_connection_state_get(NUM2INT(state)));
167
+ }
168
+
169
+ static VALUE rb_sigar_net_address_to_string(sigar_net_address_t *address)
170
+ {
171
+ char addr_str[SIGAR_INET6_ADDRSTRLEN];
172
+ sigar_net_address_to_string(NULL, address, addr_str);
173
+ return rb_str_new2(addr_str);
174
+ }
175
+
176
+ #define rb_sigar_net_address_to_s(a) rb_sigar_net_address_to_string(&a)
177
+
178
+ static VALUE rb_sigar_new_list(char *data, unsigned long number,
179
+ int size, VALUE rclass)
180
+ {
181
+ unsigned long i;
182
+ VALUE av = rb_ary_new2(number);
183
+
184
+ for (i=0; i<number; i++, data += size) {
185
+ void *ent = malloc(size);
186
+
187
+ memcpy(ent, data, size);
188
+ rb_ary_push(av, Data_Wrap_Struct(rclass, 0, free, ent));
189
+ }
190
+
191
+ return av;
192
+ }
193
+
194
+ static VALUE rb_sigar_new_strlist(char **data, unsigned long number)
195
+ {
196
+ unsigned long i;
197
+ VALUE av = rb_ary_new2(number);
198
+
199
+ for (i=0; i<number; i++) {
200
+ rb_ary_push(av, rb_str_new2(data[i]));
201
+ }
202
+
203
+ return av;
204
+ }
205
+
206
+ static VALUE rb_sigar_new_intlist(int *data, int number)
207
+ {
208
+ int i;
209
+ VALUE av = rb_ary_new2(number);
210
+
211
+ for (i=0; i<number; i++) {
212
+ rb_ary_push(av, rb_int2inum(data[i]));
213
+ }
214
+
215
+ return av;
216
+ }
217
+
218
+ static VALUE rb_sigar_net_interface_list(VALUE obj)
219
+ {
220
+ int status;
221
+ sigar_t *sigar = rb_sigar_get(obj);
222
+ sigar_net_interface_list_t iflist;
223
+ VALUE RETVAL;
224
+
225
+ status = sigar_net_interface_list_get(sigar, &iflist);
226
+ if (status != SIGAR_OK) {
227
+ RB_SIGAR_CROAK;
228
+ }
229
+
230
+ RETVAL = rb_sigar_new_strlist(iflist.data, iflist.number);
231
+
232
+ sigar_net_interface_list_destroy(sigar, &iflist);
233
+
234
+ return RETVAL;
235
+ }
236
+
237
+ static int rb_sigar_str2net_address(VALUE bytes, sigar_net_address_t *address)
238
+ {
239
+ long len = RSTRING_LEN(bytes);
240
+
241
+ switch (len) {
242
+ case 4:
243
+ address->family = SIGAR_AF_INET;
244
+ break;
245
+ case 4*4:
246
+ address->family = SIGAR_AF_INET6;
247
+ break;
248
+ default:
249
+ return EINVAL;
250
+ }
251
+
252
+ memcpy(RSTRING_PTR(bytes), &address->addr.in6, len);
253
+
254
+ return SIGAR_OK;
255
+ }
256
+
257
+ static VALUE rb_cSigarNetStat;
258
+
259
+ static VALUE rb_sigar_net_stat_get(VALUE obj, VALUE flags, VALUE bytes, int port)
260
+ {
261
+ int status;
262
+ int has_port = (port != -1);
263
+ sigar_t *sigar = rb_sigar_get(obj);
264
+ sigar_net_stat_t *RETVAL = malloc(sizeof(*RETVAL));
265
+ sigar_net_address_t address;
266
+
267
+ if (has_port) {
268
+ status = rb_sigar_str2net_address(bytes, &address);
269
+ if (status == SIGAR_OK) {
270
+ status = sigar_net_stat_port_get(sigar, RETVAL, NUM2INT(flags),
271
+ &address, port);
272
+ }
273
+ }
274
+ else {
275
+ status = sigar_net_stat_get(sigar, RETVAL, NUM2INT(flags));
276
+ }
277
+
278
+ if (status != SIGAR_OK) {
279
+ free(RETVAL);
280
+ RB_SIGAR_CROAK;
281
+ }
282
+
283
+ return Data_Wrap_Struct(rb_cSigarNetStat, 0, rb_sigar_free, RETVAL);
284
+ }
285
+
286
+ static VALUE rb_sigar_net_stat(VALUE obj, VALUE flags)
287
+ {
288
+ return rb_sigar_net_stat_get(obj, flags, Qnil, -1);
289
+ }
290
+
291
+ static VALUE rb_sigar_net_stat_port(VALUE obj, VALUE flags, VALUE address, VALUE port)
292
+ {
293
+ return rb_sigar_net_stat_get(obj, flags, address, NUM2INT(port));
294
+ }
295
+
296
+ static VALUE rb_sigar_NetStat_tcp_states(VALUE self)
297
+ {
298
+ sigar_net_stat_t *net_stat;
299
+
300
+ Data_Get_Struct(self, sigar_net_stat_t, net_stat);
301
+
302
+ return rb_sigar_new_intlist(&net_stat->tcp_states[0], SIGAR_TCP_UNKNOWN);
303
+ }
304
+
305
+ static VALUE rb_cSigarNetConnection;
306
+
307
+ static VALUE rb_sigar_net_connection_list(VALUE obj, VALUE flags)
308
+ {
309
+ int status;
310
+ unsigned int i;
311
+ sigar_t *sigar = rb_sigar_get(obj);
312
+ sigar_net_connection_list_t connlist;
313
+ VALUE RETVAL;
314
+
315
+ status = sigar_net_connection_list_get(sigar, &connlist, NUM2UINT(flags));
316
+
317
+ if (status != SIGAR_OK) {
318
+ RB_SIGAR_CROAK;
319
+ }
320
+
321
+ RETVAL = rb_sigar_new_list((char *)&connlist.data[0],
322
+ connlist.number,
323
+ sizeof(*connlist.data),
324
+ rb_cSigarNetConnection);
325
+
326
+ sigar_net_connection_list_destroy(sigar, &connlist);
327
+
328
+ return RETVAL;
329
+ }
330
+
331
+ static VALUE rb_sigar_net_services_name(VALUE obj, VALUE protocol, VALUE port)
332
+ {
333
+ sigar_t *sigar = rb_sigar_get(obj);
334
+ char *name;
335
+
336
+ if ((name = sigar_net_services_name_get(sigar, NUM2UINT(protocol), NUM2UINT(port)))) {
337
+ return rb_str_new2(name);
338
+ }
339
+ else {
340
+ return Qnil;
341
+ }
342
+ }
343
+
344
+ static VALUE rb_cSigarCpuInfo;
345
+
346
+ static VALUE rb_sigar_cpu_info_list(VALUE obj)
347
+ {
348
+ int status;
349
+ sigar_t *sigar = rb_sigar_get(obj);
350
+ sigar_cpu_info_list_t cpu_infos;
351
+ VALUE RETVAL;
352
+
353
+ status = sigar_cpu_info_list_get(sigar, &cpu_infos);
354
+ if (status != SIGAR_OK) {
355
+ RB_SIGAR_CROAK;
356
+ }
357
+
358
+ RETVAL = rb_sigar_new_list((char *)&cpu_infos.data[0],
359
+ cpu_infos.number,
360
+ sizeof(*cpu_infos.data),
361
+ rb_cSigarCpuInfo);
362
+
363
+ sigar_cpu_info_list_destroy(sigar, &cpu_infos);
364
+
365
+ return RETVAL;
366
+ }
367
+
368
+ static VALUE rb_cSigarCpuPerc;
369
+
370
+ static VALUE rb_cSigarFileSystem;
371
+
372
+ static VALUE rb_sigar_file_system_list(VALUE obj)
373
+ {
374
+ int status;
375
+ sigar_t *sigar = rb_sigar_get(obj);
376
+ sigar_file_system_list_t fslist;
377
+ VALUE RETVAL;
378
+
379
+ status = sigar_file_system_list_get(sigar, &fslist);
380
+ if (status != SIGAR_OK) {
381
+ RB_SIGAR_CROAK;
382
+ }
383
+
384
+ RETVAL = rb_sigar_new_list((char *)&fslist.data[0],
385
+ fslist.number,
386
+ sizeof(*fslist.data),
387
+ rb_cSigarFileSystem);
388
+
389
+ sigar_file_system_list_destroy(sigar, &fslist);
390
+
391
+ return RETVAL;
392
+ }
393
+
394
+ static VALUE rb_cSigarWho;
395
+
396
+ static VALUE rb_sigar_who_list(VALUE obj)
397
+ {
398
+ int status;
399
+ sigar_t *sigar = rb_sigar_get(obj);
400
+ sigar_who_list_t list;
401
+ VALUE RETVAL;
402
+
403
+ status = sigar_who_list_get(sigar, &list);
404
+ if (status != SIGAR_OK) {
405
+ RB_SIGAR_CROAK;
406
+ }
407
+
408
+ RETVAL = rb_sigar_new_list((char *)&list.data[0],
409
+ list.number,
410
+ sizeof(*list.data),
411
+ rb_cSigarWho);
412
+
413
+ sigar_who_list_destroy(sigar, &list);
414
+
415
+ return RETVAL;
416
+ }
417
+
418
+ static VALUE rb_cSigarNetRoute;
419
+
420
+ static VALUE rb_sigar_net_route_list(VALUE obj)
421
+ {
422
+ int status;
423
+ sigar_t *sigar = rb_sigar_get(obj);
424
+ sigar_net_route_list_t list;
425
+ VALUE RETVAL;
426
+
427
+ status = sigar_net_route_list_get(sigar, &list);
428
+ if (status != SIGAR_OK) {
429
+ RB_SIGAR_CROAK;
430
+ }
431
+
432
+ RETVAL = rb_sigar_new_list((char *)&list.data[0],
433
+ list.number,
434
+ sizeof(*list.data),
435
+ rb_cSigarNetRoute);
436
+
437
+ sigar_net_route_list_destroy(sigar, &list);
438
+
439
+ return RETVAL;
440
+ }
441
+
442
+ static VALUE rb_sigar_proc_list(int argc, VALUE *argv, VALUE obj)
443
+ {
444
+ int status;
445
+ sigar_t *sigar = rb_sigar_get(obj);
446
+ sigar_proc_list_t list;
447
+ VALUE RETVAL;
448
+ VALUE vptql;
449
+
450
+ rb_scan_args(argc, argv, "01", &vptql);
451
+ if (NIL_P(vptql)) {
452
+ status = sigar_proc_list_get(sigar, &list);
453
+
454
+ if (status != SIGAR_OK) {
455
+ RB_SIGAR_CROAK;
456
+ }
457
+ }
458
+ else {
459
+ sigar_ptql_query_t *query;
460
+ sigar_ptql_error_t error;
461
+ char *ptql = StringValuePtr(vptql);
462
+
463
+ status = sigar_ptql_query_create(&query, ptql, &error);
464
+
465
+ if (status != SIGAR_OK) {
466
+ RB_SIGAR_RAISE(error.message);
467
+ }
468
+ sigar_ptql_re_impl_set(sigar, NULL, rbsigar_ptql_re_impl);
469
+ status = sigar_ptql_query_find(sigar, query, &list);
470
+ sigar_ptql_re_impl_set(sigar, NULL, NULL);
471
+ sigar_ptql_query_destroy(query);
472
+ if (status != SIGAR_OK) {
473
+ RB_SIGAR_RAISE(sigar_strerror(sigar, status));
474
+ }
475
+ }
476
+
477
+ RETVAL = rb_sigar_new_intlist(&list.data[0],
478
+ list.number);
479
+
480
+ sigar_proc_list_destroy(sigar, &list);
481
+
482
+ return RETVAL;
483
+ }
484
+
485
+ static VALUE rb_sigar_proc_args(VALUE obj, VALUE pid)
486
+ {
487
+ int status;
488
+ sigar_t *sigar = rb_sigar_get(obj);
489
+ sigar_proc_args_t args;
490
+ VALUE RETVAL;
491
+
492
+ status = sigar_proc_args_get(sigar, OBJ2PID(pid), &args);
493
+
494
+ if (status != SIGAR_OK) {
495
+ RB_SIGAR_CROAK;
496
+ }
497
+
498
+ RETVAL = rb_sigar_new_strlist(args.data, args.number);
499
+
500
+ sigar_proc_args_destroy(sigar, &args);
501
+
502
+ return RETVAL;
503
+ }
504
+
505
+ static int rb_sigar_env_getall(void *data,
506
+ const char *key, int klen,
507
+ char *val, int vlen)
508
+ {
509
+ rb_hash_aset(*((VALUE*)data),
510
+ rb_str_new(key, klen),
511
+ rb_str_new(val, vlen));
512
+ return SIGAR_OK;
513
+ }
514
+
515
+ static VALUE rb_sigar_proc_env(VALUE obj, VALUE pid)
516
+ {
517
+ int status;
518
+ sigar_t *sigar = rb_sigar_get(obj);
519
+ sigar_proc_env_t procenv;
520
+ VALUE RETVAL = rb_hash_new();
521
+
522
+ procenv.type = SIGAR_PROC_ENV_ALL;
523
+ procenv.env_getter = rb_sigar_env_getall;
524
+ procenv.data = &RETVAL;
525
+
526
+ status = sigar_proc_env_get(sigar, OBJ2PID(pid), &procenv);
527
+ if (status != SIGAR_OK) {
528
+ RB_SIGAR_CROAK;
529
+ }
530
+
531
+ return RETVAL;
532
+ }
533
+
534
+ #include "./rbsigar_generated.rx"
535
+
536
+ #define RB_SIGAR_CONST_INT(name) \
537
+ rb_define_const(rclass, #name, INT2FIX(SIGAR_##name))
538
+
539
+ #define RB_SIGAR_DEFINE_CONST_STR(name, value) \
540
+ rb_define_const(rclass, name, rb_obj_freeze(rb_str_new2(value)))
541
+
542
+ #define RB_SIGAR_CONST_STR(name) \
543
+ rb_define_const(rclass, #name, rb_obj_freeze(rb_str_new2(SIGAR_##name)))
544
+
545
+ static void Init_rbsigar_constants(VALUE rclass)
546
+ {
547
+ RB_SIGAR_CONST_INT(IFF_UP);
548
+ RB_SIGAR_CONST_INT(IFF_BROADCAST);
549
+ RB_SIGAR_CONST_INT(IFF_DEBUG);
550
+ RB_SIGAR_CONST_INT(IFF_LOOPBACK);
551
+ RB_SIGAR_CONST_INT(IFF_POINTOPOINT);
552
+ RB_SIGAR_CONST_INT(IFF_NOTRAILERS);
553
+ RB_SIGAR_CONST_INT(IFF_RUNNING);
554
+ RB_SIGAR_CONST_INT(IFF_NOARP);
555
+ RB_SIGAR_CONST_INT(IFF_PROMISC);
556
+ RB_SIGAR_CONST_INT(IFF_ALLMULTI);
557
+ RB_SIGAR_CONST_INT(IFF_MULTICAST);
558
+
559
+ RB_SIGAR_CONST_INT(NETCONN_CLIENT);
560
+ RB_SIGAR_CONST_INT(NETCONN_SERVER);
561
+ RB_SIGAR_CONST_INT(NETCONN_TCP);
562
+ RB_SIGAR_CONST_INT(NETCONN_UDP);
563
+ RB_SIGAR_CONST_INT(NETCONN_RAW);
564
+ RB_SIGAR_CONST_INT(NETCONN_UNIX);
565
+
566
+ RB_SIGAR_CONST_INT(TCP_ESTABLISHED);
567
+ RB_SIGAR_CONST_INT(TCP_SYN_SENT);
568
+ RB_SIGAR_CONST_INT(TCP_SYN_RECV);
569
+ RB_SIGAR_CONST_INT(TCP_FIN_WAIT1);
570
+ RB_SIGAR_CONST_INT(TCP_FIN_WAIT2);
571
+ RB_SIGAR_CONST_INT(TCP_TIME_WAIT);
572
+ RB_SIGAR_CONST_INT(TCP_CLOSE);
573
+ RB_SIGAR_CONST_INT(TCP_CLOSE_WAIT);
574
+ RB_SIGAR_CONST_INT(TCP_LAST_ACK);
575
+ RB_SIGAR_CONST_INT(TCP_LISTEN);
576
+ RB_SIGAR_CONST_INT(TCP_CLOSING);
577
+ RB_SIGAR_CONST_INT(TCP_IDLE);
578
+ RB_SIGAR_CONST_INT(TCP_BOUND);
579
+ RB_SIGAR_CONST_INT(TCP_UNKNOWN);
580
+
581
+ RB_SIGAR_CONST_INT(RTF_UP);
582
+ RB_SIGAR_CONST_INT(RTF_GATEWAY);
583
+ RB_SIGAR_CONST_INT(RTF_HOST);
584
+
585
+ RB_SIGAR_CONST_STR(NULL_HWADDR);
586
+ }
587
+
588
+ static void Init_rbsigar_version(VALUE rclass)
589
+ {
590
+ sigar_version_t *sv = sigar_version_get();
591
+ RB_SIGAR_DEFINE_CONST_STR("BUILD_DATE", sv->build_date);
592
+ RB_SIGAR_DEFINE_CONST_STR("SCM_REVISION", sv->scm_revision);
593
+ RB_SIGAR_DEFINE_CONST_STR("VERSION", sv->version);
594
+ }
595
+
596
+ void Init_rbsigar(void)
597
+ {
598
+ VALUE rclass = rb_define_class("Sigar", rb_cObject);
599
+
600
+ rb_define_method(rclass, "cpu_info_list", rb_sigar_cpu_info_list, 0);
601
+ rb_define_method(rclass, "file_system_list", rb_sigar_file_system_list, 0);
602
+ rb_define_method(rclass, "net_connection_list", rb_sigar_net_connection_list, 1);
603
+ rb_define_method(rclass, "net_interface_list", rb_sigar_net_interface_list, 0);
604
+ rb_define_method(rclass, "net_services_name", rb_sigar_net_services_name, 2);
605
+ rb_define_method(rclass, "net_stat", rb_sigar_net_stat, 1);
606
+ rb_define_method(rclass, "net_stat_port", rb_sigar_net_stat_port, 3);
607
+ rb_define_method(rclass, "net_route_list", rb_sigar_net_route_list, 0);
608
+ rb_define_method(rclass, "who_list", rb_sigar_who_list, 0);
609
+ rb_define_method(rclass, "proc_list", rb_sigar_proc_list, -1);
610
+ rb_define_method(rclass, "proc_args", rb_sigar_proc_args, 1);
611
+ rb_define_method(rclass, "proc_env", rb_sigar_proc_env, 1);
612
+
613
+ rb_define_singleton_method(rclass, "new", rb_sigar_new, 0);
614
+ rb_define_singleton_method(rclass, "format_size", rb_sigar_format_size, 1);
615
+ rb_define_singleton_method(rclass, "net_interface_flags_to_s",
616
+ rb_sigar_net_interface_flags_to_s, 1);
617
+ rb_define_singleton_method(rclass, "net_connection_type_to_s",
618
+ rb_sigar_net_connection_type_to_s, 1);
619
+ rb_define_singleton_method(rclass, "net_connection_state_to_s",
620
+ rb_sigar_net_connection_state_to_s, 1);
621
+
622
+ Init_rbsigar_constants(rclass);
623
+ Init_rbsigar_version(rclass);
624
+
625
+ /* generated */
626
+ rb_sigar_define_module_methods(rclass);
627
+ rb_define_method(rb_cSigarNetStat, "tcp_states", rb_sigar_NetStat_tcp_states, 0);
628
+ }