telemetry-snmp 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/rspec.yml +44 -0
- data/.github/workflows/rubocop.yml +28 -0
- data/.github/workflows/sourcehawk-scan.yml +20 -0
- data/.gitignore +14 -0
- data/.rspec +4 -0
- data/.rubocop.yml +26 -0
- data/CHANGELOG.md +4 -0
- data/CODE_OF_CONDUCT.md +75 -0
- data/CONTRIBUTING.md +54 -0
- data/Gemfile +10 -0
- data/INDIVIDUAL_CONTRIBUTOR_LICENSE.md +30 -0
- data/LICENSE +201 -0
- data/NOTICE.txt +9 -0
- data/README.md +54 -0
- data/attribution.txt +1 -0
- data/config.ru +15 -0
- data/exe/snmp_collector +55 -0
- data/lib/telemetry/snmp.rb +23 -0
- data/lib/telemetry/snmp/api.rb +55 -0
- data/lib/telemetry/snmp/auth.rb +54 -0
- data/lib/telemetry/snmp/auth/defaults.rb +41 -0
- data/lib/telemetry/snmp/client.rb +104 -0
- data/lib/telemetry/snmp/controllers/device_creds.rb +105 -0
- data/lib/telemetry/snmp/controllers/devices.rb +94 -0
- data/lib/telemetry/snmp/controllers/oid_groups.rb +71 -0
- data/lib/telemetry/snmp/controllers/oids.rb +80 -0
- data/lib/telemetry/snmp/controllers/users.rb +81 -0
- data/lib/telemetry/snmp/controllers/walks.rb +89 -0
- data/lib/telemetry/snmp/data.rb +69 -0
- data/lib/telemetry/snmp/data/default_opts.rb +73 -0
- data/lib/telemetry/snmp/data/migrations/001_device_creds.rb +19 -0
- data/lib/telemetry/snmp/data/migrations/002_create_devices_table.rb +31 -0
- data/lib/telemetry/snmp/data/migrations/003_create_oids_tables.rb +16 -0
- data/lib/telemetry/snmp/data/migrations/004_create_oid_groups.rb +15 -0
- data/lib/telemetry/snmp/data/migrations/005_create_oids_oid_groups.rb +17 -0
- data/lib/telemetry/snmp/data/migrations/006_device_to_oid_group.rb +15 -0
- data/lib/telemetry/snmp/data/migrations/007_create_users.rb +20 -0
- data/lib/telemetry/snmp/data/migrations/008_create_walks_table.rb +14 -0
- data/lib/telemetry/snmp/data/migrations/009_create_tag_name_column.rb +7 -0
- data/lib/telemetry/snmp/data/migrations/010_create_user_audit_table.rb +18 -0
- data/lib/telemetry/snmp/data/models/device.rb +11 -0
- data/lib/telemetry/snmp/data/models/device_cred.rb +11 -0
- data/lib/telemetry/snmp/data/models/oid.rb +10 -0
- data/lib/telemetry/snmp/data/models/oid_group.rb +10 -0
- data/lib/telemetry/snmp/data/models/oid_oid_groups.rb +10 -0
- data/lib/telemetry/snmp/data/models/oid_walk.rb +10 -0
- data/lib/telemetry/snmp/data/models/user.rb +10 -0
- data/lib/telemetry/snmp/data/models/user_audit_log.rb +19 -0
- data/lib/telemetry/snmp/mibs/AGENTX-MIB.txt +527 -0
- data/lib/telemetry/snmp/mibs/AIRPORT-BASESTATION-3-MIB.txt +461 -0
- data/lib/telemetry/snmp/mibs/BRIDGE-MIB.txt +1472 -0
- data/lib/telemetry/snmp/mibs/DISMAN-EVENT-MIB.txt +1882 -0
- data/lib/telemetry/snmp/mibs/DISMAN-SCHEDULE-MIB.txt +699 -0
- data/lib/telemetry/snmp/mibs/DISMAN-SCRIPT-MIB.txt +1764 -0
- data/lib/telemetry/snmp/mibs/EtherLike-MIB.txt +1862 -0
- data/lib/telemetry/snmp/mibs/HCNUM-TC.txt +118 -0
- data/lib/telemetry/snmp/mibs/HOST-RESOURCES-MIB.txt +1540 -0
- data/lib/telemetry/snmp/mibs/HOST-RESOURCES-TYPES.txt +389 -0
- data/lib/telemetry/snmp/mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB.txt +123 -0
- data/lib/telemetry/snmp/mibs/IANA-LANGUAGE-MIB.txt +123 -0
- data/lib/telemetry/snmp/mibs/IANA-RTPROTO-MIB.txt +91 -0
- data/lib/telemetry/snmp/mibs/IANAifType-MIB.txt +619 -0
- data/lib/telemetry/snmp/mibs/IF-INVERTED-STACK-MIB.txt +149 -0
- data/lib/telemetry/snmp/mibs/IF-MIB.txt +1814 -0
- data/lib/telemetry/snmp/mibs/INET-ADDRESS-MIB.txt +402 -0
- data/lib/telemetry/snmp/mibs/IP-FORWARD-MIB.txt +1277 -0
- data/lib/telemetry/snmp/mibs/IP-MIB.txt +4993 -0
- data/lib/telemetry/snmp/mibs/IPV6-FLOW-LABEL-MIB.txt +58 -0
- data/lib/telemetry/snmp/mibs/IPV6-ICMP-MIB.txt +529 -0
- data/lib/telemetry/snmp/mibs/IPV6-MIB.txt +1443 -0
- data/lib/telemetry/snmp/mibs/IPV6-TC.txt +67 -0
- data/lib/telemetry/snmp/mibs/IPV6-TCP-MIB.txt +211 -0
- data/lib/telemetry/snmp/mibs/IPV6-UDP-MIB.txt +141 -0
- data/lib/telemetry/snmp/mibs/NET-SNMP-AGENT-MIB.txt +554 -0
- data/lib/telemetry/snmp/mibs/NET-SNMP-EXAMPLES-MIB.txt +285 -0
- data/lib/telemetry/snmp/mibs/NET-SNMP-EXTEND-MIB.txt +325 -0
- data/lib/telemetry/snmp/mibs/NET-SNMP-MIB.txt +67 -0
- data/lib/telemetry/snmp/mibs/NET-SNMP-PASS-MIB.txt +124 -0
- data/lib/telemetry/snmp/mibs/NET-SNMP-TC.txt +128 -0
- data/lib/telemetry/snmp/mibs/NET-SNMP-VACM-MIB.txt +154 -0
- data/lib/telemetry/snmp/mibs/NOTIFICATION-LOG-MIB.txt +753 -0
- data/lib/telemetry/snmp/mibs/PAN-COMMON-MIB.md5 +1 -0
- data/lib/telemetry/snmp/mibs/PAN-COMMON-MIB.my +2293 -0
- data/lib/telemetry/snmp/mibs/PAN-ENTITY-EXT-MIB.md5 +1 -0
- data/lib/telemetry/snmp/mibs/PAN-ENTITY-EXT-MIB.my +293 -0
- data/lib/telemetry/snmp/mibs/PAN-GLOBAL-REG-MIB.md5 +1 -0
- data/lib/telemetry/snmp/mibs/PAN-GLOBAL-REG-MIB.my +84 -0
- data/lib/telemetry/snmp/mibs/PAN-GLOBAL-TC-MIB.md5 +1 -0
- data/lib/telemetry/snmp/mibs/PAN-GLOBAL-TC-MIB.my +68 -0
- data/lib/telemetry/snmp/mibs/PAN-LC-MIB.md5 +1 -0
- data/lib/telemetry/snmp/mibs/PAN-LC-MIB.my +204 -0
- data/lib/telemetry/snmp/mibs/PAN-PRODUCT-MIB.md5 +1 -0
- data/lib/telemetry/snmp/mibs/PAN-PRODUCT-MIB.my +305 -0
- data/lib/telemetry/snmp/mibs/PAN-TRAPS.md5 +1 -0
- data/lib/telemetry/snmp/mibs/PAN-TRAPS.my +7809 -0
- data/lib/telemetry/snmp/mibs/RFC-1215.txt +38 -0
- data/lib/telemetry/snmp/mibs/RFC1155-SMI.txt +119 -0
- data/lib/telemetry/snmp/mibs/RFC1213-MIB.txt +2613 -0
- data/lib/telemetry/snmp/mibs/RMON-MIB.txt +3980 -0
- data/lib/telemetry/snmp/mibs/SCTP-MIB.txt +1342 -0
- data/lib/telemetry/snmp/mibs/SMUX-MIB.txt +160 -0
- data/lib/telemetry/snmp/mibs/SNMP-COMMUNITY-MIB.txt +429 -0
- data/lib/telemetry/snmp/mibs/SNMP-FRAMEWORK-MIB.txt +526 -0
- data/lib/telemetry/snmp/mibs/SNMP-MPD-MIB.txt +145 -0
- data/lib/telemetry/snmp/mibs/SNMP-NOTIFICATION-MIB.txt +589 -0
- data/lib/telemetry/snmp/mibs/SNMP-PROXY-MIB.txt +294 -0
- data/lib/telemetry/snmp/mibs/SNMP-TARGET-MIB.txt +660 -0
- data/lib/telemetry/snmp/mibs/SNMP-USER-BASED-SM-MIB.txt +912 -0
- data/lib/telemetry/snmp/mibs/SNMP-USM-AES-MIB.txt +62 -0
- data/lib/telemetry/snmp/mibs/SNMP-USM-DH-OBJECTS-MIB.txt +532 -0
- data/lib/telemetry/snmp/mibs/SNMP-VIEW-BASED-ACM-MIB.txt +830 -0
- data/lib/telemetry/snmp/mibs/SNMPv2-CONF.txt +322 -0
- data/lib/telemetry/snmp/mibs/SNMPv2-MIB.txt +854 -0
- data/lib/telemetry/snmp/mibs/SNMPv2-SMI.txt +344 -0
- data/lib/telemetry/snmp/mibs/SNMPv2-TC.txt +772 -0
- data/lib/telemetry/snmp/mibs/SNMPv2-TM.txt +176 -0
- data/lib/telemetry/snmp/mibs/TCP-MIB.txt +785 -0
- data/lib/telemetry/snmp/mibs/TRANSPORT-ADDRESS-MIB.txt +421 -0
- data/lib/telemetry/snmp/mibs/TUNNEL-MIB.txt +738 -0
- data/lib/telemetry/snmp/mibs/UCD-DEMO-MIB.txt +74 -0
- data/lib/telemetry/snmp/mibs/UCD-DISKIO-MIB.txt +171 -0
- data/lib/telemetry/snmp/mibs/UCD-DLMOD-MIB.txt +124 -0
- data/lib/telemetry/snmp/mibs/UCD-IPFWACC-MIB.txt +327 -0
- data/lib/telemetry/snmp/mibs/UCD-SNMP-MIB.txt +1712 -0
- data/lib/telemetry/snmp/mibs/UDP-MIB.txt +549 -0
- data/lib/telemetry/snmp/publisher.rb +130 -0
- data/lib/telemetry/snmp/version.rb +7 -0
- data/sourcehawk.yml +4 -0
- data/telemetry-snmp.gemspec +48 -0
- metadata +456 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'sinatra/extension'
|
2
|
+
|
3
|
+
module Telemetry
|
4
|
+
module Snmp
|
5
|
+
module Controller
|
6
|
+
module Devices
|
7
|
+
extend Sinatra::Extension
|
8
|
+
|
9
|
+
get '' do
|
10
|
+
devices = {}
|
11
|
+
Telemetry::Snmp::Data::Model::Device.all.each do |device|
|
12
|
+
devices[device.values[:id]] = device.values
|
13
|
+
end
|
14
|
+
|
15
|
+
devices
|
16
|
+
end
|
17
|
+
|
18
|
+
get '/:id' do
|
19
|
+
device = Telemetry::Snmp::Data::Model::Device[params[:id]]
|
20
|
+
status 404 if device.nil?
|
21
|
+
{ error: true, message: "#{params[:id]} not found" } if device.nil?
|
22
|
+
|
23
|
+
device.values
|
24
|
+
end
|
25
|
+
|
26
|
+
post '' do
|
27
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
28
|
+
|
29
|
+
if body[:hostname].nil?
|
30
|
+
status 400
|
31
|
+
{ error: true, message: 'hostname cannot be null for new record' }
|
32
|
+
end
|
33
|
+
|
34
|
+
{
|
35
|
+
id: Telemetry::Snmp::Data::Model::User.insert(
|
36
|
+
hostname: body[:hostname],
|
37
|
+
ip_address: body[:ip_address],
|
38
|
+
active: body[:active] || 1,
|
39
|
+
port: body[:port] || 161,
|
40
|
+
snmp_version: body[:snmp_version] || 3,
|
41
|
+
device_cred_id: body[:device_cred_id],
|
42
|
+
frequency: body[:frequency] || 60,
|
43
|
+
environment: body[:environment] || 'production',
|
44
|
+
datacenter: body[:datacenter],
|
45
|
+
zone: body[:zone],
|
46
|
+
created: Sequel::CURRENT_TIMESTAMP
|
47
|
+
),
|
48
|
+
hostname: body[:hostname]
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
put '/:id' do
|
53
|
+
device = Telemetry::Snmp::Data::Model::Device[params[:id]]
|
54
|
+
status 404 if device.nil?
|
55
|
+
{ error: true, message: "#{params[:id]} not found" } if device.nil?
|
56
|
+
|
57
|
+
status 405
|
58
|
+
{ error: true, message: 'puts not supported', id: params[:id] }
|
59
|
+
end
|
60
|
+
|
61
|
+
patch '/:id' do
|
62
|
+
# id, hostname, ip_address, active, port, snmp_version, device_cred_id,
|
63
|
+
# frequency, environment, datacenter, zone, last_polled, created, updated
|
64
|
+
device = Telemetry::Snmp::Data::Model::Device[params[:id]]
|
65
|
+
status 404 if device.nil?
|
66
|
+
{ error: true, message: "#{params[:id]} not found" } if device.nil?
|
67
|
+
|
68
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
69
|
+
updates = {}
|
70
|
+
fields = %i[hostname ip_address active port snmp_version device_cred_id frequency environment
|
71
|
+
datacenter zone]
|
72
|
+
fields.each { |field| updates[field] = body[field] if body.key? field }
|
73
|
+
|
74
|
+
if updates.empty?
|
75
|
+
status 400
|
76
|
+
return { error: true, message: 'no valid fields to update' }
|
77
|
+
end
|
78
|
+
|
79
|
+
updates[:updated] = Sequel::CURRENT_TIMESTAMP
|
80
|
+
device.update(**updates)
|
81
|
+
{ error: false, updated_fields: updates.keys, id: params[:id] }
|
82
|
+
end
|
83
|
+
|
84
|
+
delete '/:id' do
|
85
|
+
device = Telemetry::Snmp::Data::Model::Device[params[:id]]
|
86
|
+
status 404 if device.nil?
|
87
|
+
{ error: true, message: "#{params[:id]} not found" } if device.nil?
|
88
|
+
|
89
|
+
{ error: !device.delete, id: params[:id] }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'sinatra/extension'
|
2
|
+
|
3
|
+
module Telemetry
|
4
|
+
module Snmp
|
5
|
+
module Controller
|
6
|
+
module OIDGroups
|
7
|
+
extend Sinatra::Extension
|
8
|
+
|
9
|
+
get '' do
|
10
|
+
groups = {}
|
11
|
+
Telemetry::Snmp::Data::Model::OIDGroup.all.each do |group|
|
12
|
+
groups[group.values[:id]] = group.values
|
13
|
+
end
|
14
|
+
|
15
|
+
groups
|
16
|
+
end
|
17
|
+
|
18
|
+
get '/:id' do
|
19
|
+
group = Telemetry::Snmp::Data::Model::OIDGroup[params[:id]]
|
20
|
+
status 404 if group.nil?
|
21
|
+
{ error: true, message: "#{params[:id]} not found" } if group.nil?
|
22
|
+
|
23
|
+
group.values
|
24
|
+
end
|
25
|
+
|
26
|
+
post '' do
|
27
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
28
|
+
if body[:name].nil?
|
29
|
+
status 400
|
30
|
+
{ error: true, message: 'name cannot be null for new record' }
|
31
|
+
end
|
32
|
+
|
33
|
+
{
|
34
|
+
id: Telemetry::Snmp::Data::Model.OIDGroup.insert(
|
35
|
+
name: body[:name],
|
36
|
+
active: body[:active] || 1,
|
37
|
+
created: Sequel::CURRENT_TIMESTAMP
|
38
|
+
),
|
39
|
+
name: body[:name]
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
put '/:id' do
|
44
|
+
group = Telemetry::Snmp::Data::Model::OIDGroup[params[:id]]
|
45
|
+
status 404 if group.nil?
|
46
|
+
{ error: true, message: "#{params[:id]} not found" } if group.nil?
|
47
|
+
|
48
|
+
status 405
|
49
|
+
{ error: true, message: 'puts not supported', id: params[:id] }
|
50
|
+
end
|
51
|
+
|
52
|
+
patch '/:id' do
|
53
|
+
group = Telemetry::Snmp::Data::Model::OIDGroup[params[:id]]
|
54
|
+
status 404 if group.nil?
|
55
|
+
{ error: true, message: "#{params[:id]} not found" } if group.nil?
|
56
|
+
|
57
|
+
status 405
|
58
|
+
{ error: true, message: 'patch not supported', id: params[:id] }
|
59
|
+
end
|
60
|
+
|
61
|
+
delete '/:id' do
|
62
|
+
group = Telemetry::Snmp::Data::Model::OIDGroup[params[:id]]
|
63
|
+
status 404 if group.nil?
|
64
|
+
{ error: true, message: "#{params[:id]} not found" } if group.nil?
|
65
|
+
|
66
|
+
{ success: !group.delete, id: params[:id] }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'sinatra/extension'
|
2
|
+
|
3
|
+
module Telemetry
|
4
|
+
module Snmp
|
5
|
+
module Controller
|
6
|
+
module OIDs
|
7
|
+
extend Sinatra::Extension
|
8
|
+
|
9
|
+
get '' do
|
10
|
+
oids = {}
|
11
|
+
|
12
|
+
Telemetry::Snmp::Data::MOdel::OID.all.each do |oid|
|
13
|
+
oids[oid.values[:id]] = oid.values
|
14
|
+
end
|
15
|
+
|
16
|
+
oids
|
17
|
+
end
|
18
|
+
|
19
|
+
get '/:id' do
|
20
|
+
oid = Telemetry::Snmp::Data::Model::OID[params[:id]]
|
21
|
+
status 404 if oid.nil?
|
22
|
+
return { error: true, message: "#{params[:id]} not found" } if oid.nil?
|
23
|
+
|
24
|
+
oid.values
|
25
|
+
end
|
26
|
+
|
27
|
+
post '' do
|
28
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
29
|
+
status 400 if body[:oid].nil?
|
30
|
+
{ error: true, message: 'oid is a required field' } if body[:oid].nil?
|
31
|
+
|
32
|
+
insert = {
|
33
|
+
oid: body[:oid],
|
34
|
+
name: body[:name],
|
35
|
+
description: body[:description],
|
36
|
+
created: Sequel::CURRENT_TIMESTAMP
|
37
|
+
}
|
38
|
+
|
39
|
+
{ id: Telemetry::Snmp::Data::Model::OID.insert(**insert), oid: body[:oid] }
|
40
|
+
end
|
41
|
+
|
42
|
+
put '/:id' do
|
43
|
+
oid = Telemetry::Snmp::Data::Model::OID[params[:id]]
|
44
|
+
status 404 if oid.nil?
|
45
|
+
return { error: true, message: "#{params[:id]} not found" } if oid.nil?
|
46
|
+
|
47
|
+
status 405
|
48
|
+
{ error: true, message: 'puts not supported', id: params[:id] }
|
49
|
+
end
|
50
|
+
|
51
|
+
patch '/:id' do
|
52
|
+
oid = Telemetry::Snmp::Data::Model::OID[params[:id]]
|
53
|
+
status 404 if oid.nil?
|
54
|
+
return { error: true, message: "#{params[:id]} not found" } if oid.nil?
|
55
|
+
|
56
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
57
|
+
updates = {}
|
58
|
+
fields = %i[oid name description]
|
59
|
+
fields.each { |field| updates[field] = body[field] if body.key? field }
|
60
|
+
if updates.empty?
|
61
|
+
status 400
|
62
|
+
return { error: true, message: 'no valid fields to update' }
|
63
|
+
end
|
64
|
+
|
65
|
+
updates[:updated] = Sequel::CURRENT_TIMESTAMP
|
66
|
+
oid.update(**updates)
|
67
|
+
{ error: false, updated_fields: updates.keys, id: params[:id] }
|
68
|
+
end
|
69
|
+
|
70
|
+
delete '/:id' do
|
71
|
+
oid = Telemetry::Snmp::Data::Model::OID[params[:id]]
|
72
|
+
status 404 if oid.nil?
|
73
|
+
return { error: true, message: "#{params[:id]} not found" } if oid.nil?
|
74
|
+
|
75
|
+
{ error: !oid.delete, id: params[:id] }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'sinatra/extension'
|
2
|
+
|
3
|
+
module Telemetry
|
4
|
+
module Snmp
|
5
|
+
module Controller
|
6
|
+
module Users
|
7
|
+
extend Sinatra::Extension
|
8
|
+
get '' do
|
9
|
+
users = {}
|
10
|
+
Telemetry::Snmp::Data::Model::User.all.each do |user|
|
11
|
+
users[user.values[:id]] = user.values
|
12
|
+
end
|
13
|
+
|
14
|
+
users
|
15
|
+
end
|
16
|
+
|
17
|
+
get '/:id' do
|
18
|
+
user = Telemetry::Snmp::Data::Model::User[params[:id]]
|
19
|
+
status 404 if user.nil?
|
20
|
+
return { error: true, message: "#{params[:id]} not found" } if user.nil?
|
21
|
+
|
22
|
+
user.values
|
23
|
+
end
|
24
|
+
|
25
|
+
post '' do
|
26
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
27
|
+
insert = {
|
28
|
+
username: body[:username],
|
29
|
+
email: body[:email],
|
30
|
+
active: body[:active] || 1,
|
31
|
+
admin: body[:admin] || 0,
|
32
|
+
created: Sequel::CURRENT_TIMESTAMP
|
33
|
+
}
|
34
|
+
|
35
|
+
unless insert.values.include? nil
|
36
|
+
status 400
|
37
|
+
{ error: true, message: 'missing required fields' }
|
38
|
+
end
|
39
|
+
|
40
|
+
{ id: Telemetry::Snmp::Data::Model::User.insert(**insert), username: body[:username] }
|
41
|
+
end
|
42
|
+
|
43
|
+
put '/:id' do
|
44
|
+
user = Telemetry::Snmp::Data::Model::User[params[:id]]
|
45
|
+
status 404 if user.nil?
|
46
|
+
return { error: true, message: "#{params[:id]} not found" } if user.nil?
|
47
|
+
|
48
|
+
status 405
|
49
|
+
{ error: true, message: 'puts not supported', id: params[:id] }
|
50
|
+
end
|
51
|
+
|
52
|
+
patch '/:id' do
|
53
|
+
user = Telemetry::Snmp::Data::Model::User[params[:id]]
|
54
|
+
status 404 if user.nil?
|
55
|
+
return { error: true, message: "#{params[:id]} not found" } if user.nil?
|
56
|
+
|
57
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
58
|
+
updates = {}
|
59
|
+
fields = %i[username email active admin]
|
60
|
+
fields.each { |field| updates[field] = body[field] if body.key? field }
|
61
|
+
if updates.empty?
|
62
|
+
status 400
|
63
|
+
return { error: true, message: 'no valid fields to update' }
|
64
|
+
end
|
65
|
+
|
66
|
+
updates[:updated] = Sequel::CURRENT_TIMESTAMP
|
67
|
+
user.update(**updates)
|
68
|
+
{ error: false, updated_fields: updates.keys, id: params[:id] }
|
69
|
+
end
|
70
|
+
|
71
|
+
delete '/:id' do
|
72
|
+
user = Telemetry::Snmp::Data::Model::User[params[:id]]
|
73
|
+
status 404 if user.nil?
|
74
|
+
return { error: true, message: "#{params[:id]} not found" } if user.nil?
|
75
|
+
|
76
|
+
{ error: !user.delete, id: params[:id] }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'sinatra/extension'
|
2
|
+
require 'oj'
|
3
|
+
require 'multi_json'
|
4
|
+
|
5
|
+
module Telemetry
|
6
|
+
module Snmp
|
7
|
+
module Controller
|
8
|
+
module Walks
|
9
|
+
extend Sinatra::Extension
|
10
|
+
# id, oid_index, oid_walk, active, measurement_name, created, updated
|
11
|
+
|
12
|
+
get '' do
|
13
|
+
results = {}
|
14
|
+
Telemetry::Snmp::Data::Model::OIDWalks.all.each do |walk|
|
15
|
+
results[walk.values[:id]] = walk.values
|
16
|
+
end
|
17
|
+
|
18
|
+
results
|
19
|
+
end
|
20
|
+
|
21
|
+
get '/:id' do
|
22
|
+
result = Telemetry::Snmp::Data::Model::OIDWalks[params[:id]]
|
23
|
+
return {} if result.nil?
|
24
|
+
|
25
|
+
result.values
|
26
|
+
end
|
27
|
+
|
28
|
+
post '' do
|
29
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
30
|
+
insert = {
|
31
|
+
oid_index: body[:oid_index],
|
32
|
+
oid_walk: body[:oid_walk],
|
33
|
+
active: body[:active] || 1,
|
34
|
+
measurement_name: body[:measurement_name] || 'snmp',
|
35
|
+
created: Sequel::CURRENT_TIMESTAMP
|
36
|
+
}
|
37
|
+
|
38
|
+
if insert[:oid_index].nil? || insert[:oid_walk].nil?
|
39
|
+
status 400
|
40
|
+
{ error: true, missing_oid_index: insert[:oid_index].nil?, missing_oid_walk: insert[:oid_walk].nil? }
|
41
|
+
end
|
42
|
+
|
43
|
+
{ id: Telemetry::Snmp::Data::Model::OIDWalks.insert(**insert), error: false }
|
44
|
+
end
|
45
|
+
|
46
|
+
patch '/:id' do
|
47
|
+
result = Telemetry::Snmp::Data::Model::OIDWalks[params[:id]]
|
48
|
+
if result.nil?
|
49
|
+
status 404
|
50
|
+
return { error: true, message: "#{param[:id]} not found" }
|
51
|
+
end
|
52
|
+
|
53
|
+
update = {}
|
54
|
+
fields = %i[oid_index oid_walk active measurement_name]
|
55
|
+
body = MultiJson.load(request.body.read, symbolize_keys: true)
|
56
|
+
fields.each do |field|
|
57
|
+
next unless body.key? field
|
58
|
+
|
59
|
+
update[field] = body[field]
|
60
|
+
end
|
61
|
+
|
62
|
+
if update.empty?
|
63
|
+
status 400
|
64
|
+
return { error: true, message: 'no valid fields to update' }
|
65
|
+
end
|
66
|
+
|
67
|
+
update[:updated] = Sequel::CURRENT_TIMESTAMP
|
68
|
+
result.update(**update)
|
69
|
+
{ error: false, updated_field: update, id: params[:id] }
|
70
|
+
end
|
71
|
+
|
72
|
+
put '/:id' do
|
73
|
+
status 405
|
74
|
+
{ error: true, message: 'puts not supported', id: params[:id] }
|
75
|
+
end
|
76
|
+
|
77
|
+
delete '/:id' do
|
78
|
+
result = Telemetry::Snmp::Data::Model::OIDWalks[params[:id]]
|
79
|
+
if result.nil?
|
80
|
+
status 404
|
81
|
+
return { error: true, message: "#{param[:id]} not found" }
|
82
|
+
end
|
83
|
+
|
84
|
+
{ error: result.delete, id: params[:id] }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
require 'sequel/extensions/migration'
|
3
|
+
require 'sequel/plugins/serialization'
|
4
|
+
|
5
|
+
require 'telemetry/snmp/data/default_opts'
|
6
|
+
require 'oj'
|
7
|
+
|
8
|
+
module Telemetry
|
9
|
+
module Snmp
|
10
|
+
module Data
|
11
|
+
extend Telemetry::Snmp::Data::DefaultOpts
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def migration_path
|
15
|
+
"#{__dir__}/data/migrations"
|
16
|
+
end
|
17
|
+
|
18
|
+
def migration
|
19
|
+
@migration_version = Sequel::Migrator.run(connection, migration_path, use_transactions: true)
|
20
|
+
end
|
21
|
+
|
22
|
+
def migration_version
|
23
|
+
@migration_version || migration
|
24
|
+
end
|
25
|
+
|
26
|
+
def migrations_up_to_date?
|
27
|
+
Sequel::Migrator.check_current(connection, migration_path)
|
28
|
+
true
|
29
|
+
rescue Sequel::Migrator::NotCurrentError
|
30
|
+
false
|
31
|
+
end
|
32
|
+
|
33
|
+
def load_models(*models_array)
|
34
|
+
models_array = models if models_array.empty?
|
35
|
+
models_array.each do |model|
|
36
|
+
require "telemetry/snmp/data/models/#{model}.rb"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def models
|
41
|
+
%w[user device_cred device oid oid_group oid_oid_groups oid_walk user_audit_log]
|
42
|
+
end
|
43
|
+
|
44
|
+
def connection(**opts)
|
45
|
+
@connection ||= Sequel.connect(**opts.merge(default_credentials))
|
46
|
+
end
|
47
|
+
|
48
|
+
def connected?
|
49
|
+
connection.test_connection
|
50
|
+
end
|
51
|
+
|
52
|
+
def setup_oj_serializer
|
53
|
+
Sequel::Plugins::Serialization.register_format(:oj_json,
|
54
|
+
->(value) { Oj.dump(value) },
|
55
|
+
->(value) { Oj.load(value.nil? ? 'null' : value) })
|
56
|
+
end
|
57
|
+
|
58
|
+
def start!
|
59
|
+
raise 'failed to start db connection' unless connected?
|
60
|
+
|
61
|
+
migration
|
62
|
+
setup_oj_serializer
|
63
|
+
|
64
|
+
load_models
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|