leecher 0.2.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gitignore +5 -4
  2. data/.travis.yml +2 -0
  3. data/Gemfile +1 -2
  4. data/Gemfile.lock +48 -0
  5. data/README +58 -0
  6. data/Rakefile +5 -7
  7. data/bin/leecher +2 -265
  8. data/bin/leecher-aria2-event-hook +12 -0
  9. data/config/amqp.example.yml +28 -0
  10. data/config/arguments.rb +12 -0
  11. data/config/aria2.example.yml +6 -0
  12. data/config/boot.rb +64 -0
  13. data/config/environment.rb +22 -0
  14. data/config/environments/development.rb +2 -0
  15. data/config/environments/production.rb +5 -0
  16. data/config/environments/test.rb +2 -0
  17. data/config/gheed.example.yml +2 -0
  18. data/config/leecher.example.yml +1 -0
  19. data/config/post-daemonize/readme +5 -0
  20. data/config/pre-daemonize/amqp.rb +6 -0
  21. data/config/pre-daemonize/json.rb +3 -0
  22. data/config/pre-daemonize/readme +12 -0
  23. data/config/pre-daemonize/safely.rb +13 -0
  24. data/leecher.gemspec +13 -4
  25. data/lib/leecher.rb +24 -2
  26. data/lib/leecher/aria2/client.rb +65 -0
  27. data/lib/leecher/client.rb +31 -211
  28. data/lib/leecher/gheed/client.rb +35 -0
  29. data/lib/leecher/metalink_queue.rb +68 -0
  30. data/lib/leecher/version.rb +1 -1
  31. data/libexec/leecher-daemon.rb +34 -0
  32. data/script/console +4 -0
  33. data/script/destroy +4 -0
  34. data/script/generate +4 -0
  35. data/spec/aria2/client_spec.rb +26 -0
  36. data/spec/client_spec.rb +42 -83
  37. data/spec/metalink_queue_spec.rb +25 -0
  38. data/spec/spec.opts +2 -0
  39. data/spec/spec_helper.rb +0 -2
  40. data/tasks/rspec.rake +6 -0
  41. metadata +134 -90
  42. data/config/aria2.conf +0 -15
  43. data/config/client.yml +0 -32
  44. data/lib/leecher/log.rb +0 -91
  45. data/lib/leecher/shellout.rb +0 -27
  46. data/spec/shellout_spec.rb +0 -26
