xlogin 0.10.6 → 0.10.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/xlogin/delegator.rb +1 -1
- data/lib/xlogin/factory.rb +11 -8
- data/lib/xlogin/rake_task.rb +17 -31
- data/lib/xlogin/session.rb +17 -12
- data/lib/xlogin/session_pool.rb +3 -11
- data/lib/xlogin/spec.rb +0 -2
- data/lib/xlogin/template.rb +3 -9
- data/lib/xlogin/version.rb +1 -1
- data/lib/xlogin.rb +6 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3f7a65ed48d5aa25928be4d31714657faa282f21fe317908c6da68f61ce9ab9
|
4
|
+
data.tar.gz: 4fc355338732d7df48ef787a152171460c334c3e9494c251e3472c4c892af84a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13df83043b60975e0e17a505b0568aec8c779ff321ba512fbecf1bc654a80d044a5221ca9b69db048c3f1b6412706da05cc013b9ec5ff8c82fcadbb76988202f
|
7
|
+
data.tar.gz: '063955b5da490638837d0bc04f35c867ba4fe4861d56862854a06939f11d56b94afafec329c0bebc339894e649b34ee509b94b95cb07dfe859c2de9d272f48e6'
|
data/lib/xlogin/delegator.rb
CHANGED
@@ -15,7 +15,7 @@ module Xlogin
|
|
15
15
|
|
16
16
|
login = @methods.fetch(:login)
|
17
17
|
delegate = @methods.fetch(:delegate)
|
18
|
-
raise TemplateError.new("'login' and 'delegate' must be defined in the #{target_info[:type]} template.") unless login && delegate
|
18
|
+
raise TemplateError.new("'login' and 'delegate' methods must be defined in the #{target_info[:type]} template.") unless login && delegate
|
19
19
|
|
20
20
|
relay_uri = Addressable::URI.parse(uri.to_s)
|
21
21
|
userinfo_cache = relay_uri.userinfo.dup
|
data/lib/xlogin/factory.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'addressable/uri'
|
2
2
|
require 'singleton'
|
3
|
+
require 'xlogin/session_pool'
|
3
4
|
require 'xlogin/template'
|
4
5
|
|
5
6
|
module Xlogin
|
@@ -13,9 +14,8 @@ module Xlogin
|
|
13
14
|
@session_pool = Hash.new
|
14
15
|
end
|
15
16
|
|
16
|
-
def set_inventory(**opts)
|
17
|
-
|
18
|
-
@inventory[name] = (get_inventory(name) || {}).merge(opts)
|
17
|
+
def set_inventory(name, **opts)
|
18
|
+
@inventory[name] = (get_inventory(name) || {name: name}).merge(opts)
|
19
19
|
end
|
20
20
|
|
21
21
|
def get_inventory(name)
|
@@ -34,14 +34,14 @@ module Xlogin
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def set_template(name, text = nil, &block)
|
37
|
-
template = get_template(name)
|
37
|
+
template = get_template(name) || Xlogin::Template.new(name)
|
38
38
|
template.instance_eval(text) if text
|
39
39
|
template.instance_eval(&block) if block
|
40
40
|
@templates[name.to_s.downcase] = template
|
41
41
|
end
|
42
42
|
|
43
43
|
def get_template(name)
|
44
|
-
@templates[name.to_s.downcase]
|
44
|
+
@templates[name.to_s.downcase]
|
45
45
|
end
|
46
46
|
|
47
47
|
def list_templates
|
@@ -50,6 +50,8 @@ module Xlogin
|
|
50
50
|
|
51
51
|
def build(type:, **opts)
|
52
52
|
template = get_template(type)
|
53
|
+
raise TemplateError.new("Template not found: '#{type}'") unless template
|
54
|
+
|
53
55
|
template.build(uri(opts), **opts)
|
54
56
|
end
|
55
57
|
|
@@ -73,15 +75,16 @@ module Xlogin
|
|
73
75
|
|
74
76
|
private
|
75
77
|
def uri(**opts)
|
76
|
-
return opts[:uri].strip if opts.key?(:uri)
|
77
|
-
raise SessionError.new("Invalid target: '#{opts}'") unless opts[:scheme] && opts[:host]
|
78
|
+
return Addressable::URI.parse(opts[:uri].strip) if opts.key?(:uri)
|
78
79
|
|
79
80
|
scheme = opts[:scheme].strip
|
80
81
|
address = opts.values_at(:host, :port).compact.map(&:strip).join(':')
|
81
82
|
userinfo = opts[:userinfo].strip
|
82
83
|
userinfo ||= opts.values_at(:username, :password).compact.map(&:strip).join(':')
|
83
84
|
|
84
|
-
"#{scheme}://" + [userinfo, address].compact.join('@')
|
85
|
+
Addressable::URI.parse("#{scheme}://" + [userinfo, address].compact.join('@'))
|
86
|
+
rescue
|
87
|
+
raise SessionError.new("Invalid target - '#{opts}'")
|
85
88
|
end
|
86
89
|
|
87
90
|
end
|
data/lib/xlogin/rake_task.rb
CHANGED
@@ -5,21 +5,18 @@ require 'ostruct'
|
|
5
5
|
require 'stringio'
|
6
6
|
|
7
7
|
module Xlogin
|
8
|
-
|
9
8
|
class RakeTask < Rake::TaskLib
|
10
9
|
|
11
10
|
class << self
|
12
11
|
include Rake::DSL
|
13
12
|
|
14
|
-
def generate(*
|
15
|
-
hostnames = target.flat_map { |e| Xlogin.list(e) }.map { |e| e[:name] }
|
16
|
-
|
13
|
+
def generate(*patterns, **opts, &block)
|
17
14
|
description = Rake.application.last_description
|
18
|
-
|
15
|
+
hostnames = Xlogin.list(*patterns).map { |e| e[:name] }
|
19
16
|
|
20
|
-
|
17
|
+
task 'all' => hostnames if !!opts[:all]
|
21
18
|
hostnames.each do |hostname|
|
22
|
-
desc description
|
19
|
+
desc "#{description} - #{hostname}" if !!opts[:desc]
|
23
20
|
RakeTask.new(hostname, &block)
|
24
21
|
end
|
25
22
|
|
@@ -27,7 +24,6 @@ module Xlogin
|
|
27
24
|
end
|
28
25
|
|
29
26
|
attr_reader :name
|
30
|
-
attr_reader :taskname
|
31
27
|
attr_accessor :lock
|
32
28
|
attr_accessor :log
|
33
29
|
attr_accessor :silent
|
@@ -37,9 +33,7 @@ module Xlogin
|
|
37
33
|
|
38
34
|
def initialize(name)
|
39
35
|
@name = name
|
40
|
-
@taskname = [*Rake.application.current_scope.to_a.reverse, name].join(':')
|
41
36
|
@runner = nil
|
42
|
-
@config = OpenStruct.new
|
43
37
|
@silent ||= Rake.application.options.silent
|
44
38
|
@fail_on_error = true
|
45
39
|
|
@@ -47,21 +41,17 @@ module Xlogin
|
|
47
41
|
define
|
48
42
|
end
|
49
43
|
|
50
|
-
def
|
51
|
-
|
44
|
+
def name_with_scope
|
45
|
+
[*Rake.application.current_scope.to_a.reverse, name].join(':')
|
52
46
|
end
|
53
47
|
|
54
|
-
def
|
55
|
-
|
56
|
-
@config.send(name, *args)
|
48
|
+
def run(&block)
|
49
|
+
@runner = block
|
57
50
|
end
|
51
|
+
alias_method :start, :run
|
58
52
|
|
59
53
|
private
|
60
54
|
def define
|
61
|
-
description = Rake.application.last_description
|
62
|
-
description = "#{description} - #{name}" if description
|
63
|
-
desc description
|
64
|
-
|
65
55
|
mkdir_p(File.dirname(log), verbose: Rake.application.options.trace) if log
|
66
56
|
mkdir_p(File.dirname(lock), verbose: Rake.application.options.trace) if lock
|
67
57
|
|
@@ -70,7 +60,6 @@ module Xlogin
|
|
70
60
|
file(lock) do
|
71
61
|
next if @@graceful_shutdown
|
72
62
|
run_task
|
73
|
-
mkdir_p(File.dirname(lock), verbose: Rake.application.options.trace)
|
74
63
|
touch(lock, verbose: Rake.application.options.trace)
|
75
64
|
end
|
76
65
|
else
|
@@ -88,18 +77,16 @@ module Xlogin
|
|
88
77
|
loggers << buffer if !silent && Rake.application.options.always_multitask
|
89
78
|
loggers << $stdout if !silent && !Rake.application.options.always_multitask
|
90
79
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
session.close if session
|
80
|
+
session = Xlogin.get(name, log: loggers)
|
81
|
+
@runner.call(session)
|
82
|
+
session.close rescue nil
|
95
83
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
84
|
+
printf($stdout, buffer.string) if !silent && Rake.application.options.always_multitask
|
85
|
+
rescue => e
|
86
|
+
output($stderr, buffer.string) if !silent && Rake.application.options.always_multitask
|
87
|
+
output($stderr, "[ERROR] #{e}\n")
|
100
88
|
|
101
|
-
|
102
|
-
end
|
89
|
+
@@graceful_shutdown = true if fail_on_error
|
103
90
|
end
|
104
91
|
|
105
92
|
def printf(fp, text)
|
@@ -112,5 +99,4 @@ module Xlogin
|
|
112
99
|
end
|
113
100
|
|
114
101
|
end
|
115
|
-
|
116
102
|
end
|
data/lib/xlogin/session.rb
CHANGED
@@ -21,8 +21,6 @@ module Xlogin
|
|
21
21
|
when 'telnet' then 23
|
22
22
|
end
|
23
23
|
|
24
|
-
raise SessionError.new("Invalid URI - '#{uri}'") unless @host && @port
|
25
|
-
|
26
24
|
@name = opts[:name] || @host
|
27
25
|
@config = OpenStruct.new(opts)
|
28
26
|
@template = template
|
@@ -54,6 +52,11 @@ module Xlogin
|
|
54
52
|
@template.name
|
55
53
|
end
|
56
54
|
|
55
|
+
def enable(*args)
|
56
|
+
return super(*args) unless args.empty?
|
57
|
+
super(@config.enable)
|
58
|
+
end
|
59
|
+
|
57
60
|
def prompt
|
58
61
|
cmd('').to_s.lines.last&.chomp
|
59
62
|
end
|
@@ -63,17 +66,18 @@ module Xlogin
|
|
63
66
|
end
|
64
67
|
|
65
68
|
def puts(*args, &block)
|
66
|
-
args = [instance_exec(*args, &@template.interrupt)].flatten if @template.interrupt
|
67
|
-
super(*args, &block)
|
69
|
+
args = [instance_exec(*args, &@template.interrupt!)].flatten.compact if @template.interrupt!
|
70
|
+
super(*args, &block) unless args.empty?
|
68
71
|
end
|
69
72
|
|
70
73
|
def waitfor(*args, &block)
|
74
|
+
args = [Regexp.union(*@template.prompt.map(&:first))] if args.empty?
|
71
75
|
@mutex.synchronize { _waitfor(*args, &block) }
|
72
76
|
end
|
73
77
|
|
74
78
|
def close
|
75
79
|
@mutex.synchronize do
|
76
|
-
@loggers.
|
80
|
+
@loggers.each do |_, logger|
|
77
81
|
next if logger.nil? || [$stdout, $stderr].include?(logger)
|
78
82
|
logger.close
|
79
83
|
end
|
@@ -101,10 +105,10 @@ module Xlogin
|
|
101
105
|
|
102
106
|
private
|
103
107
|
def _waitfor(*args, &block)
|
104
|
-
|
105
|
-
line =
|
106
|
-
block.call(recv) if block
|
108
|
+
__waitfor = method(:waitfor).super_method
|
109
|
+
line = __waitfor.call(*args) do |recv|
|
107
110
|
output_log(recv)
|
111
|
+
block.call(recv) if block
|
108
112
|
end
|
109
113
|
|
110
114
|
_, process = @template.prompt.find { |r, p| r =~ line && p }
|
@@ -116,6 +120,10 @@ module Xlogin
|
|
116
120
|
return line
|
117
121
|
end
|
118
122
|
|
123
|
+
def output_log(text)
|
124
|
+
@loggers.each { |_, logger| logger.syswrite(text) if logger }
|
125
|
+
end
|
126
|
+
|
119
127
|
def ssh_tunnel(gateway)
|
120
128
|
gateway_uri = Addressable::URI.parse(gateway)
|
121
129
|
case gateway_uri.scheme
|
@@ -133,10 +141,6 @@ module Xlogin
|
|
133
141
|
end
|
134
142
|
end
|
135
143
|
|
136
|
-
def output_log(text)
|
137
|
-
@loggers.values.each { |logger| logger.syswrite(text) if logger }
|
138
|
-
end
|
139
|
-
|
140
144
|
def build_logger(log)
|
141
145
|
case log
|
142
146
|
when String
|
@@ -149,5 +153,6 @@ module Xlogin
|
|
149
153
|
log
|
150
154
|
end
|
151
155
|
end
|
156
|
+
|
152
157
|
end
|
153
158
|
end
|
data/lib/xlogin/session_pool.rb
CHANGED
@@ -2,7 +2,6 @@ require 'time'
|
|
2
2
|
require 'thread'
|
3
3
|
|
4
4
|
module Xlogin
|
5
|
-
|
6
5
|
class SessionPool
|
7
6
|
|
8
7
|
DEFAULT_POOL_SIZE = 1
|
@@ -14,14 +13,8 @@ module Xlogin
|
|
14
13
|
@args = args
|
15
14
|
@opts = opts
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
@size = @opts.delete(:pool_size) || DEFAULT_POOL_SIZE
|
20
|
-
@idle = @opts.delete(:pool_idle) || DEFAULT_POOL_IDLE
|
21
|
-
when Hash
|
22
|
-
@size = @args.delete(:pool_size) || DEFAULT_POOL_SIZE
|
23
|
-
@idle = @args.delete(:pool_idle) || DEFAULT_POOL_IDLE
|
24
|
-
end
|
16
|
+
@size = DEFAULT_POOL_SIZE
|
17
|
+
@idle = DEFAULT_POOL_IDLE
|
25
18
|
|
26
19
|
@mutex = Mutex.new
|
27
20
|
@queue = Queue.new
|
@@ -39,7 +32,7 @@ module Xlogin
|
|
39
32
|
def with
|
40
33
|
session = deq
|
41
34
|
begin
|
42
|
-
session.prompt
|
35
|
+
session.prompt # confirm that the session is still alive
|
43
36
|
rescue IOError, EOFError, Errno::ECONNABORTED, Errno::ECONNREFUSED, Errno::ECONNRESET
|
44
37
|
destroy session
|
45
38
|
session = deq
|
@@ -94,5 +87,4 @@ module Xlogin
|
|
94
87
|
end
|
95
88
|
|
96
89
|
end
|
97
|
-
|
98
90
|
end
|
data/lib/xlogin/spec.rb
CHANGED
data/lib/xlogin/template.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'addressable/uri'
|
2
1
|
require 'xlogin/ssh'
|
3
2
|
require 'xlogin/telnet'
|
4
3
|
|
@@ -10,7 +9,6 @@ module Xlogin
|
|
10
9
|
RESERVED_METHODS = %i( login logout enable disable delegate )
|
11
10
|
|
12
11
|
attr_reader :name
|
13
|
-
attr_reader :methods
|
14
12
|
|
15
13
|
def initialize(name)
|
16
14
|
@name = name
|
@@ -35,20 +33,15 @@ module Xlogin
|
|
35
33
|
@methods[name] = block
|
36
34
|
end
|
37
35
|
|
38
|
-
def interrupt(&block)
|
36
|
+
def interrupt!(&block)
|
39
37
|
return @interrupt unless block
|
40
38
|
@interrupt = block
|
41
39
|
end
|
42
40
|
|
43
41
|
def build(uri, **opts)
|
44
|
-
uri = Addressable::URI.parse(uri.to_s)
|
45
42
|
klass = Class.new(Xlogin.const_get(uri.scheme.capitalize))
|
46
43
|
klass.class_exec(@methods) do |methods|
|
47
44
|
methods.each do |name, block|
|
48
|
-
if name == :enable
|
49
|
-
define_method(name) { |*args| instance_exec([*args, opts[name]].first, &block) }
|
50
|
-
next
|
51
|
-
end
|
52
45
|
define_method(name, &block)
|
53
46
|
end
|
54
47
|
end
|
@@ -57,8 +50,9 @@ module Xlogin
|
|
57
50
|
end
|
58
51
|
|
59
52
|
def method_missing(name, *, &block)
|
60
|
-
super unless RESERVED_METHODS.include?(name)
|
53
|
+
super unless RESERVED_METHODS.include?(name)
|
61
54
|
bind(name) { |*args| instance_exec(*args, &block) }
|
62
55
|
end
|
56
|
+
|
63
57
|
end
|
64
58
|
end
|
data/lib/xlogin/version.rb
CHANGED
data/lib/xlogin.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
$:.unshift File.dirname(__FILE__)
|
2
2
|
|
3
3
|
require 'xlogin/factory'
|
4
|
-
require 'xlogin/session_pool'
|
5
4
|
require 'xlogin/version'
|
6
5
|
|
7
6
|
module Xlogin
|
@@ -16,20 +15,21 @@ module Xlogin
|
|
16
15
|
@factory ||= Xlogin::Factory.instance
|
17
16
|
end
|
18
17
|
|
18
|
+
def list(*patterns)
|
19
|
+
factory.list_inventory(*patterns)
|
20
|
+
end
|
21
|
+
|
19
22
|
def get(args, **opts, &block)
|
20
23
|
session = case args
|
21
24
|
when Hash then factory.build(**args.merge(**opts))
|
22
25
|
when String then factory.build_from_hostname(args, **opts)
|
26
|
+
else return
|
23
27
|
end
|
24
28
|
|
25
29
|
return session unless block
|
26
30
|
begin block.call(session) ensure session.close end
|
27
31
|
end
|
28
32
|
|
29
|
-
def list(*patterns)
|
30
|
-
factory.list_inventory(*patterns)
|
31
|
-
end
|
32
|
-
|
33
33
|
def get_pool(args, **opts, &block)
|
34
34
|
pool = factory.build_pool(args, **opts)
|
35
35
|
|
@@ -56,10 +56,6 @@ module Xlogin
|
|
56
56
|
@authorized = boolean == true || (block && block.call == true)
|
57
57
|
end
|
58
58
|
|
59
|
-
def register(**args)
|
60
|
-
factory.set_inventory(**args)
|
61
|
-
end
|
62
|
-
|
63
59
|
def source(*source_files, &block)
|
64
60
|
return source_file(*source_files) unless block
|
65
61
|
instance_eval(&block) unless source_files.empty?
|
@@ -99,7 +95,7 @@ module Xlogin
|
|
99
95
|
opts = args[2] || {}
|
100
96
|
|
101
97
|
super unless args.size == 2 || args.size == 3
|
102
|
-
|
98
|
+
factory.set_inventory(name, type: type, uri: uri, **opts)
|
103
99
|
end
|
104
100
|
|
105
101
|
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.10.
|
4
|
+
version: 0.10.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- haccht
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-telnet
|