csigar 0.7.3 → 0.7.4

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.
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