logger_pipe 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +8 -0
- data/lib/logger_pipe/runner.rb +37 -13
- data/lib/logger_pipe/version.rb +1 -1
- data/spec/logger_pipe_spec.rb +19 -0
- data/spec/stderr_test.sh +7 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd276efaaeaec72d772ef2850226516e2fdbd75d
|
4
|
+
data.tar.gz: 3a8b2f21d9a5e920db4dd4ead277e89a78a0941d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf66b0f214bb5dbb5370cfec1e4339bffd2d9af0af26354e583e3f35b0732d60496b38eabb753a4b168112f87c1dfe8629fcf57a26898bd885c3d7e2396f3201
|
7
|
+
data.tar.gz: d28ec1066da06d0759b41b727e2ff31f684b815f27e74193143d248908ff0c8ceafaca9854af359d3d835f284eaafe1624d4c38bb34ae565a9dc6d3bb32f4106
|
data/Gemfile
CHANGED
data/lib/logger_pipe/runner.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require "logger_pipe"
|
3
3
|
|
4
4
|
require "timeout"
|
5
|
+
require 'tempfile'
|
5
6
|
|
6
7
|
module LoggerPipe
|
7
8
|
|
@@ -28,48 +29,57 @@ module LoggerPipe
|
|
28
29
|
return nil
|
29
30
|
end
|
30
31
|
logger.info("executing: #{cmd}")
|
31
|
-
buf = []
|
32
|
+
@buf = []
|
32
33
|
# systemをタイムアウトさせることはできないので、popenの戻り値を使っています。
|
33
34
|
# see http://docs.ruby-lang.org/ja/2.0.0/class/Timeout.html
|
34
|
-
com, pid = nil, nil
|
35
|
-
|
36
|
-
|
35
|
+
@com, @pid = nil, nil
|
36
|
+
stderr_buffer do |stderr_fp|
|
37
|
+
timeout do
|
37
38
|
|
38
39
|
# popenにブロックを渡さないと$?がnilになってしまうので敢えてブロックで処理しています。
|
39
|
-
com = IO.popen(cmd) do |com|
|
40
|
-
|
40
|
+
@com = IO.popen("#{cmd} 2> #{stderr_fp.path}") do |com|
|
41
|
+
@com = com
|
42
|
+
@pid = com.pid
|
41
43
|
while line = com.gets
|
42
|
-
buf << line
|
44
|
+
@buf << line
|
43
45
|
logger.debug(line.chomp)
|
44
46
|
end
|
45
47
|
end
|
46
48
|
if $?.exitstatus == 0
|
49
|
+
logging_stderr(stderr_fp)
|
47
50
|
logger.info("\e[32mSUCCESS: %s\e[0m" % [cmd])
|
48
|
-
return buf.join
|
51
|
+
return @buf.join
|
49
52
|
else
|
53
|
+
logging_stderr(stderr_fp)
|
50
54
|
msg = "\e[31mFAILURE: %s\e[0m" % [cmd]
|
51
55
|
logger.error(msg)
|
52
|
-
raise Failure.new(msg, buf)
|
56
|
+
raise Failure.new(msg, @buf)
|
53
57
|
end
|
54
58
|
|
55
59
|
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def timeout(&block)
|
64
|
+
begin
|
65
|
+
Timeout.timeout(@timeout, &block)
|
56
66
|
rescue Timeout::Error => e
|
57
|
-
logger.error("[#{e.class.name} #{e.message}] now killing process
|
67
|
+
logger.error("[#{e.class.name} #{e.message}] now killing process pid:#{@pid.inspect}: #{cmd}")
|
58
68
|
begin
|
59
|
-
Process.kill('SIGINT', pid) if pid
|
69
|
+
Process.kill('SIGINT', @pid) if @pid
|
60
70
|
rescue Exception => err
|
61
71
|
logger.error("[#{err.class.name}] #{err.message}")
|
62
72
|
end
|
63
73
|
begin
|
64
74
|
Timeout.timeout(10) do
|
65
|
-
result = com.read
|
75
|
+
result = @com.read
|
66
76
|
end
|
67
77
|
rescue Exception => err
|
68
78
|
logger.error("failure to get result [#{err.class.name}] #{err.message}")
|
69
79
|
result = "<failure to get result>"
|
70
80
|
end
|
71
81
|
begin
|
72
|
-
msg = "\e[31mEXECUTION Timeout: %s\e[0m\n%s\n[result]: %s" % [cmd, buf.join.strip, result]
|
82
|
+
msg = "\e[31mEXECUTION Timeout: %s\e[0m\n%s\n[result]: %s" % [cmd, @buf.join.strip, result]
|
73
83
|
logger.error(msg)
|
74
84
|
rescue Exception => err
|
75
85
|
logger.error("[#{err.class.name}] #{err.message}")
|
@@ -78,6 +88,20 @@ module LoggerPipe
|
|
78
88
|
end
|
79
89
|
end
|
80
90
|
|
91
|
+
def stderr_buffer
|
92
|
+
Tempfile.open("logger_pipe.stderr.log") do |f|
|
93
|
+
f.close
|
94
|
+
return block_given? ? yield(f) : nil
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def logging_stderr(f)
|
99
|
+
f.open
|
100
|
+
c = f.read
|
101
|
+
if !c.nil? && !c.empty?
|
102
|
+
logger.info("--- begin stderr ---\n#{c}\n--- end stderr ---")
|
103
|
+
end
|
104
|
+
end
|
81
105
|
end
|
82
106
|
|
83
107
|
end
|
data/lib/logger_pipe/version.rb
CHANGED
data/spec/logger_pipe_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
require 'stringio'
|
@@ -37,6 +38,24 @@ describe LoggerPipe do
|
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
41
|
+
context "stderr" do
|
42
|
+
let(:cmd){ File.expand_path("../stderr_test.sh", __FILE__) }
|
43
|
+
it "returns STDOUT on success" do
|
44
|
+
res = LoggerPipe.run(logger, "#{cmd} 0")
|
45
|
+
# puts buffer.string
|
46
|
+
expect(buffer.string).to match /bar\n/
|
47
|
+
expect(res).to eq "foo\nbaz\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "buffer include stderr content on error" do
|
51
|
+
expect{
|
52
|
+
LoggerPipe.run(logger, "#{cmd} 1")
|
53
|
+
}.to raise_error(LoggerPipe::Failure)
|
54
|
+
# puts buffer.string
|
55
|
+
expect(buffer.string).to match /bar\n/
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
40
59
|
context "dry_run: true" do
|
41
60
|
let(:cmd){ "date +'Foo: %Y-%m-%dT%H:%M:%S'; sleep 1; date +'Bar: %Y-%m-%dT%H:%M:%S'" }
|
42
61
|
it "returns nil" do
|
data/spec/stderr_test.sh
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logger_pipe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- logger_pipe.gemspec
|
73
73
|
- spec/logger_pipe_spec.rb
|
74
74
|
- spec/spec_helper.rb
|
75
|
+
- spec/stderr_test.sh
|
75
76
|
homepage: https://github.com/groovenauts/logger_pipe
|
76
77
|
licenses:
|
77
78
|
- MIT
|
@@ -99,3 +100,4 @@ summary: logger_pipe helps to connect child process STDOUT to Logger on realtime
|
|
99
100
|
test_files:
|
100
101
|
- spec/logger_pipe_spec.rb
|
101
102
|
- spec/spec_helper.rb
|
103
|
+
- spec/stderr_test.sh
|