telemetry-snmp 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/rspec.yml +44 -0
  3. data/.github/workflows/rubocop.yml +28 -0
  4. data/.github/workflows/sourcehawk-scan.yml +20 -0
  5. data/.gitignore +14 -0
  6. data/.rspec +4 -0
  7. data/.rubocop.yml +26 -0
  8. data/CHANGELOG.md +4 -0
  9. data/CODE_OF_CONDUCT.md +75 -0
  10. data/CONTRIBUTING.md +54 -0
  11. data/Gemfile +10 -0
  12. data/INDIVIDUAL_CONTRIBUTOR_LICENSE.md +30 -0
  13. data/LICENSE +201 -0
  14. data/NOTICE.txt +9 -0
  15. data/README.md +54 -0
  16. data/attribution.txt +1 -0
  17. data/config.ru +15 -0
  18. data/exe/snmp_collector +55 -0
  19. data/lib/telemetry/snmp.rb +23 -0
  20. data/lib/telemetry/snmp/api.rb +55 -0
  21. data/lib/telemetry/snmp/auth.rb +54 -0
  22. data/lib/telemetry/snmp/auth/defaults.rb +41 -0
  23. data/lib/telemetry/snmp/client.rb +104 -0
  24. data/lib/telemetry/snmp/controllers/device_creds.rb +105 -0
  25. data/lib/telemetry/snmp/controllers/devices.rb +94 -0
  26. data/lib/telemetry/snmp/controllers/oid_groups.rb +71 -0
  27. data/lib/telemetry/snmp/controllers/oids.rb +80 -0
  28. data/lib/telemetry/snmp/controllers/users.rb +81 -0
  29. data/lib/telemetry/snmp/controllers/walks.rb +89 -0
  30. data/lib/telemetry/snmp/data.rb +69 -0
  31. data/lib/telemetry/snmp/data/default_opts.rb +73 -0
  32. data/lib/telemetry/snmp/data/migrations/001_device_creds.rb +19 -0
  33. data/lib/telemetry/snmp/data/migrations/002_create_devices_table.rb +31 -0
  34. data/lib/telemetry/snmp/data/migrations/003_create_oids_tables.rb +16 -0
  35. data/lib/telemetry/snmp/data/migrations/004_create_oid_groups.rb +15 -0
  36. data/lib/telemetry/snmp/data/migrations/005_create_oids_oid_groups.rb +17 -0
  37. data/lib/telemetry/snmp/data/migrations/006_device_to_oid_group.rb +15 -0
  38. data/lib/telemetry/snmp/data/migrations/007_create_users.rb +20 -0
  39. data/lib/telemetry/snmp/data/migrations/008_create_walks_table.rb +14 -0
  40. data/lib/telemetry/snmp/data/migrations/009_create_tag_name_column.rb +7 -0
  41. data/lib/telemetry/snmp/data/migrations/010_create_user_audit_table.rb +18 -0
  42. data/lib/telemetry/snmp/data/models/device.rb +11 -0
  43. data/lib/telemetry/snmp/data/models/device_cred.rb +11 -0
  44. data/lib/telemetry/snmp/data/models/oid.rb +10 -0
  45. data/lib/telemetry/snmp/data/models/oid_group.rb +10 -0
  46. data/lib/telemetry/snmp/data/models/oid_oid_groups.rb +10 -0
  47. data/lib/telemetry/snmp/data/models/oid_walk.rb +10 -0
  48. data/lib/telemetry/snmp/data/models/user.rb +10 -0
  49. data/lib/telemetry/snmp/data/models/user_audit_log.rb +19 -0
  50. data/lib/telemetry/snmp/mibs/AGENTX-MIB.txt +527 -0
  51. data/lib/telemetry/snmp/mibs/AIRPORT-BASESTATION-3-MIB.txt +461 -0
  52. data/lib/telemetry/snmp/mibs/BRIDGE-MIB.txt +1472 -0
  53. data/lib/telemetry/snmp/mibs/DISMAN-EVENT-MIB.txt +1882 -0
  54. data/lib/telemetry/snmp/mibs/DISMAN-SCHEDULE-MIB.txt +699 -0
  55. data/lib/telemetry/snmp/mibs/DISMAN-SCRIPT-MIB.txt +1764 -0
  56. data/lib/telemetry/snmp/mibs/EtherLike-MIB.txt +1862 -0
  57. data/lib/telemetry/snmp/mibs/HCNUM-TC.txt +118 -0
  58. data/lib/telemetry/snmp/mibs/HOST-RESOURCES-MIB.txt +1540 -0
  59. data/lib/telemetry/snmp/mibs/HOST-RESOURCES-TYPES.txt +389 -0
  60. data/lib/telemetry/snmp/mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB.txt +123 -0
  61. data/lib/telemetry/snmp/mibs/IANA-LANGUAGE-MIB.txt +123 -0
  62. data/lib/telemetry/snmp/mibs/IANA-RTPROTO-MIB.txt +91 -0
  63. data/lib/telemetry/snmp/mibs/IANAifType-MIB.txt +619 -0
  64. data/lib/telemetry/snmp/mibs/IF-INVERTED-STACK-MIB.txt +149 -0
  65. data/lib/telemetry/snmp/mibs/IF-MIB.txt +1814 -0
  66. data/lib/telemetry/snmp/mibs/INET-ADDRESS-MIB.txt +402 -0
  67. data/lib/telemetry/snmp/mibs/IP-FORWARD-MIB.txt +1277 -0
  68. data/lib/telemetry/snmp/mibs/IP-MIB.txt +4993 -0
  69. data/lib/telemetry/snmp/mibs/IPV6-FLOW-LABEL-MIB.txt +58 -0
  70. data/lib/telemetry/snmp/mibs/IPV6-ICMP-MIB.txt +529 -0
  71. data/lib/telemetry/snmp/mibs/IPV6-MIB.txt +1443 -0
  72. data/lib/telemetry/snmp/mibs/IPV6-TC.txt +67 -0
  73. data/lib/telemetry/snmp/mibs/IPV6-TCP-MIB.txt +211 -0
  74. data/lib/telemetry/snmp/mibs/IPV6-UDP-MIB.txt +141 -0
  75. data/lib/telemetry/snmp/mibs/NET-SNMP-AGENT-MIB.txt +554 -0
  76. data/lib/telemetry/snmp/mibs/NET-SNMP-EXAMPLES-MIB.txt +285 -0
  77. data/lib/telemetry/snmp/mibs/NET-SNMP-EXTEND-MIB.txt +325 -0
  78. data/lib/telemetry/snmp/mibs/NET-SNMP-MIB.txt +67 -0
  79. data/lib/telemetry/snmp/mibs/NET-SNMP-PASS-MIB.txt +124 -0
  80. data/lib/telemetry/snmp/mibs/NET-SNMP-TC.txt +128 -0
  81. data/lib/telemetry/snmp/mibs/NET-SNMP-VACM-MIB.txt +154 -0
  82. data/lib/telemetry/snmp/mibs/NOTIFICATION-LOG-MIB.txt +753 -0
  83. data/lib/telemetry/snmp/mibs/PAN-COMMON-MIB.md5 +1 -0
  84. data/lib/telemetry/snmp/mibs/PAN-COMMON-MIB.my +2293 -0
  85. data/lib/telemetry/snmp/mibs/PAN-ENTITY-EXT-MIB.md5 +1 -0
  86. data/lib/telemetry/snmp/mibs/PAN-ENTITY-EXT-MIB.my +293 -0
  87. data/lib/telemetry/snmp/mibs/PAN-GLOBAL-REG-MIB.md5 +1 -0
  88. data/lib/telemetry/snmp/mibs/PAN-GLOBAL-REG-MIB.my +84 -0
  89. data/lib/telemetry/snmp/mibs/PAN-GLOBAL-TC-MIB.md5 +1 -0
  90. data/lib/telemetry/snmp/mibs/PAN-GLOBAL-TC-MIB.my +68 -0
  91. data/lib/telemetry/snmp/mibs/PAN-LC-MIB.md5 +1 -0
  92. data/lib/telemetry/snmp/mibs/PAN-LC-MIB.my +204 -0
  93. data/lib/telemetry/snmp/mibs/PAN-PRODUCT-MIB.md5 +1 -0
  94. data/lib/telemetry/snmp/mibs/PAN-PRODUCT-MIB.my +305 -0
  95. data/lib/telemetry/snmp/mibs/PAN-TRAPS.md5 +1 -0
  96. data/lib/telemetry/snmp/mibs/PAN-TRAPS.my +7809 -0
  97. data/lib/telemetry/snmp/mibs/RFC-1215.txt +38 -0
  98. data/lib/telemetry/snmp/mibs/RFC1155-SMI.txt +119 -0
  99. data/lib/telemetry/snmp/mibs/RFC1213-MIB.txt +2613 -0
  100. data/lib/telemetry/snmp/mibs/RMON-MIB.txt +3980 -0
  101. data/lib/telemetry/snmp/mibs/SCTP-MIB.txt +1342 -0
  102. data/lib/telemetry/snmp/mibs/SMUX-MIB.txt +160 -0
  103. data/lib/telemetry/snmp/mibs/SNMP-COMMUNITY-MIB.txt +429 -0
  104. data/lib/telemetry/snmp/mibs/SNMP-FRAMEWORK-MIB.txt +526 -0
  105. data/lib/telemetry/snmp/mibs/SNMP-MPD-MIB.txt +145 -0
  106. data/lib/telemetry/snmp/mibs/SNMP-NOTIFICATION-MIB.txt +589 -0
  107. data/lib/telemetry/snmp/mibs/SNMP-PROXY-MIB.txt +294 -0
  108. data/lib/telemetry/snmp/mibs/SNMP-TARGET-MIB.txt +660 -0
  109. data/lib/telemetry/snmp/mibs/SNMP-USER-BASED-SM-MIB.txt +912 -0
  110. data/lib/telemetry/snmp/mibs/SNMP-USM-AES-MIB.txt +62 -0
  111. data/lib/telemetry/snmp/mibs/SNMP-USM-DH-OBJECTS-MIB.txt +532 -0
  112. data/lib/telemetry/snmp/mibs/SNMP-VIEW-BASED-ACM-MIB.txt +830 -0
  113. data/lib/telemetry/snmp/mibs/SNMPv2-CONF.txt +322 -0
  114. data/lib/telemetry/snmp/mibs/SNMPv2-MIB.txt +854 -0
  115. data/lib/telemetry/snmp/mibs/SNMPv2-SMI.txt +344 -0
  116. data/lib/telemetry/snmp/mibs/SNMPv2-TC.txt +772 -0
  117. data/lib/telemetry/snmp/mibs/SNMPv2-TM.txt +176 -0
  118. data/lib/telemetry/snmp/mibs/TCP-MIB.txt +785 -0
  119. data/lib/telemetry/snmp/mibs/TRANSPORT-ADDRESS-MIB.txt +421 -0
  120. data/lib/telemetry/snmp/mibs/TUNNEL-MIB.txt +738 -0
  121. data/lib/telemetry/snmp/mibs/UCD-DEMO-MIB.txt +74 -0
  122. data/lib/telemetry/snmp/mibs/UCD-DISKIO-MIB.txt +171 -0
  123. data/lib/telemetry/snmp/mibs/UCD-DLMOD-MIB.txt +124 -0
  124. data/lib/telemetry/snmp/mibs/UCD-IPFWACC-MIB.txt +327 -0
  125. data/lib/telemetry/snmp/mibs/UCD-SNMP-MIB.txt +1712 -0
  126. data/lib/telemetry/snmp/mibs/UDP-MIB.txt +549 -0
  127. data/lib/telemetry/snmp/publisher.rb +130 -0
  128. data/lib/telemetry/snmp/version.rb +7 -0
  129. data/sourcehawk.yml +4 -0
  130. data/telemetry-snmp.gemspec +48 -0
  131. 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