rbitter 0.1.0 → 0.1.2
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/.gitignore +21 -21
- data/.rspec +2 -2
- data/.travis.yml +15 -15
- data/Gemfile +12 -12
- data/LICENSE.txt +22 -22
- data/Rakefile +8 -8
- data/XMLRPC.md +19 -19
- data/bin/rbitter +20 -20
- data/lib/rbitter/arcserver.rb +130 -126
- data/lib/rbitter/console.rb +93 -93
- data/lib/rbitter/default/config_json.rb +37 -38
- data/lib/rbitter/dlthread.rb +62 -65
- data/lib/rbitter/env.rb +62 -62
- data/lib/rbitter/libtwitter_connection_override.rb +45 -45
- data/lib/rbitter/records.rb +121 -121
- data/lib/rbitter/records_migrate/20150327_add_index.rb +11 -11
- data/lib/rbitter/records_migrate/20150504_add_replyto_column.rb +11 -11
- data/lib/rbitter/streaming.rb +104 -104
- data/lib/rbitter/version.rb +20 -20
- data/lib/rbitter/xmlrpc.rb +3 -3
- data/lib/rbitter/xmlrpcd/base.rb +24 -24
- data/lib/rbitter/xmlrpcd/rpchandles.rb +11 -11
- data/lib/rbitter/xmlrpcd/xmlrpc_auth_server.rb +82 -82
- data/lib/rbitter/xmlrpcd/xmlrpcd.rb +69 -69
- data/lib/rbitter.rb +86 -86
- data/rbitter.gemspec +46 -42
- data/spec/config/default.json +32 -32
- data/spec/rbitter/arcserver_spec.rb +30 -30
- data/spec/rbitter/console_spec.rb +9 -9
- data/spec/rbitter/default/config_json_spec.rb +3 -3
- data/spec/rbitter/dlthread_spec.rb +8 -13
- data/spec/rbitter/env_spec.rb +62 -62
- data/spec/rbitter/libtwitter_connection_override_spec.rb +8 -8
- data/spec/rbitter/records_spec.rb +13 -13
- data/spec/rbitter/streaming_spec.rb +9 -9
- data/spec/rbitter/version_spec.rb +8 -8
- data/spec/rbitter/xmlrpc_spec.rb +8 -8
- data/spec/rbitter/xmlrpcd/base_spec.rb +29 -29
- data/spec/rbitter/xmlrpcd/rpchandles_spec.rb +10 -10
- data/spec/rbitter/xmlrpcd/xmlrpc_auth_server_spec.rb +8 -8
- data/spec/rbitter/xmlrpcd/xmlrpcd_spec.rb +9 -9
- data/spec/rbitter_spec.rb +42 -42
- data/spec/spec_helper.rb +39 -39
- metadata +29 -56
@@ -1,83 +1,83 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require "rbitter/xmlrpcd/rpchandles"
|
4
|
-
require "rbitter/xmlrpcd/base"
|
5
|
-
require "xmlrpc/server"
|
6
|
-
require "webrick"
|
7
|
-
|
8
|
-
module XMLRPC
|
9
|
-
class HTTPAuthXMLRPCServer < XMLRPC::WEBrickServlet
|
10
|
-
def extract_method(methodname, *args)
|
11
|
-
for name, obj in @handler
|
12
|
-
if obj.kind_of? Proc
|
13
|
-
next unless methodname == name
|
14
|
-
else
|
15
|
-
next unless methodname =~ /^#{name}(.+)$/
|
16
|
-
next unless obj.respond_to? $1
|
17
|
-
return obj.method($1)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
|
23
|
-
def service(request, response)
|
24
|
-
# Taken from xmlrpc/server.rb
|
25
|
-
if @valid_ip
|
26
|
-
raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip }
|
27
|
-
end
|
28
|
-
|
29
|
-
if request.request_method != "POST"
|
30
|
-
raise WEBrick::HTTPStatus::MethodNotAllowed,
|
31
|
-
"unsupported method `#{request.request_method}'."
|
32
|
-
end
|
33
|
-
|
34
|
-
if parse_content_type(request['Content-type']).first != "text/xml"
|
35
|
-
raise WEBrick::HTTPStatus::BadRequest
|
36
|
-
end
|
37
|
-
|
38
|
-
length = (request['Content-length'] || 0).to_i
|
39
|
-
|
40
|
-
raise WEBrick::HTTPStatus::LengthRequired unless length > 0
|
41
|
-
|
42
|
-
data = request.body
|
43
|
-
|
44
|
-
if data.nil? or data.bytesize != length
|
45
|
-
raise WEBrick::HTTPStatus::BadRequest
|
46
|
-
end
|
47
|
-
|
48
|
-
# Originally, process(data) was here.
|
49
|
-
# We need to check whether a method requires authorization.
|
50
|
-
rpc_method_name, rpc_params = parser().parseMethodCall(data)
|
51
|
-
rpc_method = extract_method(rpc_method_name)
|
52
|
-
|
53
|
-
if RPCHandles.auth.nil?
|
54
|
-
resp = handle(rpc_method_name, *rpc_params)
|
55
|
-
else
|
56
|
-
if rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::Auth)
|
57
|
-
# Check cookie and check it's valid
|
58
|
-
if request.cookies.size == 1 \
|
59
|
-
and request.cookies[0].name == "auth_key" \
|
60
|
-
and RPCHandles.auth.include?(request.cookies[0].value)
|
61
|
-
resp = handle(rpc_method_name, *rpc_params)
|
62
|
-
else
|
63
|
-
# Permission required
|
64
|
-
raise WEBrick::HTTPStatus::Forbidden
|
65
|
-
end
|
66
|
-
elsif rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::NoAuth)
|
67
|
-
resp = handle(rpc_method_name, *rpc_params)
|
68
|
-
else
|
69
|
-
raise WEBrick::HTTPStatus::Forbidden
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
if resp.nil? or resp.bytesize <= 0
|
74
|
-
raise WEBrick::HTTPStatus::InternalServerError
|
75
|
-
end
|
76
|
-
|
77
|
-
response.status = 200
|
78
|
-
response['Content-Length'] = resp.bytesize
|
79
|
-
response['Content-Type'] = "text/xml; charset=utf-8"
|
80
|
-
response.body = resp
|
81
|
-
end
|
82
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "rbitter/xmlrpcd/rpchandles"
|
4
|
+
require "rbitter/xmlrpcd/base"
|
5
|
+
require "xmlrpc/server"
|
6
|
+
require "webrick"
|
7
|
+
|
8
|
+
module XMLRPC
|
9
|
+
class HTTPAuthXMLRPCServer < XMLRPC::WEBrickServlet
|
10
|
+
def extract_method(methodname, *args)
|
11
|
+
for name, obj in @handler
|
12
|
+
if obj.kind_of? Proc
|
13
|
+
next unless methodname == name
|
14
|
+
else
|
15
|
+
next unless methodname =~ /^#{name}(.+)$/
|
16
|
+
next unless obj.respond_to? $1
|
17
|
+
return obj.method($1)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def service(request, response)
|
24
|
+
# Taken from xmlrpc/server.rb
|
25
|
+
if @valid_ip
|
26
|
+
raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip }
|
27
|
+
end
|
28
|
+
|
29
|
+
if request.request_method != "POST"
|
30
|
+
raise WEBrick::HTTPStatus::MethodNotAllowed,
|
31
|
+
"unsupported method `#{request.request_method}'."
|
32
|
+
end
|
33
|
+
|
34
|
+
if parse_content_type(request['Content-type']).first != "text/xml"
|
35
|
+
raise WEBrick::HTTPStatus::BadRequest
|
36
|
+
end
|
37
|
+
|
38
|
+
length = (request['Content-length'] || 0).to_i
|
39
|
+
|
40
|
+
raise WEBrick::HTTPStatus::LengthRequired unless length > 0
|
41
|
+
|
42
|
+
data = request.body
|
43
|
+
|
44
|
+
if data.nil? or data.bytesize != length
|
45
|
+
raise WEBrick::HTTPStatus::BadRequest
|
46
|
+
end
|
47
|
+
|
48
|
+
# Originally, process(data) was here.
|
49
|
+
# We need to check whether a method requires authorization.
|
50
|
+
rpc_method_name, rpc_params = parser().parseMethodCall(data)
|
51
|
+
rpc_method = extract_method(rpc_method_name)
|
52
|
+
|
53
|
+
if RPCHandles.auth.nil?
|
54
|
+
resp = handle(rpc_method_name, *rpc_params)
|
55
|
+
else
|
56
|
+
if rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::Auth)
|
57
|
+
# Check cookie and check it's valid
|
58
|
+
if request.cookies.size == 1 \
|
59
|
+
and request.cookies[0].name == "auth_key" \
|
60
|
+
and RPCHandles.auth.include?(request.cookies[0].value)
|
61
|
+
resp = handle(rpc_method_name, *rpc_params)
|
62
|
+
else
|
63
|
+
# Permission required
|
64
|
+
raise WEBrick::HTTPStatus::Forbidden
|
65
|
+
end
|
66
|
+
elsif rpc_method.owner.ancestors.include?(RPCHandles::BaseHandle::NoAuth)
|
67
|
+
resp = handle(rpc_method_name, *rpc_params)
|
68
|
+
else
|
69
|
+
raise WEBrick::HTTPStatus::Forbidden
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
if resp.nil? or resp.bytesize <= 0
|
74
|
+
raise WEBrick::HTTPStatus::InternalServerError
|
75
|
+
end
|
76
|
+
|
77
|
+
response.status = 200
|
78
|
+
response['Content-Length'] = resp.bytesize
|
79
|
+
response['Content-Type'] = "text/xml; charset=utf-8"
|
80
|
+
response.body = resp
|
81
|
+
end
|
82
|
+
end
|
83
83
|
end
|
@@ -1,69 +1,69 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require "rbitter/xmlrpcd/rpchandles"
|
4
|
-
require "rbitter/xmlrpcd/xmlrpc_auth_server"
|
5
|
-
require "webrick"
|
6
|
-
|
7
|
-
module Rbitter
|
8
|
-
RPC_PREFIX="rbitter"
|
9
|
-
|
10
|
-
class RPCServer
|
11
|
-
def initialize bind_host, bind_port
|
12
|
-
@server = WEBrick::HTTPServer.new(:Port => bind_port.to_i, :BindAddress => bind_host.to_s, :MaxClients => 4, :Logger => WEBrick::Log.new($stdout))
|
13
|
-
@core = XMLRPC::HTTPAuthXMLRPCServer.new
|
14
|
-
@core.set_default_handler { |name, *args|
|
15
|
-
"NO_COMMAND: #{name} with args #{args.inspect}"
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
|
-
def load_all_handles
|
20
|
-
Rbitter["xmlrpc"]["handles"].each { |path|
|
21
|
-
puts "[xmlrpc] Scanning handles from (#{path})"
|
22
|
-
Dir.entries(path).each { |fname|
|
23
|
-
fname = File.join(path, fname)
|
24
|
-
if File.exist?(fname) and File.file?(fname)
|
25
|
-
if fname.match(/rh_\w+\.rb$/)
|
26
|
-
begin
|
27
|
-
load fname
|
28
|
-
rescue Exception => e
|
29
|
-
# stub
|
30
|
-
puts "Exception while loading #{fname}"
|
31
|
-
puts e.inspect
|
32
|
-
end
|
33
|
-
else
|
34
|
-
puts "Ignored: #{fname}"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
puts "[xmlrpc] found #{RPCHandles.constants.length} constants."
|
41
|
-
RPCHandles.constants.each { |handler|
|
42
|
-
if RPCHandles.const_get(handler).is_a?(Class)
|
43
|
-
@core.add_handler(RPC_PREFIX, RPCHandles.const_get(handler).new)
|
44
|
-
end
|
45
|
-
}
|
46
|
-
end
|
47
|
-
|
48
|
-
def main_loop
|
49
|
-
load_all_handles
|
50
|
-
|
51
|
-
@server.mount("/", @core)
|
52
|
-
@server.start
|
53
|
-
|
54
|
-
puts "[xmlrpc] XMLRPC started"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class DummyRPCServer
|
59
|
-
def initialize bind_host, bind_port; end
|
60
|
-
|
61
|
-
def load_all_handles; end
|
62
|
-
|
63
|
-
def main_loop
|
64
|
-
puts "[xmlrpc] DummyRPCServer started"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class NullRPCServer; end
|
69
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "rbitter/xmlrpcd/rpchandles"
|
4
|
+
require "rbitter/xmlrpcd/xmlrpc_auth_server"
|
5
|
+
require "webrick"
|
6
|
+
|
7
|
+
module Rbitter
|
8
|
+
RPC_PREFIX="rbitter"
|
9
|
+
|
10
|
+
class RPCServer
|
11
|
+
def initialize bind_host, bind_port
|
12
|
+
@server = WEBrick::HTTPServer.new(:Port => bind_port.to_i, :BindAddress => bind_host.to_s, :MaxClients => 4, :Logger => WEBrick::Log.new($stdout))
|
13
|
+
@core = XMLRPC::HTTPAuthXMLRPCServer.new
|
14
|
+
@core.set_default_handler { |name, *args|
|
15
|
+
"NO_COMMAND: #{name} with args #{args.inspect}"
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def load_all_handles
|
20
|
+
Rbitter["xmlrpc"]["handles"].each { |path|
|
21
|
+
puts "[xmlrpc] Scanning handles from (#{path})"
|
22
|
+
Dir.entries(path).each { |fname|
|
23
|
+
fname = File.join(path, fname)
|
24
|
+
if File.exist?(fname) and File.file?(fname)
|
25
|
+
if fname.match(/rh_\w+\.rb$/)
|
26
|
+
begin
|
27
|
+
load fname
|
28
|
+
rescue Exception => e
|
29
|
+
# stub
|
30
|
+
puts "Exception while loading #{fname}"
|
31
|
+
puts e.inspect
|
32
|
+
end
|
33
|
+
else
|
34
|
+
puts "Ignored: #{fname}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
puts "[xmlrpc] found #{RPCHandles.constants.length} constants."
|
41
|
+
RPCHandles.constants.each { |handler|
|
42
|
+
if RPCHandles.const_get(handler).is_a?(Class)
|
43
|
+
@core.add_handler(RPC_PREFIX, RPCHandles.const_get(handler).new)
|
44
|
+
end
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def main_loop
|
49
|
+
load_all_handles
|
50
|
+
|
51
|
+
@server.mount("/", @core)
|
52
|
+
@server.start
|
53
|
+
|
54
|
+
puts "[xmlrpc] XMLRPC started"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class DummyRPCServer
|
59
|
+
def initialize bind_host, bind_port; end
|
60
|
+
|
61
|
+
def load_all_handles; end
|
62
|
+
|
63
|
+
def main_loop
|
64
|
+
puts "[xmlrpc] DummyRPCServer started"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class NullRPCServer; end
|
69
|
+
end
|
data/lib/rbitter.rb
CHANGED
@@ -1,86 +1,86 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
|
-
|
4
|
-
require "rbitter/version"
|
5
|
-
require "rbitter/arcserver"
|
6
|
-
require "rbitter/env"
|
7
|
-
require "rbitter/console"
|
8
|
-
require "rbitter/xmlrpc"
|
9
|
-
|
10
|
-
module Rbitter
|
11
|
-
BOOTSTRAP_ARGS = ['configure', 'console', 'help', 'logs', 'serve']
|
12
|
-
|
13
|
-
def self.rbitter_header
|
14
|
-
puts "Rbitter #{VERSION} on #{RUBY_VERSION} (#{RUBY_PLATFORM})"
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.rbitter_help_msg
|
18
|
-
puts "Rbitter is a Twitter streaming archiver, with XMLRPC access."
|
19
|
-
puts "-------"
|
20
|
-
puts "Usage: rbitter (application-mode)"
|
21
|
-
puts "application-mode's are:"
|
22
|
-
puts "|- serve : Launch Rbitter full system (Streaming + Database + XMLRPC)"
|
23
|
-
puts "|- console : Launch console application utilizing XMLRPC"
|
24
|
-
puts "|- configure: Write default configuration file 'config.json' in current folder"
|
25
|
-
puts "|- help : Show this message"
|
26
|
-
puts "`- logs : Show Rbitter internal logs"
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.prebootstrap
|
30
|
-
# Due to stalled socket problem, If unpatched twitter gem is installed.
|
31
|
-
# Twitter::Streaming::Connection will be monkey-patched.
|
32
|
-
patch_required = false
|
33
|
-
|
34
|
-
if Twitter::Version.const_defined?(:MAJOR)
|
35
|
-
b5_version = Twitter::Version::MAJOR * 10000
|
36
|
-
+ Twitter::Version::MINOR * 100 + Twitter::Version::PATCH
|
37
|
-
if b5_version <= 51400
|
38
|
-
warn "[rbitter] Monkey-patching Twitter::Streaming::Connection"
|
39
|
-
warn "[rbitter] Please upgrade twitter gem to apply streaming read timeout"
|
40
|
-
patch_required = true
|
41
|
-
end
|
42
|
-
else
|
43
|
-
b6_version = Twitter::Version.to_a
|
44
|
-
if b6_version[0] <= 6 and b6_version[1] <= 0 and b6_version[2] <= 0
|
45
|
-
patch_required = true
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
require "rbitter/libtwitter_connection_override" if patch_required
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.bootstrap_configs
|
53
|
-
require "rbitter/default/config_json"
|
54
|
-
|
55
|
-
open(File.join(Dir.pwd, "config.json"), "w") { |io|
|
56
|
-
io.write(DEFAULT_CONFIG_JSON)
|
57
|
-
}
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.bootstrap args=[]
|
61
|
-
return nil if args.length < 1
|
62
|
-
|
63
|
-
if args[0] == "serve"
|
64
|
-
prebootstrap
|
65
|
-
|
66
|
-
Rbitter.config_initialize
|
67
|
-
|
68
|
-
archive_server = Rbitter::ArcServer.new
|
69
|
-
archive_server.main_loop
|
70
|
-
elsif args[0] == "help"
|
71
|
-
rbitter_help_msg
|
72
|
-
elsif args[0] == "configure"
|
73
|
-
bootstrap_configs
|
74
|
-
elsif args[0] == "console"
|
75
|
-
Rbitter.config_initialize
|
76
|
-
|
77
|
-
con = Rbitter::Console.new
|
78
|
-
con.start
|
79
|
-
elsif args[0] == "logs"
|
80
|
-
# show log in stdout
|
81
|
-
puts "Log buffer feature is in heavy development. Sorry."
|
82
|
-
else
|
83
|
-
fail StandardError, "Invalid bootstrap parameter: #{args[0]}"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
|
4
|
+
require "rbitter/version"
|
5
|
+
require "rbitter/arcserver"
|
6
|
+
require "rbitter/env"
|
7
|
+
require "rbitter/console"
|
8
|
+
require "rbitter/xmlrpc"
|
9
|
+
|
10
|
+
module Rbitter
|
11
|
+
BOOTSTRAP_ARGS = ['configure', 'console', 'help', 'logs', 'serve']
|
12
|
+
|
13
|
+
def self.rbitter_header
|
14
|
+
puts "Rbitter #{VERSION} on #{RUBY_VERSION} (#{RUBY_PLATFORM})"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.rbitter_help_msg
|
18
|
+
puts "Rbitter is a Twitter streaming archiver, with XMLRPC access."
|
19
|
+
puts "-------"
|
20
|
+
puts "Usage: rbitter (application-mode)"
|
21
|
+
puts "application-mode's are:"
|
22
|
+
puts "|- serve : Launch Rbitter full system (Streaming + Database + XMLRPC)"
|
23
|
+
puts "|- console : Launch console application utilizing XMLRPC"
|
24
|
+
puts "|- configure: Write default configuration file 'config.json' in current folder"
|
25
|
+
puts "|- help : Show this message"
|
26
|
+
puts "`- logs : Show Rbitter internal logs"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.prebootstrap
|
30
|
+
# Due to stalled socket problem, If unpatched twitter gem is installed.
|
31
|
+
# Twitter::Streaming::Connection will be monkey-patched.
|
32
|
+
patch_required = false
|
33
|
+
|
34
|
+
if Twitter::Version.const_defined?(:MAJOR)
|
35
|
+
b5_version = Twitter::Version::MAJOR * 10000
|
36
|
+
+ Twitter::Version::MINOR * 100 + Twitter::Version::PATCH
|
37
|
+
if b5_version <= 51400
|
38
|
+
warn "[rbitter] Monkey-patching Twitter::Streaming::Connection"
|
39
|
+
warn "[rbitter] Please upgrade twitter gem to apply streaming read timeout"
|
40
|
+
patch_required = true
|
41
|
+
end
|
42
|
+
else
|
43
|
+
b6_version = Twitter::Version.to_a
|
44
|
+
if b6_version[0] <= 6 and b6_version[1] <= 0 and b6_version[2] <= 0
|
45
|
+
patch_required = true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
require "rbitter/libtwitter_connection_override" if patch_required
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.bootstrap_configs
|
53
|
+
require "rbitter/default/config_json"
|
54
|
+
|
55
|
+
open(File.join(Dir.pwd, "config.json"), "w") { |io|
|
56
|
+
io.write(DEFAULT_CONFIG_JSON)
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.bootstrap args=[]
|
61
|
+
return nil if args.length < 1
|
62
|
+
|
63
|
+
if args[0] == "serve"
|
64
|
+
prebootstrap
|
65
|
+
|
66
|
+
Rbitter.config_initialize
|
67
|
+
|
68
|
+
archive_server = Rbitter::ArcServer.new
|
69
|
+
archive_server.main_loop
|
70
|
+
elsif args[0] == "help"
|
71
|
+
rbitter_help_msg
|
72
|
+
elsif args[0] == "configure"
|
73
|
+
bootstrap_configs
|
74
|
+
elsif args[0] == "console"
|
75
|
+
Rbitter.config_initialize
|
76
|
+
|
77
|
+
con = Rbitter::Console.new
|
78
|
+
con.start
|
79
|
+
elsif args[0] == "logs"
|
80
|
+
# show log in stdout
|
81
|
+
puts "Log buffer feature is in heavy development. Sorry."
|
82
|
+
else
|
83
|
+
fail StandardError, "Invalid bootstrap parameter: #{args[0]}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/rbitter.gemspec
CHANGED
@@ -1,42 +1,46 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
lib = File.expand_path('../lib', __FILE__)
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require 'rbitter/version'
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = "rbitter"
|
9
|
-
spec.version = Rbitter::VERSION
|
10
|
-
spec.authors = ["Nidev Plontra"]
|
11
|
-
spec.email = ["nidev.plontra@gmail.com"]
|
12
|
-
spec.summary = %q{Rbitter is a Twitter client specialized in archiving}
|
13
|
-
spec.description = %q{Rbitter archives all tweets appeared on user streaming using ActiveRecord. XMLRPC is used to serve archived tweets and useful features}
|
14
|
-
spec.homepage = "https://github.com/nidev/rbitter"
|
15
|
-
spec.license = "MIT"
|
16
|
-
|
17
|
-
spec.files = `git ls-files -z`.split("\x0")
|
18
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
-
spec.require_paths = ["lib"]
|
21
|
-
|
22
|
-
|
23
|
-
spec.add_dependency 'twitter', '~> 5.14'
|
24
|
-
spec.add_dependency 'json', '~> 1.7'
|
25
|
-
spec.add_dependency 'ripl', '~> 0.7'
|
26
|
-
spec.add_dependency 'activerecord', '~> 4.0'
|
27
|
-
|
28
|
-
if RUBY_PLATFORM == 'java'
|
29
|
-
spec.
|
30
|
-
|
31
|
-
spec.add_dependency 'jdbc-
|
32
|
-
spec.add_dependency '
|
33
|
-
spec.add_dependency '
|
34
|
-
|
35
|
-
spec.add_dependency '
|
36
|
-
|
37
|
-
spec.
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'rbitter/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "rbitter"
|
9
|
+
spec.version = Rbitter::VERSION
|
10
|
+
spec.authors = ["Nidev Plontra"]
|
11
|
+
spec.email = ["nidev.plontra@gmail.com"]
|
12
|
+
spec.summary = %q{Rbitter is a Twitter client specialized in archiving}
|
13
|
+
spec.description = %q{Rbitter archives all tweets appeared on user streaming using ActiveRecord. XMLRPC is used to serve archived tweets and useful features}
|
14
|
+
spec.homepage = "https://github.com/nidev/rbitter"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
|
23
|
+
spec.add_dependency 'twitter', '~> 5.14'
|
24
|
+
spec.add_dependency 'json', '~> 1.7'
|
25
|
+
spec.add_dependency 'ripl', '~> 0.7'
|
26
|
+
spec.add_dependency 'activerecord', '~> 4.0'
|
27
|
+
|
28
|
+
if RUBY_PLATFORM == 'java'
|
29
|
+
spec.platform = 'java'
|
30
|
+
|
31
|
+
spec.add_dependency 'activerecord-jdbc-adapter', '~> 1.3'
|
32
|
+
spec.add_dependency 'jdbc-sqlite3', '~> 3.8'
|
33
|
+
spec.add_dependency 'jdbc-mysql', '~> 5.1'
|
34
|
+
spec.add_dependency 'activerecord-jdbcsqlite3-adapter', '~> 1.3'
|
35
|
+
spec.add_dependency 'activerecord-jdbcmysql-adapter', '~> 1.3'
|
36
|
+
else
|
37
|
+
spec.platform = 'ruby'
|
38
|
+
|
39
|
+
spec.add_dependency 'sqlite3', '~> 1.3'
|
40
|
+
spec.add_dependency 'mysql2', '~> 0.3'
|
41
|
+
spec.add_dependency 'activerecord-mysql2-adapter', '~> 0.0.3'
|
42
|
+
end
|
43
|
+
|
44
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
45
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
46
|
+
end
|
data/spec/config/default.json
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
{
|
2
|
-
"twitter": {
|
3
|
-
"consumer_key": "",
|
4
|
-
"consumer_secret": "",
|
5
|
-
"access_token": "",
|
6
|
-
"access_token_secret": ""
|
7
|
-
},
|
8
|
-
"activerecord": "sqlite3",
|
9
|
-
"sqlite3": {
|
10
|
-
"dbfile": "rbitter.sqlite"
|
11
|
-
},
|
12
|
-
"mysql2": {
|
13
|
-
"host": "localhost",
|
14
|
-
"port": 3306,
|
15
|
-
"dbname": "archive",
|
16
|
-
"username": "",
|
17
|
-
"password": ""
|
18
|
-
},
|
19
|
-
"media_downloader": {
|
20
|
-
"cacert_path": "/cacerts/cacert.pem",
|
21
|
-
"download_dir": "imgs/"
|
22
|
-
},
|
23
|
-
"xmlrpc": {
|
24
|
-
"enable": true,
|
25
|
-
"bind_host": "0.0.0.0",
|
26
|
-
"bind_port": 1400,
|
27
|
-
"auth": {
|
28
|
-
"username": "username",
|
29
|
-
"password": "password"
|
30
|
-
},
|
31
|
-
"handles": ["/path/to/handles"]
|
32
|
-
}
|
1
|
+
{
|
2
|
+
"twitter": {
|
3
|
+
"consumer_key": "",
|
4
|
+
"consumer_secret": "",
|
5
|
+
"access_token": "",
|
6
|
+
"access_token_secret": ""
|
7
|
+
},
|
8
|
+
"activerecord": "sqlite3",
|
9
|
+
"sqlite3": {
|
10
|
+
"dbfile": "rbitter.sqlite"
|
11
|
+
},
|
12
|
+
"mysql2": {
|
13
|
+
"host": "localhost",
|
14
|
+
"port": 3306,
|
15
|
+
"dbname": "archive",
|
16
|
+
"username": "",
|
17
|
+
"password": ""
|
18
|
+
},
|
19
|
+
"media_downloader": {
|
20
|
+
"cacert_path": "/cacerts/cacert.pem",
|
21
|
+
"download_dir": "imgs/"
|
22
|
+
},
|
23
|
+
"xmlrpc": {
|
24
|
+
"enable": true,
|
25
|
+
"bind_host": "0.0.0.0",
|
26
|
+
"bind_port": 1400,
|
27
|
+
"auth": {
|
28
|
+
"username": "username",
|
29
|
+
"password": "password"
|
30
|
+
},
|
31
|
+
"handles": ["/path/to/handles"]
|
32
|
+
}
|
33
33
|
}
|