oxidized 0.29.1 → 0.37.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 (236) hide show
  1. checksums.yaml +4 -4
  2. data/.coderabbit.yaml +21 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +45 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  5. data/.github/ISSUE_TEMPLATE/support-request.md +39 -0
  6. data/.github/workflows/codeql.yml +4 -4
  7. data/.github/workflows/publishdocker.yml +108 -13
  8. data/.github/workflows/ruby.yml +3 -12
  9. data/.github/workflows/stale.yml +6 -1
  10. data/.gitignore +2 -0
  11. data/.rubocop.yml +69 -13
  12. data/.rubocop_todo.yml +13 -143
  13. data/CHANGELOG.md +431 -4
  14. data/CONTRIBUTING.md +189 -0
  15. data/Dockerfile +89 -34
  16. data/README.md +59 -188
  17. data/Rakefile +58 -12
  18. data/bin/oxidized +2 -5
  19. data/docs/Configuration.md +382 -149
  20. data/docs/Creating-Models.md +262 -10
  21. data/docs/DeviceSimulation.md +196 -0
  22. data/docs/Docker.md +246 -0
  23. data/docs/Hooks.md +146 -51
  24. data/docs/Inputs.md +237 -0
  25. data/docs/Issues.md +123 -0
  26. data/docs/Model-Notes/APC.md +72 -0
  27. data/docs/Model-Notes/Cumulus.md +5 -0
  28. data/docs/Model-Notes/EatonNetwork.md +18 -0
  29. data/docs/Model-Notes/ExaLink.md +43 -0
  30. data/docs/Model-Notes/FSOS.md +17 -0
  31. data/docs/Model-Notes/Fortinet.md +75 -0
  32. data/docs/Model-Notes/GrandstreamHT8xx.md +8 -0
  33. data/docs/Model-Notes/HPEAruba.md +32 -0
  34. data/docs/Model-Notes/IvantiConnectSecure.md +59 -0
  35. data/docs/Model-Notes/OS6.md +10 -0
  36. data/docs/Model-Notes/README.md +1 -20
  37. data/docs/Model-Notes/RouterOS.md +28 -0
  38. data/docs/Model-Notes/SikluMHTG.md +7 -0
  39. data/docs/Model-Notes/TrueNAS.md +23 -0
  40. data/docs/Model-Notes/XGS4600-Zyxel.md +5 -0
  41. data/docs/ModelUnitTests.md +219 -0
  42. data/docs/Outputs.md +102 -5
  43. data/docs/Release.md +102 -0
  44. data/docs/Ruby-API.md +135 -2
  45. data/docs/Sources.md +34 -0
  46. data/docs/Supported-OS-Types.md +207 -270
  47. data/docs/Troubleshooting.md +43 -1
  48. data/extra/device2yaml.rb +259 -0
  49. data/extra/gitdiff-msteams.sh +32 -5
  50. data/extra/hooks/modelrules.rb +55 -0
  51. data/extra/hooks/modelrulesadvanced.rb +167 -0
  52. data/extra/hooks/srcipmap.rb +54 -0
  53. data/extra/nagios_check_failing_nodes.rb +1 -1
  54. data/extra/oxidized.runit +1 -1
  55. data/extra/rest_client.rb +5 -4
  56. data/extra/syslog.rb +11 -6
  57. data/lib/oxidized/cli/support.rb +152 -0
  58. data/lib/oxidized/cli.rb +21 -6
  59. data/lib/oxidized/config/vars.rb +33 -14
  60. data/lib/oxidized/config.rb +28 -17
  61. data/lib/oxidized/core.rb +50 -8
  62. data/lib/oxidized/hook/ciscosparkdiff.rb +11 -9
  63. data/lib/oxidized/hook/exec.rb +5 -4
  64. data/lib/oxidized/hook/githubrepo.rb +55 -18
  65. data/lib/oxidized/hook/noophook.rb +2 -2
  66. data/lib/oxidized/hook/slackdiff.rb +50 -14
  67. data/lib/oxidized/hook/xmppdiff.rb +9 -9
  68. data/lib/oxidized/hook.rb +68 -16
  69. data/lib/oxidized/input/cli.rb +8 -3
  70. data/lib/oxidized/input/debugtext.rb +40 -0
  71. data/lib/oxidized/input/debugyaml.rb +82 -0
  72. data/lib/oxidized/input/exec.rb +2 -11
  73. data/lib/oxidized/input/ftp.rb +2 -19
  74. data/lib/oxidized/input/http.rb +67 -17
  75. data/lib/oxidized/input/input.rb +35 -14
  76. data/lib/oxidized/input/scp.rb +27 -0
  77. data/lib/oxidized/input/ssh.rb +59 -83
  78. data/lib/oxidized/input/sshbase.rb +102 -0
  79. data/lib/oxidized/input/telnet.rb +20 -19
  80. data/lib/oxidized/input/tftp.rb +8 -8
  81. data/lib/oxidized/job.rb +18 -7
  82. data/lib/oxidized/jobs.rb +11 -1
  83. data/lib/oxidized/logger.rb +51 -0
  84. data/lib/oxidized/manager.rb +18 -17
  85. data/lib/oxidized/model/acos.rb +2 -1
  86. data/lib/oxidized/model/addpack.rb +26 -0
  87. data/lib/oxidized/model/adtran.rb +5 -1
  88. data/lib/oxidized/model/adva.rb +3 -3
  89. data/lib/oxidized/model/airfiber.rb +1 -1
  90. data/lib/oxidized/model/aos7.rb +11 -0
  91. data/lib/oxidized/model/aoscx.rb +37 -29
  92. data/lib/oxidized/model/aosw.rb +39 -29
  93. data/lib/oxidized/model/apc_aos.rb +7 -2
  94. data/lib/oxidized/model/apcaos.rb +39 -0
  95. data/lib/oxidized/model/aricentiss.rb +9 -2
  96. data/lib/oxidized/model/arubainstant.rb +93 -0
  97. data/lib/oxidized/model/asa.rb +11 -10
  98. data/lib/oxidized/model/asternos.rb +22 -0
  99. data/lib/oxidized/model/asyncos.rb +3 -3
  100. data/lib/oxidized/model/audiocodes.rb +2 -2
  101. data/lib/oxidized/model/awplus.rb +15 -12
  102. data/lib/oxidized/model/axos.rb +1 -1
  103. data/lib/oxidized/model/bdcom.rb +1 -0
  104. data/lib/oxidized/model/c4cmts.rb +1 -2
  105. data/lib/oxidized/model/ciscosma.rb +1 -1
  106. data/lib/oxidized/model/ciscosmb.rb +6 -1
  107. data/lib/oxidized/model/cnos.rb +13 -10
  108. data/lib/oxidized/model/comtrol.rb +1 -1
  109. data/lib/oxidized/model/comware.rb +5 -3
  110. data/lib/oxidized/model/cumulus.rb +14 -2
  111. data/lib/oxidized/model/defacto.rb +26 -0
  112. data/lib/oxidized/model/dellx.rb +1 -1
  113. data/lib/oxidized/model/dlink.rb +5 -2
  114. data/lib/oxidized/model/dlinknextgen.rb +55 -0
  115. data/lib/oxidized/model/dnos.rb +3 -0
  116. data/lib/oxidized/model/dslcommands.rb +93 -0
  117. data/lib/oxidized/model/dslsetup.rb +102 -0
  118. data/lib/oxidized/model/eatonnetwork.rb +70 -0
  119. data/lib/oxidized/model/edgecos.rb +3 -1
  120. data/lib/oxidized/model/edgeos.rb +7 -6
  121. data/lib/oxidized/model/edgeswitch.rb +3 -1
  122. data/lib/oxidized/model/efos.rb +41 -0
  123. data/lib/oxidized/model/eltex.rb +4 -2
  124. data/lib/oxidized/model/enterasys800.rb +2 -2
  125. data/lib/oxidized/model/enterprise_sonic.rb +46 -0
  126. data/lib/oxidized/model/eos.rb +3 -1
  127. data/lib/oxidized/model/exalink.rb +36 -0
  128. data/lib/oxidized/model/f5os.rb +17 -0
  129. data/lib/oxidized/model/fabricos.rb +2 -2
  130. data/lib/oxidized/model/fastiron.rb +5 -3
  131. data/lib/oxidized/model/firebrick.rb +2 -2
  132. data/lib/oxidized/model/firelinuxos.rb +13 -6
  133. data/lib/oxidized/model/firewareos.rb +10 -1
  134. data/lib/oxidized/model/fortigate.rb +160 -0
  135. data/lib/oxidized/model/fortios.rb +38 -48
  136. data/lib/oxidized/model/fsos.rb +46 -0
  137. data/lib/oxidized/model/gaiaos.rb +4 -4
  138. data/lib/oxidized/model/garderos.rb +38 -0
  139. data/lib/oxidized/model/grandstreamht8xx.rb +19 -0
  140. data/lib/oxidized/model/h3c.rb +1 -1
  141. data/lib/oxidized/model/ibos.rb +1 -0
  142. data/lib/oxidized/model/ingate.rb +47 -0
  143. data/lib/oxidized/model/ios.rb +57 -30
  144. data/lib/oxidized/model/iosxr.rb +2 -2
  145. data/lib/oxidized/model/ironware.rb +7 -5
  146. data/lib/oxidized/model/ivanti.rb +54 -0
  147. data/lib/oxidized/model/junos.rb +12 -5
  148. data/lib/oxidized/model/kornfeldos.rb +33 -0
  149. data/lib/oxidized/model/lenovonos.rb +2 -0
  150. data/lib/oxidized/model/linksyssrw.rb +3 -3
  151. data/lib/oxidized/model/linuxgeneric.rb +4 -2
  152. data/lib/oxidized/model/macros.rb +60 -0
  153. data/lib/oxidized/model/mimosab11.rb +34 -0
  154. data/lib/oxidized/model/ml66.rb +33 -0
  155. data/lib/oxidized/model/mlnxos.rb +18 -14
  156. data/lib/oxidized/model/model.rb +98 -103
  157. data/lib/oxidized/model/mtrlrfs.rb +1 -0
  158. data/lib/oxidized/model/ndms.rb +6 -0
  159. data/lib/oxidized/model/netgear.rb +14 -3
  160. data/lib/oxidized/model/netonix.rb +1 -1
  161. data/lib/oxidized/model/netscaler.rb +1 -1
  162. data/lib/oxidized/model/nodegrid.rb +1 -1
  163. data/lib/oxidized/model/nsxdfw.rb +31 -0
  164. data/lib/oxidized/model/nsxfirewall.rb +2 -1
  165. data/lib/oxidized/model/nxos.rb +20 -15
  166. data/lib/oxidized/model/ocnos.rb +42 -0
  167. data/lib/oxidized/model/onefinity.rb +18 -0
  168. data/lib/oxidized/model/openbsd.rb +1 -1
  169. data/lib/oxidized/model/opengear.rb +36 -1
  170. data/lib/oxidized/model/openwrt.rb +6 -6
  171. data/lib/oxidized/model/opnsense.rb +9 -1
  172. data/lib/oxidized/model/os6.rb +48 -0
  173. data/lib/oxidized/model/outputs.rb +5 -0
  174. data/lib/oxidized/model/panos.rb +2 -0
  175. data/lib/oxidized/model/perle.rb +41 -0
  176. data/lib/oxidized/model/pfsense.rb +9 -0
  177. data/lib/oxidized/model/powerconnect.rb +32 -11
  178. data/lib/oxidized/model/procurve.rb +6 -2
  179. data/lib/oxidized/model/qtech.rb +3 -1
  180. data/lib/oxidized/model/quantaos.rb +8 -6
  181. data/lib/oxidized/model/rgos.rb +33 -0
  182. data/lib/oxidized/model/riverbed.rb +104 -0
  183. data/lib/oxidized/model/routeros.rb +18 -11
  184. data/lib/oxidized/model/saos.rb +18 -1
  185. data/lib/oxidized/model/saos10.rb +38 -0
  186. data/lib/oxidized/model/siklu.rb +1 -1
  187. data/lib/oxidized/model/siklumhtg.rb +22 -0
  188. data/lib/oxidized/model/sixwind.rb +28 -0
  189. data/lib/oxidized/model/slxos.rb +3 -3
  190. data/lib/oxidized/model/smartbyte.rb +48 -0
  191. data/lib/oxidized/model/sonicos.rb +27 -20
  192. data/lib/oxidized/model/speedtouch.rb +1 -1
  193. data/lib/oxidized/model/sros.rb +3 -3
  194. data/lib/oxidized/model/srosmd.rb +1 -1
  195. data/lib/oxidized/model/supermicro.rb +1 -1
  196. data/lib/oxidized/model/telco.rb +1 -1
  197. data/lib/oxidized/model/tmos.rb +1 -0
  198. data/lib/oxidized/model/tnsr.rb +57 -0
  199. data/lib/oxidized/model/tplink.rb +5 -5
  200. data/lib/oxidized/model/trango.rb +4 -2
  201. data/lib/oxidized/model/truenas.rb +64 -3
  202. data/lib/oxidized/model/ucs.rb +1 -1
  203. data/lib/oxidized/model/unifiap.rb +144 -0
  204. data/lib/oxidized/model/uplinkolt.rb +46 -0
  205. data/lib/oxidized/model/voltaire.rb +1 -1
  206. data/lib/oxidized/model/voss.rb +3 -0
  207. data/lib/oxidized/model/vrp.rb +5 -1
  208. data/lib/oxidized/model/vyatta.rb +9 -3
  209. data/lib/oxidized/model/vyos.rb +37 -0
  210. data/lib/oxidized/model/xos.rb +10 -1
  211. data/lib/oxidized/model/zhoneolt.rb +4 -2
  212. data/lib/oxidized/model/zynos.rb +67 -3
  213. data/lib/oxidized/model/zynosadsl.rb +14 -0
  214. data/lib/oxidized/model/zynoscli.rb +1 -1
  215. data/lib/oxidized/model/zynosgs.rb +2 -0
  216. data/lib/oxidized/model/zynosmgs.rb +32 -0
  217. data/lib/oxidized/node.rb +99 -64
  218. data/lib/oxidized/nodes.rb +40 -19
  219. data/lib/oxidized/output/file.rb +80 -43
  220. data/lib/oxidized/output/git.rb +295 -151
  221. data/lib/oxidized/output/gitcrypt.rb +193 -185
  222. data/lib/oxidized/output/http.rb +63 -51
  223. data/lib/oxidized/output/output.rb +20 -4
  224. data/lib/oxidized/signals.rb +44 -0
  225. data/lib/oxidized/source/csv.rb +49 -49
  226. data/lib/oxidized/source/http.rb +76 -63
  227. data/lib/oxidized/source/jsonfile.rb +68 -0
  228. data/lib/oxidized/source/source.rb +73 -18
  229. data/lib/oxidized/source/sql.rb +71 -59
  230. data/lib/oxidized/version.rb +6 -4
  231. data/lib/oxidized/worker.rb +57 -29
  232. data/lib/oxidized.rb +4 -24
  233. data/lib/refinements.rb +21 -1
  234. data/oxidized.gemspec +45 -21
  235. metadata +248 -41
  236. data/lib/oxidized/model/timos.rb +0 -10
