fiverr_copy 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +64 -1
- data/lib/fiverr_copy/server.rb +18 -6
- data/lib/fiverr_copy/version.rb +1 -1
- metadata +3 -3
data/README.md
CHANGED
@@ -18,7 +18,70 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
FiverrCopy automates the process of distributing files to multiple servers in a sync column method.
|
22
|
+
You'll need to write a "recipe" and boot up the server with that recipe.
|
23
|
+
|
24
|
+
What it actually does is to create a linked list of servers in which ever client is connected to the next client
|
25
|
+
starting with the server.
|
26
|
+
the server then distributes the file to the first client in queue, and this client passes every chunk of data it gets to the next client and so on.
|
27
|
+
|
28
|
+
the main benefit is obviously getting a more efficient way to distribute files to multiple machines than the normal scp, nfs mount, etc.
|
29
|
+
|
30
|
+
## Recipes
|
31
|
+
|
32
|
+
To create a FiverrCopy recipe, just create a ruby file that looks something like this
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
FiverrCopy::Server.recipe = FiverrCopy::Recipe.new("My Awesome Script", "a void description") do |recipe|
|
36
|
+
recipe.filter = "*.jpg"
|
37
|
+
recipe.clients = ["server1", "server2"]
|
38
|
+
recipe.username = "serveruser"
|
39
|
+
recipe.port = 1555
|
40
|
+
recipe.chunk_size = 1024
|
41
|
+
recipe.manual = true
|
42
|
+
end
|
43
|
+
```
|
44
|
+
* filter: this is the file selector that the FiverrCopy::Server will grab and tar before distribution, you can either specify a wildcard, a specific file or join both by spaces.
|
45
|
+
* clients: a list of ips or hosts to distribute the file to. protip: use host names that all the servers in the process are familiar with (server and clients).
|
46
|
+
* username: FiverrCopy uses Net::SSH to fire up some events, it counts on you that your current user can login to any of the machines using a username only and an ssh key.
|
47
|
+
* port: which port to run on.
|
48
|
+
* chunk_size: buffer size when sending file chunks.
|
49
|
+
* manuak: FiverrCopy will try to fire up clients when it runs, if you want to run them by yourself - toggle this option and the FiverrCopy::Server will assume the clients are ready.
|
50
|
+
|
51
|
+
## Binary
|
52
|
+
|
53
|
+
FiverrCopy contains only one binary which is `fiverr_copy`:
|
54
|
+
|
55
|
+
```bash
|
56
|
+
Usage: fiverr_copy [options]
|
57
|
+
-c, --client Run as client
|
58
|
+
-s, --server Run as server
|
59
|
+
-p, --port PORT Select a port. (default: 1234)
|
60
|
+
-r, --recipe FILE Specify a recipe file
|
61
|
+
-n, --nexthop IP/HOST Specify the next hop for distribution
|
62
|
+
-f, --filename FILENAME Specify filename
|
63
|
+
-w, --chunk CHUNK_SIZE specify chunk size
|
64
|
+
-h, --help Display this screen
|
65
|
+
```
|
66
|
+
|
67
|
+
## Examples
|
68
|
+
|
69
|
+
running a server:
|
70
|
+
|
71
|
+
`fiverr_copy --server --recipe /etc/distribute_mysql_dump.rb`
|
72
|
+
|
73
|
+
the server will only need the `--server` and the `--recipe` options.
|
74
|
+
|
75
|
+
running a client manually:
|
76
|
+
|
77
|
+
`fiverr_copy --client --port 1555 --filename mysql_dump_compressed_1333364100.tgz --chunk 1024`
|
78
|
+
|
79
|
+
this will run a FiverrCopy::Client instance on port 1555, reading 1024 bytes at a time from stream to the mysql_dump_compressed_* file destination.
|
80
|
+
|
81
|
+
## TODOs
|
82
|
+
|
83
|
+
1. Testing, how.
|
84
|
+
|
22
85
|
|
23
86
|
## Contributing
|
24
87
|
|
data/lib/fiverr_copy/server.rb
CHANGED
@@ -17,6 +17,22 @@ class FiverrCopy::Server
|
|
17
17
|
compressed_file_name = "fiverr_copy_compressed_#{Time.now.to_i}.tgz"
|
18
18
|
|
19
19
|
if !(self.recipe.manual_client_activation?)
|
20
|
+
|
21
|
+
last_hop = self.recipe.initialized_clients.shift
|
22
|
+
|
23
|
+
puts "Last Hop: #{last_hop.inspect}"
|
24
|
+
threads << Thread.new(last_hop) do |current_client|
|
25
|
+
current_client.setup!
|
26
|
+
Net::SSH.start(current_client.client_ip, current_client.username) do |ssh|
|
27
|
+
gem_exists = ssh.exec("which fiverr_copy") == "" ? false : true
|
28
|
+
if !(gem_exists)
|
29
|
+
puts "Please install the fiverr_copy gem on all clients."
|
30
|
+
exit 0
|
31
|
+
end
|
32
|
+
ssh.exec("fiverr_copy --client --port #{self.recipe.port} --filename #{compressed_file_name} --chunk #{self.recipe.chunk_size} \&")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
20
36
|
self.recipe.initialized_clients.each do |client|
|
21
37
|
threads << Thread.new(client) do |current_client|
|
22
38
|
current_client.setup!
|
@@ -27,11 +43,7 @@ class FiverrCopy::Server
|
|
27
43
|
puts "Please install the fiverr_copy gem on all clients."
|
28
44
|
exit 0
|
29
45
|
end
|
30
|
-
|
31
|
-
puts "#{current_client.client_ip}: fiverr_copy --client --port #{self.recipe.port} --filename #{compressed_file_name} --chunk #{self.recipe.chunk_size} #{next_client} \&"
|
32
|
-
silence_stream(STDOUT) do
|
33
|
-
ssh.exec("fiverr_copy --client --port #{self.recipe.port} --filename #{compressed_file_name} --chunk #{self.recipe.chunk_size} #{next_client} \&")
|
34
|
-
end
|
46
|
+
ssh.exec("fiverr_copy --client --port #{self.recipe.port} --filename #{compressed_file_name} --chunk #{self.recipe.chunk_size} --nexthop #{current_client.next_client} \&")
|
35
47
|
end
|
36
48
|
end
|
37
49
|
end
|
@@ -75,7 +87,7 @@ class FiverrCopy::Server
|
|
75
87
|
while !(client_session.closed?) && (buffer = transmitted_file.read(self.recipe.chunk_size)) do
|
76
88
|
client_session.write buffer
|
77
89
|
sent += self.recipe.chunk_size
|
78
|
-
print "\r#{"%.2f" % (sent.to_f / file_size.to_f * 100)}% "
|
90
|
+
print "\r#{"%.2f" % (sent.to_f / file_size.to_f * 100)}% " if Time.now.to_i % 3 == 0
|
79
91
|
end
|
80
92
|
puts "Done!"
|
81
93
|
end
|
data/lib/fiverr_copy/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fiverr_copy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Elad Meidar
|