corona 0.0.2 → 0.0.5
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 +7 -0
- data/Gemfile +1 -12
- data/Gemfile.lock +14 -24
- data/Rakefile +25 -13
- data/corona.gemspec +2 -1
- data/lib/corona/core.rb +7 -26
- data/lib/corona/db/db.rb +31 -0
- data/lib/corona/db/model.rb +20 -0
- data/lib/corona/model.rb +34 -0
- data/lib/corona/snmp.rb +2 -2
- metadata +22 -17
- data/lib/corona/db.rb +0 -50
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8dbac544706aa6c8804d989307768c20ed0e5149
|
4
|
+
data.tar.gz: efe2c5e74b075d7fa8206c2ce0413221aaf6e345
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d00f70284e1d0049d153d83b9c24ae3a49191235fc714fd80f049ba4ab4e2689d2c54aeca1a6e7182d238a064035ea92ff048f6a6f574a36f25bd94e96b4648f
|
7
|
+
data.tar.gz: 8426a763a70f6d6529b4dff2d8b9e0ba77be47893454fba3d9e91be55408bf1992e281622002457a4a5e4b2751b5fada89bd6dad0c7b516a17f4ed6be785e8cd
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,32 +1,22 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
corona (0.0.5)
|
5
|
+
sequel
|
6
|
+
snmp
|
7
|
+
sqlite3
|
8
|
+
|
1
9
|
GEM
|
2
10
|
remote: https://rubygems.org/
|
3
11
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
coderay (~> 1.0.5)
|
9
|
-
method_source (~> 0.8)
|
10
|
-
slop (~> 3.3.1)
|
11
|
-
rspec (2.14.1)
|
12
|
-
rspec-core (~> 2.14.0)
|
13
|
-
rspec-expectations (~> 2.14.0)
|
14
|
-
rspec-mocks (~> 2.14.0)
|
15
|
-
rspec-core (2.14.5)
|
16
|
-
rspec-expectations (2.14.2)
|
17
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
18
|
-
rspec-mocks (2.14.3)
|
19
|
-
sequel (3.42.0)
|
20
|
-
slop (3.3.2)
|
21
|
-
snmp (1.1.0)
|
22
|
-
sqlite3 (1.3.7)
|
12
|
+
rspec-core (2.14.7)
|
13
|
+
sequel (4.7.0)
|
14
|
+
snmp (1.1.1)
|
15
|
+
sqlite3 (1.3.8)
|
23
16
|
|
24
17
|
PLATFORMS
|
25
18
|
ruby
|
26
19
|
|
27
20
|
DEPENDENCIES
|
28
|
-
|
29
|
-
rspec
|
30
|
-
sequel
|
31
|
-
snmp
|
32
|
-
sqlite3
|
21
|
+
corona!
|
22
|
+
rspec-core
|
data/Rakefile
CHANGED
@@ -1,35 +1,47 @@
|
|
1
1
|
begin
|
2
|
+
require 'rake/testtask'
|
2
3
|
require 'bundler'
|
3
|
-
require 'rspec/core/rake_task'
|
4
4
|
Bundler.setup
|
5
5
|
rescue LoadError
|
6
|
-
warn 'missing
|
7
|
-
raise
|
6
|
+
warn 'bunler missing'
|
8
7
|
exit 42
|
9
8
|
end
|
10
9
|
|
11
10
|
gemspec = eval(File.read(Dir['*.gemspec'].first))
|
11
|
+
file = [gemspec.name, gemspec.version].join('-') + '.gem'
|
12
12
|
|
13
|
-
desc 'Validate
|
13
|
+
desc 'Validate gemspec'
|
14
14
|
task :gemspec do
|
15
15
|
gemspec.validate
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
desc 'Run minitest'
|
19
|
+
task :test do
|
20
|
+
Rake::TestTask.new do |t|
|
21
|
+
t.libs.push "lib"
|
22
|
+
t.test_files = FileList['spec/*_spec.rb']
|
23
|
+
t.verbose = true
|
24
|
+
end
|
25
|
+
end
|
19
26
|
|
20
|
-
desc
|
21
|
-
task :build
|
27
|
+
desc 'Build gem'
|
28
|
+
task :build do
|
22
29
|
system "gem build #{gemspec.name}.gemspec"
|
23
|
-
FileUtils.mkdir_p
|
24
|
-
FileUtils.mv
|
30
|
+
FileUtils.mkdir_p 'gems'
|
31
|
+
FileUtils.mv file, 'gems'
|
25
32
|
end
|
26
33
|
|
27
|
-
desc
|
34
|
+
desc 'Install gem'
|
28
35
|
task :install => :build do
|
29
|
-
system "sudo sh -c \'umask 022; gem install gems/#{
|
36
|
+
system "sudo -E sh -c \'umask 022; gem install gems/#{file}\'"
|
30
37
|
end
|
31
38
|
|
32
|
-
desc
|
39
|
+
desc 'Remove gems'
|
33
40
|
task :clean do
|
34
|
-
FileUtils.rm_rf
|
41
|
+
FileUtils.rm_rf 'gems'
|
42
|
+
end
|
43
|
+
|
44
|
+
desc 'Push to rubygems'
|
45
|
+
task :push do
|
46
|
+
system "gem push gems/#{file}"
|
35
47
|
end
|
data/corona.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'corona'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.5'
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.authors = [ 'Saku Ytti' ]
|
6
6
|
s.email = %w( saku@ytti.fi )
|
@@ -15,4 +15,5 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_dependency 'sequel'
|
16
16
|
s.add_dependency 'sqlite3'
|
17
17
|
s.add_dependency 'snmp'
|
18
|
+
s.add_development_dependency 'rspec-core'
|
18
19
|
end
|
data/lib/corona/core.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'corona/log'
|
2
2
|
require 'corona/config/core'
|
3
3
|
require 'corona/snmp'
|
4
|
-
require 'corona/db'
|
4
|
+
require 'corona/db/db'
|
5
|
+
require 'corona/model'
|
5
6
|
require 'ipaddr'
|
6
7
|
require 'resolv'
|
7
8
|
|
@@ -55,8 +56,8 @@ module Corona
|
|
55
56
|
def process opt
|
56
57
|
opt = normalize_opt opt
|
57
58
|
record = mkrecord opt
|
58
|
-
old_by_ip, old_by_sysname = @db.old record[:
|
59
|
-
|
59
|
+
old_by_ip, old_by_sysname = @db.old record[:ip], record[:oid_sysName]
|
60
|
+
|
60
61
|
# unique box having non-unique sysname
|
61
62
|
# old_by_sysname = false if record[:oid_sysDescr].match 'Application Control Engine'
|
62
63
|
|
@@ -104,14 +105,14 @@ module Corona
|
|
104
105
|
elsif new_int_pref == 100 and old_int_pref == 99
|
105
106
|
# neither old or new interface is known good MGMT interface
|
106
107
|
if SNMP.new(old_by_sysname[:ip]).sysdescr
|
107
|
-
# if old IP works, don't update
|
108
|
+
# if old IP works, don't update
|
108
109
|
Log.debug "#{record[:ip]} not updating, previously seen as #{old_by_sysname[:ip]}"
|
109
110
|
else
|
110
111
|
Log.info "#{record[:ip]} updating, old #{old_by_sysname[:ip]} is dead"
|
111
112
|
@db.update record, [:oid_sysName, old_by_sysname[:oid_sysName]]
|
112
113
|
end
|
113
114
|
|
114
|
-
elsif new_int_pref >= old_int_pref
|
115
|
+
elsif new_int_pref >= old_int_pref
|
115
116
|
# nothing to do, we have better entry
|
116
117
|
Log.debug "#{record[:ip]} already seen as superior via #{old_by_sysname[:ip]}"
|
117
118
|
|
@@ -122,10 +123,9 @@ module Corona
|
|
122
123
|
|
123
124
|
def mkrecord opt
|
124
125
|
{
|
125
|
-
:id => opt[:ip].to_i,
|
126
126
|
:ip => opt[:ip].to_s,
|
127
127
|
:ptr => ip2name(opt[:ip].to_s),
|
128
|
-
:model =>
|
128
|
+
:model => Model.map(opt[:oids][:sysDescr]),
|
129
129
|
:oid_ifDescr => opt[:int],
|
130
130
|
:oid_sysName => opt[:oids][:sysName],
|
131
131
|
:oid_sysLocation => opt[:oids][:sysLocation],
|
@@ -142,25 +142,6 @@ module Corona
|
|
142
142
|
Resolv.getname ip rescue ip
|
143
143
|
end
|
144
144
|
|
145
|
-
def model opt
|
146
|
-
case opt[:oids][:sysDescr]
|
147
|
-
when /Cisco Catalyst operating System/
|
148
|
-
'catos'
|
149
|
-
when /cisco/i, /Application Control Engine/i
|
150
|
-
'ios'
|
151
|
-
when /JUNOS/
|
152
|
-
'junos'
|
153
|
-
when /^NetScreen/, /^SSG-\d+/
|
154
|
-
'screenos'
|
155
|
-
when /IronWare/
|
156
|
-
'ironware'
|
157
|
-
when /^Summit/
|
158
|
-
'xos'
|
159
|
-
when /^\d+[A-Z]\sEthernet Switch$/
|
160
|
-
'powerconnect'
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
145
|
def resolve_networks
|
165
146
|
[CFG.poll, CFG.ignore].map do |nets|
|
166
147
|
if nets.respond_to? :each
|
data/lib/corona/db/db.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Corona
|
2
|
+
class DB
|
3
|
+
require 'sequel'
|
4
|
+
require 'sqlite3'
|
5
|
+
def initialize
|
6
|
+
Sequel::Model.plugin :schema
|
7
|
+
@db = Sequel.sqlite(CFG.db, :max_connections => 1, :pool_timeout => 60)
|
8
|
+
require_relative 'model'
|
9
|
+
end
|
10
|
+
|
11
|
+
def add record
|
12
|
+
record[:first_seen] = record[:last_seen] = Time.now.utc
|
13
|
+
record[:active] = true
|
14
|
+
Log.debug "adding: #{record}"
|
15
|
+
Device.new(record).save
|
16
|
+
end
|
17
|
+
|
18
|
+
def update record, where
|
19
|
+
record[:last_seen] = Time.now.utc
|
20
|
+
record[:active] = true
|
21
|
+
Log.debug "updating (where: #{where}): #{record}"
|
22
|
+
Device[where.first.to_sym => where.last].update record
|
23
|
+
end
|
24
|
+
|
25
|
+
def old ip, oid_sysName
|
26
|
+
ip = Device[:ip => ip]
|
27
|
+
sysName = Device[:oid_sysName => oid_sysName]
|
28
|
+
[ip, sysName]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Corona
|
2
|
+
class DB
|
3
|
+
class Device < Sequel::Model
|
4
|
+
set_schema do
|
5
|
+
primary_key :id
|
6
|
+
String :ip
|
7
|
+
String :ptr
|
8
|
+
String :model
|
9
|
+
String :oid_ifDescr
|
10
|
+
Boolean :active
|
11
|
+
Time :first_seen
|
12
|
+
Time :last_seen
|
13
|
+
String :oid_sysName
|
14
|
+
String :oid_sysLocation
|
15
|
+
String :oid_sysDescr
|
16
|
+
end
|
17
|
+
create_table unless table_exists?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/corona/model.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module Corona
|
2
|
+
class Model
|
3
|
+
def self.map sysDescr
|
4
|
+
case sysDescr
|
5
|
+
when /Cisco Catalyst Operating System/i
|
6
|
+
'catos'
|
7
|
+
when /Cisco Controller/
|
8
|
+
'aireos'
|
9
|
+
when /IOS XR/
|
10
|
+
'iosxr'
|
11
|
+
when /NX-OS/
|
12
|
+
'nxos'
|
13
|
+
when /cisco/i, /Application Control Engine/i
|
14
|
+
'ios'
|
15
|
+
when /JUNOS/
|
16
|
+
'junos'
|
17
|
+
when /^NetScreen/, /^SSG-\d+/
|
18
|
+
'screenos'
|
19
|
+
when /Arista Networks EOS/
|
20
|
+
'eos'
|
21
|
+
when /IronWare/
|
22
|
+
'ironware'
|
23
|
+
when /^Summit/
|
24
|
+
'xos'
|
25
|
+
when /^Alcatel-Lucent/
|
26
|
+
'aos'
|
27
|
+
when /ProCurve/ # ProCurve OS does not seem to have name?
|
28
|
+
'procurve'
|
29
|
+
when /^\d+[A-Z]\sEthernet Switch$/
|
30
|
+
'powerconnect'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/corona/snmp.rb
CHANGED
@@ -27,7 +27,7 @@ module Corona
|
|
27
27
|
oid = [oid].flatten.join('.')
|
28
28
|
begin
|
29
29
|
@snmp.get(oid).each_varbind { |vb| return vb }
|
30
|
-
rescue ::SNMP::RequestTimeout
|
30
|
+
rescue ::SNMP::RequestTimeout, Errno::EACCES
|
31
31
|
return false
|
32
32
|
end
|
33
33
|
end
|
@@ -42,7 +42,7 @@ module Corona
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
45
|
-
rescue ::SNMP::RequestTimeout
|
45
|
+
rescue ::SNMP::RequestTimeout, Errno::EACCES
|
46
46
|
return false
|
47
47
|
end
|
48
48
|
result
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: corona
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Saku Ytti
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-07 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: sequel
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: sqlite3
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: snmp
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,20 @@ dependencies:
|
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-core
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
65
|
requirements:
|
59
66
|
- - '>='
|
60
67
|
- !ruby/object:Gem::Version
|
@@ -79,34 +86,32 @@ files:
|
|
79
86
|
- lib/corona/config/bootstrap.rb
|
80
87
|
- lib/corona/config/core.rb
|
81
88
|
- lib/corona/core.rb
|
82
|
-
- lib/corona/db.rb
|
89
|
+
- lib/corona/db/db.rb
|
90
|
+
- lib/corona/db/model.rb
|
83
91
|
- lib/corona/log.rb
|
92
|
+
- lib/corona/model.rb
|
84
93
|
- lib/corona/snmp.rb
|
85
94
|
homepage: http://github.com/ytti/corona
|
86
95
|
licenses: []
|
96
|
+
metadata: {}
|
87
97
|
post_install_message:
|
88
98
|
rdoc_options: []
|
89
99
|
require_paths:
|
90
100
|
- lib
|
91
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
-
none: false
|
93
102
|
requirements:
|
94
103
|
- - '>='
|
95
104
|
- !ruby/object:Gem::Version
|
96
105
|
version: '0'
|
97
|
-
segments:
|
98
|
-
- 0
|
99
|
-
hash: 1830848294566328575
|
100
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
107
|
requirements:
|
103
108
|
- - '>='
|
104
109
|
- !ruby/object:Gem::Version
|
105
110
|
version: '0'
|
106
111
|
requirements: []
|
107
112
|
rubyforge_project: corona
|
108
|
-
rubygems_version:
|
113
|
+
rubygems_version: 2.0.3
|
109
114
|
signing_key:
|
110
|
-
specification_version:
|
115
|
+
specification_version: 4
|
111
116
|
summary: device discovery via snmp polls
|
112
117
|
test_files: []
|
data/lib/corona/db.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
module Corona
|
2
|
-
class DB
|
3
|
-
require 'sequel'
|
4
|
-
require 'sqlite3'
|
5
|
-
def initialize
|
6
|
-
@db = Sequel.sqlite(CFG.db, :max_connections => 1, :pool_timeout => 60)
|
7
|
-
|
8
|
-
@db.create_table :device do
|
9
|
-
primary_key :id
|
10
|
-
String :ip
|
11
|
-
String :ptr
|
12
|
-
String :model
|
13
|
-
String :oid_ifDescr
|
14
|
-
Boolean :active
|
15
|
-
Time :first_seen
|
16
|
-
Time :last_seen
|
17
|
-
String :oid_sysName
|
18
|
-
String :oid_sysLocation
|
19
|
-
String :oid_sysDescr
|
20
|
-
end unless @db.table_exists? :device
|
21
|
-
end
|
22
|
-
|
23
|
-
# http://sequel.rubyforge.org/rdoc/files/doc/cheat_sheet_rdoc.html
|
24
|
-
#
|
25
|
-
|
26
|
-
def add record
|
27
|
-
record[:first_seen] = record[:last_seen] = Time.now.utc
|
28
|
-
record[:active] = true
|
29
|
-
#Log.debug "adding: #{record}"
|
30
|
-
@db[:device].insert record
|
31
|
-
end
|
32
|
-
|
33
|
-
def update record, where
|
34
|
-
record[:last_seen] = Time.now.utc
|
35
|
-
record[:active] = true
|
36
|
-
#Log.debug "updating (where: #{where}): #{record}"
|
37
|
-
@db[:device].where('? == ?', where.first, where.last).update record
|
38
|
-
end
|
39
|
-
|
40
|
-
def [] primary_key
|
41
|
-
@db[:device].where('id == ?', primary_key).first
|
42
|
-
end
|
43
|
-
|
44
|
-
def old primary_key, oid_sysName
|
45
|
-
ip = self[primary_key]
|
46
|
-
sysName = @db[:device].where('oid_sysName == ?', oid_sysName).first
|
47
|
-
[ip, sysName]
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|