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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b26b178a10c633dba392219f40f91dbf6f1869a5
4
- data.tar.gz: 9f6f39fd2343af67c0c0323529e602a4f33068cf
3
+ metadata.gz: be67fcb820039d30493c8255ba1decd0f1c115bf
4
+ data.tar.gz: f0eac690d332fe41d9baf96ed2a01dce20370aaa
5
5
  SHA512:
6
- metadata.gz: afb36351cf44ca9b4254e6855d008b4799b5a9c573b02a756fd0783848ac292e0147b6de80fefd08cdbe3537db942dacc22aabd2d52e337c67ed8d5f5eeb7074
7
- data.tar.gz: ae02784a767ac8014925fd4e80d1cddb0f5dc339314a2008a9164ad3b478158f0fd10caf7f6611e26d326a6b458730a1c42a345c5f04c1413a679a2edc337d7c
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
- @crc32 ||= begin
63
- fcrc32 = 0
64
- until self.eof?
65
- f = self.read(@@max_mem)
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
@@ -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
- @socket.read_timeout = @read_timeout
414
- @socket.debug_output = @debug_output
415
- end
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() })
@@ -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 = opts[:poster] if opts[: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, crc32, pcrc32, part_size, file_size, filename)
50
- chunk_start = ((current_part - 1) * part_size) + 1
51
- chunk_end = current_part * part_size
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=#{part_size} part=#{current_part} pcrc32=#{pcrc32} crc32=#{crc32}"
59
+ trailer = "=yend size=#{@length} part=#{current_part} pcrc32=#{@part_crc32} crc32=#{@crc32}"
60
60
  else
61
- trailer = "=yend size=#{part_size} part=#{current_part} pcrc32=#{pcrc32}"
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
@@ -1,3 +1,3 @@
1
1
  module Sanguinews
2
- VERSION = "0.64"
2
+ VERSION = "0.70"
3
3
  end
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 'crc32'
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
- data[:crc32] = yencoded[1].to_s(16)
56
- data[:yenc] = yencoded[0]
57
- data[:length] = len
58
- data[:chunk] = chunk
59
- data[:file] = file
60
- final_data[0] = form_message(data)
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.64'
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-09 00:00:00.000000000 Z
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