csigar 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 47bd73004109a069e58520b246d15cc11bfdeba4
4
- data.tar.gz: 993496c3b2ce640a396c6e1a76be9ce096acb9bc
3
+ metadata.gz: 7804b5c687d2dd767a30b7d92f9b886128ea4e83
4
+ data.tar.gz: 9b25e12b9dcca3aec625a74284862014d56d555e
5
5
  SHA512:
6
- metadata.gz: d0c74d16f703c4196cb5e9128e2f5b262e8a2dfaee139ce296f01ee87d3ee9a80a0dc00d4b8e8a373cf316ccc737f612e2cd262912ec7c832bf7b067c3d91fb5
7
- data.tar.gz: 88ec5ceae647140676f6e0fc02d0de2dea25ce35ea557d53f8ffe250a66b3c8c8b0bcaf2b2a0708d6129ae3d10d7a76c27480561e55f2adf99e3f7944730ad5b
6
+ metadata.gz: 3a48cae74e0750521cfa494452e78c6ec396b6a1fc9b9fdfe6564acb60ef116da0a5f5997d400ecbb23d53ccd8281eb9280708ec016c6ba7fd98811b11ed8620
7
+ data.tar.gz: 456d3736f2d986eb66afce6bbe08b1aea1bb44de46e2d30b8fbed1c67fdf495b18b4438d8a4144f7b8f5f6a25c18e440575659a2ab3b9264e47c654465898c0a
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Instructions
2
+ ## Creating gem file
3
+ `rake package`
4
+
5
+ Creates a gem file in pkg/csigar-0.x.x.gem.
6
+
7
+ ## Installing gem file
8
+ `gem install pkg/csigar-x.x.x.gem`
9
+
10
+ Installs gem file to local ruby libs.
11
+
12
+ ## Publishing gem file
13
+ `gem push pkg/csigar-x.x.x.gem`
14
+
15
+ Pushes gem file to rubygems.org (account required).
16
+
17
+ ## Test using irb
18
+ Start interactive ruby shell:
19
+ `#>irb`
20
+ Require module (must return "true"):
21
+ `require 'csigar'`
22
+ Build instance:
23
+ `sigar = Csigar.new`
24
+ Get test value (should return numeric value):
25
+ `sigar.cpu_perc.wait`
26
+
27
+
28
+ # Docs
29
+
30
+ Visit the SIGAR Wiki for documentation, bugs, support, etc.:
31
+ http://sigar.hyperic.com/
32
+
33
+ 2014-10-28
34
+ Patched version of hyperic/sigar by jgottschlich@cloudscale.de
35
+ - added cpu_perc_metric to ruby bindings
36
+ - fixed Rakefile to use Gem::PackageTask instead of deprecated package
37
+ - changed version number to 0.7.3
38
+
39
+
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ spec = Gem::Specification.new do |s|
22
22
  s.name = GEM
23
23
  # s.version = props['version.major'] + '.' + props['version.minor'] + '.' + props['version.maint']
24
24
  # '0.7.x' until the sigar-1.7.0 release
25
- s.version = '0' + '.' + props['version.minor'] + '.' + '3'
25
+ s.version = '0' + '.' + props['version.minor'] + '.' + '4'
26
26
  s.summary = props['project.summary']
27
27
  s.description = s.summary
28
28
  s.author = props['project.author']
@@ -32,7 +32,7 @@ spec = Gem::Specification.new do |s|
32
32
  s.has_rdoc = false
33
33
  s.extensions = 'bindings/ruby/extconf.rb'
34
34
  s.files =
35
- %w(LICENSE NOTICE README Rakefile version.properties) +
35
+ %w(LICENSE NOTICE README.md Rakefile version.properties) +
36
36
  %w(bindings/SigarWrapper.pm bindings/SigarBuild.pm) +
37
37
  `git ls-files -- bindings/ruby/*`.split("\n") +
38
38
  Dir.glob("include/*.h") +
@@ -43,6 +43,7 @@ my %has_name_arg = map { $_, 1 } qw(FileSystemUsage DiskUsage
43
43
  FileAttrs DirStat DirUsage
44
44
  NetInterfaceConfig NetInterfaceStat);
45
45
 
46
+
46
47
  my %proc_no_arg = map { $_, 1 } qw(stat);
47
48
 
48
49
  my %get_not_impl = map { $_, 1 } qw(net_address net_route net_connection net_stat cpu_perc
@@ -527,6 +528,7 @@ use vars qw(%classes %cmds);
527
528
  plat => '*'
528
529
  },
529
530
  ],
531
+
530
532
  ProcMem => [
531
533
  {
532
534
  name => 'size', type => 'Long',
@@ -627,6 +629,51 @@ use vars qw(%classes %cmds);
627
629
  plat => '*'
628
630
  },
629
631
  ],
