xlogin 0.5.13 → 0.5.14

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 28fe38cadeb9382c1dca21cc77a8cc5d5233ea2b
4
- data.tar.gz: 4d9075c3216fb035d8c8b0407e99f67b35e0dd0d
3
+ metadata.gz: 0e757e206fe886bf5b5f4ed56e8b7a47cf6837c9
4
+ data.tar.gz: 43ea824dfd4a8131b795b81bc1fd342de46155e9
5
5
  SHA512:
6
- metadata.gz: cc38702bc86c7b0f416a4688f7b0a3b8d8d949dfa59371e255198dac36edb09a497b321ab8242b766dbd9f9c1313d566ae18aaeaf567f15737ca6aa02f3cb9aa
7
- data.tar.gz: 4a7f58d4699f7a70941d1cc32ccdff906791f3ad820676fefe403e4ecb935acc7e28c42feb7ea1b7efe75f1134e42505bb95d5b7d9c7434afddde626d23a3460
6
+ metadata.gz: 235201b50907672f266709c6036802d3c3fbbdfa96436f4eb0ee24b40268bb273ceba8ac77598c3bbf01faa242ae12fc889524bc658edefb1c3968f5933a3e4f
7
+ data.tar.gz: 4851153be8d9c4208daf7283e35646f1d557830a2bb82540d031ce479589d6f56040035d43ad62e206c26df9c50bbab9bb9ea46cdc1160c266eeab8120c64791
data/README.md CHANGED
@@ -4,7 +4,7 @@ rancid clogin alternative.
4
4
  ## Usage
5
5
 
6
6
  ネットワークデバイスへのログインを自動化するツール群。
7
- `xlogin/firmares`にファームウェア仕様を記述することで対象機器を拡大可能。
7
+ `~/.xlogin.d/`へファームウェア毎の仕様を記述することで対象機器を拡大可能。
8
8
 
9
9
 
10
10
  各個別装置毎のログインのための認証情報は`~/.xloginrc`へ記述しておく。
data/lib/xlogin/cli.rb CHANGED
@@ -36,7 +36,7 @@ module Xlogin
36
36
  parser.on('-l [DIRECTORY]', '--log', String, 'The DIRECTORY to the output log file (default: $PWD/log).') { |v| config.logdir = v || Dir.pwd }
37
37
 
38
38
  parser.on('-p NUM', '--parallels', Integer, 'The NUM of the threads. (default: 5).') { |v| config.parallels = v }
39
- parser.on('-e', '--enable', TrueClass, 'Try to gain enable priviledge.') { |v| config.enable = v }
39
+ parser.on('-e', '--enable', TrueClass, 'Try to gain enable priviledge.') { |v| config.autoenable = v }
40
40
  parser.on('-y', '--assume-yes', TrueClass, 'Always answer "yes" if confirmed.') { |v| config.assume_yes = v }
41
41
  parser.on('-h', '--help', 'Show this message.') { Xlogin::CLI.usage }
42
42
 
@@ -128,13 +128,15 @@ module Xlogin
128
128
  loggers << $stdout if config.parallels == 1
129
129
  loggers << File.join(config.logdir, "#{hostname}.log") if config.logdir
130
130
 
131
- session = Xlogin.get(hostname, enable: config.enable, log: loggers)
131
+ session = Xlogin.get(hostname, log: loggers)
132
+ session.enable(session.enable_password) if config.autoenable && session.respond_to?(:enable)
132
133
  block.call(session)
133
134
 
134
135
  if config.parallels > 1
135
136
  output = buffer.string.lines.map { |line| "#{hostname}: #{line}" }.join
136
137
  display.synchronize { $stdout.puts output }
137
138
  end
139
+
138
140
  rescue => e
139
141
  if config.parallels > 1
140
142
  output = "\n#{hostname}: [Error] #{e}"
@@ -7,43 +7,41 @@ module Xlogin
7
7
 
8
8
  def initialize
9
9
  @timeout = 5
10
- @cmdhook = nil
11
10
  @prompts = Array.new
12
- @methods = Hash.new
11
+
12
+ @hook = nil
13
+ @bind = Hash.new
13
14
  end
14
15
 
15
16
  def timeout(val)
16
17
  @timeout = val.to_i
17
18
  end
18
19
 
19
- def hook(&block)
20
- @cmdhook = block
21
- end
22
-
23
20
  def prompt(expect, &block)
24
21
  @prompts << [Regexp.new(expect.to_s), block]
25
22
  end
26
23
 
24
+ def hook(&block)
25
+ @hook = block
26
+ end
27
+
27
28
  def bind(name, &block)
28
- @methods[name] = block
29
+ @bind[name] = block
29
30
  end
30
31
 
31
32
  def run(uri, opts = {})
32
33
  uri = URI(uri.to_s)
33
34
  klass = Class.new(Xlogin.const_get(uri.scheme.capitalize))
34
- klass.class_exec(@methods) do |methods|
35
- methods.each { |m, _| undef_method(m) if method_defined?(m) }
36
- end
37
35
 