@@ -2,6 +2,8 @@ module Oxidized
2
2
  require 'oxidized/job'
3
3
  require 'oxidized/jobs'
4
4
  class Worker
5
+ include SemanticLogger::Loggable
6
+
5
7
  def initialize(nodes)
6
8
  @jobs_done = 0
7
9
  @nodes = nodes
@@ -17,24 +19,28 @@ module Oxidized
17
19
  @jobs.work
18
20
 
19
21
  while @jobs.size < @jobs.want
20
- Oxidized.logger.debug "lib/oxidized/worker.rb: Jobs running: #{@jobs.size} of #{@jobs.want} - ended: #{@jobs_done} of #{@nodes.size}"
22
+ logger.debug "Jobs running: #{@jobs.size} of #{@jobs.want} - ended: " \
23
+ "#{@jobs_done} of #{@nodes.size}"
21
24
  # ask for next node in queue non destructive way
22
25
  nextnode = @nodes.first
23
- unless nextnode.last.nil?
24
- # Set unobtainable value for 'last' if interval checking is disabled
25
- last = Oxidized.config.interval.zero? ? Time.now.utc + 10 : nextnode.last.end
26
- break if last + Oxidized.config.interval > Time.now.utc
27
- end
26
+ break if Oxidized.config.interval.zero? && !nextnode.nexted?
27
+
28
+ nextnode.nexted = false
29
+ break if !nextnode.last.nil? && (nextnode.last.end + Oxidized.config.interval > Time.now.utc)
30
+
28
31
  # shift nodes and get the next node
