scccp 0.0.1 → 0.0.2
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.
- data/lib/scccp/scp.rb +26 -1
- data/lib/scccp/version.rb +1 -1
- data/test/test.rb +50 -0
- metadata +2 -2
data/lib/scccp/scp.rb
CHANGED
@@ -3,6 +3,8 @@ require 'fileutils'
|
|
3
3
|
|
4
4
|
module Scccp
|
5
5
|
class Scp
|
6
|
+
SIGNALS = [ :QUIT, :INT, :TERM, :USR1, :USR2, :HUP ]
|
7
|
+
|
6
8
|
ATTRS = [
|
7
9
|
:remote_host,
|
8
10
|
:remote_user_name,
|
@@ -12,6 +14,7 @@ module Scccp
|
|
12
14
|
:ok_folder,
|
13
15
|
:ng_folder,
|
14
16
|
:timeout,
|
17
|
+
:lockfile,
|
15
18
|
:logger2ssh,
|
16
19
|
:logger
|
17
20
|
]
|
@@ -30,7 +33,7 @@ module Scccp
|
|
30
33
|
#v = instance_variable_get("@#{attr.to_s}")
|
31
34
|
v = send(attr)
|
32
35
|
case attr
|
33
|
-
when :remote_user_name,:remote_user_password,:timeout,:logger2ssh
|
36
|
+
when :remote_user_name,:remote_user_password,:timeout,:logger2ssh,:lockfile
|
34
37
|
next
|
35
38
|
when :queue_folder,:ok_folder,:ng_folder
|
36
39
|
unless File.directory?(v)
|
@@ -45,8 +48,14 @@ module Scccp
|
|
45
48
|
true
|
46
49
|
end
|
47
50
|
|
51
|
+
def receive_signal(signal)
|
52
|
+
@killing = true
|
53
|
+
end
|
54
|
+
|
48
55
|
def proceed
|
49
56
|
attrs_ok?
|
57
|
+
SIGNALS.each { |sig| trap(sig){receive_signal(sig)} }
|
58
|
+
|
50
59
|
opt = {}
|
51
60
|
if remote_user_password
|
52
61
|
opt[:password] = remote_user_password
|
@@ -64,15 +73,25 @@ module Scccp
|
|
64
73
|
!(o =~ /\.(tmp|ok)$/)
|
65
74
|
end
|
66
75
|
|
76
|
+
if lockfile
|
77
|
+
if File.exists?(lockfile)
|
78
|
+
logger.warn("lockfile:#{lockfile} already exists")
|
79
|
+
return :lockfile_error
|
80
|
+
end
|
81
|
+
File.open(lockfile, "w"){|f|f.write $$}
|
82
|
+
end
|
83
|
+
|
67
84
|
logger.info("queue_folder is #{queue_folder}")
|
68
85
|
logger.info("target is #{remote_host}:#{remote_path}")
|
69
86
|
#logger.info(files.inspect)
|
87
|
+
uploaded_count = 0
|
70
88
|
|
71
89
|
begin
|
72
90
|
# ブロックで使うと途中で失敗した場合にscpインスタンスを
|
73
91
|
# 使いまわせない(というか固まる)のでこんな感じの使い方で
|
74
92
|
scp = Net::SCP.start(remote_host, remote_user_name, opt)
|
75
93
|
files.each do |file|
|
94
|
+
break if @killing
|
76
95
|
ok_file = file + '.ok'
|
77
96
|
begin
|
78
97
|
logger.info "uploading_start:#{file}"
|
@@ -84,6 +103,7 @@ module Scccp
|
|
84
103
|
logger.info "uploading_finish:#{ok_file}"
|
85
104
|
FileUtils.mv(file,ok_folder)
|
86
105
|
FileUtils.mv(ok_file,ok_folder)
|
106
|
+
uploaded_count += 1
|
87
107
|
true
|
88
108
|
rescue => e
|
89
109
|
logger.error e
|
@@ -103,7 +123,12 @@ module Scccp
|
|
103
123
|
if scp
|
104
124
|
scp.session.close
|
105
125
|
end
|
126
|
+
if lockfile
|
127
|
+
FileUtils.rm lockfile
|
128
|
+
end
|
106
129
|
end
|
130
|
+
|
131
|
+
uploaded_count
|
107
132
|
end
|
108
133
|
end
|
109
134
|
end
|
data/lib/scccp/version.rb
CHANGED
data/test/test.rb
CHANGED
@@ -14,6 +14,7 @@ class TestScccp < Test::Unit::TestCase
|
|
14
14
|
OK_FOLDER = "#{SCCCP_WORKING_DIR}done/"
|
15
15
|
NG_FOLDER = "#{SCCCP_WORKING_DIR}error/"
|
16
16
|
REMOTE_PATH = "#{SCCCP_WORKING_DIR}remote/"
|
17
|
+
LOCK_FILE = "#{SCCCP_WORKING_DIR}test.lock"
|
17
18
|
REMOTE_USER_NAME = 'paco'
|
18
19
|
REMOTE_USER_PASSWORD = nil
|
19
20
|
REMOTE_HOST = "localhost"
|
@@ -72,6 +73,55 @@ class TestScccp < Test::Unit::TestCase
|
|
72
73
|
assert_false File.exists?(NG_FOLDER + "testfile2.ok")
|
73
74
|
end
|
74
75
|
|
76
|
+
# アップロードに5秒程度かかるように調整が必要
|
77
|
+
# 200個SCPで今の環境で5秒程度かかる
|
78
|
+
# スレッド立ててからsleep 1 (ロックファイルが出来る前に
|
79
|
+
# 後のプロセスが起動しないように)が良い感じで動くように
|
80
|
+
# 個々の値は将来調整しないといけないかもしれない
|
81
|
+
def prepare_heavy_test
|
82
|
+
(1..200).each do |i|
|
83
|
+
file = QUEUE_FOLDER + "#{i}.dat"
|
84
|
+
File.write(file,'test_data')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def test_signal
|
90
|
+
prepare_heavy_test
|
91
|
+
|
92
|
+
th = Thread.new do
|
93
|
+
scccp = Scccp::Scp.new(attr.merge({:lockfile=>LOCK_FILE}))
|
94
|
+
scccp.proceed
|
95
|
+
end
|
96
|
+
|
97
|
+
sleep 1
|
98
|
+
|
99
|
+
assert_equal true, File.exists?(LOCK_FILE)
|
100
|
+
`kill #{File.read(LOCK_FILE)}`
|
101
|
+
|
102
|
+
sleep 1
|
103
|
+
assert_equal false, File.exists?(LOCK_FILE)
|
104
|
+
|
105
|
+
th.join
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
def test_lockfile
|
110
|
+
prepare_heavy_test
|
111
|
+
|
112
|
+
th = Thread.new do
|
113
|
+
scccp = Scccp::Scp.new(attr.merge({:lockfile=>LOCK_FILE}))
|
114
|
+
scccp.proceed
|
115
|
+
end
|
116
|
+
|
117
|
+
sleep 1
|
118
|
+
assert_equal true, File.exists?(LOCK_FILE)
|
119
|
+
|
120
|
+
scccp2 = Scccp::Scp.new(attr.merge({:lockfile=>LOCK_FILE}))
|
121
|
+
assert_equal :lockfile_error, scccp2.proceed
|
122
|
+
th.join
|
123
|
+
end
|
124
|
+
|
75
125
|
def test_connection_error
|
76
126
|
scccp = Scccp::Scp.new(attr)
|
77
127
|
scccp.remote_host = 'sefisfejisfe.sefijsefij.esfij'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scccp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: net-scp
|