content_server 0.0.10 → 1.0.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.
- data/bin/backup_server +26 -14
- data/bin/content_server +26 -24
- data/lib/content_server.rb +10 -186
- data/lib/content_server/backup_server.rb +120 -0
- data/lib/content_server/content_receiver.rb +44 -45
- data/lib/content_server/content_server.rb +89 -0
- data/lib/content_server/file_streamer.rb +225 -220
- data/lib/content_server/queue_copy.rb +190 -182
- data/lib/content_server/queue_indexer.rb +91 -92
- data/lib/content_server/remote_content.rb +70 -72
- data/lib/content_server/version.rb +1 -3
- data/spec/content_server/content_server_spec.rb +10 -12
- data/spec/content_server/file_streamer_spec.rb +50 -52
- metadata +246 -33
@@ -5,93 +5,91 @@ require 'log'
|
|
5
5
|
require 'networking/tcp'
|
6
6
|
require 'params'
|
7
7
|
|
8
|
-
module
|
9
|
-
|
8
|
+
module ContentServer
|
9
|
+
|
10
|
+
Params.integer('remote_content_fetch_timeout', 10, 'Remote content desired freshness in seconds.')
|
11
|
+
Params.integer('remote_content_save_timeout', 60*60, 'Remote content force refresh in seconds.')
|
12
|
+
|
13
|
+
# TODO(kolman): Use only one tcp/ip socket by utilizing one NQueue for many queues!
|
14
|
+
class RemoteContentClient
|
15
|
+
def initialize(dynamic_content_data, host, port, local_backup_folder)
|
16
|
+
@dynamic_content_data = dynamic_content_data
|
17
|
+
@remote_tcp = Networking::TCPClient.new(host, port, method(:receive_content))
|
18
|
+
@last_fetch_timestamp = nil
|
19
|
+
@last_save_timestamp = nil
|
20
|
+
@content_server_content_data_path = File.join(local_backup_folder, 'remote',
|
21
|
+
host + '_' + port.to_s)
|
22
|
+
Log.debug2("Initialized RemoteContentClient: host:#{host} port:#{port} local_backup_folder:#{local_backup_folder}")
|
23
|
+
end
|
10
24
|
|
11
|
-
|
12
|
-
|
25
|
+
def receive_content(message)
|
26
|
+
Log.debug1("Backup server received Remote content data:#{message.to_s}")
|
27
|
+
ref = @dynamic_content_data.last_content_data
|
28
|
+
@dynamic_content_data.update(message)
|
29
|
+
@last_fetch_timestamp = Time.now.to_i
|
13
30
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@dynamic_content_data = dynamic_content_data
|
18
|
-
@remote_tcp = Networking::TCPClient.new(host, port, method(:receive_content))
|
19
|
-
@last_update_timestamp = nil
|
20
|
-
@content_server_content_data_path = File.join(local_backup_folder, 'remote',
|
21
|
-
host + '_' + port.to_s)
|
31
|
+
save_time_span = Params['remote_content_save_timeout']
|
32
|
+
if !@last_save_timestamp.nil?
|
33
|
+
save_time_span = Time.now.to_i - @last_save_timestamp
|
22
34
|
end
|
23
35
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
max_time_span = Params['max_content_timeout']
|
30
|
-
if !@last_update_timestamp.nil?
|
31
|
-
max_time_span = Time.now.to_i - @last_update_timestamp
|
32
|
-
end
|
33
|
-
|
34
|
-
@last_update_timestamp = Time.now.to_i
|
35
|
-
|
36
|
-
if ref != message || max_time_span >= Params['max_content_timeout']
|
37
|
-
Log.debug2("Remote content data changed or max time span is large, writing.")
|
38
|
-
Log.debug3("max_time_span: #{max_time_span}")
|
39
|
-
write_to = File.join(@content_server_content_data_path,
|
40
|
-
@last_update_timestamp.to_s + '.cd')
|
41
|
-
FileUtils.makedirs(@content_server_content_data_path) unless \
|
36
|
+
if save_time_span >= Params['remote_content_save_timeout']
|
37
|
+
@last_save_timestamp = Time.now.to_i
|
38
|
+
write_to = File.join(@content_server_content_data_path,
|
39
|
+
@last_save_timestamp.to_s + '.cd')
|
40
|
+
FileUtils.makedirs(@content_server_content_data_path) unless \
|
42
41
|
File.directory?(@content_server_content_data_path)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
count = File.open(write_to, 'wb') { |f| f.write(message.to_s) }
|
43
|
+
Log.info("Written content data to file:#{write_to}.")
|
44
|
+
else
|
45
|
+
Log.info("No need to write remote content data, it has not changed.")
|
47
46
|
end
|
47
|
+
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
sleep_time_span = Time.now.to_i - @last_update_timestamp \
|
69
|
-
unless @last_update_timestamp.nil?
|
70
|
-
Log.debug2("sleep_time_span: #{sleep_time_span}")
|
71
|
-
sleep(sleep_time_span) if sleep_time_span > 0
|
49
|
+
def run()
|
50
|
+
Log.debug1("Running remote content client.")
|
51
|
+
threads = []
|
52
|
+
threads << @remote_tcp.tcp_thread if @remote_tcp != nil
|
53
|
+
threads << Thread.new do
|
54
|
+
Log.debug1("New thread.")
|
55
|
+
loop do
|
56
|
+
# if need content data
|
57
|
+
sleep_time_span = Params['remote_content_save_timeout']
|
58
|
+
if !@last_fetch_timestamp.nil?
|
59
|
+
sleep_time_span = Time.now.to_i - @last_fetch_timestamp
|
60
|
+
end
|
61
|
+
Log.debug1("sleep_time_span: #{sleep_time_span}")
|
62
|
+
if sleep_time_span >= Params['remote_content_save_timeout']
|
63
|
+
# Send ping!
|
64
|
+
bytes_written = @remote_tcp.send_obj(nil)
|
65
|
+
Log.info("sending ping request for remote content data!")
|
72
66
|
end
|
67
|
+
sleep(sleep_time_span) if sleep_time_span > 0
|
73
68
|
end
|
74
69
|
end
|
75
70
|
end
|
71
|
+
end
|
76
72
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
def content_requested(addr_info, message)
|
84
|
-
# Send response.
|
85
|
-
Log.debug1('Local content data requested.')
|
86
|
-
@tcp_server.send_obj(@dynamic_content_data.last_content_data)
|
87
|
-
end
|
73
|
+
class RemoteContentServer
|
74
|
+
def initialize(dynamic_content_data, port)
|
75
|
+
@dynamic_content_data = dynamic_content_data
|
76
|
+
@tcp_server = Networking::TCPServer.new(port, method(:content_requested))
|
77
|
+
Log.debug2("initialize RemoteContentServer on port:#{port}")
|
78
|
+
end
|
88
79
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
80
|
+
def content_requested(addr_info, message)
|
81
|
+
# Send response.
|
82
|
+
Log.info("Master server received content data request. Sending content data:#{@dynamic_content_data.last_content_data}")
|
83
|
+
@tcp_server.send_obj(@dynamic_content_data.last_content_data)
|
84
|
+
Log.info('Master server sent content data')
|
85
|
+
end
|
93
86
|
|
87
|
+
def tcp_thread
|
88
|
+
return @tcp_server.tcp_thread if @tcp_server != nil
|
89
|
+
nil
|
94
90
|
end
|
95
91
|
|
96
92
|
end
|
93
|
+
|
97
94
|
end
|
95
|
+
|
@@ -2,26 +2,24 @@ require 'rspec'
|
|
2
2
|
|
3
3
|
require_relative '../../lib/file_copy/copy.rb'
|
4
4
|
|
5
|
-
module
|
6
|
-
module
|
7
|
-
module Spec
|
5
|
+
module ContentServer
|
6
|
+
module Spec
|
8
7
|
|
9
|
-
|
8
|
+
describe 'Backup Listener' do
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
describe 'Local file monitor' do
|
10
|
+
end
|
14
11
|
|
15
|
-
|
12
|
+
describe 'Local file monitor' do
|
16
13
|
|
17
|
-
|
14
|
+
end
|
18
15
|
|
19
|
-
|
16
|
+
describe 'Local file indexer' do
|
20
17
|
|
21
|
-
|
18
|
+
end
|
22
19
|
|
23
|
-
|
20
|
+
describe 'File copier' do
|
24
21
|
|
25
22
|
end
|
23
|
+
|
26
24
|
end
|
27
25
|
end
|
@@ -5,66 +5,64 @@ require 'stringio'
|
|
5
5
|
require_relative '../../lib/content_server/file_streamer'
|
6
6
|
|
7
7
|
# Uncomment to debug spec.
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
Params['log_write_to_console'] = false
|
9
|
+
Params['log_write_to_file'] = false
|
10
|
+
Params['log_debug_level'] = 0
|
11
|
+
Params['streaming_chunk_size'] = 5
|
12
|
+
Params.init ARGV
|
13
|
+
Log.init
|
14
14
|
# Have to be set to test chunking mechanism.
|
15
15
|
|
16
|
-
module
|
17
|
-
module
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
Log.info("orig_file #{orig_file.to_s}.")
|
16
|
+
module ContentServer
|
17
|
+
module Spec
|
18
|
+
describe 'FileStreamer' do
|
19
|
+
it 'should copy one file chunk by chunks and validate content' do
|
20
|
+
Log.info('#0 start')
|
21
|
+
orig_file = StringIO.new('Some content. Some content. Some content. Some content.')
|
22
|
+
Log.info("orig_file #{orig_file.to_s}.")
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
24
|
+
# should simulate Tempfile object, thus need to add to this object Tempfile methsods
|
25
|
+
# that are absent in StringIO, but used in tested ruby code
|
26
|
+
dest_file = StringIO.new
|
27
|
+
def dest_file.path
|
28
|
+
'/tmp/path/tmp_basename'
|
29
|
+
end
|
30
|
+
def dest_file.unlink
|
31
|
+
true
|
32
|
+
end
|
33
|
+
Log.info("dest_file #{dest_file.to_s}.")
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
streamer = nil
|
36
|
+
done = lambda{ |checksum, filename|
|
37
|
+
Log.info('#4 streaming done, check content ok.')
|
38
|
+
dest_file.string().should eq(orig_file.string())
|
40
39
|
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
Log.info('#5 exiting streamer thread.')
|
41
|
+
streamer.thread.exit
|
42
|
+
}
|
44
43
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
receiver = ContentServer::FileReceiver.new(done)
|
45
|
+
send_chunk = lambda { |*args|
|
46
|
+
receiver.receive_chunk(*args)
|
47
|
+
streamer.copy_another_chuck('da39a3ee5e6b4b0d3255bfef95601890afd80709')
|
48
|
+
}
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
50
|
+
Log.info('#2 start streaming.')
|
51
|
+
# This is for FileStreamer :NEW_STREAM and FileReceiver :receive_chunk
|
52
|
+
::File.stub(:new).and_return(orig_file, dest_file)
|
53
|
+
::FileUtils.stub(:makedirs).and_return(true)
|
54
|
+
::FileUtils.stub(:copy_file).and_return(true)
|
55
|
+
# This is for FileReceiver :handle_last_chunk
|
56
|
+
::File.stub(:rename)
|
57
|
+
# This is for Index agent 'get_checksum' which opens file, read content and validates
|
58
|
+
# checksum.
|
59
|
+
::File.stub(:open).and_return(dest_file)
|
61
60
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
61
|
+
streamer = ContentServer::FileStreamer.new(send_chunk)
|
62
|
+
Log.info('#3 start streaming.')
|
63
|
+
streamer.start_streaming('da39a3ee5e6b4b0d3255bfef95601890afd80709', 'dummy')
|
64
|
+
streamer.thread.join()
|
65
|
+
Log.flush
|
68
66
|
end
|
69
67
|
end
|
70
68
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: content_server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,87 +9,298 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: content_data
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: file_indexing
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
|
-
- -
|
35
|
+
- - '='
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
37
|
+
version: 1.0.0
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.0.0
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: file_monitoring
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
|
-
- -
|
51
|
+
- - '='
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
53
|
+
version: 1.0.0
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.0.0
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: log
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
|
-
- -
|
67
|
+
- - '='
|
53
68
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
69
|
+
version: 1.0.0
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - '='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.0.0
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: networking
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
|
-
- -
|
83
|
+
- - '='
|
64
84
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
85
|
+
version: 1.0.0
|
66
86
|
type: :runtime
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.0.0
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: params
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - '='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.0.0
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - '='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.0.0
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: process_monitoring
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.0.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - '='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.0.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rake
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
72
129
|
none: false
|
73
130
|
requirements:
|
74
|
-
- -
|
131
|
+
- - '='
|
75
132
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
133
|
+
version: 0.9.2.2
|
77
134
|
type: :runtime
|
78
135
|
prerelease: false
|
79
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - '='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.9.2.2
|
80
142
|
- !ruby/object:Gem::Dependency
|
81
143
|
name: run_in_background
|
82
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - '='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.0.0
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - '='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.0.0
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: content_data
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - '='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 1.0.0
|
166
|
+
type: :runtime
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - '='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 1.0.0
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: file_indexing
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
83
177
|
none: false
|
84
178
|
requirements:
|
85
|
-
- -
|
179
|
+
- - '='
|
86
180
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
181
|
+
version: 1.0.0
|
88
182
|
type: :runtime
|
89
183
|
prerelease: false
|
90
|
-
version_requirements:
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - '='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: 1.0.0
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: file_monitoring
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - '='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: 1.0.0
|
198
|
+
type: :runtime
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - '='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: 1.0.0
|
206
|
+
- !ruby/object:Gem::Dependency
|
207
|
+
name: log
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
210
|
+
requirements:
|
211
|
+
- - '='
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: 1.0.0
|
214
|
+
type: :runtime
|
215
|
+
prerelease: false
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - '='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: 1.0.0
|
222
|
+
- !ruby/object:Gem::Dependency
|
223
|
+
name: networking
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
225
|
+
none: false
|
226
|
+
requirements:
|
227
|
+
- - '='
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: 1.0.0
|
230
|
+
type: :runtime
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
234
|
+
requirements:
|
235
|
+
- - '='
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: 1.0.0
|
238
|
+
- !ruby/object:Gem::Dependency
|
239
|
+
name: params
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
241
|
+
none: false
|
242
|
+
requirements:
|
243
|
+
- - '='
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: 1.0.0
|
246
|
+
type: :runtime
|
247
|
+
prerelease: false
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
none: false
|
250
|
+
requirements:
|
251
|
+
- - '='
|
252
|
+
- !ruby/object:Gem::Version
|
253
|
+
version: 1.0.0
|
254
|
+
- !ruby/object:Gem::Dependency
|
255
|
+
name: process_monitoring
|
256
|
+
requirement: !ruby/object:Gem::Requirement
|
257
|
+
none: false
|
258
|
+
requirements:
|
259
|
+
- - '='
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
version: 1.0.0
|
262
|
+
type: :runtime
|
263
|
+
prerelease: false
|
264
|
+
version_requirements: !ruby/object:Gem::Requirement
|
265
|
+
none: false
|
266
|
+
requirements:
|
267
|
+
- - '='
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: 1.0.0
|
270
|
+
- !ruby/object:Gem::Dependency
|
271
|
+
name: rake
|
272
|
+
requirement: !ruby/object:Gem::Requirement
|
273
|
+
none: false
|
274
|
+
requirements:
|
275
|
+
- - '='
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: 0.9.2.2
|
278
|
+
type: :runtime
|
279
|
+
prerelease: false
|
280
|
+
version_requirements: !ruby/object:Gem::Requirement
|
281
|
+
none: false
|
282
|
+
requirements:
|
283
|
+
- - '='
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: 0.9.2.2
|
286
|
+
- !ruby/object:Gem::Dependency
|
287
|
+
name: run_in_background
|
288
|
+
requirement: !ruby/object:Gem::Requirement
|
289
|
+
none: false
|
290
|
+
requirements:
|
291
|
+
- - '='
|
292
|
+
- !ruby/object:Gem::Version
|
293
|
+
version: 1.0.0
|
294
|
+
type: :runtime
|
295
|
+
prerelease: false
|
296
|
+
version_requirements: !ruby/object:Gem::Requirement
|
297
|
+
none: false
|
298
|
+
requirements:
|
299
|
+
- - '='
|
300
|
+
- !ruby/object:Gem::Version
|
301
|
+
version: 1.0.0
|
91
302
|
description: Monitor and Index a directory and back it up to backup server.
|
92
|
-
email:
|
303
|
+
email: bbfsdev@gmail.com
|
93
304
|
executables:
|
94
305
|
- content_server
|
95
306
|
- backup_server
|
@@ -99,15 +310,17 @@ files:
|
|
99
310
|
- lib/content_server.rb
|
100
311
|
- lib/content_server/file_streamer.rb
|
101
312
|
- lib/content_server/queue_copy.rb
|
313
|
+
- lib/content_server/content_server.rb
|
102
314
|
- lib/content_server/content_receiver.rb
|
103
315
|
- lib/content_server/remote_content.rb
|
104
316
|
- lib/content_server/version.rb
|
317
|
+
- lib/content_server/backup_server.rb
|
105
318
|
- lib/content_server/queue_indexer.rb
|
106
319
|
- spec/content_server/content_server_spec.rb
|
107
320
|
- spec/content_server/file_streamer_spec.rb
|
108
321
|
- bin/content_server
|
109
322
|
- bin/backup_server
|
110
|
-
homepage: http://github.com/
|
323
|
+
homepage: http://github.com/bbfsdev/bbfs
|
111
324
|
licenses: []
|
112
325
|
post_install_message:
|
113
326
|
rdoc_options: []
|
@@ -127,7 +340,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
340
|
version: '0'
|
128
341
|
requirements: []
|
129
342
|
rubyforge_project:
|
130
|
-
rubygems_version: 1.8.
|
343
|
+
rubygems_version: 1.8.24
|
131
344
|
signing_key:
|
132
345
|
specification_version: 3
|
133
346
|
summary: Servers for backing up content.
|