sanguinews 0.64 → 0.70
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 +4 -4
- data/lib/sanguinews/file_to_upload.rb +12 -21
- data/lib/sanguinews/nntp.rb +5 -6
- data/lib/sanguinews/nntp_msg.rb +17 -8
- data/lib/sanguinews/version.rb +1 -1
- data/lib/sanguinews.rb +13 -31
- metadata +2 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be67fcb820039d30493c8255ba1decd0f1c115bf
|
4
|
+
data.tar.gz: f0eac690d332fe41d9baf96ed2a01dce20370aaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f81ce4b9b6f57db3b75c4cd28e3e7fe99f57fffcb4f9a72c42b8c47dbc7e975c183984fa337e597bcd17a054fafee20e65e4a28bb78f088a5adcf95423b362c1
|
7
|
+
data.tar.gz: d7bb9a2ec530a79045ba59daba1f10043ddd41f6808ebbe9042fb12d623737a3d4e30fdb8b08764857762591abdd22d8f2a329ffc2e3131469a7dcfd518fed93
|
@@ -15,16 +15,12 @@
|
|
15
15
|
# with this library; if not, write to the Free Software Foundation, Inc.,
|
16
16
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
17
17
|
########################################################################
|
18
|
-
require 'nzb'
|
19
|
-
require 'vmstat'
|
20
18
|
|
21
19
|
module Sanguinews
|
22
20
|
class FileToUpload < File
|
23
|
-
attr_accessor :name, :chunks, :subject
|
21
|
+
attr_accessor :name, :chunks, :subject, :messages
|
24
22
|
attr_reader :crc32, :nzb, :dir_prefix, :cname
|
25
23
|
|
26
|
-
@@max_mem = nil
|
27
|
-
|
28
24
|
def initialize(var)
|
29
25
|
@dir_prefix = ''
|
30
26
|
|
@@ -35,12 +31,17 @@ module Sanguinews
|
|
35
31
|
@name = File.basename(var[:name])
|
36
32
|
chunk_amount(var[:chunk_length])
|
37
33
|
common_name(var)
|
38
|
-
max_mem
|
39
34
|
if var[:nzb]
|
40
35
|
@from = var[:from]
|
41
36
|
@groups = var[:groups]
|
42
37
|
nzb_init
|
43
38
|
end
|
39
|
+
@messages = []
|
40
|
+
@chunks.times do |x|
|
41
|
+
subject = "#{var[:prefix]}#{@dir_prefix}\"#{@name}\" yEnc (#{x+1}/#{@chunks})"
|
42
|
+
@messages[x] = NntpMsg.new(@from, @groups, subject)
|
43
|
+
@messages[x].xna = var[:xna]
|
44
|
+
end
|
44
45
|
return @name
|
45
46
|
end
|
46
47
|
|
@@ -59,15 +60,12 @@ module Sanguinews
|
|
59
60
|
end
|
60
61
|
|
61
62
|
def file_crc32
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
fcrc32 = Crc32.calculate(f, f.size, fcrc32)
|
67
|
-
end
|
68
|
-
self.rewind
|
69
|
-
fcrc32.to_s(16)
|
63
|
+
fcrc32 = false
|
64
|
+
@messages.each do |message|
|
65
|
+
fcrc32 &&= Zlib.crc32_combine(fcrc32, message.part_crc32.to_i(16), message.length)
|
66
|
+
fcrc32 ||= message.part_crc32.to_i(16)
|
70
67
|
end
|
68
|
+
@crc32 = fcrc32.to_s(16)
|
71
69
|
end
|
72
70
|
|
73
71
|
private
|
@@ -92,12 +90,5 @@ module Sanguinews
|
|
92
90
|
@nzb.write_header
|
93
91
|
end
|
94
92
|
|
95
|
-
def max_mem
|
96
|
-
@@max_mem ||= begin
|
97
|
-
memory = Vmstat.memory
|
98
|
-
@@max_mem = (memory[:free] * memory[:pagesize] * 0.1).floor
|
99
|
-
end
|
100
|
-
@@max_mem
|
101
|
-
end
|
102
93
|
end
|
103
94
|
end
|
data/lib/sanguinews/nntp.rb
CHANGED
@@ -399,9 +399,6 @@ module Net #:nodoc:
|
|
399
399
|
|
400
400
|
else
|
401
401
|
socket = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
|
402
|
-
@socket = InternetMessageIO.new(socket)
|
403
|
-
@socket.read_timeout = @read_timeout
|
404
|
-
@socket.debug_output = @debug_output
|
405
402
|
# Use OpenSSL to wrap socket
|
406
403
|
# Introduced by: Tadeus Dobrovolskij
|
407
404
|
if method == :tls
|
@@ -410,9 +407,11 @@ module Net #:nodoc:
|
|
410
407
|
ssl.sync_close = true
|
411
408
|
ssl.connect
|
412
409
|
@socket = InternetMessageIO.new(ssl)
|
413
|
-
|
414
|
-
|
415
|
-
|
410
|
+
else
|
411
|
+
@socket = InternetMessageIO.new(socket)
|
412
|
+
end
|
413
|
+
@socket.read_timeout = @read_timeout
|
414
|
+
@socket.debug_output = @debug_output
|
416
415
|
end
|
417
416
|
|
418
417
|
check_response(critical { recv_response() })
|
data/lib/sanguinews/nntp_msg.rb
CHANGED
@@ -20,7 +20,7 @@ require 'date'
|
|
20
20
|
|
21
21
|
module Sanguinews
|
22
22
|
class NntpMsg
|
23
|
-
attr_accessor :message, :from, :groups, :subject, :poster, :date, :xna
|
23
|
+
attr_accessor :message, :from, :groups, :subject, :poster, :date, :xna, :crc32, :part_crc32, :length
|
24
24
|
|
25
25
|
def initialize(from, groups, subject, message='', **opts)
|
26
26
|
@from = from
|
@@ -29,7 +29,7 @@ module Sanguinews
|
|
29
29
|
@message = message
|
30
30
|
@date = opts[:date] if opts[:date]
|
31
31
|
@date ||= DateTime.now().strftime('%a, %d %b %Y %T %z')
|
32
|
-
@poster =
|
32
|
+
@poster = "sanguinews v#{Sanguinews::VERSION} (ruby #{RUBY_VERSION}) - https://github.com/tdobrovolskij/sanguinews"
|
33
33
|
end
|
34
34
|
|
35
35
|
def create_header
|
@@ -46,19 +46,19 @@ module Sanguinews
|
|
46
46
|
return header
|
47
47
|
end
|
48
48
|
|
49
|
-
def yenc_body(current_part, parts,
|
50
|
-
chunk_start = ((current_part - 1) *
|
51
|
-
chunk_end = current_part *
|
49
|
+
def yenc_body(current_part, parts, file_size, filename)
|
50
|
+
chunk_start = ((current_part - 1) * @length) + 1
|
51
|
+
chunk_end = current_part * @length
|
52
52
|
if (parts==1)
|
53
53
|
headerline = "=ybegin line=128 size=#{file_size} name=#{filename}"
|
54
|
-
trailer = "=yend size=#{file_size} crc32=#{crc32}"
|
54
|
+
trailer = "=yend size=#{file_size} crc32=#{@crc32}"
|
55
55
|
else
|
56
56
|
headerline = "=ybegin part=#{current_part} total=#{parts} line=128 size=#{file_size} name=#{filename}\n=ypart begin=#{chunk_start} end=#{chunk_end}"
|
57
57
|
# last part
|
58
58
|
if (current_part == parts)
|
59
|
-
trailer = "=yend size=#{
|
59
|
+
trailer = "=yend size=#{@length} part=#{current_part} pcrc32=#{@part_crc32} crc32=#{@crc32}"
|
60
60
|
else
|
61
|
-
trailer = "=yend size=#{
|
61
|
+
trailer = "=yend size=#{@length} part=#{current_part} pcrc32=#{@part_crc32}"
|
62
62
|
end
|
63
63
|
end
|
64
64
|
headerline << "\n#{@message}\n"
|
@@ -74,5 +74,14 @@ module Sanguinews
|
|
74
74
|
def size
|
75
75
|
return @message.length
|
76
76
|
end
|
77
|
+
|
78
|
+
def unset
|
79
|
+
@from = nil
|
80
|
+
@groups = nil
|
81
|
+
@subject = nil
|
82
|
+
@poster = nil
|
83
|
+
@date = nil
|
84
|
+
@message = nil
|
85
|
+
end
|
77
86
|
end
|
78
87
|
end
|
data/lib/sanguinews/version.rb
CHANGED
data/lib/sanguinews.rb
CHANGED
@@ -22,10 +22,11 @@ require 'optparse'
|
|
22
22
|
require 'monitor'
|
23
23
|
require 'date'
|
24
24
|
require 'tempfile'
|
25
|
+
require 'zlib'
|
25
26
|
# Following non-standard gems are needed
|
26
27
|
require 'parseconfig'
|
27
28
|
require 'speedometer'
|
28
|
-
require '
|
29
|
+
require 'nzb'
|
29
30
|
# Our library
|
30
31
|
require_relative 'sanguinews/thread-pool'
|
31
32
|
require_relative 'sanguinews/nntp'
|
@@ -52,39 +53,21 @@ module Sanguinews
|
|
52
53
|
final_data = []
|
53
54
|
len = bindata.length
|
54
55
|
yencoded = Yencoded::Data.yenc(bindata, len)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
56
|
+
msg = file.messages[chunk-1]
|
57
|
+
msg.message = yencoded[0].force_encoding('ASCII-8BIT')
|
58
|
+
msg.part_crc32 = yencoded[1].to_s(16)
|
59
|
+
msg.length = len
|
60
|
+
msg.crc32 = file.file_crc32 if chunk == file.chunks
|
61
|
+
msg.yenc_body(chunk, file.chunks, file.size, file.name)
|
62
|
+
final_data[0] = { message: msg.return_self, filename: file.name, chunk: chunk, length: len }
|
61
63
|
final_data[1] = file
|
62
64
|
queue.push(final_data)
|
65
|
+
# we do care about user's memory
|
66
|
+
msg.unset
|
63
67
|
chunk += 1
|
64
68
|
end
|
65
69
|
end
|
66
70
|
|
67
|
-
def form_message(data)
|
68
|
-
message = data[:yenc]
|
69
|
-
length = data[:length]
|
70
|
-
pcrc32 = data[:crc32]
|
71
|
-
file = data[:file]
|
72
|
-
chunk = data[:chunk]
|
73
|
-
crc32 = file.crc32
|
74
|
-
fsize = file.size
|
75
|
-
chunks = file.chunks
|
76
|
-
basename = file.name
|
77
|
-
# usenet works with ASCII
|
78
|
-
subject="#{@config.prefix}#{file.dir_prefix}\"#{basename}\" yEnc (#{chunk}/#{chunks})"
|
79
|
-
msg = NntpMsg.new(@config.from, @config.groups, subject)
|
80
|
-
msg.poster = "sanguinews v#{Sanguinews::VERSION} (ruby #{RUBY_VERSION}) - https://github.com/tdobrovolskij/sanguinews"
|
81
|
-
msg.xna = @config.xna
|
82
|
-
msg.message = message.force_encoding('ASCII-8BIT')
|
83
|
-
msg.yenc_body(chunk, chunks, crc32, pcrc32, length, fsize, basename)
|
84
|
-
msg = msg.return_self
|
85
|
-
{ message: msg, filename: basename, chunk: chunk, length: length }
|
86
|
-
end
|
87
|
-
|
88
71
|
def connect(conn_nr)
|
89
72
|
begin
|
90
73
|
nntp = Net::NNTP.start(
|
@@ -164,7 +147,8 @@ module Sanguinews
|
|
164
147
|
file = FileToUpload.new(
|
165
148
|
name: file, chunk_length: @config.article_size, prefix: @config.prefix,
|
166
149
|
current: current_file, last: max, filemode: @config.filemode,
|
167
|
-
from: @config.from, groups: @config.groups, nzb: @config.nzb
|
150
|
+
from: @config.from, groups: @config.groups, nzb: @config.nzb,
|
151
|
+
prefix: @config.prefix, xna: @config.xna
|
168
152
|
)
|
169
153
|
@s.to_upload += file.size
|
170
154
|
|
@@ -263,8 +247,6 @@ module Sanguinews
|
|
263
247
|
# let's give a little bit higher priority for file processing thread
|
264
248
|
@file_proc_thread = Thread.new {
|
265
249
|
files_to_process.each do |file|
|
266
|
-
@s.log("Calculating CRC32 value for #{file.name}\n", stderr: true) if @verbose
|
267
|
-
file.file_crc32
|
268
250
|
@s.log("Encoding #{file.name}\n")
|
269
251
|
yencode(file, @config.article_size, messages)
|
270
252
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sanguinews
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.70'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tadeus Dobrovolskij
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: speedometer
|
@@ -50,20 +50,6 @@ dependencies:
|
|
50
50
|
- - ">="
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: 0.2.2
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: vmstat
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '2.1'
|
60
|
-
type: :runtime
|
61
|
-
prerelease: false
|
62
|
-
version_requirements: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
64
|
-
- - "~>"
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: '2.1'
|
67
53
|
- !ruby/object:Gem::Dependency
|
68
54
|
name: parseconfig
|
69
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,20 +64,6 @@ dependencies:
|
|
78
64
|
- - "~>"
|
79
65
|
- !ruby/object:Gem::Version
|
80
66
|
version: '1.0'
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: crc32
|
83
|
-
requirement: !ruby/object:Gem::Requirement
|
84
|
-
requirements:
|
85
|
-
- - "~>"
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: '1.0'
|
88
|
-
type: :runtime
|
89
|
-
prerelease: false
|
90
|
-
version_requirements: !ruby/object:Gem::Requirement
|
91
|
-
requirements:
|
92
|
-
- - "~>"
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: '1.0'
|
95
67
|
- !ruby/object:Gem::Dependency
|
96
68
|
name: rake
|
97
69
|
requirement: !ruby/object:Gem::Requirement
|