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.
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