632
+ ProcDiskIO => [
633
+ {
634
+ name => 'bytes_read', type => 'Long',
635
+ desc => 'Bytes Read',
636
+ plat => 'LW'
637
+ },
638
+ {
639
+ name => 'bytes_written', type => 'Long',
640
+ desc => 'Bytes Written',
641
+ plat => 'LW'
642
+ },
643
+ {
644
+ name => 'bytes_total', type => 'Long',
645
+ desc => 'Bytes Total',
646
+ plat => 'LWAHS'
647
+ }
648
+ ],
649
+
650
+ ProcCumulativeDiskIO => [
651
+ {
652
+ name => 'bytes_read', type => 'Long',
653
+ desc => 'Bytes Read from Start',
654
+ plat => 'LW'
655
+ },
656
+ {
657
+ name => 'bytes_written', type => 'Long',
658
+ desc => 'Bytes Written from Start',
659
+ plat => 'LW'
660
+ },
661
+ {
662
+ name => 'bytes_total', type => 'Long',
663
+ desc => 'Bytes Total from Start',
664
+ plat => 'LWAHS'
665
+ }
666
+ ],
667
+
668
+ DumpPidCache => [
669
+ {
670
+ name => 'dummy', type => 'Long',
671
+ desc => 'Dummy',
672
+ plat => 'LWAHS'
673
+ }
674
+ ],
675
+
676
+
630
677
  ProcState => [
631
678
  {
632
679
  name => 'state', type => 'Char',
data/include/sigar.h CHANGED
@@ -292,6 +292,47 @@ typedef struct {
292
292
  SIGAR_DECLARE(int) sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
293
293
  sigar_proc_mem_t *procmem);
294
294
 
295
+ typedef struct {
296
+ sigar_uint64_t
297
+ bytes_read,
298
+ bytes_written,
299
+ bytes_total;
300
+ } sigar_proc_disk_io_t;
301
+
302
+ SIGAR_DECLARE(int) sigar_proc_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
303
+ sigar_proc_disk_io_t *proc_disk_io);
304
+
305
+ typedef struct {
306
+ sigar_uint64_t
307
+ bytes_read,
308
+ bytes_written,
309
+ bytes_total;
310
+ sigar_uint64_t last_time;
311
+ sigar_uint64_t
312
+ bytes_read_diff,
313
+ bytes_written_diff,
314
+ bytes_total_diff;
315
+ } sigar_cached_proc_disk_io_t;
316
+
317
+
318
+ typedef struct {
319
+ sigar_uint64_t
320
+ bytes_read,
321
+ bytes_written,
322
+ bytes_total;
323
+ } sigar_proc_cumulative_disk_io_t;
324
+
325
+ SIGAR_DECLARE(int) sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
326
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io);
327
+
328
+
329
+ typedef struct {
330
+ sigar_uint64_t dummy;
331
+ }sigar_dump_pid_cache_t;
332
+
333
+ SIGAR_DECLARE(int) sigar_dump_pid_cache_get(sigar_t *sigar, sigar_dump_pid_cache_t *info);
334
+
335
+
295
336
  typedef struct {
296
337
  sigar_uid_t uid;
297
338
  sigar_gid_t gid;
@@ -68,7 +68,8 @@
68
68
  sigar_cache_t *proc_cpu; \
69
69
  sigar_cache_t *net_listen; \
70
70
  sigar_cache_t *net_services_tcp; \
71
- sigar_cache_t *net_services_udp
71
+ sigar_cache_t *net_services_udp;\
72
+ sigar_cache_t *proc_io
72
73
 
73
74
  #if defined(WIN32)
74
75
  # define SIGAR_INLINE __inline
@@ -398,11 +399,15 @@ int sigar_get_iftype(const char *name, int *type, int *inst);
398
399
  #define SIGAR_NIC_SIT "IPv6-in-IPv4"
399
400
  #define SIGAR_NIC_IRDA "IrLAP"
400
401
  #define SIGAR_NIC_EC "Econet"
401
-
402
+ #define PID_CACHE_CLEANUP_PERIOD 1000*60*10 /* 10 minutes */
403
+ #define PID_CACHE_ENTRY_EXPIRE_PERIOD 1000*60*20 /* 20 minutes */
402
404
  #ifndef WIN32
403
405
  #include <netdb.h>
404
406
  #endif
405
407
 
408
+ #define PROC_PID_CPU_CACHE 1
409
+ #define PROC_PID_IO_CACHE 2
410
+
406
411
  #define SIGAR_HOSTENT_LEN 1024
407
412
  #if defined(_AIX)
408
413
  #define SIGAR_HAS_HOSTENT_DATA
data/include/sigar_util.h CHANGED
@@ -170,15 +170,21 @@ struct sigar_cache_entry_t {
170
170
  sigar_cache_entry_t *next;
171
171
  sigar_uint64_t id;
172
172
  void *value;
173
+ sigar_uint64_t last_access_time;
173
174
  };
174
175
 
175
176
  typedef struct {
176
177
  sigar_cache_entry_t **entries;
177
178
  unsigned int count, size;
178
179
  void (*free_value)(void *ptr);
180
+ sigar_uint64_t entry_expire_period;
181
+ sigar_uint64_t cleanup_period_millis;
182
+ sigar_uint64_t last_cleanup_time;
179
183
  } sigar_cache_t;
180
184
 
181
185
  sigar_cache_t *sigar_cache_new(int size);
186
+ sigar_cache_t *sigar_expired_cache_new(int size, sigar_uint64_t cleanup_period_millis, sigar_uint64_t entry_expire_period);
187
+ void sigar_cache_dump(sigar_cache_t *table);
182
188
 
183
189
  sigar_cache_entry_t *sigar_cache_get(sigar_cache_t *table,
184
190
  sigar_uint64_t key);
@@ -754,6 +754,23 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
754
754
  return SIGAR_OK;
755
755
  }
756
756
 
757
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
758
+ sigar_proc_cumulative_disk_io_t *cumulative_proc_disk_io)
759
+ {
760
+ int status = sigar_getprocs(sigar, pid);
761
+ struct procsinfo64 *pinfo = sigar->pinfo;
762
+
763
+ if (status != SIGAR_OK) {
764
+ return status;
765
+ }
766
+ cumulative_proc_disk_io->bytes_read = SIGAR_FIELD_NOTIMPL;
767
+ cumulative_proc_disk_io->bytes_written = SIGAR_FIELD_NOTIMPL;
768
+ cumulative_proc_disk_io->bytes_total = pinfo->pi_ioch;
769
+
770
+ return SIGAR_OK;
771
+ }
772
+
773
+
757
774
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
758
775
  sigar_proc_cred_t *proccred)
