xlogin 0.5.6 → 0.5.7

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: 2be188c26cbf628e71b5eaf1cb10f7ddc3ffc334
4
- data.tar.gz: fe373f5b3d3f7cc1693cb0ebd3bfe982987e9a67
3
+ metadata.gz: 9ac09545140fdb579f104d9d89a9680d36b50522
4
+ data.tar.gz: e27770786a5251da7e202f0112732c9ffa104db9
5
5
  SHA512:
6
- metadata.gz: afe158fb986690afa66c0aecb5854f95049ad26b1d080b24b56343bb925844a83900cb47a30b65dac90eabacadc87bd66884bded360f8dbc87f33657ed09c978
7
- data.tar.gz: 0c30870ce6e156a5bc7ab030945d3b62cee1acdd2d5a00bfedaf02cb4a6b8732b705f6b3a703a909b50f0cdc99a886a5b7156fdf4a581a1cc6e1d57ada1fc63a
6
+ metadata.gz: 0ab2b2221629cb99df6de1aa45d78758e18b5bce185de383c4a32ccdc67d9b0cab0d8927fc92c8cd4ffdd74c0fc0a7667ed2f3f1aab396b59c3edc81dd4f64e6
7
+ data.tar.gz: 909d257d6fde36ff54c28823e10ce6606386164c5284d362a6e2b899af3408093f756b12300b792f36a58cf1eccc131c2697c4ebf86f734f15ccbfad529109db
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xlogin (0.5.6)
4
+ xlogin (0.5.7)
5
5
  net-ssh
6
6
  net-ssh-gateway
7
7
  net-ssh-telnet
data/lib/xlogin/cli.rb CHANGED
@@ -35,9 +35,9 @@ module Xlogin
35
35
  parser.on('-T DIRECTORY', '--template-dir', String, 'The DIRECTORY to the template files.') { |v| config.templates += Dir.glob(File.join(v, '*.rb')) }
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
- 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 }
40
- parser.on('-y', '--assumeyes', TrueClass, 'Always answer "yes" if confirmed.') { |v| config.assumeyes = v }
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 }
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
 
43
43
  self.class.module_eval do
@@ -54,6 +54,7 @@ module Xlogin
54
54
  Xlogin.init do
55
55
  source(config.inventory)
56
56
  template(*config.templates)
57
+ authorize(config.assume_yes)
57
58
  end
58
59
 
59
60
  factory = Xlogin::FirmwareFactory.instance
@@ -112,12 +113,12 @@ module Xlogin
112
113
  end
113
114
 
114
115
  private
115
- def login(config)
116
- display = Mutex.new
117
- config.parallels = [config.parallels, config.hostlist.size].min
116
+ def login(config, &block)
118
117
  FileUtils.mkdir_p(config.logdir) if config.logdir
118
+ config.parallels = [config.parallels, config.hostlist.size].min
119
119
 
120
- Parallel.each(config.hostlist, in_thread: config.parallels) do |host|
120
+ display = Mutex.new
121
+ Parallel.map(config.hostlist, in_thread: config.parallels) do |host|
121
122
  begin
122
123
  hostname = host[:name]
123
124
  buffer = StringIO.new
@@ -127,8 +128,8 @@ module Xlogin
127
128
  loggers << $stdout if config.parallels == 1
128
129
  loggers << File.join(config.logdir, "#{hostname}.log") if config.logdir
129
130
 
130
- session = Xlogin.get(hostname, assumeyes: config.assumeyes, enable: config.enable, log: loggers)
131
- yield session
131
+ session = Xlogin.get(hostname, enable: config.enable, log: loggers)
132
+ block.call(session)
132
133
 
133
134
  if config.parallels > 1
134
135
  output = buffer.string.lines.map { |line| "#{hostname}: #{line}" }.join
@@ -7,7 +7,7 @@ module Xlogin
7
7
 
8
8
  def initialize
9
9
  @timeout = 5
10
- @on_exec = nil
10
+ @cmdhook = nil
11
11
  @prompts = Array.new
12
12
  @methods = Hash.new
13
13
  end
@@ -16,8 +16,8 @@ module Xlogin
16
16
  @timeout = val.to_i
17
17
  end
18
18
 
19
- def on_exec(&block)
20
- @on_exec = block
19
+ def hook(&block)
20
+ @cmdhook = block
21
21
  end
22
22
 
23
23
  def prompt(expect, &block)
@@ -42,20 +42,23 @@ module Xlogin
42
42
  end
43
43
  end
44
44
 
45
- if @on_exec
46
- klass.class_exec(@on_exec) do |on_exec|
47
- alias_method :do_cmd, :cmd
48
- define_method(:cmd) do |args|
49
- args = {'String' => args.to_s} unless args.kind_of?(Hash)
50
- instance_exec(args, &on_exec)
45
+ if @cmdhook
46
+ klass.class_exec(@cmdhook) do |cmdhook|
47
+ alias_method :pass, :puts
48
+ define_method(:puts) do |command|
49
+ instance_exec(command, &cmdhook)
51
50
  end
52
51
  end
53
52
  end
54
53
 
55
54
  if grant = opts.delete(:grant)
56
55
  mod_open, password, mod_close= grant.split(':')
57
- klass.class_exec(mod_open, password, mod_close) do |mod_open, password, mod_close|
58
- alias_method "__#{mod_open}".to_sym, mod_open.to_sym
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
+
59
62
  define_method(mod_open) do |*args, &block|
60
63
  args = [*args, password] unless password.empty?
61
64
  send("__#{mod_open}", *args)
@@ -64,7 +67,6 @@ module Xlogin
64
67
  cmd(mod_close)
65
68
  end
66
69
  end
67
- alias_method :enable, mod_open unless mod_open.to_sym == :enable
68
70
  end
