oxidized 0.25.1 → 0.26.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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +30 -9
  3. data/.rubocop_todo.yml +16 -637
  4. data/.travis.yml +2 -3
  5. data/CHANGELOG.md +14 -0
  6. data/Dockerfile +7 -5
  7. data/README.md +18 -14
  8. data/Rakefile +2 -2
  9. data/bin/console +1 -1
  10. data/bin/oxidized +2 -2
  11. data/docs/Configuration.md +6 -0
  12. data/docs/Model-Notes/README.md +1 -0
  13. data/docs/Model-Notes/SmartAX-Huawei.md +35 -0
  14. data/docs/Supported-OS-Types.md +12 -0
  15. data/extra/nagios_check_failing_nodes.rb +1 -1
  16. data/extra/rest_client.rb +6 -8
  17. data/extra/syslog.rb +33 -33
  18. data/lib/oxidized/cli.rb +25 -26
  19. data/lib/oxidized/config.rb +9 -9
  20. data/lib/oxidized/config/vars.rb +3 -7
  21. data/lib/oxidized/core.rb +4 -7
  22. data/lib/oxidized/hook.rb +16 -17
  23. data/lib/oxidized/hook/awssns.rb +4 -4
  24. data/lib/oxidized/hook/exec.rb +16 -20
  25. data/lib/oxidized/hook/githubrepo.rb +8 -14
  26. data/lib/oxidized/hook/noophook.rb +1 -1
  27. data/lib/oxidized/hook/xmppdiff.rb +1 -1
  28. data/lib/oxidized/input/cli.rb +12 -12
  29. data/lib/oxidized/input/ftp.rb +8 -8
  30. data/lib/oxidized/input/http.rb +37 -14
  31. data/lib/oxidized/input/input.rb +6 -6
  32. data/lib/oxidized/input/ssh.rb +31 -31
  33. data/lib/oxidized/input/telnet.rb +24 -24
  34. data/lib/oxidized/input/tftp.rb +9 -10
  35. data/lib/oxidized/jobs.rb +7 -7
  36. data/lib/oxidized/manager.rb +13 -13
  37. data/lib/oxidized/model/acos.rb +2 -2
  38. data/lib/oxidized/model/aireos.rb +3 -3
  39. data/lib/oxidized/model/aos7.rb +1 -1
  40. data/lib/oxidized/model/aosw.rb +12 -14
  41. data/lib/oxidized/model/apc_aos.rb +1 -1
  42. data/lib/oxidized/model/aricentiss.rb +6 -8
  43. data/lib/oxidized/model/asa.rb +1 -1
  44. data/lib/oxidized/model/audiocodesmp.rb +28 -0
  45. data/lib/oxidized/model/awplus.rb +9 -9
  46. data/lib/oxidized/model/boss.rb +1 -1
  47. data/lib/oxidized/model/ciscosmb.rb +1 -1
  48. data/lib/oxidized/model/ciscovpn3k.rb +11 -0
  49. data/lib/oxidized/model/comware.rb +1 -1
  50. data/lib/oxidized/model/cumulus.rb +3 -1
  51. data/lib/oxidized/model/dellx.rb +5 -5
  52. data/lib/oxidized/model/edgeos.rb +1 -1
  53. data/lib/oxidized/model/edgeswitch.rb +1 -1
  54. data/lib/oxidized/model/fabricos.rb +1 -1
  55. data/lib/oxidized/model/fortios.rb +5 -5
  56. data/lib/oxidized/model/ftos.rb +1 -1
  57. data/lib/oxidized/model/gcombnps.rb +7 -7
  58. data/lib/oxidized/model/grandstream.rb +9 -0
  59. data/lib/oxidized/model/hatteras.rb +8 -8
  60. data/lib/oxidized/model/ios.rb +22 -40
  61. data/lib/oxidized/model/ironware.rb +1 -1
  62. data/lib/oxidized/model/junos.rb +1 -1
  63. data/lib/oxidized/model/mlnxos.rb +1 -1
  64. data/lib/oxidized/model/model.rb +32 -38
  65. data/lib/oxidized/model/netgearxs716.rb +23 -0
  66. data/lib/oxidized/model/netonix.rb +1 -1
  67. data/lib/oxidized/model/netscaler.rb +1 -1
  68. data/lib/oxidized/model/nos.rb +2 -2
  69. data/lib/oxidized/model/nxos.rb +1 -1
  70. data/lib/oxidized/model/openbsd.rb +3 -2
  71. data/lib/oxidized/model/outputs.rb +4 -4
  72. data/lib/oxidized/model/planet.rb +4 -4
  73. data/lib/oxidized/model/powerconnect.rb +8 -8
  74. data/lib/oxidized/model/procurve.rb +2 -1
  75. data/lib/oxidized/model/quantaos.rb +3 -3
  76. data/lib/oxidized/model/raisecom.rb +19 -0
  77. data/lib/oxidized/model/siklu.rb +1 -1
  78. data/lib/oxidized/model/slxos.rb +1 -1
  79. data/lib/oxidized/model/smartax.rb +25 -0
  80. data/lib/oxidized/model/sros.rb +4 -4
  81. data/lib/oxidized/model/tdre.rb +30 -0
  82. data/lib/oxidized/model/tmos.rb +3 -0
  83. data/lib/oxidized/model/trango.rb +17 -37
  84. data/lib/oxidized/model/voltaire.rb +1 -1
  85. data/lib/oxidized/model/voss.rb +1 -1
  86. data/lib/oxidized/model/vyatta.rb +1 -1
  87. data/lib/oxidized/model/xos.rb +1 -1
  88. data/lib/oxidized/model/zhoneolt.rb +1 -1
  89. data/lib/oxidized/node.rb +42 -46
  90. data/lib/oxidized/node/stats.rb +6 -6
  91. data/lib/oxidized/nodes.rb +42 -42
  92. data/lib/oxidized/output/file.rb +16 -20
  93. data/lib/oxidized/output/git.rb +68 -78
  94. data/lib/oxidized/output/gitcrypt.rb +77 -91
  95. data/lib/oxidized/output/http.rb +17 -19
  96. data/lib/oxidized/output/output.rb +1 -1
  97. data/lib/oxidized/source/csv.rb +3 -3
  98. data/lib/oxidized/source/http.rb +11 -14
  99. data/lib/oxidized/source/source.rb +3 -3
  100. data/lib/oxidized/source/sql.rb +16 -18
  101. data/lib/oxidized/string.rb +10 -10
  102. data/lib/oxidized/version.rb +4 -4
  103. data/lib/oxidized/worker.rb +15 -15
  104. data/oxidized.gemspec +6 -9
  105. metadata +32 -25
