telemetry-snmp 0.1.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.
- 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
|