igp 0.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,105 @@
1
+ require 'net/ping'
2
+ require 'net/ldap'
3
+ require 'uri'
4
+
5
+ # The Net module serves as a namespace only.
6
+ module Net
7
+ # The Ping::LDAP class encapsulates methods for LDAP pings.
8
+ class Ping::LDAP < Ping
9
+ # uri contains the URI object for the request
10
+ #
11
+ attr_accessor :uri
12
+
13
+ # username and password may be set for ping using
14
+ # an authenticated LDAP bind
15
+ #
16
+ attr_accessor :username
17
+ attr_accessor :password
18
+
19
+ # set/get the encryption method. By default nil,
20
+ # but may be set to :simple_tls
21
+ #
22
+ attr_reader :encryption
23
+
24
+ def encryption=(value)
25
+ @encryption = value.is_a?(Symbol) ? value : value.to_sym
26
+ end
27
+
28
+ # Creates and returns a new Ping::LDAP object.
29
+ # The default +timeout+ is 5 seconds.
30
+ #
31
+ # +uri+ string is expected to be a full URI with scheme (ldap/ldaps)
32
+ # and optionally the port (else default port is assumed) e.g.
33
+ # ldap://my.ldap.host.com
34
+ # ldap://my.ldap.host.com:1389
35
+ # ldaps://my.ldap.host.com
36
+ # ldaps://my.ldap.host.com:6636
37
+ #
38
+ # If a plain hostname is provided as the +uri+, a default port of 389 is assumed
39
+ #
40
+ def initialize(uri = nil, timeout = 5)
41
+ host, port = decode_uri(uri)
42
+ super(host, port, timeout)
43
+ end
44
+
45
+ # method used to decode uri string
46
+ #
47
+ def decode_uri(value)
48
+ @uri = URI.parse(value)
49
+ if uri.scheme =~ /ldap/
50
+ p = @port = uri.port
51
+ h = @host = uri.host
52
+ @encryption = uri.scheme == 'ldaps' ? :simple_tls : nil
53
+ else
54
+ h = value
55
+ p = 389
56
+ end
57
+ [h, p]
58
+ end
59
+
60
+ # constructs the LDAP configuration structure
61
+ #
62
+ def config
63
+ {
64
+ host: uri.host,
65
+ port: uri.port,
66
+ encryption: encryption
67
+ }.merge(
68
+ if username && password
69
+ { auth: { method: :simple, username: username, password: password } }
70
+ else
71
+ { auth: { method: :anonymous } }
72
+ end
73
+ )
74
+ end
75
+
76
+ # perform ping, optionally providing the ping destination uri
77
+ #
78
+ def ping(host = nil)
79
+ decode_uri(host) if host
80
+ super(@host)
81
+
82
+ bool = false
83
+
84
+ start_time = Time.now
85
+
86
+ begin
87
+ Timeout.timeout(@timeout) do
88
+ Net::LDAP.new(config).bind
89
+ end
90
+ rescue StandardError => e
91
+ @exception = e.message
92
+ else
93
+ bool = true
94
+ end
95
+
96
+ # There is no duration if the ping failed
97
+ @duration = Time.now - start_time if bool
98
+
99
+ bool
100
+ end
101
+
102
+ alias ping? ping
103
+ alias pingecho ping
104
+ end
105
+ end
data/spec/base_spec.rb CHANGED
@@ -2,65 +2,64 @@ require 'spec_helper'
2
2
  require 'getoptions'
3
3
 
4
4
  describe Igp::Base do
5
-
6
- describe "base initialization without options" do
7
- it "should not set ping_handler" do
8
- subject.ping_handler.should be_nil
5
+ describe 'base initialization without options' do
6
+ it 'should not set ping_handler' do
7
+ expect(subject.ping_handler).to be_nil
9
8
  end
10
- it "should not set limit" do
11
- subject.limit.should be_nil
9
+ it 'should not set limit' do
10
+ expect(subject.limit).to be_nil
12
11
  end