29
32
  node = @nodes.get
30
33
  node.running? ? next : node.running = true
31
34
 
32
35
  @jobs.push Job.new node
33
- Oxidized.logger.debug "lib/oxidized/worker.rb: Added #{node.group}/#{node.name} to the job queue"
36
+ logger.debug "Added #{node.group}/#{node.name} to the job queue"
34
37
  end
35
38
 
36
- run_done_hook if cycle_finished?
37
- Oxidized.logger.debug("lib/oxidized/worker.rb: #{@jobs.size} jobs running in parallel") unless @jobs.empty?
39
+ if cycle_finished?
40
+ run_done_hook
41
+ exit 0 if Oxidized.config.run_once
42
+ end
43
+ logger.debug("#{@jobs.size} jobs running in parallel") unless @jobs.empty?
38
44
  end
39
45
 
40
46
  def process(job)
@@ -49,26 +55,52 @@ module Oxidized
49
55
  process_failure node, job
50
56
  end
51
57
  rescue NodeNotFound
52
- Oxidized.logger.warn "#{node.group}/#{node.name} not found, removed while collecting?"
58
+ logger.warn "#{node.group}/#{node.name} not found, removed while collecting?"
59
+ end
60
+
61
+ def reload
62
+ @nodes.load
53
63
  end
