dock_driver 0.1.2 → 0.2.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.
- data/.pryrc +10 -0
- data/History.rdoc +52 -0
- data/Manifest.txt +9 -10
- data/{README.txt → README.rdoc} +0 -5
- data/Rakefile +27 -3
- data/TODO.rdoc +11 -0
- data/bin/dock_driver +18 -77
- data/data/example.dock_driver.yml +15 -146
- data/lib/dock_driver/dock.rb +116 -165
- data/lib/dock_driver/dock_item.rb +47 -0
- data/lib/dock_driver/dzen2.rb +5 -0
- data/lib/dock_driver/i3.rb +80 -0
- data/lib/dock_driver/mixins.rb +33 -0
- data/lib/dock_driver/workspace_pager.rb +5 -0
- data/lib/dock_driver.rb +79 -13
- data.tar.gz.sig +0 -0
- metadata +20 -21
- metadata.gz.sig +0 -0
- data/.hgignore +0 -2
- data/History.txt +0 -37
- data/Ideas.txt +0 -19
- data/lib/dock_driver/data_rate_poll.rb +0 -136
- data/lib/dock_driver/hashutils.rb +0 -79
- data/lib/dock_driver/poll.rb +0 -90
- data/spec/dock_driver/dock_spec.rb +0 -36
- data/spec/dock_driver/poll_spec.rb +0 -45
- data/spec/dock_driver_spec.rb +0 -17
data/Ideas.txt
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
= Ideas
|
2
|
-
|
3
|
-
== Without Dependencies
|
4
|
-
|
5
|
-
* Graphing
|
6
|
-
* Automatic Coloring (with definable syntax)
|
7
|
-
|
8
|
-
== With Dependencies
|
9
|
-
|
10
|
-
* Maildir support
|
11
|
-
* SNMP Poller
|
12
|
-
* gateway / internet latency
|
13
|
-
|
14
|
-
== dzen2 Ideas
|
15
|
-
|
16
|
-
* buttons
|
17
|
-
* events
|
18
|
-
* text window
|
19
|
-
|
@@ -1,136 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
# vim: set nosta noet ts=4 sw=4:
|
3
|
-
# encoding: utf-8
|
4
|
-
|
5
|
-
require 'ostruct'
|
6
|
-
|
7
|
-
require 'dock_driver' unless defined? DockDriver
|
8
|
-
require 'dock_driver/poll'
|
9
|
-
|
10
|
-
# A class to provide periodic command execution, caching, and a
|
11
|
-
# running average of changes in the output of the command.
|
12
|
-
#
|
13
|
-
class DockDriver::DataRatePoll < DockDriver::Poll
|
14
|
-
|
15
|
-
# Default values to populate the OpenStruct with.
|
16
|
-
#
|
17
|
-
DEFAULTS = {
|
18
|
-
:unit => :mb,
|
19
|
-
:history_size => 2,
|
20
|
-
:format => '%0.3f',
|
21
|
-
}.freeze
|
22
|
-
|
23
|
-
# Create a new DataRatePoll.
|
24
|
-
#
|
25
|
-
# === Arguments:
|
26
|
-
#
|
27
|
-
# +opts+ - A hash containing options. Merged with DEFAULTS.
|
28
|
-
#
|
29
|
-
# +block+ - If a block is given, replace :cmd with that block.
|
30
|
-
#
|
31
|
-
# === Options:
|
32
|
-
#
|
33
|
-
# Everything accepted by from Poll, plus:
|
34
|
-
#
|
35
|
-
# +:history_size+ - How many samples to keep
|
36
|
-
#
|
37
|
-
# +:unit+ - The unit to use. See the methods and aliases available.
|
38
|
-
# (b, kb, mb, gb, tb, pb, eb, zb, yb, and full names: bits, kibibits, mebibits, ...)
|
39
|
-
#
|
40
|
-
def initialize( opts = {} )
|
41
|
-
super DEFAULTS.merge( opts )
|
42
|
-
|
43
|
-
@last_sample = nil
|
44
|
-
@history = Array.new( self.history_size ) { 0 }
|
45
|
-
end
|
46
|
-
|
47
|
-
# Runs the command if enough time has elapsed since the last
|
48
|
-
# poll. "Enough Time" is defined by the :delay option. Maintains the
|
49
|
-
# history of output, average and formatting.
|
50
|
-
#
|
51
|
-
def poll
|
52
|
-
return false unless super
|
53
|
-
|
54
|
-
@sample = @sample.to_f
|
55
|
-
@last_sample ||= @sample
|
56
|
-
sample = 8 * ( @sample - @last_sample )
|
57
|
-
@history.shift if @history.length >= self.history_size
|
58
|
-
@history.push sample
|
59
|
-
@last_sample = @sample
|
60
|
-
|
61
|
-
true
|
62
|
-
end
|
63
|
-
|
64
|
-
# Returns the average value in bits.
|
65
|
-
#
|
66
|
-
def bits
|
67
|
-
@history.inject( :+ ) / @history.count.to_f
|
68
|
-
end
|
69
|
-
alias :b :bits
|
70
|
-
|
71
|
-
# Returns the average value in kibibits.
|
72
|
-
#
|
73
|
-
def kibibits
|
74
|
-
bits / 1024.0
|
75
|
-
end
|
76
|
-
alias :kb :kibibits
|
77
|
-
|
78
|
-
# Returns the average value in mebibits.
|
79
|
-
#
|
80
|
-
def mebibits
|
81
|
-
kibibits / 1024.0
|
82
|
-
end
|
83
|
-
alias :mb :mebibits
|
84
|
-
|
85
|
-
# Returns the average value in gibibits.
|
86
|
-
#
|
87
|
-
def gibibits
|
88
|
-
mebibits / 1024.0
|
89
|
-
end
|
90
|
-
alias :gb :gibibits
|
91
|
-
|
92
|
-
# Returns the average value in tebibits.
|
93
|
-
#
|
94
|
-
def tebibits
|
95
|
-
gibibits / 1024.0
|
96
|
-
end
|
97
|
-
alias :tb :tebibits
|
98
|
-
|
99
|
-
# Returns the average value in pebibits.
|
100
|
-
#
|
101
|
-
def pebibits
|
102
|
-
tebibits / 1024.0
|
103
|
-
end
|
104
|
-
alias :pb :pebibits
|
105
|
-
|
106
|
-
# Returns the average value in exbibits.
|
107
|
-
#
|
108
|
-
def exbibits
|
109
|
-
pebibits / 1024.0
|
110
|
-
end
|
111
|
-
alias :eb :exbibits
|
112
|
-
|
113
|
-
# Returns the average value in zebibits.
|
114
|
-
#
|
115
|
-
def zebibits
|
116
|
-
exbibits / 1024.0
|
117
|
-
end
|
118
|
-
alias :zb :zebibits
|
119
|
-
|
120
|
-
# Returns the average value in yobibits.
|
121
|
-
#
|
122
|
-
def yobibits
|
123
|
-
zebibits / 1024.0
|
124
|
-
end
|
125
|
-
alias :yb :yobibits
|
126
|
-
|
127
|
-
# Returns a string representing the data rate this poll tracks.
|
128
|
-
#
|
129
|
-
def to_s
|
130
|
-
value = self.unit ? send( self.unit ) : bits
|
131
|
-
return value.to_s if self.format.nil?
|
132
|
-
self.format % value
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
# vim: set nosta noet ts=4 sw=4:
|
3
|
-
# encoding: utf-8
|
4
|
-
#
|
5
|
-
# Copyright (c) 2007-2012, Michael Granger and Mahlon E. Smith
|
6
|
-
# All rights reserved.
|
7
|
-
#
|
8
|
-
|
9
|
-
### A collection of utilities for working with Hashes.
|
10
|
-
#
|
11
|
-
module HashUtilities
|
12
|
-
|
13
|
-
###############
|
14
|
-
module_function
|
15
|
-
###############
|
16
|
-
|
17
|
-
### Return a version of the given +hash+ with its keys transformed
|
18
|
-
### into Strings from whatever they were before.
|
19
|
-
def stringify_keys( hash )
|
20
|
-
newhash = {}
|
21
|
-
|
22
|
-
hash.each do |key,val|
|
23
|
-
if val.is_a?( Hash )
|
24
|
-
newhash[ key.to_s ] = stringify_keys( val )
|
25
|
-
else
|
26
|
-
newhash[ key.to_s ] = val
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
return newhash
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
### Return a duplicate of the given +hash+ with its identifier-like keys
|
35
|
-
### transformed into symbols from whatever they were before.
|
36
|
-
def symbolify_keys( hash )
|
37
|
-
newhash = {}
|
38
|
-
|
39
|
-
hash.each do |key,val|
|
40
|
-
keysym = key.to_s.dup.untaint.to_sym
|
41
|
-
|
42
|
-
if val.is_a?( Hash )
|
43
|
-
newhash[ keysym ] = symbolify_keys( val )
|
44
|
-
else
|
45
|
-
newhash[ keysym ] = val
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
return newhash
|
50
|
-
end
|
51
|
-
alias_method :internify_keys, :symbolify_keys
|
52
|
-
|
53
|
-
|
54
|
-
# Recursive hash-merge function
|
55
|
-
def merge_recursively( key, oldval, newval )
|
56
|
-
case oldval
|
57
|
-
when Hash
|
58
|
-
case newval
|
59
|
-
when Hash
|
60
|
-
oldval.merge( newval, &method(:merge_recursively) )
|
61
|
-
else
|
62
|
-
newval
|
63
|
-
end
|
64
|
-
|
65
|
-
when Array
|
66
|
-
case newval
|
67
|
-
when Array
|
68
|
-
oldval | newval
|
69
|
-
else
|
70
|
-
newval
|
71
|
-
end
|
72
|
-
|
73
|
-
else
|
74
|
-
newval
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
end # HashUtilities
|
79
|
-
|
data/lib/dock_driver/poll.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
# vim: set nosta noet ts=4 sw=4:
|
3
|
-
# encoding: utf-8
|
4
|
-
#
|
5
|
-
|
6
|
-
require 'ostruct'
|
7
|
-
|
8
|
-
require 'dock_driver' unless defined? DockDriver
|
9
|
-
|
10
|
-
# A class to provide periodic command execution and caching.
|
11
|
-
#
|
12
|
-
class DockDriver::Poll < OpenStruct
|
13
|
-
|
14
|
-
# Default values to populate the OpenStruct with.
|
15
|
-
#
|
16
|
-
DEFAULTS = {
|
17
|
-
:delay => 1,
|
18
|
-
}.freeze
|
19
|
-
|
20
|
-
# Create a new Poll.
|
21
|
-
#
|
22
|
-
# === Arguments:
|
23
|
-
#
|
24
|
-
# +opts+ - A hash containing options. Merged with DEFAULTS.
|
25
|
-
#
|
26
|
-
# +block+ - If a block is given, replace :cmd with that block.
|
27
|
-
#
|
28
|
-
# === Options:
|
29
|
-
#
|
30
|
-
# +:delay+ - Determines the minimum amount of time to let elapse between executions.
|
31
|
-
#
|
32
|
-
# +:cmd+ - A string or block to execute.
|
33
|
-
#
|
34
|
-
# +:scan_regex+ - A bare string to be interpreted as a regex for use with +scan+. Any
|
35
|
-
# capture group matches will be joined with single spaces.
|
36
|
-
#
|
37
|
-
# +:format+ - A format string. See: Kernel#format
|
38
|
-
#
|
39
|
-
def initialize( opts = {}, &block )
|
40
|
-
super DEFAULTS.merge( opts )
|
41
|
-
|
42
|
-
@sample = nil
|
43
|
-
|
44
|
-
if block_given?
|
45
|
-
self.cmd = block
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Runs the command if enough time has elapsed since the last
|
50
|
-
# poll. "Enough Time" is defined by the :delay option. If the command
|
51
|
-
# fails to run, it is disabled and the format and output string are set
|
52
|
-
# to nil.
|
53
|
-
#
|
54
|
-
def poll
|
55
|
-
return false if @sample and (Time.now - (self.last_poll || 0 )) < self.delay
|
56
|
-
|
57
|
-
self.last_poll = Time.now
|
58
|
-
|
59
|
-
case self.cmd
|
60
|
-
when Proc
|
61
|
-
@sample = self.cmd.call.to_s.chomp
|
62
|
-
else
|
63
|
-
output = `#{self.cmd.to_s} 2>&1`.chomp
|
64
|
-
if $? == 0
|
65
|
-
@sample = output
|
66
|
-
else
|
67
|
-
self.format = nil
|
68
|
-
@sample = '[%s: Error!] ' % self.name
|
69
|
-
raise output
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
if self.scan_regex
|
74
|
-
extract = @sample.scan( Regexp.new( self.scan_regex ) ).flatten
|
75
|
-
@sample = extract.join( ' ' ) unless extract.empty?
|
76
|
-
end
|
77
|
-
|
78
|
-
true
|
79
|
-
end
|
80
|
-
|
81
|
-
# Returns the output of the command this Poll runs. It will return a formatted string if
|
82
|
-
# the +:format+ option is correctly specified.
|
83
|
-
#
|
84
|
-
def to_s
|
85
|
-
return @sample.to_s if self.format.nil?
|
86
|
-
self.format % @sample
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
@@ -1,36 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'pathname'
|
3
|
-
require 'fileutils'
|
4
|
-
require 'dock_driver/dock'
|
5
|
-
|
6
|
-
describe DockDriver::Dock do
|
7
|
-
|
8
|
-
subject do
|
9
|
-
@conf = Pathname( __FILE__ ).parent.parent.parent
|
10
|
-
@conf += 'data/example.dock_driver.yml'
|
11
|
-
|
12
|
-
# Use very common binaries that are all but guaranteed to be in the
|
13
|
-
# user's path so that we can maintain a meaningful example config file.
|
14
|
-
#
|
15
|
-
dock = Dock.new( @conf.to_s, nil, 'cat' )
|
16
|
-
dock.polls.values.each { |p| p.cmd = 'echo test' }
|
17
|
-
dock
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should load a config file' do
|
21
|
-
subject.dock_command.should_not be nil
|
22
|
-
subject.template.should_not be nil
|
23
|
-
subject.polls.should have_at_least( 2 ).things
|
24
|
-
subject.polls.values.each { |p| p.should be_a_kind_of Poll }
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should only reload a config file with a more recent mtime' do
|
28
|
-
subject.send( :load_config ).should be false
|
29
|
-
sleep 0.1
|
30
|
-
FileUtils.touch @conf
|
31
|
-
subject.send( :load_config ).should be true
|
32
|
-
subject.send( :load_config ).should be false
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
@@ -1,45 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'dock_driver/poll'
|
3
|
-
require 'dock_driver/data_rate_poll'
|
4
|
-
|
5
|
-
include DockDriver
|
6
|
-
|
7
|
-
shared_examples 'a poll' do
|
8
|
-
|
9
|
-
subject do
|
10
|
-
described_class.new( :cmd => 'echo test' )
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should execute shell commands' do
|
14
|
-
lambda do
|
15
|
-
subject.poll.should == true
|
16
|
-
end.should_not raise_error
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should execute blocks' do
|
20
|
-
subject.cmd = lambda {}
|
21
|
-
lambda do
|
22
|
-
subject.poll.should == true
|
23
|
-
end.should_not raise_error
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should cache command output' do
|
27
|
-
subject.delay = 10
|
28
|
-
subject.poll.should == true
|
29
|
-
subject.poll.should == false
|
30
|
-
|
31
|
-
subject.delay = 0
|
32
|
-
subject.poll.should == true
|
33
|
-
subject.poll.should == true
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
describe Poll do
|
39
|
-
it_behaves_like 'a poll'
|
40
|
-
end
|
41
|
-
|
42
|
-
describe DataRatePoll do
|
43
|
-
it_behaves_like 'a poll'
|
44
|
-
end
|
45
|
-
|
data/spec/dock_driver_spec.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'dock_driver'
|
3
|
-
|
4
|
-
describe DockDriver do
|
5
|
-
|
6
|
-
it 'should define a standard version number' do
|
7
|
-
defined?( VERSION ).should == 'constant'
|
8
|
-
VERSION.should =~ /^\d+\.\d+\.\d+$/
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should define a mercurial revision' do
|
12
|
-
defined?( REVISION ).should == 'constant'
|
13
|
-
REVISION.should =~ /^Revision: [[:xdigit:]]+ $/
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|