13
- it "should default interval to 5 sec" do
14
- subject.interval.should eql(5)
12
+ it 'should default interval to 5 sec' do
13
+ expect(subject.interval).to eql(5)
15
14
  end
16
15
  end
17
-
18
- describe "ping_handler configuration" do
19
- it "should be Net::Ping::External for :icmp" do
20
- options = { :type => :icmp, :host => 'localhost', :port => nil}
16
+
17
+ describe 'ping_handler configuration' do
18
+ it 'should be Net::Ping::External for :icmp' do
19
+ options = { type: :icmp, host: 'localhost', port: nil }
21
20
  base = Igp::Base.new(options)
22
- base.ping_handler.should be_a(Net::Ping::External)
21
+ expect(base.ping_handler).to be_a(Net::Ping::External)
23
22
  end
24
- it "should be Net::Ping::UDP for :tcp" do
25
- options = { :type => :udp, :host => 'localhost', :port => 22}
23
+ it 'should be Net::Ping::UDP for :tcp' do
24
+ options = { type: :udp, host: 'localhost', port: 22 }
26
25
  base = Igp::Base.new(options)
27
- base.ping_handler.should be_a(Net::Ping::UDP)
26
+ expect(base.ping_handler).to be_a(Net::Ping::UDP)
28
27
  end
29
- it "should be Net::Ping::TCP for :tcp" do
30
- options = { :type => :tcp, :host => 'localhost', :port => 22}
28
+ it 'should be Net::Ping::TCP for :tcp' do
29
+ options = { type: :tcp, host: 'localhost', port: 22 }
31
30
  base = Igp::Base.new(options)
32
- base.ping_handler.should be_a(Net::Ping::TCP)
31
+ expect(base.ping_handler).to be_a(Net::Ping::TCP)
33
32
  end
34
- it "should be Net::Ping::HTTP for :http" do
35
- options = { :type => :http, :url => 'http://localhost'}
33
+ it 'should be Net::Ping::HTTP for :http' do
34
+ options = { type: :http, url: 'http://localhost' }
36
35
  base = Igp::Base.new(options)
37
- base.ping_handler.should be_a(Net::Ping::HTTP)
36
+ expect(base.ping_handler).to be_a(Net::Ping::HTTP)
38
37
  end
39
- it "should be Net::Ping::HTTP for :https" do
40
- options = { :type => :https, :url => 'https://localhost'}
38
+ it 'should be Net::Ping::HTTP for :https' do
39
+ options = { type: :https, url: 'https://localhost' }
41
40
  base = Igp::Base.new(options)
42
- base.ping_handler.should be_a(Net::Ping::HTTP)
41
+ expect(base.ping_handler).to be_a(Net::Ping::HTTP)
43
42
  end
44
- it "should be Net::Ping::LDAP for :ldap" do
45
- options = { :type => :ldap, :url => 'ldap://localhost'}
43
+ it 'should be Net::Ping::LDAP for :ldap' do
44
+ options = { type: :ldap, url: 'ldap://localhost' }
46
45
  base = Igp::Base.new(options)
47
- base.ping_handler.should be_a(Net::Ping::LDAP)
46
+ expect(base.ping_handler).to be_a(Net::Ping::LDAP)
48
47
  end
49
- it "should be Net::Ping::LDAP for :ldaps" do
50
- options = { :type => :ldaps, :url => 'ldaps://localhost'}
48
+ it 'should be Net::Ping::LDAP for :ldaps' do
49
+ options = { type: :ldaps, url: 'ldaps://localhost' }
51
50
  base = Igp::Base.new(options)
52
- base.ping_handler.should be_a(Net::Ping::LDAP)
51
+ expect(base.ping_handler).to be_a(Net::Ping::LDAP)
53
52
  end
54
53
  end
55
54
 
56
- describe "#run" do
55
+ describe '#run' do
57
56
  before do