54
64
 
55
65
  private
56
66
 
67
+ def significant_changes?(job, output)
68
+ node = job.node
69
+ model = node.model
70
+ return true unless model.vars(:output_store_mode) == "on_significant"
71
+
72
+ unless output.respond_to?(:fetch)
73
+ logger.error("Detection of significant changes needs an output " \
74
+ "capable of fetching the last configuration")
75
+ return true
76
+ end
77
+
78
+ old = model.significant_changes output.fetch(node, node.group)
79
+ new = model.significant_changes job.config.to_cfg
80
+ if old == new
81
+ logger.debug "No significant change on node #{node.name}"
82
+ false
83
+ else
84
+ true
85
+ end
86
+ end
87
+
57
88
  def process_success(node, job)
58
89
  @jobs_done += 1 # needed for :nodes_done hook
59
- Oxidized.hooks.handle :node_success, node: node,
60
- job: job
90
+ Oxidized.hooks.node_success(node: node, job: job)
61
91
  msg = "update #{node.group}/#{node.name}"
62
92
  msg += " from #{node.from}" if node.from
63
93
  msg += " with message '#{node.msg}'" if node.msg
64
94
  output = node.output.new
65
- if output.store node.name, job.config,
66
- msg: msg, email: node.email, user: node.user, group: node.group
95
+
96
+ significant_changes = significant_changes?(job, output)
97
+ if output.store(node.name, job.config,
98
+ msg: msg, email: node.email, user: node.user,
99
+ group: node.group,
100
+ significant_changes: significant_changes)
67
101
  node.modified