@@ -2,15 +2,16 @@ module Oxidized
2
2
  class CLI
3
3
  require 'slop'
4
4
  require 'oxidized'
5
+ require 'English'
5
6
 
6
7
  def run
7
8
  check_pid
8
9
  Process.daemon if @opts[:daemonize]
9
10
  write_pid
10
11
  begin
11
- Oxidized.logger.info "Oxidized starting, running as pid #{$$}"
12
+ Oxidized.logger.info "Oxidized starting, running as pid #{$PROCESS_ID}"
12
13
  Oxidized.new
13
- rescue => error
14
+ rescue StandardError => error
14
15
  crash error
15
16
  raise
16
17
  end
@@ -27,9 +28,9 @@ module Oxidized
27
28
  @pidfile = File.expand_path(Oxidized.config.pid)
28
29
  end
29
30
 
30
- def crash error
31
+ def crash(error)
31
32
  Oxidized.logger.fatal "Oxidized crashed, crashfile written in #{Config::Crash}"
32
- open Config::Crash, 'w' do |file|
33
+ File.open Config::Crash, 'w' do |file|
33
34
  file.puts '-' * 50
34
35
  file.puts Time.now.utc
35
36
  file.puts error.message + ' [' + error.class.to_s + ']'
@@ -40,7 +41,7 @@ module Oxidized
40
41
  end
