ztk 1.14.1 → 1.15.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.
- checksums.yaml +8 -8
- data/lib/ztk/base.rb +1 -7
- data/lib/ztk/logger.rb +69 -14
- data/lib/ztk/ssh/download.rb +40 -29
- data/lib/ztk/ssh/upload.rb +40 -29
- data/lib/ztk/version.rb +1 -1
- data/spec/ztk/background_spec.rb +1 -0
- data/spec/ztk/logger_spec.rb +2 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ODJhNjRkODMyODczZDA0ZTNhN2RjZjI1Y2Q2OTY3MWMzNzlhYzUzYg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YjMzYjJlOGY0ZTkxOTg4NzhmZDMyMzE0NDNiNjE2YTdiZDBjMzZjZA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OGYyMTI5ODlhNzNmYzAxNDc1N2E2MjZmYzRkNGRmYzBkODc4YjBhNTZjYzgw
|
10
|
+
NTU4NTczMzJkYWY0N2EzNzA5ZmViODM4YWJmY2MxYjE5OGExZWU4OTIxNTcx
|
11
|
+
N2JjNDY4MTI5NjBjYjFkNzBmMzEwMzFlMGIyMzRiNmZmMDhiOGQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjM4MDk0NDRkOGYxNDk3NmQxODQ1YTNmOTY0ZmJiYmI4MTE1NTljYmZlN2M5
|
14
|
+
OTNjZjE4ZTkzZjc4M2RiZTcxMzkxNDQwY2RiMTBjMDY5NDJhMzM5NGJjZDEz
|
15
|
+
ZmY5MGZiYjg0ZDQ4YWFiMjFjYzA3NGE3MWNmM2YxZWUzMjY0YmY=
|
data/lib/ztk/base.rb
CHANGED
@@ -128,13 +128,7 @@ module ZTK
|
|
128
128
|
if !block_given?
|
129
129
|
log_and_raise(BaseError, "You must supply a block to the log method!")
|
130
130
|
elsif (@config.ui.logger.level <= ZTK::Logger.const_get(log_level.to_s.upcase))
|
131
|
-
|
132
|
-
@config.ui.logger.logdev.write(ZTK::ANSI.uncolor(yield))
|
133
|
-
@config.ui.logger.logdev.respond_to?(:flush) and @config.ui.logger.logdev.flush
|
134
|
-
else
|
135
|
-
@config.ui.logger.instance_variable_get(:@logdev).instance_variable_get(:@dev).write(ZTK::ANSI.uncolor(yield))
|
136
|
-
@config.ui.logger.instance_variable_get(:@logdev).instance_variable_get(:@dev).respond_to?(:flush) and @config.ui.logger.instance_variable_get(:@logdev).instance_variable_get(:@dev).flush
|
137
|
-
end
|
131
|
+
@config.ui.logger << ZTK::ANSI.uncolor(yield)
|
138
132
|
end
|
139
133
|
end
|
140
134
|
|
data/lib/ztk/logger.rb
CHANGED
@@ -4,9 +4,14 @@ module ZTK
|
|
4
4
|
|
5
5
|
# Standard Logging Class
|
6
6
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
7
|
+
# Allows chaining standard Ruby loggers as well as adding extra spice to your
|
8
|
+
# log messages. This includes uSec timestamping, PIDs and caller tree
|
9
|
+
# details.
|
10
|
+
#
|
11
|
+
# This class accepts the same initialize arguments as the Ruby logger class.
|
12
|
+
# You can chain multiple loggers together, for example to get an effect of
|
13
|
+
# logging to STDOUT and a file simultaneously without having to modify your
|
14
|
+
# existing logging statements.
|
10
15
|
#
|
11
16
|
# One can override the logging level on the command line with programs that
|
12
17
|
# use this library like so:
|
@@ -22,21 +27,70 @@ module ZTK
|
|
22
27
|
# $logger.error { "This is a error message!" }
|
23
28
|
# $logger.fatal { "This is a fatal message!" }
|
24
29
|
#
|
30
|
+
# = Simple logger chain:
|
31
|
+
#
|
32
|
+
# logger = ZTK::Logger.new
|
33
|
+
# logger.loggers << ::Logger.new(STDOUT)
|
34
|
+
# logger.loggers << ::Logger.new('test.log')
|
35
|
+
#
|
36
|
+
# logger.debug { "This will be written to STDOUT as well as test.log!" }
|
37
|
+
#
|
38
|
+
# = Alternate logger chaining:
|
39
|
+
#
|
40
|
+
# logger = ZTK::Logger.new(STDOUT)
|
41
|
+
# logger.loggers << ::Logger.new('test.log')
|
42
|
+
#
|
43
|
+
# logger.debug { "This will be written to STDOUT as well as test.log!" }
|
44
|
+
#
|
25
45
|
# @author Zachary Patten <zachary AT jovelabs DOT com>
|
26
46
|
class Logger < ::Logger
|
27
|
-
attr_accessor :stdout_echo
|
28
47
|
|
29
48
|
# Log Levels
|
30
49
|
SEVERITIES = Severity.constants.inject([]) {|arr,c| arr[Severity.const_get(c)] = c; arr}
|
31
50
|
|
51
|
+
class LogDevice
|
52
|
+
attr_reader :dev
|
53
|
+
attr_reader :filename
|
54
|
+
|
55
|
+
def initialize(chain)
|
56
|
+
@chain = chain
|
57
|
+
@dev = nil
|
58
|
+
@filename = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def write(message)
|
62
|
+
@chain.loggers.each do |logger|
|
63
|
+
logger << message
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def close
|
68
|
+
@chain.loggers.each do |logger|
|
69
|
+
logger.instance_variable_get(:@logdev).close
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
attr_accessor :loggers
|
76
|
+
|
32
77
|
def initialize(*args)
|
33
|
-
super(
|
78
|
+
super(StringIO.new)
|
79
|
+
|
80
|
+
@loggers = Array.new
|
81
|
+
if args.count > 0
|
82
|
+
@loggers << ::Logger.new(*args)
|
83
|
+
end
|
84
|
+
|
85
|
+
@logdev = LogDevice.new(self)
|
86
|
+
|
34
87
|
set_log_level
|
35
88
|
end
|
36
89
|
|
37
|
-
#
|
38
|
-
def
|
39
|
-
@logdev.instance_variable_get(:@dev)
|
90
|
+
# Generates a human-readable string about the logger.
|
91
|
+
def inspect
|
92
|
+
loggers_inspect = @loggers.collect{|logger| logger.instance_variable_get(:@logdev).instance_variable_get(:@dev).inspect }.join(', ')
|
93
|
+
"#<#{self.class} loggers=[#{loggers_inspect}]>"
|
40
94
|
end
|
41
95
|
|
42
96
|
# Specialized logging. Logs messages in the same format, except has the
|
@@ -55,9 +109,12 @@ module ZTK
|
|
55
109
|
add(severity, nil, nil, shift, &block)
|
56
110
|
end
|
57
111
|
|
58
|
-
|
59
|
-
|
60
|
-
|
112
|
+
def level=(value)
|
113
|
+
@level = value
|
114
|
+
|
115
|
+
@loggers.each { |logger| logger.level = @level }
|
116
|
+
|
117
|
+
value
|
61
118
|
end
|
62
119
|
|
63
120
|
|
@@ -96,9 +153,7 @@ module ZTK
|
|
96
153
|
message = [message, progname].flatten.compact.join(": ")
|
97
154
|
message = "%19s.%06d|%05d|%5s|%s%s\n" % [Time.now.utc.strftime("%Y-%m-%d|%H:%M:%S"), Time.now.utc.usec, Process.pid, SEVERITIES[severity], called_by, message]
|
98
155
|
|
99
|
-
|
100
|
-
(stdout_echo == true) and $stdout.write(statement)
|
101
|
-
@logdev.write(statement)
|
156
|
+
@logdev.write(ZTK::ANSI.uncolor(message))
|
102
157
|
@logdev.respond_to?(:flush) and @logdev.flush
|
103
158
|
|
104
159
|
true
|
data/lib/ztk/ssh/download.rb
CHANGED
@@ -41,45 +41,56 @@ module ZTK
|
|
41
41
|
options.ui.logger.info { "download(#{remote.inspect}, #{local.inspect})" }
|
42
42
|
|
43
43
|
ZTK::RescueRetry.try(:ui => config.ui, :tries => ZTK::SSH::RESCUE_RETRY_ATTEMPTS, :on_retry => method(:on_retry)) do
|
44
|
-
if (options.use_scp ==
|
45
|
-
|
46
|
-
case event
|
47
|
-
when :open
|
48
|
-
options.ui.logger.debug { "download(#{args[0].remote} -> #{args[0].local})" }
|
49
|
-
options.on_progress.nil? or options.on_progress.call(:open, args)
|
50
|
-
when :close
|
51
|
-
options.ui.logger.debug { "close(#{args[0].local})" }
|
52
|
-
options.on_progress.nil? or options.on_progress.call(:close, args)
|
53
|
-
when :mkdir
|
54
|
-
options.ui.logger.debug { "mkdir(#{args[0]})" }
|
55
|
-
options.on_progress.nil? or options.on_progress.call(:mkdir, args)
|
56
|
-
when :get
|
57
|
-
options.ui.logger.debug { "get(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
|
58
|
-
options.on_progress.nil? or options.on_progress.call(:get, args)
|
59
|
-
when :finish
|
60
|
-
options.ui.logger.debug { "finish" }
|
61
|
-
options.on_progress.nil? or options.on_progress.call(:finish, args)
|
62
|
-
end
|
63
|
-
end
|
44
|
+
if (options.use_scp == true)
|
45
|
+
scp_download(remote, local, options)
|
64
46
|
else
|
65
|
-
|
66
|
-
|
47
|
+
sftp_download(remote, local, options)
|
48
|
+
end
|
49
|
+
end
|
67
50
|
|
68
|
-
|
69
|
-
|
51
|
+
true
|
52
|
+
end
|
70
53
|
|
71
|
-
opened or (options.on_progress.nil? or options.on_progress.call(:open, args) and (opened = true))
|
72
54
|
|
73
|
-
|
74
|
-
options.on_progress.nil? or options.on_progress.call(:get, args)
|
75
|
-
end
|
55
|
+
private
|
76
56
|
|
57
|
+
def sftp_download(remote, local, options={})
|
58
|
+
sftp.download!(remote.to_s, local.to_s, options.send(:table)) do |event, downloader, *args|
|
59
|
+
case event
|
60
|
+
when :open
|
61
|
+
options.ui.logger.debug { "download(#{args[0].remote} -> #{args[0].local})" }
|
62
|
+
options.on_progress.nil? or options.on_progress.call(:open, args)
|
63
|
+
when :close
|
64
|
+
options.ui.logger.debug { "close(#{args[0].local})" }
|
65
|
+
options.on_progress.nil? or options.on_progress.call(:close, args)
|
66
|
+
when :mkdir
|
67
|
+
options.ui.logger.debug { "mkdir(#{args[0]})" }
|
68
|
+
options.on_progress.nil? or options.on_progress.call(:mkdir, args)
|
69
|
+
when :get
|
70
|
+
options.ui.logger.debug { "get(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
|
71
|
+
options.on_progress.nil? or options.on_progress.call(:get, args)
|
72
|
+
when :finish
|
77
73
|
options.ui.logger.debug { "finish" }
|
78
74
|
options.on_progress.nil? or options.on_progress.call(:finish, args)
|
79
75
|
end
|
80
76
|
end
|
77
|
+
end
|
81
78
|
|
82
|
-
|
79
|
+
def scp_download(remote, local, options={})
|
80
|
+
opened = false
|
81
|
+
args = []
|
82
|
+
|
83
|
+
scp.download!(remote.to_s, local.to_s, options.send(:table)) do |ch, name, sent, total|
|
84
|
+
args = [ OpenStruct.new(:size => total, :local => name, :remote => name), sent, '' ]
|
85
|
+
|
86
|
+
opened or (options.on_progress.nil? or options.on_progress.call(:open, args) and (opened = true))
|
87
|
+
|
88
|
+
options.ui.logger.debug { "get(#{args[0].remote}, sent #{args[1]}, total #{args[0].size})" }
|
89
|
+
options.on_progress.nil? or options.on_progress.call(:get, args)
|
90
|
+
end
|
91
|
+
|
92
|
+
options.ui.logger.debug { "finish" }
|
93
|
+
options.on_progress.nil? or options.on_progress.call(:finish, args)
|
83
94
|
end
|
84
95
|
|
85
96
|
end
|
data/lib/ztk/ssh/upload.rb
CHANGED
@@ -39,45 +39,56 @@ module ZTK
|
|
39
39
|
config.ui.logger.info { "upload(#{local.inspect}, #{remote.inspect})" }
|
40
40
|
|
41
41
|
ZTK::RescueRetry.try(:ui => config.ui, :tries => ZTK::SSH::RESCUE_RETRY_ATTEMPTS, :on_retry => method(:on_retry)) do
|
42
|
-
if (options.use_scp ==
|
43
|
-
|
44
|
-
case event
|
45
|
-
when :open
|
46
|
-
options.ui.logger.debug { "upload(#{args[0].local} -> #{args[0].remote})" }
|
47
|
-
options.on_progress.nil? or options.on_progress.call(:open, args)
|
48
|
-
when :close
|
49
|
-
options.ui.logger.debug { "close(#{args[0].remote})" }
|
50
|
-
options.on_progress.nil? or options.on_progress.call(:close, args)
|
51
|
-
when :mkdir
|
52
|
-
options.ui.logger.debug { "mkdir(#{args[0]})" }
|
53
|
-
options.on_progress.nil? or options.on_progress.call(:mkdir, args)
|
54
|
-
when :put
|
55
|
-
options.ui.logger.debug { "put(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
|
56
|
-
options.on_progress.nil? or options.on_progress.call(:put, args)
|
57
|
-
when :finish
|
58
|
-
options.ui.logger.debug { "finish" }
|
59
|
-
options.on_progress.nil? or options.on_progress.call(:finish, args)
|
60
|
-
end
|
61
|
-
end
|
42
|
+
if (options.use_scp == true)
|
43
|
+
scp_upload(local, remote, options)
|
62
44
|
else
|
63
|
-
|
64
|
-
|
45
|
+
sftp_upload(local, remote, options)
|
46
|
+
end
|
47
|
+
end
|
65
48
|
|
66
|
-
|
67
|
-
|
49
|
+
true
|
50
|
+
end
|
68
51
|
|
69
|
-
opened or (options.on_progress.nil? or options.on_progress.call(:open, args) and (opened = true))
|
70
52
|
|
71
|
-
|
72
|
-
options.on_progress.nil? or options.on_progress.call(:put, args)
|
73
|
-
end
|
53
|
+
private
|
74
54
|
|
55
|
+
def sftp_upload(local, remote, options={})
|
56
|
+
sftp.upload!(local.to_s, remote.to_s) do |event, uploader, *args|
|
57
|
+
case event
|
58
|
+
when :open
|
59
|
+
options.ui.logger.debug { "upload(#{args[0].local} -> #{args[0].remote})" }
|
60
|
+
options.on_progress.nil? or options.on_progress.call(:open, args)
|
61
|
+
when :close
|
62
|
+
options.ui.logger.debug { "close(#{args[0].remote})" }
|
63
|
+
options.on_progress.nil? or options.on_progress.call(:close, args)
|
64
|
+
when :mkdir
|
65
|
+
options.ui.logger.debug { "mkdir(#{args[0]})" }
|
66
|
+
options.on_progress.nil? or options.on_progress.call(:mkdir, args)
|
67
|
+
when :put
|
68
|
+
options.ui.logger.debug { "put(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
|
69
|
+
options.on_progress.nil? or options.on_progress.call(:put, args)
|
70
|
+
when :finish
|
75
71
|
options.ui.logger.debug { "finish" }
|
76
72
|
options.on_progress.nil? or options.on_progress.call(:finish, args)
|
77
73
|
end
|
78
74
|
end
|
75
|
+
end
|
79
76
|
|
80
|
-
|
77
|
+
def scp_upload(local, remote, options={})
|
78
|
+
opened = false
|
79
|
+
args = []
|
80
|
+
|
81
|
+
scp.upload!(local.to_s, remote.to_s, options.send(:table)) do |ch, name, sent, total|
|
82
|
+
args = [ OpenStruct.new(:size => total, :local => name, :remote => name), sent, '' ]
|
83
|
+
|
84
|
+
opened or (options.on_progress.nil? or options.on_progress.call(:open, args) and (opened = true))
|
85
|
+
|
86
|
+
options.ui.logger.debug { "put(#{args[0].remote}, sent #{args[1]}, total #{args[0].size})" }
|
87
|
+
options.on_progress.nil? or options.on_progress.call(:put, args)
|
88
|
+
end
|
89
|
+
|
90
|
+
options.ui.logger.debug { "finish" }
|
91
|
+
options.on_progress.nil? or options.on_progress.call(:finish, args)
|
81
92
|
end
|
82
93
|
|
83
94
|
end
|
data/lib/ztk/version.rb
CHANGED
data/spec/ztk/background_spec.rb
CHANGED
data/spec/ztk/logger_spec.rb
CHANGED
@@ -46,10 +46,6 @@ describe ZTK::Logger do
|
|
46
46
|
subject.should be_an_instance_of ZTK::Logger
|
47
47
|
end
|
48
48
|
|
49
|
-
it "should provide access to the raw log file handle" do
|
50
|
-
subject.logdev.should be_an_instance_of File
|
51
|
-
end
|
52
|
-
|
53
49
|
end
|
54
50
|
|
55
51
|
describe "general logging functionality" do
|
@@ -85,17 +81,16 @@ describe ZTK::Logger do
|
|
85
81
|
|
86
82
|
it "should allow writing directly to the log device" do
|
87
83
|
data = "Hello World"
|
88
|
-
subject
|
84
|
+
subject << data
|
89
85
|
IO.read(@logfile).match(data).should_not be nil
|
90
86
|
end
|
91
87
|
|
92
88
|
it "should allow us to echo log statements to STDOUT" do
|
93
89
|
data = "Hello World"
|
94
90
|
stdout = StringIO.new
|
95
|
-
|
96
91
|
$stdout = stdout
|
92
|
+
subject.loggers = [ ::Logger.new($stdout) ]
|
97
93
|
|
98
|
-
subject.stdout_echo = true
|
99
94
|
subject.debug { data }
|
100
95
|
|
101
96
|
stdout.rewind
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ztk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zachary Patten
|
@@ -288,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
288
288
|
version: '0'
|
289
289
|
requirements: []
|
290
290
|
rubyforge_project:
|
291
|
-
rubygems_version: 2.
|
291
|
+
rubygems_version: 2.1.11
|
292
292
|
signing_key:
|
293
293
|
specification_version: 4
|
294
294
|
summary: Zachary's (DevOp) Tool Kit
|