68
- Oxidized.logger.info "Configuration updated for #{node.group}/#{node.name}"
69
- Oxidized.hooks.handle :post_store, node: node,
70
- job: job,
71
- commitref: output.commitref
102
+ logger.info "Configuration updated for #{node.group}/#{node.name}"
103
+ Oxidized.hooks.post_store(node: node, job: job, commitref: output.commitref)
72
104
  end
73
105
  node.reset
74
106
  end
@@ -87,26 +119,22 @@ module Oxidized
87
119
  @jobs_done += 1
88
120
  msg += ", retries exhausted, giving up"
89
121
  node.retry = 0
90
- Oxidized.hooks.handle :node_fail, node: node,
91
- job: job
122
+ Oxidized.hooks.node_fail(node: node, job: job)
92
123
  end
93
- Oxidized.logger.warn msg
124
+ logger.warn msg
94
125
  end
95
126
 
96
127
  def cycle_finished?
97
- if @jobs_done > @nodes.count
98
- true
99
- else
100
- @jobs_done.positive? && (@jobs_done % @nodes.count).zero?
101
- end
128
+ @jobs_done > @nodes.count ||
129
+ (@jobs_done.positive? && (@jobs_done % @nodes.count).zero?)
102
130
  end
103
131
 
104
132
  def run_done_hook