41
42
 
42
43
  def parse_opts
43
- opts = Slop.new(:help => true) do
44
+ opts = Slop.new(help: true) do
44
45
  on 'd', 'debug', 'turn on debugging'
45
46
  on 'daemonize', 'Daemonize/fork the process'
46
47
  on 'show-exhaustive-config', 'output entire configuration, including defaults' do
@@ -56,43 +57,41 @@ module Oxidized
56
57
  [opts.parse!, opts]
57
58
  end
58
59
 
59
- def pidfile
60
- @pidfile
61
- end
60
+ attr_reader :pidfile
62
61
 
63
62
  def pidfile?
64
63
  !!pidfile
65
64
  end
66
65
 
67
66
  def write_pid
68
- if pidfile?
69
- begin
70
- File.open(pidfile, ::File::CREAT | ::File::EXCL | ::File::WRONLY) { |f| f.write("#{Process.pid}") }
71
- at_exit { File.delete(pidfile) if File.exists?(pidfile) }
72
- rescue Errno::EEXIST
73
- check_pid
74
- retry
75
- end
67
+ return unless pidfile?
68
+
69
+ begin
70
+ File.open(pidfile, ::File::CREAT | ::File::EXCL | ::File::WRONLY) { |f| f.write(Process.pid.to_s) }
71
+ at_exit { File.delete(pidfile) if File.exist?(pidfile) }
72
+ rescue Errno::EEXIST
73
+ check_pid
74
+ retry
76
75
  end
77
76
  end
78
77
 
79
78
  def check_pid
80
- if pidfile?
81
- case pid_status(pidfile)
82
- when :running, :not_owned
83
- puts "A server is already running. Check #{pidfile}"
84
- exit(1)
85
- when :dead
86
- File.delete(pidfile)
87
- end
79
+ return unless pidfile?
80
+
81
+ case pid_status(pidfile)
82
+ when :running, :not_owned
83
+ puts "A server is already running. Check #{pidfile}"
84
+ exit(1)
85
+ when :dead
86
+ File.delete(pidfile)
88
87
  end
89
88
  end
90
89
 
91
90
  def pid_status(pidfile)
92
- return :exited unless File.exists?(pidfile)
91
+ return :exited unless File.exist?(pidfile)
93
92
 
94
93
  pid = ::File.read(pidfile).to_i
95
- return :dead if pid == 0
94
+ return :dead if pid.zero?
96
95
 
97
96
  Process.kill(0, pid)
98
97
  :running
@@ -4,13 +4,13 @@ module Oxidized
4
4
  class InvalidConfig < OxidizedError; end
5
5
  class Config
6
6
  Root = ENV['OXIDIZED_HOME'] || File.join(ENV['HOME'], '.config', 'oxidized')
7
- Crash = File.join Root, 'crash'
8
- Log = File.join Root, 'logs'
9
- InputDir = File.join Directory, %w(lib oxidized input)
10
- OutputDir = File.join Directory, %w(lib oxidized output)
11
- ModelDir = File.join Directory, %w(lib oxidized model)
12
- SourceDir = File.join Directory, %w(lib oxidized source)
13
- HookDir = File.join Directory, %w(lib oxidized hook)
7
+ Crash = File.join(ENV['OXIDIZED_LOGS'] || Root, 'crash')
8
+ Log = File.join(ENV['OXIDIZED_LOGS'] || Root, 'logs')
9
+ InputDir = File.join Directory, %w[lib oxidized input]
10
+ OutputDir = File.join Directory, %w[lib oxidized output]
11
+ ModelDir = File.join Directory, %w[lib oxidized model]
12
+ SourceDir = File.join Directory, %w[lib oxidized source]
13
+ HookDir = File.join Directory, %w[lib oxidized hook]
14
14
  Sleep = 1