@@ -1,15 +0,0 @@
1
- dir=<%= aria2_dir %>
2
- log=/tmp/aria.log
3
- check-integrity=true
4
- max-connection-per-server=<%= aria2_connections %>
5
- min-split-size=1M
6
- follow-torrent=mem
7
- max-overall-upload-limit=30K
8
- follow-metalink=mem
9
- metalink-servers=<%= aria2_connections %>
10
- rpc-listen-all=false
11
- rpc-listen-port=<%= aria2_rpc_port %>
12
- rpc-passwd=<%= aria2_rpc_password %>
13
- rpc-user=<%= aria2_rpc_user %>
14
- allow-piece-length-change=true
15
- save-session=<%= File.join(config_dirname, "session.aria2") %>
@@ -1,32 +0,0 @@
1
- :username: <%= username %>
2
- :password: <%= password %>
3
- :metalink_queue_name: metalink
4
- :log:
5
- :level: :info
6
- :filename: <%= File.join(config_dirname, "leecher.log") %>
7
- :bunny_opts:
8
- :host: <%= host %>
9
- :port: 5672
10
- :vhost: /
11
- :user: <%= username %>
12
- :pass: <%= password %>
13
- :ssl: false
14
- :verify_ssl: false
15
- :logfile: <%= File.join(config_dirname, "bunny.log") %>
16
- :logging: false
17
- :frame_max: 131072
18
- :channel_max: 0
19
- :heartbeat: 300
20
- :connect_timeout: 5
21
- :aria2_opts:
22
- :config: <%= File.join(config_dirname, "aria2.conf") %>
23
- :bin: <%= aria2_bin %>
24
- :args: [-D, --enable-rpc]
25
- :user: <%= aria2_rpc_user %>
26
- :password: <%= aria2_rpc_password %>
27
- :port: <%= aria2_rpc_port %>
28
- :daemon:
29
- :chdir: <%= File.join(config_dirname) %>
30
- :umask: 0000
31
- :stdout: <%= File.join(config_dirname, "stdout") %>
32
- :stderr: <%= File.join(config_dirname, "stderr") %>
@@ -1,91 +0,0 @@
1
- module Leecher
2
-
3
- class Log
4
-
5
- require "time"
6
-
7
- LEVELS = {
8
- :debug => 0,
9
- :warn => 1,
10
- :info => 2,
11
- :error => 3,
12
- :fatal => 4,
13
- }
14
-
15
- attr_accessor :log_fn
16
- attr_reader :level
17
-
18
- def initialize(level = :debug,
19
- log_fn = nil)
20
- self.level = level
21
- self.log_fn = log_fn
22
- open_log_fd()
23
- end
24
-
25
- def open_log_fd
26
- @log_fd.close() if @log_fd and not @log_fd.closed?
27
- if self.log_fn
28
- @log_fd = File.open(self.log_fn, "a")
29
- end
30
- end
31
-
32
- def close_log_fd
33
- if @log_fd and not @log_fd.closed?
34
- @log_fd.flush()
35
- @log_fd.close()
36
- end
37
- end
38
-
39
- LEVELS.each_key do |level|
40
- define_method(level) do |message|
41
- write_to_log(level, message)
42
- end
43
- end
44
-
45
- def level=(level)
46
- @level = level
47
- @_enum_level = LEVELS[level]
48
- end
49
-
50
- def write_to_log(level, message)
51
- if LEVELS[level] >= @_enum_level
52
- do_write_to_log(level, message)
53
- else
54
- # Toss it
55
- end
56
- end
57
-
58
- def do_write_to_log(level, message)
59
- iso8601_timestr = Time.now.iso8601()
60
- log_for_humans(iso8601_timestr, level, message)
61
-
62
- if @log_fd and not @log_fd.closed?
63
- @log_fd.puts("%s %s %s" % [iso8601_timestr, level.to_s.upcase, message])
64
- @log_fd.flush()
65
- end
66
- end
67
-
68
- # Map the log level (LOG_LEVEL_*) to an array containing
69
- # [human_name:String, colour:String(ANSI escape sequence)]
70
- ANSI_RED = "\033[0;31m"
71
- ANSI_RED_INVERTED = "\033[7;31m"
72
- ANSI_BROWN = "\033[0;33m"
73
- ANSI_MAGENTA = "\033[0;35m"
74
- ANSI_GREEN = "\033[0;32m"
75
- ANSI_BOLD_WHITE = "\033[0;37m"
76
- ANSI_NORMAL = "\033[0m"
77
- HUMAN_LOG_LEVELS = {
78
- :fatal => ["FATAL", ANSI_RED_INVERTED],
79
- :error => ["ERROR", ANSI_RED],
80
- :info => ["INFO", ANSI_GREEN],
81
- :warn => ["WARN", ANSI_MAGENTA],
82
- :debug => ["DEBUG", ANSI_BROWN],
83
- }
84
- def log_for_humans(iso8601_timestr, log_level, log_msg)
85
- level_str, level_colour = HUMAN_LOG_LEVELS[log_level]
86
- STDOUT.puts("#{ANSI_BOLD_WHITE}#{iso8601_timestr}#{ANSI_NORMAL} "\
87
- "#{level_colour}#{"%5.5s" % level_str}#{ANSI_NORMAL} #{log_msg}")
88
- STDOUT.flush()
89
- end
90
- end
91
- end
@@ -1,27 +0,0 @@
1
- module Leecher
2
- module Shellout
3
-
4
- # FIXME: probably want to implement timeouts here..
5
- def shellout(cmd, stdin = nil, stdout = nil, stderr = nil)
6
- child_pid, child_status = nil
7
- child_pid = Kernel.fork()
8
-
9
- if child_pid
10
- # Parent process executes this
11
- child_pid, child_status = Process.waitpid2(child_pid)
12
- else
13
- Process.setsid()
14
- STDIN.reopen(stdin || "/dev/null")
15
- STDOUT.reopen(stdout || "/dev/null")
16
- STDERR.reopen(stderr || "/dev/null")
17
- 3.upto(256) { |fd| IO.new(fd).close rescue nil }
18
-
19
- Kernel.exec(cmd)
20
- # Never reached.
21
- Kernel.exit!
22
- end
23
-
24
- child_status
25
- end
26
- end
27
- end
@@ -1,26 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- require 'leecher/shellout'
4
-
5
- include Leecher::Shellout
6
-
7
- describe Leecher::Shellout do
8
- it "should return 0 for true" do
9
- shellout("/bin/true").success?.should be_true
10
- end
11
-
12
- it "should return 1 for false" do
13
- shellout("/bin/false").success?.should be_false
14
- end
15
-
16
- it "should work with pipes" do
17
- stdin_rd, stdin_wr = IO.pipe()
18
- stdout_rd, stdout_wr = IO.pipe()
19
- stdin_wr.puts("foo")
20
- stdin_wr.close()
21
- child_status = shellout("cat", stdin_rd, stdout_wr)
22
- stdout_wr.close()
23
- stdout_rd.gets().should == "foo\n"
24
- stdout_rd.close()
25
- end
26
- end