58
- @good = Igp::Base.new({ :type => :icmp, :host => 'localhost', :port => nil, :limit => 1})
57
+ @good = Igp::Base.new({ type: :icmp, host: 'localhost', port: nil, limit: 1 })
59
58
  end
60
- it "should print header and log a ping result" do
61
- @good.formatter.should_receive(:header)
62
- @good.formatter.should_receive(:log)
63
- capture(:stdout,:stderr){ @good.run }
59
+ it 'should print header and log a ping result' do
60
+ expect(@good.formatter).to receive(:header)
61
+ expect(@good.formatter).to receive(:log)
62
+ capture(:stdout, :stderr) { @good.run }
64
63
  end
65
64
  end
66
- end
65
+ end
data/spec/format_spec.rb CHANGED
@@ -2,47 +2,45 @@ require 'spec_helper'
2
2
  require 'getoptions'
3
3
 
4
4
  describe Igp::Base::Format do
5
-
6
5
  describe '#duration' do
7
- it "should return nil for nil duration" do
8
- subject.duration(nil).should be_nil
6
+ it 'should return nil for nil duration' do
7
+ expect(subject.duration(nil)).to be_nil
9
8
  end
10
- it "should return string to 6 decimal places for non-nil duration" do
9
+ it 'should return string to 6 decimal places for non-nil duration' do
11
10
  result = subject.duration(1.0)
12
- result.should match(/^\d+\.\d{6}$/)
13
- result.to_f.should eql(1.0)
11
+ expect(result).to match(/^\d+\.\d{6}$/)
12
+ expect(result.to_f).to eql(1.0)
14
13
  end
15
- it "should handle integer parameter" do
14
+ it 'should handle integer parameter' do
16
15
  result = subject.duration(1)
17
- result.should match(/^\d+\.\d{6}$/)
18
- result.to_f.should eql(1.0)
16
+ expect(result).to match(/^\d+\.\d{6}$/)
17
+ expect(result.to_f).to eql(1.0)
19
18
  end
20
19
  end
21
20
 
22
21
  describe '#header' do
23
- it "should output a blank line for nil parameters" do
24
- result = capture(:stderr){ subject.header(nil) }
25
- result.should eql("\n")
22
+ it 'should output a blank line for nil parameters' do
23
+ result = capture(:stderr) { subject.header(nil) }
24
+ expect(result).to eql("\n")
26
25
  end
27
- it "should convert an arbitrary array of strings and numbers to a space-delimited output to stderr" do
28
- result = capture(:stderr){ subject.header("string",1.0,"another string",2.0) }
29
- result.should eql("string 1.0 another string 2.0\n")
26
+ it 'should convert an arbitrary array of strings and numbers to a space-delimited output to stderr' do
27
+ result = capture(:stderr) { subject.header('string', 1.0, 'another string', 2.0) }
28
+ expect(result).to eql("string 1.0 another string 2.0\n")
30
29
  end
31
30
  end
32
31
 
33
32
  describe '#log' do
34
- it "should output time only for nil parameters" do
35
- result = capture(:stdout){ subject.log(nil) }
36
- result.should match(/^.+Z,$/)
33
+ it 'should output time only for nil parameters' do
34
+ result = capture(:stdout) { subject.log(nil) }
35
+ expect(result).to match(/^.+Z,$/)
37
36
  end
38
- it "should log successful message (boolean,float,nil) to stdout" do
39
- result = capture(:stdout){ subject.log(true,1.0,nil) }
40
- result.should match(/^.+Z,true,1.0,$/)
37
+ it 'should log successful message (boolean,float,nil) to stdout' do
38
+ result = capture(:stdout) { subject.log(true, 1.0, nil) }
39
+ expect(result).to match(/^.+Z,true,1.0,$/)
41
40
  end
42
- it "should log unsuccessful message (boolean,nil,string) to stdout" do
43
- result = capture(:stdout){ subject.log(false,nil,"message") }
44
- result.should match(/^.+Z,false,,message$/)
41
+ it 'should log unsuccessful message (boolean,nil,string) to stdout' do
42
+ result = capture(:stdout) { subject.log(false, nil, 'message') }
43
+ expect(result).to match(/^.+Z,false,,message$/)
45
44
  end
