simple-transfer 0.0.1
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 +7 -0
- data/README.md +56 -0
- data/lib/buffer/buffer.rb +27 -0
- data/lib/transfer.rb +225 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f69f3c96aad7319e99191e7e4cc291a9b75a8997aeec61c8acd6fac55e230322
|
4
|
+
data.tar.gz: 9ab1d2e0b548b65e6f09d677f0295ab16b87d5dab71be58c7d2faa516c1ec92c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 62867c898cad672b01ee0f35d976d770246a7e44725cf37fdab3db79d6a0a97d476363a3b300c7dfccb3969ba67f7ad8b62181eaf9d010eae8f978770c1d5989
|
7
|
+
data.tar.gz: 5b7b9a30ff2d42f10b8507157892f0677fadf20d1143ef27a9a3668dda004492821e092aba78f433faa19a6b8a18c30b83d62cbffb5906fd7841260a1a9755cb
|
data/README.md
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
This gem is created to make transfering whole directories; scripts, photos, videos, any files that are up to 30 MB simple and easy.
|
2
|
+
|
3
|
+
**Please don't forget to read the notes section.**
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
As the name suggests, to transfer files is simple and easy with ```simple-transfer```.
|
10
|
+
|
11
|
+
The ```Transfer``` module has two methods: ```Transfer::run_server``` and ```Transfer::transfer```.
|
12
|
+
|
13
|
+
#### ```Transfer::run_server```
|
14
|
+
|
15
|
+
This method will run a server on your local machine. Once you call it, the server will listen for connections.
|
16
|
+
|
17
|
+
The server is for receiving files only. So the machine that will receive files needs to call this method first.
|
18
|
+
|
19
|
+
#### ```Transfer::transfer```
|
20
|
+
This method takes two arguments, first argument is the IPv4 of the target; second one is the name of the file, directory that will be sent.
|
21
|
+
|
22
|
+
It will try to connect to the target machine if not already connected and send the files that are specified.
|
23
|
+
|
24
|
+
|
25
|
+
## Example
|
26
|
+
|
27
|
+
|
28
|
+
The server:
|
29
|
+
|
30
|
+
```
|
31
|
+
require 'transfer'
|
32
|
+
include Transfer
|
33
|
+
|
34
|
+
Transfer.run_server
|
35
|
+
|
36
|
+
```
|
37
|
+
|
38
|
+
The client:
|
39
|
+
|
40
|
+
```
|
41
|
+
require 'transfer'
|
42
|
+
include Transfer
|
43
|
+
|
44
|
+
Transfer.transfer('192.168.1.25', 'foo.png')
|
45
|
+
|
46
|
+
```
|
47
|
+
|
48
|
+
## Notes
|
49
|
+
|
50
|
+
* Using ```simple-transfer``` from the interactive ruby shell is terribly bad.
|
51
|
+
|
52
|
+
* ```simple-transfer``` uses tcp sockets and buffers data that are bigger than 65 KB. If you are receiving files only partially and encountering strange errors, try setting the ```$MAX_BUFFER_SIZE``` constant to a lower value.
|
53
|
+
|
54
|
+
* To make ```simple-transfer``` work on the internetwork, port forwarding is required.
|
55
|
+
|
56
|
+
* Relative paths are NOT supported in simple-transfer. Files need to be in the cwd to be transfered.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
def buffer(data, buffer_size=65000)
|
5
|
+
|
6
|
+
labelnum = 0
|
7
|
+
|
8
|
+
buffers = Hash.new
|
9
|
+
|
10
|
+
data = String(data)
|
11
|
+
|
12
|
+
buffer_amount = ( data.length / buffer_size ) + 1
|
13
|
+
|
14
|
+
sindex = 0
|
15
|
+
|
16
|
+
while labelnum != buffer_amount
|
17
|
+
buffers["buffer#{labelnum}"] = data.slice(sindex, buffer_size)
|
18
|
+
|
19
|
+
sindex += buffer_size
|
20
|
+
|
21
|
+
labelnum += 1
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
return buffers
|
26
|
+
|
27
|
+
end
|
data/lib/transfer.rb
ADDED
@@ -0,0 +1,225 @@
|
|
1
|
+
|
2
|
+
require_relative 'buffer/buffer'
|
3
|
+
require 'socket'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
$socket = Socket::new(Socket::AF_INET, Socket::SOCK_STREAM)
|
9
|
+
$socket.setsockopt(:SOCKET, :REUSEADDR, true)
|
10
|
+
|
11
|
+
$PORT = 30317
|
12
|
+
|
13
|
+
|
14
|
+
$MAX_BUFFER_SIZE = 65000
|
15
|
+
|
16
|
+
|
17
|
+
def set_server(port=$PORT)
|
18
|
+
myaddr = Socket.pack_sockaddr_in(port, '0.0.0.0')
|
19
|
+
|
20
|
+
$socket.bind(myaddr)
|
21
|
+
|
22
|
+
$socket.listen(5)
|
23
|
+
|
24
|
+
puts "server listening on port: #{port}."
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
def accept_client
|
37
|
+
puts "waiting for the client to connect..."
|
38
|
+
|
39
|
+
$conn = $socket.accept
|
40
|
+
|
41
|
+
puts "#{$conn[1].ip_unpack()[0]} has connected!"
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
def connectto_target(ip, port=$PORT)
|
49
|
+
remote_addr = Socket.pack_sockaddr_in(port, ip)
|
50
|
+
|
51
|
+
puts "trying to connect to the target..."
|
52
|
+
$socket.connect(remote_addr)
|
53
|
+
puts "connected to the target!"
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
def recv_file
|
66
|
+
|
67
|
+
file_size = $conn[0].recv(1024).chomp
|
68
|
+
|
69
|
+
unless file_size == ''
|
70
|
+
|
71
|
+
begin
|
72
|
+
file_size = Integer(file_size)
|
73
|
+
rescue ArgumentError
|
74
|
+
puts "Oops, there was a problem..."
|
75
|
+
|
76
|
+
return nil
|
77
|
+
end
|
78
|
+
|
79
|
+
else
|
80
|
+
puts "file receiving ended."
|
81
|
+
exit()
|
82
|
+
end
|
83
|
+
|
84
|
+
filename = $conn[0].recv(1024).chomp
|
85
|
+
|
86
|
+
if file_size > 31457280
|
87
|
+
puts "#{filename} is bigger than 30 MB, cannot save!"
|
88
|
+
|
89
|
+
return nil
|
90
|
+
|
91
|
+
|
92
|
+
elsif file_size < $MAX_BUFFER_SIZE
|
93
|
+
file_content = $conn[0].recv($MAX_BUFFER_SIZE).chomp
|
94
|
+
|
95
|
+
else
|
96
|
+
file_content = ''
|
97
|
+
|
98
|
+
while true
|
99
|
+
data = $conn[0].recv($MAX_BUFFER_SIZE).chomp
|
100
|
+
|
101
|
+
if data == "END"
|
102
|
+
break
|
103
|
+
else
|
104
|
+
file_content += data
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
begin
|
112
|
+
open("./"+filename, "a").write(file_content)
|
113
|
+
|
114
|
+
rescue Errno::ENOENT
|
115
|
+
dirname = File.dirname(filename)
|
116
|
+
|
117
|
+
unless File.directory?(dirname)
|
118
|
+
FileUtils.mkdir_p(dirname)
|
119
|
+
open("./"+filename, "a").write(file_content)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
puts "received file '#{filename}'"
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
def send_file(filename)
|
131
|
+
|
132
|
+
puts "sending #{filename}..."
|
133
|
+
|
134
|
+
file_content = open(filename, "r").read()
|
135
|
+
|
136
|
+
file_size = file_content.length
|
137
|
+
|
138
|
+
$socket.puts(file_size)
|
139
|
+
sleep(0.5)
|
140
|
+
|
141
|
+
$socket.puts(filename)
|
142
|
+
sleep(0.5)
|
143
|
+
|
144
|
+
if file_size > 31457280
|
145
|
+
return nil
|
146
|
+
|
147
|
+
elsif file_size < $MAX_BUFFER_SIZE
|
148
|
+
$socket.puts(file_content)
|
149
|
+
|
150
|
+
else
|
151
|
+
buffers = buffer(file_content, buffer_size=$MAX_BUFFER_SIZE)
|
152
|
+
|
153
|
+
for buffer in buffers.values
|
154
|
+
$socket.puts(buffer)
|
155
|
+
sleep(0.1)
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
$socket.puts "END"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
def send_dir(dirname)
|
168
|
+
Dir["#{dirname}/**/*"].each do |file|
|
169
|
+
unless File.directory?(file)
|
170
|
+
send_file(file)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
|
194
|
+
module Transfer
|
195
|
+
def self.run_server
|
196
|
+
set_server
|
197
|
+
accept_client
|
198
|
+
while true
|
199
|
+
begin
|
200
|
+
recv_file
|
201
|
+
ensure
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.transfer(ip, file)
|
207
|
+
begin
|
208
|
+
connectto_target(ip)
|
209
|
+
rescue Errno::EISCONN
|
210
|
+
end
|
211
|
+
|
212
|
+
if File.directory?(file)
|
213
|
+
send_dir(file)
|
214
|
+
else
|
215
|
+
send_file(file)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple-transfer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Burzum
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-01-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files:
|
18
|
+
- README.md
|
19
|
+
files:
|
20
|
+
- README.md
|
21
|
+
- lib/buffer/buffer.rb
|
22
|
+
- lib/transfer.rb
|
23
|
+
homepage:
|
24
|
+
licenses: []
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubygems_version: 3.1.2
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: A gem for transfering files up to 30 mbs simply and with ease.
|
45
|
+
test_files: []
|