15
15
 
16
16
  def self.load(cmd_opts = {})
@@ -49,13 +49,13 @@ module Oxidized
49
49
  asetus.default.source.default = 'csv' # csv, sql
50
50
 
51
51
  asetus.default.model_map = {
52
- 'cisco' => 'ios',
53
52
  'juniper' => 'junos',
53
+ 'cisco' => 'ios'
54
54
  }
55
55
 
56
56
  begin
57
57
  asetus.load # load system+user configs, merge to Config.cfg
58
- rescue => error
58
+ rescue StandardError => error
59
59
  raise InvalidConfig, "Error loading config: #{error.message}"
60
60
  end
61
61
 
@@ -1,17 +1,13 @@
1
1
  module Oxidized::Config::Vars
2
2
  # convenience method for accessing node, group or global level user variables
3
3
  # nil values will be ignored
4
- def vars name
4
+ def vars(name)
5
5
  r = @node.vars[name] unless @node.vars.nil?
6
6
  if Oxidized.config.groups.has_key?(@node.group)
7
- if Oxidized.config.groups[@node.group].vars.has_key?(name.to_s)
8
- r ||= Oxidized.config.groups[@node.group].vars[name.to_s]
9
- end
7
+ r ||= Oxidized.config.groups[@node.group].vars[name.to_s] if Oxidized.config.groups[@node.group].vars.has_key?(name.to_s)
10
8
  end
11
9
  if Oxidized.config.models.has_key?(@node.model.class.name.to_s.downcase)
12
- if Oxidized.config.models[@node.model.class.name.to_s.downcase].vars.has_key?(name.to_s)
13
- r ||= Oxidized.config.models[@node.model.class.name.to_s.downcase].vars[name.to_s]
14
- end
10
+ r ||= Oxidized.config.models[@node.model.class.name.to_s.downcase].vars[name.to_s] if Oxidized.config.models[@node.model.class.name.to_s.downcase].vars.has_key?(name.to_s)
15
11
  end
16
12
  r ||= Oxidized.config.vars[name.to_s] if Oxidized.config.vars.has_key?(name.to_s)
17
13
  r
@@ -1,6 +1,6 @@
1
1
  module Oxidized
2
2
  class << self
3
- def new *args
3
+ def new(*args)
4
4
  Core.new args
5
5
  end
6
6
  end
@@ -8,11 +8,11 @@ module Oxidized
8
8
  class Core
9
9
  class NoNodesFound < OxidizedError; end
10
10
 
11
- def initialize args
11
+ def initialize(_args)
12
12
  Oxidized.mgr = Manager.new
13
13
  Oxidized.Hooks = HookManager.from_config(Oxidized.config)
14
14
  nodes = Nodes.new
15
- raise NoNodesFound, 'source returns no usable nodes' if nodes.size == 0
15
+ raise NoNodesFound, 'source returns no usable nodes' if nodes.size.zero?
16
16
 
17
17
  @worker = Worker.new nodes
18
18
  trap('HUP') { nodes.load }
@@ -33,10 +33,7 @@ module Oxidized
33
33
 
34
34
  def run
35
35
  Oxidized.logger.debug "lib/oxidized/core.rb: Starting the worker..."
36
- while true
37
- @worker.work
38
- sleep Config::Sleep
39
- end
36
+ @worker.work while sleep Config::Sleep
40
37
  end
41
38
  end
42
39
  end
@@ -1,7 +1,7 @@
1
1
  module Oxidized
2
2
  class HookManager
3
3
  class << self
4
- def from_config cfg
4
+ def from_config(cfg)
5
5
  mgr = new
6
6
  cfg.hooks.each do |name, h_cfg|