46
45
  end
47
-
48
- end
46
+ end
@@ -0,0 +1,193 @@
1
+ require 'spec_helper'
2
+ require 'fakeldap'
3
+
4
+ describe Net::Ping::LDAP do
5
+ before :all do
6
+ @ldap_server = FakeLDAP::Server.new(port: 2389)
7
+ @ldap_server.run_tcpserver
8
+ @ldap_server.add_user('cn=el.Daper,ou=USERS,dc=example,dc=com', 'ldappassword')
9
+ end
10
+
11
+ after :all do
12
+ @ldap_server.stop
13
+ end
14
+
15
+ context 'when valid ldap url' do
16
+ let(:timeout) { 30 }
17
+ let(:cn) { 'el.Daper' }
18
+ let(:password) { 'ldappassword' }
19
+ let(:uri) { 'ldap://localhost:2389' }
20
+ subject(:ldap) do
21
+ ldap = Net::Ping::LDAP.new(uri, timeout)
22
+ ldap.username = cn
23
+ ldap.password = password
24
+ ldap
25
+ end
26
+
27
+ describe '#ping' do
28
+ subject { ldap.ping }
29
+ it 'ping basic functionality' do
30
+ expect { subject }.to_not raise_error
31
+ expect(subject).to eql(true)
32
+ end
33
+ end
34
+ describe '#ping?' do
35
+ subject { ldap.ping? }
36
+ it 'returns a boolean' do
37
+ expect(subject).to eql(true)
38
+ end
39
+ end
40
+ describe '#pingecho' do
41
+ subject { ldap.pingecho }
42
+ it 'returns a boolean' do
43
+ expect(subject).to eql(true)
44
+ end
45
+ end
46
+ describe '#duration' do
47
+ subject { ldap.duration }
48
+ before { ldap.ping }
49
+ it 'returns a float' do
50
+ expect(subject).to be_a(Float)
51
+ end
52
+ end
53
+ end
54
+
55
+ context 'when bad ldap url' do
56
+ let(:uri) { 'ldap://blabfoobarurghxxxx.com' }
57
+ subject(:ldap) { Net::Ping::LDAP.new(uri) }
58
+ describe '#ping' do
59
+ subject { ldap.ping }
60
+ it 'ping basic functionality' do
61
+ expect { subject }.to_not raise_error
62
+ expect(subject).to eql(false)
63
+ end
64
+ end
65
+ describe '#ping?' do
66
+ subject { ldap.ping? }
67
+ it 'returns a boolean' do
68
+ expect(subject).to eql(false)
69
+ end
70
+ end
71
+ describe '#pingecho' do
72
+ subject { ldap.pingecho }
73
+ it 'returns a boolean' do
74
+ expect(subject).to eql(false)
75
+ end
76
+ end
77
+ describe '#duration' do
78
+ subject { ldap.duration }
79
+ before { ldap.ping }
80
+ it 'returns nil' do
81
+ expect(subject).to be_nil
82
+ end
83
+ end
84
+ end
85
+
86
+ # test 'host attribute basic functionality' do
87
+ # assert_respond_to(@ldap, :host)
88
+ # assert_respond_to(@ldap, :host=)
89
+ # assert_equal(@@host, @ldap.host)
90
+ # end
91
+
92
+ # test 'port attribute basic functionality' do
93
+ # assert_respond_to(@ldap, :port)
94
+ # assert_respond_to(@ldap, :port=)
95
+ # end
96
+
97
+ # test 'port attribute expected value' do
98
+ # assert_equal(@@port, @ldap.port)
99
+ # end
100
+
101
+ # test 'timeout attribute basic functionality' do
102
+ # assert_respond_to(@ldap, :timeout)
103
+ # assert_respond_to(@ldap, :timeout=)
104
+ # end
105
+
106
+ # test 'timeout attribute expected values' do
107
+ # assert_equal(@@timeout, @ldap.timeout)
108
+ # assert_equal(5, @bad.timeout)
109
+ # end
110
+
111
+ # test 'exception attribute basic functionality' do
112
+ # assert_respond_to(@ldap, :exception)
113
+ # assert_nil(@ldap.exception)
114
+ # end
115
+
116
+ # test 'exception attribute is nil if the ping is successful' do
117
+ # assert_true(@ldap.ping)
118
+ # assert_nil(@ldap.exception)
119
+ # end
120
+
121
+ # test 'exception attribute is not nil if the ping is unsuccessful' do
122
+ # assert_false(@bad.ping)
123
+ # assert_not_nil(@bad.exception)
124
+ # end
125
+
126
+ # test 'warning attribute basic functionality' do
127
+ # assert_respond_to(@ldap, :warning)
128
+ # assert_nil(@ldap.warning)
129
+ # end
130
+
131
+ # test 'uri attribute basic functionality' do
132
+ # assert_respond_to(@ldap, :uri)
133
+ # assert_respond_to(@ldap, :uri=)
134
+ # end
135
+
136
+ # test 'username attribute basic functionality' do
137
+ # assert_respond_to(@ldap, :username)
138
+ # assert_respond_to(@ldap, :username=)
139
+ # end
140
+
141
+ # test 'password attribute basic functionality' do
142
+ # assert_respond_to(@ldap, :password)
143
+ # assert_respond_to(@ldap, :password=)
144
+ # end
145
+
146
+ # test 'encryption attribute basic functionality' do
147
+ # assert_respond_to(@ldap, :encryption)
148
+ # assert_respond_to(@ldap, :encryption=)
149
+ # end
150
+
151
+ # test 'encryption defaults to nil for ldap' do
152
+ # assert_nil(Net::Ping::LDAP.new('ldap://somehost.example.net').encryption)
153
+ # end
154
+
155
+ # test 'encryption defaults to simple_tls for ldaps' do
156
+ # assert_equal(:simple_tls, Net::Ping::LDAP.new('ldaps://somehost.example.net').encryption)
157
+ # end
158
+
159
+ # test 'port defaults to 389 for ldap' do
160
+ # assert_equal(389, Net::Ping::LDAP.new('ldap://somehost.example.net').port)
161
+ # end
162
+
163
+ # test 'port defaults to 636 for ldaps' do
164
+ # assert_equal(636, Net::Ping::LDAP.new('ldaps://somehost.example.net').port)
165
+ # end
166
+
167
+ # test 'port extracted from uri if provided' do
168
+ # assert_equal(12345, Net::Ping::LDAP.new('ldap://somehost.example.net:12345').port)
169
+ # assert_equal(12345, Net::Ping::LDAP.new('ldaps://somehost.example.net:12345').port)
170
+ # end
171
+
172
+ # test 'encryption setting is forced to symbol' do
173
+ # @ldap.encryption = 'simple_tls'
174
+ # assert_true( @ldap.encryption.is_a? Symbol )
175
+ # assert_true( @ldap.config[:encryption].is_a? Symbol )
176
+ # end
177
+
178
+ # test 'username/password set in config auth section' do
179
+ # @ldap.username, @ldap.password = 'fred', 'derf'
180
+ # assert_equal('fred', @ldap.config[:auth][:username] )
181
+ # assert_equal('derf', @ldap.config[:auth][:password] )
182
+ # end
183
+
184
+ # test 'auth method defaults to simple if username/password set' do
185
+ # @ldap.username, @ldap.password = 'fred', 'derf'
186
+ # assert_equal(:simple, @ldap.config[:auth][:method] )
187
+ # end
188
+
189
+ # test 'if no username/password then defaults to auth anonymous' do
190
+ # @ldap.username = @ldap.password = nil
191
+ # assert_equal({:method => :anonymous}, @ldap.config[:auth] )
192
+ # end
193
+ end