38
- @methods.each do |name, block|
39
- klass.class_exec(name, block) do |name, block|
40
- undef_method(name) if respond_to?(name)
36
+ @bind.each do |name, block|
37
+ klass.class_exec(name.to_sym, block) do |name, block|
38
+ undef_method(name) if method_defined?(name)
41
39
  define_method(name, &block)
42
40
  end
43
41
  end
44
42
 
45
- if @cmdhook
46
- klass.class_exec(@cmdhook) do |cmdhook|
43
+ if @hook
44
+ klass.class_exec(@hook) do |cmdhook|
47
45
  alias_method :pass, :puts
48
46
  define_method(:puts) do |command|
49
47
  instance_exec(command, &cmdhook)
@@ -51,25 +49,6 @@ module Xlogin
51
49
  end
52
50
  end
53
51
 
54
- if grant = opts.delete(:grant)
55
- mod_open, password, mod_close= grant.split(':')
56
- klass.class_exec(mod_open.to_sym, password, mod_close) do |mod_open, password, mod_close|
57
- if method_defined?(mod_open)
58
- alias_method "__#{mod_open}".to_sym, mod_open
59
- alias_method :enable, mod_open unless mod_open == :enable
60
- end
61
-
62
- define_method(mod_open) do |*args, &block|
63
- args = [*args, password] unless password.empty?
64
- send("__#{mod_open}", *args)
65
- if block
66
- block.call
67
- cmd(mod_close)
68
- end
69
- end
70
- end
71
- end
72
-
73
52
  session = klass.new(
74
53
  {
75
54
  host: uri.host,
@@ -79,9 +58,6 @@ module Xlogin
79
58
  prompts: @prompts,
80
59
  }.merge(opts)
81
60
  )
82
-
83
- session.enable if session.respond_to?(:enable) && opts[:enable]
84
- session
85
61
  end
86
62
 
87
63
  end
@@ -52,7 +52,7 @@ module Xlogin
52
52
 
53
53
  def list(name = nil)
54
54
  keys = @database.keys
55
- keys = keys.select { |key| key =~ /^#{name}(:|$)/ } unless name.nil?
55
+ keys = keys.select { |key| key =~ /^#{name}(:|$)/ } unless name.nil? || name.to_s == 'all'
56
56
  @database.values_at(*keys)
57
57
  end
58
58
 
@@ -23,6 +23,15 @@ module Xlogin
23
23
  @logger = update_logger
24
24
  end
25
25
 
26
+ def enable(*args)
27
+ # do nothing here.
28
+ # write bind(:enable) proc in the firmware template to override.
29
+ end
30
+
31
+ def enable_password
32
+ opts[:enablepw]
33
+ end
34
+
26
35
  def waitfor(*expect, &block)
27
36
  if expect.compact.empty?
28
37
  super(Regexp.union(*@prompts.map(&:first))) do |recvdata|
@@ -44,8 +53,8 @@ module Xlogin
44
53
  end
45
54
  end
46
55
 
47
- def dup(opts = @opts)
48
- self.class.new(opts)
56
+ def dup(**args)
57
+ self.class.new(**@opts.merge(args))
49
58
  end
50
59
 
51
60
  def lock(timeout: @timeout)
@@ -8,8 +8,13 @@ bind(:login) do |password|
8
8
  waitfor
9
9
  end
10
10
 
11
- bind(:enable) do |password|
11
+ bind(:enable) do |password, &block|
12
12
  puts('enable')
13
13
  waitfor(/Password: /) && puts(password)
14
14
  waitfor
15
+
16
+ if block
17
+ block.call
18
+ cmd('disable')
19
+ end
15
20
  end
@@ -8,11 +8,10 @@ bind(:login) do |*args|
8
8
  end
9
9
 
10
10
  hook do |command|
11
- if command =~ /^(?:adm |admi |admin )?\s*(?:con|rel|red|cle|hw|ro)/
12
- # commands: configure, reload, redundancy, clear, hw-module, rollback
13
- # with or without admin prefix is prihibited if not authorized.
11
+ case command.strip
12
+ when /^conf/, /^ro/
14
13
  raise Xlogin::AuthorizationError.new("prohibited command: #{command}") unless Xlogin.authorized?
14
+ else
15
+ pass(command)
15
16
  end
16
-
17
- pass(command)
18
17
  end
@@ -10,7 +10,7 @@ bind(:login) do |*args|
10
10
  waitfor
11
11
  end
12
12
 
13
- bind(:enable_admin) do |password|
13
+ bind(:enable) do |password|
14
14
  puts('enable-admin')
15
15
  waitfor(/Password:\s?/) && puts(password)
16
16
  waitfor
@@ -1,3 +1,3 @@
1
1
  module Xlogin
2
- VERSION = "0.5.13"
2
+ VERSION = "0.5.14"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xlogin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.13
4
+ version: 0.5.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - haccht
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-04 00:00:00.000000000 Z
11
+ date: 2017-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-telnet
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  version: '0'
166
166
  requirements: []
167
167
  rubyforge_project:
168
- rubygems_version: 2.6.11
168
+ rubygems_version: 2.4.5.2
169
169
  signing_key:
170
170
  specification_version: 4
171
171
  summary: rancid clogin alternative