759
776
  {
@@ -16,6 +16,17 @@
16
16
  * limitations under the License.
17
17
  */
18
18
 
19
+ #ifdef DARWIN
20
+ #include <sys/socket.h>
21
+ #include <sys/fcntl.h>
22
+ #include <mach/thread_info.h>
23
+ #endif
24
+
25
+ #include "sigar.h"
26
+ #include "sigar_private.h"
27
+ #include "sigar_util.h"
28
+ #include "sigar_os.h"
29
+
19
30
  #include <sys/param.h>
20
31
  #include <sys/mount.h>
21
32
  #if !(defined(__FreeBSD__) && (__FreeBSD_version >= 800000))
@@ -33,7 +44,6 @@
33
44
  #include <mach/mach_port.h>
34
45
  #include <mach/task.h>
35
46
  #include <mach/thread_act.h>
36
- #include <mach/thread_info.h>
37
47
  #include <mach/vm_map.h>
38
48
  #if !defined(HAVE_SHARED_REGION_H) && defined(__MAC_10_5) /* see Availability.h */
39
49
  # define HAVE_SHARED_REGION_H /* suckit autoconf */
@@ -107,11 +117,6 @@
107
117
  #include <netinet/tcp_var.h>
108
118
  #include <netinet/tcp_fsm.h>
109
119
 
110
- #include "sigar.h"
111
- #include "sigar_private.h"
112
- #include "sigar_util.h"
113
- #include "sigar_os.h"
114
-
115
120
  #define NMIB(mib) (sizeof(mib)/sizeof(mib[0]))
116
121
 
117
122
  #ifdef __FreeBSD__
@@ -1241,6 +1246,13 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
1241
1246
  return SIGAR_OK;
1242
1247
  }
1243
1248
 
1249
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
1250
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
1251
+ {
1252
+ return SIGAR_ENOTIMPL;
1253
+ }
1254
+
1255
+
1244
1256
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
1245
1257
  sigar_proc_cred_t *proccred)
1246
1258
  {
@@ -3708,4 +3720,4 @@ int sigar_os_sys_info_get(sigar_t *sigar,
3708
3720
  #endif
3709
3721
 
3710
3722
  return SIGAR_OK;
3711
- }
3723
+ }
@@ -307,6 +307,25 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
307
307
  return SIGAR_OK;
308
308
  }
309
309
 
310
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
311
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
312
+ {
313
+
314
+ int status = sigar_pstat_getproc(sigar, pid);
315
+ struct pst_status *pinfo = sigar->pinfo;
316
+
317
+ if (status != SIGAR_OK) {
318
+ return status;
319
+ }
320
+ proc_cumulative_disk_io->bytes_read = SIGAR_FIELD_NOTIMPL;
321
+ proc_cumulative_disk_io->bytes_written = SIGAR_FIELD_NOTIMPL;
322
+ proc_cumulative_disk_io->bytes_total = pinfo->pst_ioch;
323
+
324
+
325
+ return SIGAR_OK;
326
+ }
327
+
328
+
310
329
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
311
330
  sigar_proc_cred_t *proccred)
312
331
  {
@@ -768,6 +768,34 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
768
768
  return SIGAR_OK;
769
769
  }
770
770
 
771
+ SIGAR_INLINE sigar_uint64_t get_named_proc_token(char *buffer,
772
+ char *token) {
773
+ char *ptr = strstr(buffer, token);
774
+ if (!ptr) {
775
+ return SIGAR_FIELD_NOTIMPL;
776
+ }
777
+ ptr = sigar_skip_token(ptr);
778
+ return sigar_strtoul(ptr);
779
+ }
780
+
781
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
782
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
783
+ {
784
+ char buffer[BUFSIZ];
785
+
786
+ int status = SIGAR_PROC_FILE2STR(buffer, pid, "/io");
787
+
788
+ if (status != SIGAR_OK) {
789
+ return status;
790
+ }
791
+
792
+ proc_cumulative_disk_io->bytes_read = get_named_proc_token(buffer, "\nread_bytes");
793
+ proc_cumulative_disk_io->bytes_written = get_named_proc_token(buffer, "\nwrite_bytes");
794
+ proc_cumulative_disk_io->bytes_total = proc_cumulative_disk_io->bytes_read + proc_cumulative_disk_io->bytes_written;
795
+
796
+ return SIGAR_OK;
797
+ }
798
+
771
799
  #define NO_ID_MSG "[proc_cred] /proc/%lu" PROC_PSTATUS " missing "
772
800
 
773
801
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
@@ -407,7 +407,7 @@ int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
407
407
  cpu->idle += xcpu->idle;
408
408
  cpu->nice += xcpu->nice;
409
409
  cpu->wait += xcpu->wait;
410
- cpu->total = xcpu->total;
410
+ cpu->total += xcpu->total;
411
411
  }
412
412
 
413
413
  return SIGAR_OK;
@@ -719,6 +719,21 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
719
719
  return SIGAR_OK;
720
720
  }
721
721
 
722
+ int sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
723
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
724
+ {
725
+ prusage_t usage;
726
+ int status;
727
+ if ((status = sigar_proc_usage_get(sigar, &usage, pid)) != SIGAR_OK) {
728
+ return status;
729
+ }
730
+ proc_cumulative_disk_io->bytes_read = SIGAR_FIELD_NOTIMPL;
731
+ proc_cumulative_disk_io->bytes_written = SIGAR_FIELD_NOTIMPL;
732
+ proc_cumulative_disk_io->bytes_total = usage.pr_ioch;
733
+
734
+ return SIGAR_OK;
735
+ }
736
+
722
737
  int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
723
738
  sigar_proc_cred_t *proccred)
