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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/xlogin/cli.rb +10 -9
- data/lib/xlogin/firmware.rb +14 -12
- data/lib/xlogin/firmware_factory.rb +3 -3
- data/lib/xlogin/rake_task.rb +2 -5
- data/lib/xlogin/session.rb +1 -1
- data/lib/xlogin/telnet.rb +1 -1
- data/lib/xlogin/version.rb +1 -1
- data/lib/xlogin.rb +11 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ac09545140fdb579f104d9d89a9680d36b50522
|
4
|
+
data.tar.gz: e27770786a5251da7e202f0112732c9ffa104db9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ab2b2221629cb99df6de1aa45d78758e18b5bce185de383c4a32ccdc67d9b0cab0d8927fc92c8cd4ffdd74c0fc0a7667ed2f3f1aab396b59c3edc81dd4f64e6
|
7
|
+
data.tar.gz: 909d257d6fde36ff54c28823e10ce6606386164c5284d362a6e2b899af3408093f756b12300b792f36a58cf1eccc131c2697c4ebf86f734f15ccbfad529109db
|
data/Gemfile.lock
CHANGED
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',
|
39
|
-
parser.on('-e', '--enable',
|
40
|
-
parser.on('-y', '--
|
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
|
-
|
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,
|
131
|
-
|
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
|
data/lib/xlogin/firmware.rb
CHANGED
@@ -7,7 +7,7 @@ module Xlogin
|
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
@timeout = 5
|
10
|
-
@
|
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
|
20
|
-
@
|
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 @
|
46
|
-
klass.class_exec(@
|
47
|
-
alias_method :
|
48
|
-
define_method(:
|
49
|
-
|
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
|
-
|
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::
|
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::
|
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::
|
85
|
+
raise Xlogin::HostNotFound.new("host not found: '#{hostname}'") unless hostinfo
|
86
86
|
|
87
87
|
build(hostinfo.merge(args))
|
88
88
|
end
|
data/lib/xlogin/rake_task.rb
CHANGED
@@ -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
|
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
|
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)
|
data/lib/xlogin/session.rb
CHANGED
@@ -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
|
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
data/lib/xlogin/version.rb
CHANGED
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
|
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.
|
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-
|
11
|
+
date: 2017-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-telnet
|