sanguinews 0.64 → 0.70

Sign up to get free protection for your applications and to get access to all the features.
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