724
739
  {
@@ -345,6 +345,8 @@ typedef struct {
345
345
  sigar_uint64_t handles;
346
346
  sigar_uint64_t threads;
347
347
  sigar_uint64_t page_faults;
348
+ sigar_uint64_t bytes_read;
349
+ sigar_uint64_t bytes_written;
348
350
  } sigar_win32_pinfo_t;
349
351
 
350
352
  typedef struct {
@@ -62,6 +62,8 @@ typedef enum {
62
62
  #define PERF_TITLE_PPID 1410
63
63
  #define PERF_TITLE_PRIORITY 682
64
64
  #define PERF_TITLE_START_TIME 684
65
+ #define PERF_TITLE_IO_READ_BYTES_SEC 1420
66
+ #define PERF_TITLE_IO_WRITE_BYTES_SEC 1422
65
67
 
66
68
  typedef enum {
67
69
  PERF_IX_CPUTIME,
@@ -74,6 +76,8 @@ typedef enum {
74
76
  PERF_IX_PPID,
75
77
  PERF_IX_PRIORITY,
76
78
  PERF_IX_START_TIME,
79
+ PERF_IX_IO_READ_BYTES_SEC,
80
+ PERF_IX_IO_WRITE_BYTES_SEC,
77
81
  PERF_IX_MAX
78
82
  } perf_proc_offsets_t;
79
83
 
@@ -1210,6 +1214,23 @@ SIGAR_DECLARE(int) sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
1210
1214
  return SIGAR_OK;
1211
1215
  }
1212
1216
 
1217
+ SIGAR_DECLARE(int) sigar_proc_cumulative_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
1218
+ sigar_proc_cumulative_disk_io_t *proc_cumulative_disk_io)
1219
+ {
1220
+ int status = get_proc_info(sigar, pid);
1221
+ sigar_win32_pinfo_t *pinfo = &sigar->pinfo;
1222
+
1223
+ if (status != SIGAR_OK) {
1224
+ return status;
1225
+ }
1226
+
1227
+ proc_cumulative_disk_io->bytes_read = pinfo->bytes_read;
1228
+ proc_cumulative_disk_io->bytes_written = pinfo->bytes_written;
1229
+ proc_cumulative_disk_io->bytes_total = proc_cumulative_disk_io->bytes_read + proc_cumulative_disk_io->bytes_written;
1230
+
1231
+ return SIGAR_OK;
1232
+ }
1233
+
1213
1234
  #define TOKEN_DAC (STANDARD_RIGHTS_READ | READ_CONTROL | TOKEN_QUERY)
1214
1235
 
1215
1236
  SIGAR_DECLARE(int)
@@ -1441,6 +1462,12 @@ static int get_proc_info(sigar_t *sigar, sigar_pid_t pid)
1441
1462
  case PERF_TITLE_START_TIME:
1442
1463
  perf_offsets[PERF_IX_START_TIME] = offset;
1443
1464
  break;
1465
+ case PERF_TITLE_IO_READ_BYTES_SEC:
1466
+ perf_offsets[PERF_IX_IO_READ_BYTES_SEC] = offset;
1467
+ break;
1468
+ case PERF_TITLE_IO_WRITE_BYTES_SEC:
1469
+ perf_offsets[PERF_IX_IO_WRITE_BYTES_SEC] = offset;
1470
+ break;
1444
1471
  }
1445
1472
  }
1446
1473
 
@@ -1466,6 +1493,8 @@ static int get_proc_info(sigar_t *sigar, sigar_pid_t pid)
1466
1493
  pinfo->handles = PERF_VAL(PERF_IX_HANDLE_CNT);
1467
1494
  pinfo->threads = PERF_VAL(PERF_IX_THREAD_CNT);
1468
1495
  pinfo->page_faults = PERF_VAL(PERF_IX_PAGE_FAULTS);
1496
+ pinfo->bytes_read = PERF_VAL(PERF_IX_IO_READ_BYTES_SEC);
1497
+ pinfo->bytes_written = PERF_VAL(PERF_IX_IO_WRITE_BYTES_SEC);
1469
1498
 
1470
1499
  return SIGAR_OK;
1471
1500
  }
@@ -3693,6 +3722,7 @@ int sigar_who_list_get_win32(sigar_t *sigar,
3693
3722
  #define SIGAR_ARCH "x86"
3694
3723
  #endif
3695
3724
 
3725
+
3696
3726
  int sigar_os_sys_info_get(sigar_t *sigar,
3697
3727
  sigar_sys_info_t *sysinfo)
3698
3728
  {
@@ -3700,7 +3730,7 @@ int sigar_os_sys_info_get(sigar_t *sigar,
3700
3730
  char *vendor_name, *vendor_version, *code_name=NULL;
3701
3731
 
3702
3732
  version.dwOSVersionInfoSize = sizeof(version);
3703
- GetVersionEx((OSVERSIONINFO *)&version);
3733
+ GetVersionEx((OSVERSIONINFO *)&version);
3704
3734
 
3705
3735
  if (version.dwMajorVersion == 4) {
3706
3736
  vendor_name = "Windows NT";
@@ -3740,11 +3770,25 @@ int sigar_os_sys_info_get(sigar_t *sigar,
3740
3770
  code_name = "Vienna";
3741
3771
  }
3742
3772
  }
3743
- else {
3744
- vendor_name = "Windows 2008";
3745
- vendor_version = "2008";
3746
- code_name = "Longhorn Server";
3747
- }
3773
+ else {
3774
+ // not nt work station
3775
+ if (version.dwMinorVersion == 0 || version.dwMinorVersion ==1) {
3776
+ vendor_name = "Windows 2008";
3777
+ vendor_version = "2008";
3778
+ code_name = "Longhorn Server";
3779
+ }
3780
+ else if (version.dwMinorVersion == 2) {
3781
+ vendor_name = "Windows 2012";
3782
+ vendor_version = "2012";
3783
+ code_name = "Windows Server 8";
3784
+ }
3785
+ else {
3786
+ // defaults
3787
+ vendor_name = "Windows Unknown";
3788
+ vendor_version = "2012";
3789
+ }
3790
+ }
3791
+
3748
3792
  }
3749
3793
 
3750
3794
  SIGAR_SSTRCPY(sysinfo->name, "Win32");
data/src/sigar.c CHANGED
@@ -30,6 +30,11 @@
30
30
  #ifndef WIN32
31
31
  #include <arpa/inet.h>
32
32
  #endif
33
+ #if defined(HAVE_UTMPX_H)
34
+ # include <utmpx.h>
35
+ #elif defined(HAVE_UTMP_H)
36
+ # include <utmp.h>
37
+ #endif
33
38
 
34
39
  #include "sigar.h"
35
40
  #include "sigar_private.h"
@@ -59,6 +64,7 @@ SIGAR_DECLARE(int) sigar_open(sigar_t **sigar)
59
64
  (*sigar)->net_listen = NULL;
60
65
  (*sigar)->net_services_tcp = NULL;
61
66
  (*sigar)->net_services_udp = NULL;
67
+ (*sigar)->proc_io = NULL;
62
68
  }
63
69
 
64
70
  return status;
@@ -91,6 +97,11 @@ SIGAR_DECLARE(int) sigar_close(sigar_t *sigar)
91
97
  if (sigar->net_services_udp) {
92
98
  sigar_cache_destroy(sigar->net_services_udp);
93
99
  }
100
+ if (sigar->proc_io) {
101
+ sigar_cache_destroy(sigar->proc_io);
102
+ }
103
+
104
+
94
105
 
95
106
  return sigar_os_close(sigar);
96
107
  }
