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.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +56 -0
  3. data/lib/buffer/buffer.rb +27 -0
  4. data/lib/transfer.rb +225 -0
  5. metadata +45 -0
@@ -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
@@ -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
@@ -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: []