105
- Oxidized.logger.debug "lib/oxidized/worker.rb: Running :nodes_done hook"
106
- Oxidized.hooks.handle :nodes_done
133
+ logger.debug "Running :nodes_done hook"
134
+ Oxidized.hooks.nodes_done
107
135
  rescue StandardError => e
108
136
  # swallow the hook erros and continue as normal
109
- Oxidized.logger.error "lib/oxidized/worker.rb: #{e.message}"
137
+ logger.error e.message
110
138
  ensure
111
139
  @jobs_done = 0
112
140
  end
data/lib/oxidized.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  require 'fileutils'
2
2
  require 'refinements'
3
+ require 'semantic_logger'
3
4
 
4
5
  module Oxidized
5
6
  class OxidizedError < StandardError; end
7
+ include SemanticLogger::Loggable
6
8
 
7
9
  Directory = File.expand_path(File.join(File.dirname(__FILE__), '../'))
8
10
 
@@ -13,7 +15,9 @@ module Oxidized
13
15
  require 'oxidized/nodes'
14
16
  require 'oxidized/manager'
15
17
  require 'oxidized/hook'
18
+ require 'oxidized/signals'
16
19
  require 'oxidized/core'
20
+ require 'oxidized/logger'
17
21
 
18
22
  def self.asetus
19
23
  @@asetus
@@ -26,28 +30,4 @@ module Oxidized
26
30
  def self.config
27
31
  asetus.cfg
28
32
  end
29
-
30
- def self.logger
31
- @@logger
32
- end
33
-
34
- def self.logger=(val)
35
- @@logger = val
36
- end
37
-
38
- def self.setup_logger
39
- FileUtils.mkdir_p(Config::Log) unless File.directory?(Config::Log)
40
- self.logger = if config.has_key?('use_syslog') && config.use_syslog
41
- require 'syslog/logger'
42
- Syslog::Logger.new('oxidized')
43
- else
44
- require 'logger'
45
- if config.has_key?('log')
46
- Logger.new(File.expand_path(config.log))
47
- else
48
- Logger.new(STDERR)
49
- end
50
- end
51
- logger.level = Logger::INFO unless config.debug
52
- end
53
33
  end
data/lib/refinements.rb CHANGED
@@ -25,9 +25,29 @@ module Refinements
25
25
  end
26
26
 
27
27
  # sets @cmd and @name unless @name is already set
28
- def set_cmd(command)
28
+ def process_cmd(command)
29
29
  @cmd = command
30
+ # rubocop:disable Naming/MemoizedInstanceVariableName
30
31
  @name ||= @cmd.to_s.strip.gsub(/\s+/, '_') # what to do when command is proc? #to_s seems ghetto
32
+ # rubocop:enable Naming/MemoizedInstanceVariableName
33
+ end
34
+
35
+ # keeps lines matching any pattern (String or Regexp)
36
+ def keep_lines(patterns)
37
+ each_line.select do |line|
38
+ patterns.any? do |pattern|
39
+ pattern.is_a?(Regexp) ? line =~ pattern : line.include?(pattern)
40
+ end
41
+ end.join
42
+ end
43
+
44
+ # remove lines matching any pattern (String or Regexp)
45
+ def reject_lines(patterns)
46
+ each_line.reject do |line|
47
+ patterns.any? do |pattern|
48
+ pattern.is_a?(Regexp) ? line =~ pattern : line.include?(pattern)
49
+ end
50
+ end.join
31
51
  end
32
52
 
33
53
  # Initializes the String instance variables from another String instance
data/oxidized.gemspec CHANGED
@@ -12,33 +12,57 @@ Gem::Specification.new do |s|
12
12
  s.homepage = 'http://github.com/ytti/oxidized'
13
13
  s.summary = 'feeble attempt at rancid'
14
14
  s.description = 'software to fetch configuration from network devices and store them'