7
7
  h_cfg.events.each do |event|
@@ -17,27 +17,27 @@ module Oxidized
17
17
  class HookContext < OpenStruct; end
18
18
 
19
19
  # RegisteredHook is a container for a Hook instance
20
- class RegisteredHook < Struct.new(:name, :hook); end
20
+ RegisteredHook = Struct.new(:name, :hook)
21
21
 
22
- Events = [
23
- :node_success,
24
- :node_fail,
25
- :post_store,
26
- :nodes_done
27
- ]
22
+ Events = %i[
23
+ node_success
24
+ node_fail
25
+ post_store
26
+ nodes_done
27
+ ].freeze
28
28
  attr_reader :registered_hooks
29
29
 
30
30
  def initialize
31
31
  @registered_hooks = Hash.new { |h, k| h[k] = [] }
32
32
  end
33
33
 
34
- def register event, name, hook_type, cfg
34
+ def register(event, name, hook_type, cfg)
35
35
  unless Events.include? event
36
36
  raise ArgumentError,
37
37
  "unknown event #{event}, available: #{Events.join ','}"
38
38
  end
39
39
 
40
- Oxidized.mgr.add_hook(hook_type) or raise("cannot load hook '#{hook_type}', not found")
40
+ Oxidized.mgr.add_hook(hook_type) || raise("cannot load hook '#{hook_type}', not found")
41
41
  begin
42
42
  hook = Oxidized.mgr.hook.fetch(hook_type).new
43
43
  rescue KeyError
@@ -50,15 +50,15 @@ module Oxidized
50
50
  Oxidized.logger.debug "Hook #{name.inspect} registered #{hook.class} for event #{event.inspect}"
51
51
  end
52
52
 
53
- def handle event, ctx_params = {}
53
+ def handle(event, ctx_params = {})
54
54
  ctx = HookContext.new ctx_params
55
55
  ctx.event = event
56
56
 
57
57
  @registered_hooks[event].each do |r_hook|
58
58
  begin
59
59
  r_hook.hook.run_hook ctx
60
- rescue => e
61
- Oxidized.logger.error "Hook #{r_hook.name} (#{r_hook.hook}) failed " +
60
+ rescue StandardError => e
61
+ Oxidized.logger.error "Hook #{r_hook.name} (#{r_hook.hook}) failed " \
62
62
  "(#{e.inspect}) for event #{event.inspect}"
63
63
  end
64
64
  end
@@ -69,15 +69,14 @@ module Oxidized
69
69
  class Hook
70
70
  attr_reader :cfg
71
71
 
72
- def initialize
73
- end
72
+ def initialize; end
74
73
 
75
74
  def cfg=(cfg)
76
75
  @cfg = cfg
77
- validate_cfg! if self.respond_to? :validate_cfg!
76
+ validate_cfg! if respond_to? :validate_cfg!
78
77
  end
79
78
 
80
- def run_hook ctx
79
+ def run_hook(_ctx)
81
80
  raise NotImplementedError
82
81
  end
83
82
 
@@ -10,13 +10,13 @@ class AwsSns < Oxidized::Hook
10
10
  sns = Aws::SNS::Resource.new(region: cfg.region)
11
11
  topic = sns.topic(cfg.topic_arn)
12
12
  message = {
13
- :event => ctx.event.to_s
13
+ event: ctx.event.to_s
14
14
  }
15
15
  if ctx.node
16
16
  message.merge!(
17
- :group => ctx.node.group.to_s,
18
- :model => ctx.node.model.class.name.to_s.downcase,
19
- :node => ctx.node.name.to_s
17
+ group: ctx.node.group.to_s,
18
+ model: ctx.node.model.class.name.to_s.downcase,
19
+ node: ctx.node.name.to_s
20
20
  )
21
21
  end