69
71
  end
70
72
 
@@ -71,18 +71,18 @@ module Xlogin
71
71
  def build(args)
72
72
  type = args.delete(:type)
73
73
  template = get_template(type)
74
- raise Xlogin::GeneralError.new("Template not defined: #{type}") unless template
74
+ raise Xlogin::TemplateNotFound.new("template not found: '#{type}'") unless template
75
75
 
76
76
  uri = args.delete(:uri)
77
77
  opts = args.reduce({}) { |a, (k, v)| a.merge(k.to_s.downcase.to_sym => v) }
78
- raise Xlogin::GeneralError.new("Host not found: #{args}") unless uri
78
+ raise Xlogin::HostNotFound.new("connection not defined: '#{arg}'") unless uri
79
79
 
80
80
  template.dup.run(uri, opts)
81
81
  end
82
82
 
83
83
  def build_from_hostname(hostname, **args)
84
84
  hostinfo = get(hostname)
85
- raise Xlogin::GeneralError.new("Host not found: #{hostname}") unless hostinfo
85
+ raise Xlogin::HostNotFound.new("host not found: '#{hostname}'") unless hostinfo
86
86
 
87
87
  build(hostinfo.merge(args))
88
88
  end
@@ -23,7 +23,7 @@ module Xlogin
23
23
  names = names.map(&:strip).grep(/^\s*[^#]/)
24
24
  namecount = names.uniq.inject({}) { |a, e| a.merge(e => names.count(e)) }
25
25
  duplicate = namecount.keys.select { |name| namecount[name] > 1 }
26
- raise Xlogin::GeneralError.new("Duplicate hosts found - #{duplicate.join(', ')}") unless duplicate.empty?
26
+ raise ArgumentError.new("Duplicate hosts found - #{duplicate.join(', ')}") unless duplicate.empty?
27
27
 
28
28
  current_namespace do
29
29
  description = Rake.application.last_description || "Run '#{RakeTask.current_namespace}'"
@@ -56,7 +56,6 @@ module Xlogin
56
56
  attr_accessor :silent
57
57
  attr_accessor :lockfile
58
58
  attr_accessor :logfile
59
- attr_accessor :assumeyes
60
59
  attr_accessor :uncomment
61
60
 
62
61
  def initialize(name)
@@ -69,7 +68,6 @@ module Xlogin
69
68
  @silent = Rake.application.options.silent
70
69
  @lockfile = nil
71
70
  @logfile = nil
72
- @assumeyes = false
73
71
  @uncomment = false
74
72
 
75
73
  yield(self) if block_given?
@@ -114,7 +112,7 @@ module Xlogin
114
112
  end
115
113
 
116
114
  def run_task
117
- raise Xlogin::GeneralError.new("missing xlogin_opts to connect to #{name}") unless @xlogin_opts[:type] && @xlogin_opts[:uri]
115
+ raise ArgumentError.new("missing xlogin_opts to connect to #{name}") unless @xlogin_opts[:type] && @xlogin_opts[:uri]
118
116
 
119
117
  loggers = [@xlogin_opts[:log]].flatten.compact
120
118
  loggers << $stdout unless silent || Rake.application.options.always_multitask
@@ -125,7 +123,6 @@ module Xlogin
125
123
  end
126
124
 
127
125
  @xlogin_opts[:log] = loggers unless loggers.empty?
128
- @xlogin_opts[:assumeyes] ||= assumeyes
129
126
 
130
127
  begin
131
128
  @session = Xlogin.factory.build(@xlogin_opts)
@@ -14,7 +14,7 @@ module Xlogin
14
14
  @name = @opts[:name] || @host
15
15
  @port = @opts[:port]
16
16
  @userinfo = @opts[:userinfo].to_s
17
- raise Xlogin::GeneralError.new('Argument error.') unless @host && @port
17
+ raise ArgumentError.new('device hostname or port not specified.') unless @host && @port
18
18
 
19
19
  @prompts = @opts[:prompts] || [[/[$%#>] ?\z/n, nil]]
20
20
  @timeout = @opts[:timeout] || 60
data/lib/xlogin/telnet.rb CHANGED
@@ -53,7 +53,7 @@ module Xlogin
53
53
  end
54
54
  end
55
55
  rescue EOFError, Errno::ECONNRESET
56
- $stdout.puts "\r\n", "Conneciton closed."
56
+ $stdout.puts "\r\n", "Conneciton closed.", "\r\n"
57
57
  self.close
58
58
  ensure
59
59
  $stdin.cooked!
@@ -1,3 +1,3 @@
1
1
  module Xlogin
2
- VERSION = "0.5.6"
2
+ VERSION = "0.5.7"
3
3
  end
data/lib/xlogin.rb CHANGED
@@ -10,10 +10,20 @@ module Xlogin
10
10
  DEFAULT_TEMPLATE_DIR = File.join(ENV['HOME'], '.xlogin.d')
11
11
  BUILTIN_TEMPLATE_FILES = Dir.glob(File.join(File.dirname(__FILE__), 'xlogin', 'templates', '*.rb'))
12
12
 
13
- class GeneralError < StandardError; end
13
+ class HostNotFound < StandardError; end
14
+ class TemplateNotFound < StandardError; end
15
+ class AuthorizationError < StandardError; end
14
16
 
15
17
  class << self
16
18
 
19
+ def authorize(boolean = false, &block)
20
+ @authorized = (boolean == true || block.call == true)
21
+ end
22
+
23
+ def authorized?
24
+ @authorized == true
25
+ end
26
+
17
27
  def factory
18
28
  @factory ||= Xlogin::FirmwareFactory.instance
19
29
  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.6
4
+ version: 0.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - haccht
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-14 00:00:00.000000000 Z
11
+ date: 2017-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-telnet