@@ -118,7 +129,7 @@ SIGAR_DECLARE(int) sigar_proc_cpu_get(sigar_t *sigar, sigar_pid_t pid,
118
129
  int status;
119
130
 
120
131
  if (!sigar->proc_cpu) {
121
- sigar->proc_cpu = sigar_cache_new(128);
132
+ sigar->proc_cpu = sigar_expired_cache_new(128, PID_CACHE_CLEANUP_PERIOD, PID_CACHE_ENTRY_EXPIRE_PERIOD);
122
133
  }
123
134
 
124
135
  entry = sigar_cache_get(sigar->proc_cpu, pid);
@@ -167,6 +178,106 @@ SIGAR_DECLARE(int) sigar_proc_cpu_get(sigar_t *sigar, sigar_pid_t pid,
167
178
 
168
179
  return SIGAR_OK;
169
180
  }
181
+ void copy_cached_disk_io_into_disk_io( sigar_cached_proc_disk_io_t *cached, sigar_proc_disk_io_t *proc_disk_io) {
182
+ proc_disk_io->bytes_read = cached->bytes_read_diff;
183
+ proc_disk_io->bytes_written = cached->bytes_written_diff;
184
+ proc_disk_io->bytes_total = cached->bytes_total_diff;
185
+ }
186
+
187
+ sigar_uint64_t get_io_diff(sigar_uint64_t current_value, sigar_uint64_t prev_value, sigar_uint64_t time_diff) {
188
+ double io_diff;
189
+ sigar_uint64_t int_io_diff;
190
+ if ( current_value == SIGAR_FIELD_NOTIMPL ) {
191
+ return SIGAR_FIELD_NOTIMPL;
192
+ }
193
+ io_diff = (( current_value - prev_value)/(double)time_diff)*SIGAR_MSEC;
194
+ int_io_diff = (sigar_uint64_t)io_diff;
195
+ if (int_io_diff >=0) {
196
+ return int_io_diff;
197
+ }
198
+ return 0;
199
+ }
200
+
201
+ void calculate_io_diff(sigar_proc_cumulative_disk_io_t * proc_disk_io, sigar_cached_proc_disk_io_t *cached, sigar_uint64_t time_diff, int is_first_time) {
202
+ /*calculate avg diff /read/write/total per second*/
203
+ if (!is_first_time) {
204
+ cached->bytes_written_diff = get_io_diff(proc_disk_io->bytes_written, cached->bytes_written, time_diff);
205
+ cached->bytes_read_diff = get_io_diff(proc_disk_io->bytes_read, cached->bytes_read, time_diff);
206
+ cached->bytes_total_diff = get_io_diff(proc_disk_io->bytes_total, cached->bytes_total, time_diff);
207
+ }
208
+ else {
209
+ cached->bytes_total_diff = cached->bytes_read_diff = cached->bytes_written_diff = 0.0;
210
+ }
211
+ // now put in cache the current cumulative values
212
+ cached->bytes_written = proc_disk_io->bytes_written;
213
+ cached->bytes_read = proc_disk_io->bytes_read;
214
+ cached->bytes_total = proc_disk_io->bytes_total;
215
+ }
216
+
217
+ SIGAR_DECLARE(int) sigar_proc_disk_io_get(sigar_t *sigar, sigar_pid_t pid,
218
+ sigar_proc_disk_io_t *proc_disk_io)
219
+ {
220
+ sigar_cache_entry_t *entry;
221
+ sigar_cached_proc_disk_io_t *prev;
222
+ sigar_proc_cumulative_disk_io_t cumulative_proc_disk_io;
223
+ sigar_uint64_t time_now = sigar_time_now_millis();
224
+ sigar_uint64_t time_diff;
225
+ int status, is_first_time;
226
+
227
+ if (!sigar->proc_io) {
228
+ sigar->proc_io = sigar_expired_cache_new(128, PID_CACHE_CLEANUP_PERIOD, PID_CACHE_ENTRY_EXPIRE_PERIOD);
229
+ }
230
+
231
+ entry = sigar_cache_get(sigar->proc_io, pid);
232
+ if (entry->value) {
233
+ prev = (sigar_cached_proc_disk_io_t *)entry->value;
234
+ }
235
+ else {
236
+ prev = entry->value = malloc(sizeof(*prev));
237
+ SIGAR_ZERO(prev);
238
+ }
239
+ is_first_time = (prev->last_time == 0);
240
+ time_diff = time_now - prev->last_time;
241
+
242
+ if (time_diff < 1000) {
243
+ /* we were just called within < 1 second ago. */
244
+ copy_cached_disk_io_into_disk_io(prev, proc_disk_io);
245
+ if (time_diff < 0) {
246
+ // something is wrong at least from now on the time will be ok
247
+ prev->last_time = time_now;
248
+ }
249
+ return SIGAR_OK;
250
+ }
251
+ prev->last_time = time_now;
252
+
253
+
254
+ status =
255
+ sigar_proc_cumulative_disk_io_get(sigar, pid,
256
+ &cumulative_proc_disk_io);
257
+
258
+ if (status != SIGAR_OK) {
259
+ return status;
260
+ }
261
+ calculate_io_diff(&cumulative_proc_disk_io, prev, time_diff, is_first_time);
262
+ copy_cached_disk_io_into_disk_io(prev, proc_disk_io);
263
+ return SIGAR_OK;
264
+ }
265
+
266
+ void get_cache_info(sigar_cache_t * cache, char * name){
267
+ if (cache == NULL) {
268
+ return;
269
+ }
270
+
271
+ printf("******** %s *********\n", name);
272
+ sigar_cache_dump(cache);
273
+ }
274
+
275
+ SIGAR_DECLARE(int) sigar_dump_pid_cache_get(sigar_t *sigar, sigar_dump_pid_cache_t *info) {
276
+
277
+ get_cache_info(sigar->proc_cpu, "proc cpu cache");
278
+ get_cache_info(sigar->proc_io, "proc io cache");
279
+ return SIGAR_OK;
280
+ }
170
281
 
171
282
  SIGAR_DECLARE(int) sigar_proc_stat_get(sigar_t *sigar,
172
283
  sigar_proc_stat_t *procstat)
@@ -1024,40 +1135,7 @@ SIGAR_DECLARE(int) sigar_who_list_destroy(sigar_t *sigar,
1024
1135
  return SIGAR_OK;
1025
1136
  }
1026
1137
 
1027
- #ifdef DARWIN
1028
- #include <AvailabilityMacros.h>
1029
- #endif
1030
- #ifdef MAC_OS_X_VERSION_10_5
1031
- # if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
1032
- # define SIGAR_NO_UTMP
1033
- # endif
1034
- /* else 10.4 and earlier or compiled with -mmacosx-version-min=10.3 */
1035
- #endif
1036
-
1037
- #if defined(__sun)
1038
- # include <utmpx.h>
1039
- # define SIGAR_UTMP_FILE _UTMPX_FILE
1040
- # define ut_time ut_tv.tv_sec
1041
- #elif defined(WIN32)
1042
- /* XXX may not be the default */
1043
- #define SIGAR_UTMP_FILE "C:\\cygwin\\var\\run\\utmp"
1044
- #define UT_LINESIZE 16
1045
- #define UT_NAMESIZE 16
1046
- #define UT_HOSTSIZE 256
1047
- #define UT_IDLEN 2
1048
- #define ut_name ut_user
1049
-
1050
- struct utmp {
1051
- short ut_type;
1052
- int ut_pid;
1053
- char ut_line[UT_LINESIZE];
1054
- char ut_id[UT_IDLEN];
1055
- time_t ut_time;
1056
- char ut_user[UT_NAMESIZE];
1057
- char ut_host[UT_HOSTSIZE];
1058
- long ut_addr;
1059
- };
1060
- #elif defined(NETWARE)
1138
+ #if defined(NETWARE)
1061
1139
  static char *getpass(const char *prompt)
1062
1140
  {
1063
1141
  static char password[BUFSIZ];
@@ -1067,109 +1145,48 @@ static char *getpass(const char *prompt)
1067
1145
 
1068
1146
  return (char *)&password;
1069
1147
  }
1070
- #elif !defined(SIGAR_NO_UTMP)
1071
- # include <utmp.h>
1072
- # ifdef UTMP_FILE
1073
- # define SIGAR_UTMP_FILE UTMP_FILE
1074
- # else
1075
- # define SIGAR_UTMP_FILE _PATH_UTMP
1076
- # endif
1077
- #endif
1078
-
1079
- #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(DARWIN)
1080
- # define ut_user ut_name
1081
- #endif
1082
-
1083
- #ifdef DARWIN
1084
- /* XXX from utmpx.h; sizeof changed in 10.5 */
1085
- /* additionally, utmpx does not work on 10.4 */
1086
- #define SIGAR_HAS_UTMPX
1087
- #define _PATH_UTMPX "/var/run/utmpx"
1088
- #define _UTX_USERSIZE 256 /* matches MAXLOGNAME */
1089
- #define _UTX_LINESIZE 32
1090
- #define _UTX_IDSIZE 4
1091
- #define _UTX_HOSTSIZE 256
1092
- struct utmpx {
1093
- char ut_user[_UTX_USERSIZE]; /* login name */
1094
- char ut_id[_UTX_IDSIZE]; /* id */
1095
- char ut_line[_UTX_LINESIZE]; /* tty name */
1096
- pid_t ut_pid; /* process id creating the entry */
1097
- short ut_type; /* type of this entry */
1098
- struct timeval ut_tv; /* time entry was created */
1099
- char ut_host[_UTX_HOSTSIZE]; /* host name */
1100
- __uint32_t ut_pad[16]; /* reserved for future use */
1101
- };
1102
- #define ut_xtime ut_tv.tv_sec
1103
- #define UTMPX_USER_PROCESS 7
1104
- /* end utmpx.h */
1105
- #define SIGAR_UTMPX_FILE _PATH_UTMPX
1106
1148
  #endif
1107
1149
 
1108
- #if !defined(NETWARE) && !defined(_AIX)
1109
-
1110
1150
  #define WHOCPY(dest, src) \
1111
1151
  SIGAR_SSTRCPY(dest, src); \
1112
1152
  if (sizeof(src) < sizeof(dest)) \
1113
1153
  dest[sizeof(src)] = '\0'
1114
1154
 
1115
- #ifdef SIGAR_HAS_UTMPX
1116
- static int sigar_who_utmpx(sigar_t *sigar,
1117
- sigar_who_list_t *wholist)
1155
+ static int sigar_who_utmp(sigar_t *sigar,
1156
+ sigar_who_list_t *wholist)
1118
1157
  {
1119
- FILE *fp;
1120
- struct utmpx ut;
1158
+ #if defined(HAVE_UTMPX_H)
1159
+ struct utmpx *ut;
1121
1160
 
1122
- if (!(fp = fopen(SIGAR_UTMPX_FILE, "r"))) {
1123
- return errno;
1124
- }
1161
+ setutxent();
1125
1162
 
1126
- while (fread(&ut, sizeof(ut), 1, fp) == 1) {
1163
+ while ((ut = getutxent()) != NULL) {
1127
1164
  sigar_who_t *who;
1128
1165
 
1129
- if (*ut.ut_user == '\0') {
1166
+ if (*ut->ut_user == '\0') {
1130
1167
  continue;
1131
1168
  }
1132
1169
 
1133
- #ifdef UTMPX_USER_PROCESS
1134
- if (ut.ut_type != UTMPX_USER_PROCESS) {
1170
+ if (ut->ut_type != USER_PROCESS) {
1135
1171
  continue;
1136
1172
  }
1137
- #endif
1138
1173
 
1139
1174
  SIGAR_WHO_LIST_GROW(wholist);
1140
1175
  who = &wholist->data[wholist->number++];
1141
1176
 
1142
- WHOCPY(who->user, ut.ut_user);
1143
- WHOCPY(who->device, ut.ut_line);
1144
- WHOCPY(who->host, ut.ut_host);
1177
+ WHOCPY(who->user, ut->ut_user);
1178
+ WHOCPY(who->device, ut->ut_line);
1179
+ WHOCPY(who->host, ut->ut_host);
1145
1180
 
1146
- who->time = ut.ut_xtime;
1181
+ who->time = ut->ut_tv.tv_sec;
1147
1182
  }
1148
1183
 
1149
- fclose(fp);
1150
-
1151
- return SIGAR_OK;
1152
- }
1153
- #endif
1154
-
1155
- #if defined(SIGAR_NO_UTMP) && defined(SIGAR_HAS_UTMPX)
1156
- #define sigar_who_utmp sigar_who_utmpx
1157
- #else
1158
- static int sigar_who_utmp(sigar_t *sigar,
1159
- sigar_who_list_t *wholist)
1160
- {
1184
+ endutxent();
1185
+ #elif defined(HAVE_UTMP_H)
1161
1186
  FILE *fp;
1162
- #ifdef __sun
1163
- /* use futmpx w/ pid32_t for sparc64 */
1164
- struct futmpx ut;
1165
- #else
1166
1187
  struct utmp ut;
1167
- #endif
1168
- if (!(fp = fopen(SIGAR_UTMP_FILE, "r"))) {
1169
- #ifdef SIGAR_HAS_UTMPX
1170
- /* Darwin 10.5 */
1171
- return sigar_who_utmpx(sigar, wholist);
1172
- #endif
1188
+
1189
+ if (!(fp = fopen(_PATH_UTMP, "r"))) {
1173
1190
  return errno;
1174
1191
  }
1175
1192
 
@@ -1189,7 +1206,7 @@ static int sigar_who_utmp(sigar_t *sigar,
1189
1206
  SIGAR_WHO_LIST_GROW(wholist);
1190
1207
  who = &wholist->data[wholist->number++];
1191
1208
 
1192
- WHOCPY(who->user, ut.ut_user);
1209
+ WHOCPY(who->user, ut.ut_name);
1193
1210
  WHOCPY(who->device, ut.ut_line);
1194
1211
  WHOCPY(who->host, ut.ut_host);
1195
1212
 
@@ -1197,11 +1214,10 @@ static int sigar_who_utmp(sigar_t *sigar,
1197
1214
  }
1198
1215
 
1199
1216
  fclose(fp);
1217
+ #endif
1200
1218
 
1201
1219
  return SIGAR_OK;
1202
1220
  }
1203
- #endif /* SIGAR_NO_UTMP */
1204
- #endif /* NETWARE */
1205
1221
 
1206
1222
  #if defined(WIN32)
1207
1223
 
data/src/sigar_cache.c CHANGED
@@ -35,7 +35,7 @@ static void free_value(void *ptr)
35
35
  free(ptr);
36
36
  }
37
37
 
38
- sigar_cache_t *sigar_cache_new(int size)
38
+ sigar_cache_t *sigar_expired_cache_new(int size, sigar_uint64_t cleanup_period_millis, sigar_uint64_t entry_expire_period)
39
39
  {
40
40
  sigar_cache_t *table = malloc(sizeof(*table));
41
41
  table->count = 0;
@@ -43,16 +43,27 @@ sigar_cache_t *sigar_cache_new(int size)
43
43
  table->entries = malloc(ENTRIES_SIZE(size));
44
44
  memset(table->entries, '\0', ENTRIES_SIZE(size));
45
45
  table->free_value = free_value;
46
+ table->cleanup_period_millis = cleanup_period_millis;
47
+ table->last_cleanup_time = sigar_time_now_millis();
48
+ table->entry_expire_period = entry_expire_period;
46
49
  return table;
47
50
  }
48
51
 
49
- #ifdef DEBUG_CACHE
52
+ sigar_cache_t *sigar_cache_new(int size)
53
+ {
54
+ return sigar_expired_cache_new(size, SIGAR_FIELD_NOTIMPL, SIGAR_FIELD_NOTIMPL);
55
+ }
56
+
57
+
58
+ /*#ifdef DEBUG_CACHE*/
50
59
  /* see how well entries are distributed */
51
- static void sigar_cache_dump(sigar_cache_t *table)
60
+ void sigar_cache_dump(sigar_cache_t *table)
52
61
  {
53
62
  int i;
54
63
  sigar_cache_entry_t **entries = table->entries;
55
-
64
+ printf("table size %lu\n", (long)table->size);
65
+ printf("table count %lu\n", (long)table->count);
66
+
56
67
  for (i=0; i<table->size; i++) {
57
68
  sigar_cache_entry_t *entry = *entries++;
58
69
 
@@ -68,12 +79,12 @@ static void sigar_cache_dump(sigar_cache_t *table)
68
79
  printf("\n");
69
80
  fflush(stdout);
70
81
  }
71
- #endif
82
+ /*#endif*/
72
83
 
73
84
  static void sigar_cache_rehash(sigar_cache_t *table)
74
85
  {
75
86
  int i;
76
- unsigned int new_size = table->size * 2 + 1;
87
+ unsigned int new_size = table->count * 2 + 1;
77
88
  sigar_cache_entry_t **entries = table->entries;
78
89
  sigar_cache_entry_t **new_entries =
79
90
  malloc(ENTRIES_SIZE(new_size));
@@ -101,16 +112,76 @@ static void sigar_cache_rehash(sigar_cache_t *table)
101
112
  #define SIGAR_CACHE_IX(t, k) \
102
113
  t->entries + (k % t->size)
103
114
 
115
+ void sigar_perform_cleanup_if_necessary(sigar_cache_t *table) {
116
+ sigar_uint64_t current_time;
117
+ int i;
118
+ sigar_cache_entry_t **entries;
119
+ if (table->cleanup_period_millis == SIGAR_FIELD_NOTIMPL) {
120
+ /* no cleanup for this cache) */
121
+ return;
122
+ }
123
+ current_time = sigar_time_now_millis();
124
+ if ((current_time - table->last_cleanup_time) < table->cleanup_period_millis) {
125
+ /* not enough time has passed since last cleanup */
126
+ return;
127
+ }
128
+
129
+ /* performing cleanup */
130
+ entries = table->entries;
131
+
132
+ table->last_cleanup_time = current_time;
133
+
134
+ for (i=0; i<table->size; i++) {
135
+ sigar_cache_entry_t *entry, *ptr, *entry_prev=NULL, **entry_in_table;
136
+ entry_in_table = entries;
137
+ entry = *entries++;
138
+
139
+ while (entry) {
140
+ sigar_uint64_t period_with_no_access = current_time - entry->last_access_time;
141
+ ptr = entry->next;
142
+ if (table->entry_expire_period < period_with_no_access) {
143
+ /* no one acess this entry for too long - we can delete it */
144
+ if (entry->value) {
145
+ table->free_value(entry->value);
146
+ }
147
+ free(entry);
148
+ table->count--;
149
+ if (entry_prev != NULL) {
150
+ entry_prev->next = ptr;
151
+ }
152
+ else {
153
+ /* removing first entry - head of list should point to next entry */
154
+ *entry_in_table = ptr;
155
+ }
156
+ }
157
+ else {
158
+ /* entry not expired - advance entry_prev to current entry*/
159
+ entry_prev = entry;
160
+ }
161
+ entry = ptr;
162
+ }
163
+ }
164
+ if (table->count < (table->size/4)) {
165
+ /* hash table (the array size) too big for the amount of values it contains perform rehash */
166
+ sigar_cache_rehash(table);
167
+ }
168
+ }
169
+
170
+
171
+
172
+
104
173
  sigar_cache_entry_t *sigar_cache_find(sigar_cache_t *table,
105
174
  sigar_uint64_t key)
106
175
  {
107
176
  sigar_cache_entry_t *entry, **ptr;
177
+ sigar_perform_cleanup_if_necessary(table);
108
178
 
109
179
  for (ptr = SIGAR_CACHE_IX(table, key), entry = *ptr;
110
180
  entry;
111
181
  ptr = &entry->next, entry = *ptr)
112
182
  {
113
183
  if (entry->id == key) {
184
+ entry->last_access_time = sigar_time_now_millis();
114
185
  return entry;
115
186
  }
116
187
  }
@@ -123,17 +194,19 @@ sigar_cache_entry_t *sigar_cache_get(sigar_cache_t *table,
123
194
  sigar_uint64_t key)
124
195
  {
125
196
  sigar_cache_entry_t *entry, **ptr;
197
+ sigar_perform_cleanup_if_necessary(table);
126
198
 
127
199
  for (ptr = SIGAR_CACHE_IX(table, key), entry = *ptr;
128
200
  entry;
129
201
  ptr = &entry->next, entry = *ptr)
130
202
  {
131
203
  if (entry->id == key) {
204
+ entry->last_access_time = sigar_time_now_millis();
132
205
  return entry;
133
206
  }
134
207
  }
135
208
 
136
- if (table->count++ > table->size) {
209
+ if (++table->count > table->size) {
137
210
  sigar_cache_rehash(table);
138
211
 
139
212
  for (ptr = SIGAR_CACHE_IX(table, key), entry = *ptr;
@@ -147,6 +220,7 @@ sigar_cache_entry_t *sigar_cache_get(sigar_cache_t *table,
147
220
  entry->id = key;
148
221
  entry->value = NULL;
149
222
  entry->next = NULL;
223
+ entry->last_access_time = sigar_time_now_millis();
150
224
 
151
225
  return entry;
152
226
  }
data/src/sigar_ptql.c CHANGED
@@ -1338,6 +1338,14 @@ static ptql_lookup_t PTQL_Cpu[] = {
1338
1338
  { NULL }
1339
1339
  };
1340
1340
 
1341
+ static ptql_lookup_t PTQL_Disk_IO[] = {
1342
+ { "BytesRead", PTQL_LOOKUP_ENTRY(proc_disk_io, bytes_read, UI64) },
1343
+ { "BytesWritten", PTQL_LOOKUP_ENTRY(proc_disk_io, bytes_written, UI64) },
1344
+ { "BytesTotal", PTQL_LOOKUP_ENTRY(proc_disk_io, bytes_total, UI64) },
1345
+ { NULL }
1346
+ };
1347
+
1348
+
1341
1349
  static ptql_lookup_t PTQL_CredName[] = {
1342
1350
  { "User", PTQL_LOOKUP_ENTRY(proc_cred_name, user, STR) },
1343
1351
  { "Group", PTQL_LOOKUP_ENTRY(proc_cred_name, group, STR) },
@@ -1424,6 +1432,7 @@ static ptql_entry_t ptql_map[] = {
1424
1432
  { "Port", PTQL_Port },
1425
1433
  { "Pid", PTQL_Pid },
1426
1434
  { "Service", PTQL_Service },
1435
+ { "Disk_IO", PTQL_Disk_IO },
1427
1436
  { NULL }
1428
1437
  };
1429
1438
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csigar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Doug MacEachern, Joerg Gottschlich
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-28 00:00:00.000000000 Z
11
+ date: 2014-10-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Patched version of System Information Gatherer And Reporter (original
14
14
  by Doug McEachern, patched by Joerg Gottschlich)
@@ -20,7 +20,7 @@ extra_rdoc_files: []
20
20
  files:
21
21
  - LICENSE
22
22
  - NOTICE
23
- - README
23
+ - README.md
24
24
  - Rakefile
25
25
  - version.properties
26
26
  - bindings/SigarWrapper.pm
data/README DELETED
@@ -1,8 +0,0 @@
1
- Visit the SIGAR Wiki for documentation, bugs, support, etc.:
2
- http://sigar.hyperic.com/
3
-
4
- 2014-10-28
5
- Patched version of hyperic/sigar by jgottschlich@cloudscale.de
6
- - added cpu_perc_metric to ruby bindings
7
- - fixed Rakefile to use Gem::PackageTask instead of deprecated package
8
- - changed version number to 0.7.3