22
22
  topic.publish(
@@ -12,12 +12,10 @@ class Exec < Oxidized::Hook
12
12
  if cfg.has_key? "timeout"
13
13
  @timeout = cfg.timeout
14
14
  raise "invalid timeout value" unless @timeout.is_a?(Integer) &&
15
- @timeout > 0
15
+ @timeout.positive?
16
16
  end
17
17
 
18
- if cfg.has_key? "async"
19
- @async = !!cfg.async
20
- end
18
+ @async = !!cfg.async if cfg.has_key? "async"
21
19
 
22
20
  if cfg.has_key? "cmd"
23
21
  @cmd = cfg.cmd
@@ -28,23 +26,23 @@ class Exec < Oxidized::Hook
28
26
  "#{self.class.name}: configuration invalid: #{e.message}"
29
27
  end
30
28
 
31
- def run_hook ctx
29
+ def run_hook(ctx)
32
30
  env = make_env ctx
33
31
  log "Execute: #{@cmd.inspect}", :debug
34
32
  th = Thread.new do
35
33
  begin
36
34
  run_cmd! env
37
- rescue => e
35
+ rescue StandardError => e
38
36
  raise e unless @async
39
37
  end
40
38
  end
41
39
  th.join unless @async
42
40
  end
43
41
 
44
- def run_cmd! env
42
+ def run_cmd!(env)
45
43
  pid, status = nil, nil
46
44
  Timeout.timeout(@timeout) do
47
- pid = spawn env, @cmd, :unsetenv_others => true
45
+ pid = spawn env, @cmd, unsetenv_others: true
48
46
  pid, status = wait2 pid
49
47
  unless status.exitstatus.zero?
50
48
  msg = "#{@cmd.inspect} failed with exit value #{status.exitstatus}"
@@ -59,27 +57,25 @@ class Exec < Oxidized::Hook
59
57
  raise Timeout::Error, msg
60
58
  end
61
59
 
62
- def make_env ctx
60
+ def make_env(ctx)
63
61
  env = {
64
62
  "OX_EVENT" => ctx.event.to_s
65
63
  }
66
64
  if ctx.node
67
65
  env.merge!(
68
- "OX_NODE_NAME" => ctx.node.name.to_s,
69
- "OX_NODE_IP" => ctx.node.ip.to_s,
70
- "OX_NODE_FROM" => ctx.node.from.to_s,
71
- "OX_NODE_MSG" => ctx.node.msg.to_s,
72
- "OX_NODE_GROUP" => ctx.node.group.to_s,
73
- "OX_NODE_MODEL" => ctx.node.model.class.name,
66
+ "OX_NODE_NAME" => ctx.node.name.to_s,
67
+ "OX_NODE_IP" => ctx.node.ip.to_s,
68
+ "OX_NODE_FROM" => ctx.node.from.to_s,
69
+ "OX_NODE_MSG" => ctx.node.msg.to_s,
70
+ "OX_NODE_GROUP" => ctx.node.group.to_s,
71
+ "OX_NODE_MODEL" => ctx.node.model.class.name,
74
72
  "OX_REPO_COMMITREF" => ctx.commitref.to_s,
75
- "OX_REPO_NAME" => ctx.node.repo.to_s,
73
+ "OX_REPO_NAME" => ctx.node.repo.to_s
76
74
  )
77
75
  end
78
76
  if ctx.job
79
- env.merge!(
80
- "OX_JOB_STATUS" => ctx.job.status.to_s,
81
- "OX_JOB_TIME" => ctx.job.time.to_s,
82
- )
77
+ env["OX_JOB_STATUS"] = ctx.job.status.to_s
78
+ env["OX_JOB_TIME"] = ctx.job.time.to_s
83
79
  end
84
80
  env
85
81
  end
@@ -18,7 +18,7 @@ class GithubRepo < Oxidized::Hook
18
18
  result = repo.fetch('origin', [repo.head.name], credentials: credentials)
19
19
  log result.inspect, :debug
20
20
 
21
- unless result[:total_deltas] > 0
21
+ unless result[:total_deltas].positive?
22
22
  log "nothing recieved after fetch", :debug
23
23
  return
24
24
  end
@@ -34,24 +34,18 @@ class GithubRepo < Oxidized::Hook
34
34
  return
35
35
  end
36
36
 
37
- Rugged::Commit.create(repo, {
38
- parents: [repo.head.target, their_branch.target],
39
- tree: merge_index.write_tree(repo),
40
- message: "Merge remote-tracking branch '#{their_branch.name}'",
41
- update_ref: "HEAD"
42
- })
37
+ Rugged::Commit.create(repo,
38
+ parents: [repo.head.target, their_branch.target],
39
+ tree: merge_index.write_tree(repo),
40
+ message: "Merge remote-tracking branch '#{their_branch.name}'",
41
+ update_ref: "HEAD")
43
42
  end
44
43
 
45
44
  private
46
45
 
47
46
  def credentials
48
- Proc.new do |url, username_from_url, allowed_types|
49
- if cfg.has_key?('username')
50
- git_user = cfg.username
51
- else
52
- git_user = username_from_url || 'git'
53
- end
54
-
47
+ Proc.new do |_url, username_from_url, _allowed_types| # rubocop:disable Style/Proc
48
+ git_user = cfg.has_key?('username') ? cfg.username : (username_from_url || 'git')
55
49
  if cfg.has_key?('password')
56
50
  log "Authenticating using username and password as '#{git_user}'", :debug
57
51
  Rugged::Credentials::UserPassword.new(username: git_user, password: cfg.password)
@@ -3,7 +3,7 @@ class NoopHook < Oxidized::Hook
3
3
  log "Validate config"
4
4
  end
5
5
 
6
- def run_hook ctx
6
+ def run_hook(ctx)
7
7
  log "Run hook with context: #{ctx}"
8
8
  end
9
9
  end
@@ -19,7 +19,7 @@ class XMPPDiff < Oxidized::Hook
19
19
  diff = gitoutput.get_diff ctx.node, ctx.node.group, ctx.commitref, nil
20
20
 
21
21
  interesting = diff[:patch].lines.to_a[4..-1].any? do |line|
22
- ["+", "-"].include?(line[0]) and not ["#", "!"].include?(line[1])
22
+ ["+", "-"].include?(line[0]) && (not ["#", "!"].include?(line[1]))
23
23
  end
24
24
  interesting &&= diff[:patch].lines.to_a[5..-1].any? { |line| line[0] == '-' }
25
25
  interesting &&= diff[:patch].lines.to_a[5..-1].any? { |line| line[0] == '+' }
@@ -32,24 +32,24 @@ module Oxidized
32
32
  @pre_logout.each { |command, block| block ? block.call : (cmd command, nil) }
33
33
  end
34
34
 
35
- def post_login _post_login = nil, &block
36
- unless @exec
37
- @post_login << [_post_login, block]
38
- end
35
+ def post_login(cmd = nil, &block)
36
+ return if @exec
37
+
38
+ @post_login << [cmd, block]
39
39
  end
40
40
 
41
- def pre_logout _pre_logout = nil, &block
42
- unless @exec
43
- @pre_logout << [_pre_logout, block]
44
- end
41
+ def pre_logout(cmd = nil, &block)
42
+ return if @exec
43
+
44
+ @pre_logout << [cmd, block]
45
45
  end
46
46
 
47
- def username re = /^(Username|login)/
48
- @username or @username = re
47
+ def username(regex = /^(Username|login)/)
48
+ @username || (@username = regex)
49
49
  end
50
50
 
51
- def password re = /^Password/
52
- @password or @password = re
51
+ def password(regex = /^Password/)
52
+ @password || (@password = regex)
53
53
  end
54
54
 
55
55
  def login