15
- s.rubyforge_project = s.name
16
- s.files = %x(git ls-files -z).split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ s.files = %x(git ls-files -z).split("\x0").reject { |f| f.match(/^(test|spec|features)\//) }
17
16
  s.executables = %w[oxidized]
18
17
  s.require_path = 'lib'
19
18
 
20
19
  s.metadata['rubygems_mfa_required'] = 'true'
21
20
 
21
+ # Ruby version strategy
22
+ #
23
+ # We try to keep the minimum version of Ruby to match supported LTS versions
24
+ # of common Linux distributions, as long as the maintenance effort remains
25
+ # reasonable.
22
26
  s.required_ruby_version = '>= 3.0'
23
27
 
24
- s.add_runtime_dependency 'asetus', '~> 0.1'
25
- s.add_runtime_dependency 'bcrypt_pbkdf', '~> 1.0'
26
- s.add_runtime_dependency 'ed25519', '~> 1.2'
27
- s.add_runtime_dependency 'net-ssh', '~> 7.1'
28
- s.add_runtime_dependency 'net-telnet', '~> 0.2'
29
- s.add_runtime_dependency 'rugged', '~> 1.6'
30
- s.add_runtime_dependency 'slop', '~> 4.6'
28
+ # Gemspec strategy
29
+ #
30
+ # For dependency and optional dependencies, we try to set the minimal
31
+ # dependency lower or equal to the Debian 13 "Trixie" package version,
32
+ # so that native packages can be used.
33
+ # We limit the maximal minor version so that dependabot can warn about new
34
+ # major versions and we can test them before activating them in Oxidized.
31
35
 
32
- s.add_development_dependency 'bundler', '~> 2.2'
33
- s.add_development_dependency 'git', '~> 1'
34
- s.add_development_dependency 'minitest', '~> 5.18'
35
- s.add_development_dependency 'mocha', '~> 1.2'
36
- s.add_development_dependency 'pry', '~> 0.14.2'
37
- s.add_development_dependency 'rake', '~> 13.0'
38
- s.add_development_dependency 'rubocop', '~> 1.48.0'
39
- s.add_development_dependency 'rubocop-minitest', '~> 0.29.0'
40
- s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
41
- s.add_development_dependency 'simplecov', '~> 0.22.0'
42
- s.add_development_dependency 'simplecov-cobertura', '~> 2.1.0'
43
- s.add_development_dependency 'simplecov-html', '~> 0.12.3'
36
+ s.add_dependency 'asetus', '~> 0.4'
37
+ s.add_dependency 'bcrypt_pbkdf', '~> 1.0'
38
+ s.add_dependency 'ed25519', '~> 1.2'
39
+ s.add_dependency 'net-ftp', '~> 0.2'
40
+ s.add_dependency 'net-http-digest_auth', '~> 1.4'
41
+ s.add_dependency 'net-ssh', '~> 7.3'
42
+ s.add_dependency 'net-telnet', '~> 0.2'
43
+ s.add_dependency 'psych', '~> 5.0'
44
+ s.add_dependency 'rugged', '~> 1.6'
45
+ s.add_dependency 'semantic_logger', '~> 4.17'
46
+ s.add_dependency 'slop', '~> 4.6'
47
+ s.add_dependency 'syslog', '~> 0.3'
48
+ s.add_dependency 'syslog_protocol', '~> 0.9'
49
+
50
+ s.add_development_dependency 'minitest', '>= 5.18', '<7'
51
+ s.add_development_dependency 'mocha', '>= 2.1', '<4'
52
+ s.add_development_dependency 'pry', '~> 0.15'
53
+ s.add_development_dependency 'rake', '~> 13.0'
54
+ # Rubocop introduces new rules in minor versions, so we limit automatic
55
+ # updates to patches
56
+ s.add_development_dependency 'rubocop', '~> 1.86.0'
57
+ s.add_development_dependency 'rubocop-minitest', '~> 0.39.1'
58
+ s.add_development_dependency 'rubocop-rake', '~> 0.7.0'
59
+ s.add_development_dependency 'rubocop-sequel', '~> 0.4.0'
60
+ s.add_development_dependency 'simplecov', '~> 0.22'
61
+
62
+ # Dependencies on optional libraries, used for unit tests & development
63
+ s.add_development_dependency 'git', '>= 2.0', '< 5'
64
+ s.add_development_dependency 'net-scp', '~> 4.1'
65
+ s.add_development_dependency 'net-tftp', '~> 0.1.0'
66
+ s.add_development_dependency 'oxidized-web', '>= 0.17.1'
67
+ s.add_development_dependency 'sequel', '>= 5.63.0', '< 6'
44
68
  end