ji2p 0.0.3-java
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 +7 -0
- data/bin/bundle +15 -0
- data/bin/ctxirb +119 -0
- data/bin/simple_http_server +20 -0
- data/bin/simple_outproxy +96 -0
- data/lib/actor_system/actor.rb +10 -0
- data/lib/actor_system/concurrent/processor.rb +21 -0
- data/lib/actor_system/concurrent/worker.rb +13 -0
- data/lib/actor_system/core/minimal.rb +84 -0
- data/lib/actor_system/core/observable_implementation.rb +58 -0
- data/lib/actor_system/core/props.rb +45 -0
- data/lib/actor_system/dispatcher.rb +12 -0
- data/lib/actor_system/mailbox.rb +7 -0
- data/lib/actor_system/message.rb +60 -0
- data/lib/core_ext.rb +41 -0
- data/lib/gen_server.rb +57 -0
- data/lib/ji2p.rb +37 -0
- data/lib/ji2p/bundler.rb +165 -0
- data/lib/ji2p/cluster.rb +6 -0
- data/lib/ji2p/cluster/etcd.rb +5 -0
- data/lib/ji2p/cluster/etcd/version3.rb +6 -0
- data/lib/ji2p/cluster/kubernetes.rb +5 -0
- data/lib/ji2p/cluster/kubernetes/kube_api.rb +6 -0
- data/lib/ji2p/concurrent.rb +24 -0
- data/lib/ji2p/concurrent_executor.rb +56 -0
- data/lib/ji2p/config.rb +15 -0
- data/lib/ji2p/control.rb +15 -0
- data/lib/ji2p/control/client_manager.rb +14 -0
- data/lib/ji2p/control/dest.rb +34 -0
- data/lib/ji2p/control/keypair.rb +176 -0
- data/lib/ji2p/control/server.rb +80 -0
- data/lib/ji2p/control/socket_manager.rb +77 -0
- data/lib/ji2p/control/tunnel_manager.rb +62 -0
- data/lib/ji2p/environment.rb +35 -0
- data/lib/ji2p/gem_installer.rb +89 -0
- data/lib/ji2p/jar_dependencies.rb +15 -0
- data/lib/ji2p/proxy_support.rb +46 -0
- data/lib/ji2p/rspec.rb +16 -0
- data/lib/ji2p/server.rb +10 -0
- data/lib/ji2p/server/api.rb +14 -0
- data/lib/ji2p/server/database.rb +66 -0
- data/lib/ji2p/server/http.rb +69 -0
- data/lib/ji2p/server/http_server.rb +37 -0
- data/lib/ji2p/server/initializer.rb +4 -0
- data/lib/ji2p/server/launcher.rb +40 -0
- data/lib/ji2p/server/models.rb +9 -0
- data/lib/ji2p/server/models/base_record.rb +7 -0
- data/lib/ji2p/server/models/keypair.rb +32 -0
- data/lib/ji2p/server/models/tunnel.rb +4 -0
- data/lib/ji2p/startup.rb +12 -0
- data/lib/ji2p/startup/bootstrap.rb +60 -0
- data/lib/ji2p/startup/client_application.rb +20 -0
- data/lib/ji2p/startup/router_manager.rb +21 -0
- data/lib/ji2p/startup/sinatra_app.rb +61 -0
- data/lib/ji2p/utils/blocking_queue.rb +32 -0
- data/lib/ji2p/version.rb +3 -0
- data/lib/ji2p_jars.rb +16 -0
- data/lib/maybe.rb +148 -0
- data/lib/net/i2p/client/mstreaming/0.9.43/mstreaming-0.9.43.jar +0 -0
- data/lib/net/i2p/client/streaming/0.9.43/streaming-0.9.43.jar +0 -0
- data/lib/net/i2p/i2p/0.9.43/i2p-0.9.43.jar +0 -0
- data/lib/net/i2p/router/0.9.43/router-0.9.43.jar +0 -0
- metadata +375 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'rack'
|
2
|
+
|
3
|
+
module Ji2p::Server
|
4
|
+
class HTTP
|
5
|
+
VERSION = "HTTP/1.1" unless defined? VERSION
|
6
|
+
CRLF = "\r\n" unless defined? CRLF
|
7
|
+
|
8
|
+
def initialize(socket, application)
|
9
|
+
@socket = socket
|
10
|
+
@application = application
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
matches = /\A(?<method>\S+)\s+(?<uri>\S+)\s+(?<version>\S+)#{CRLF}\Z/.match(@socket.readline)
|
15
|
+
uri = URI.parse(matches[:uri])
|
16
|
+
|
17
|
+
env = {
|
18
|
+
"rack.errors" => $stderr,
|
19
|
+
"rack.version" => Rack::VERSION,
|
20
|
+
"rack.url_scheme" => uri.scheme || "http",
|
21
|
+
"REQUEST_METHOD" => matches[:method],
|
22
|
+
"REQUEST_URI" => matches[:uri],
|
23
|
+
"HTTP_VERSION" => matches[:version],
|
24
|
+
"QUERY_STRING" => uri.query || "",
|
25
|
+
"SERVER_PORT" => uri.port || 80,
|
26
|
+
"SERVER_NAME" => uri.host || "localhost",
|
27
|
+
"PATH_INFO" => uri.path || "",
|
28
|
+
"SCRIPT_NAME" => "",
|
29
|
+
}
|
30
|
+
|
31
|
+
while matches = /\A(?<key>[^:]+):\s*(?<value>.+)#{CRLF}\Z/.match(hl = @socket.readline)
|
32
|
+
case matches[:key]
|
33
|
+
when Rack::ContentType then env["CONTENT_TYPE"] = matches[:value]
|
34
|
+
when Rack::ContentLength then env["CONTENT_LENGTH"] = Integer(matches[:value])
|
35
|
+
else env["HTTP_" + matches[:key].tr("-", "_").upcase] ||= matches[:value]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
env["rack.input"] = StringIO.new(@socket.read(env["CONTENT_LENGTH"] || 0))
|
40
|
+
|
41
|
+
return env #.map { |_,v| String.new v }
|
42
|
+
end
|
43
|
+
|
44
|
+
def handle
|
45
|
+
env = parse
|
46
|
+
|
47
|
+
status, headers, body = @application.call(env)
|
48
|
+
|
49
|
+
time = Time.now.httpdate
|
50
|
+
|
51
|
+
@socket.write "#{env['HTTP_VERSION']} #{status} #{Rack::Utils::HTTP_STATUS_CODES.fetch(status.to_i) { 'UNKNOWN' }}#{CRLF}"
|
52
|
+
@socket.write "Date: #{time}#{CRLF}"
|
53
|
+
@socket.write "Connection: close#{CRLF}"
|
54
|
+
|
55
|
+
headers.each do |key, value|
|
56
|
+
@socket.write "#{key}: #{value}#{CRLF}"
|
57
|
+
end
|
58
|
+
|
59
|
+
@socket.write(CRLF)
|
60
|
+
|
61
|
+
body.each do |chunk|
|
62
|
+
@socket.write(chunk)
|
63
|
+
end
|
64
|
+
|
65
|
+
Ji2p.logger.info("[#{time}] '#{env["REQUEST_METHOD"]} #{env["REQUEST_URI"]} #{env["HTTP_VERSION"]}' #{status}")
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'http.rb'
|
2
|
+
|
3
|
+
module Ji2p::Server
|
4
|
+
class HttpServer
|
5
|
+
|
6
|
+
def initialize(application, socket)
|
7
|
+
@application = application
|
8
|
+
@socket = socket
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
loop do
|
13
|
+
begin
|
14
|
+
monitor
|
15
|
+
rescue Interrupt
|
16
|
+
Ji2p.logger.log("INTERRUPTED")
|
17
|
+
return
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def monitor
|
23
|
+
#selections, = IO.select(@sockets)
|
24
|
+
#io, = selections
|
25
|
+
io = @socket
|
26
|
+
|
27
|
+
begin
|
28
|
+
socket = io.accept
|
29
|
+
http = Ji2p::Server::HTTP::new(socket, @application)
|
30
|
+
http.handle
|
31
|
+
ensure
|
32
|
+
socket.close
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rack'
|
2
|
+
|
3
|
+
module Ji2p::Server
|
4
|
+
class Launcher
|
5
|
+
|
6
|
+
def initialize privateKeyData=nil
|
7
|
+
generate_keypair if privateKeyData.nil?
|
8
|
+
load_keypair privateKeyData unless privateKeyData.nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def generate_keypair
|
14
|
+
@keypair = Ji2p::Control::Keypair.generate!
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_keypair privateKeyData
|
18
|
+
@keypair = Ji2p::Control::Keypair.load_from_stream! StringIO.new(privateKeyData)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
class RackConfigLauncher < Launcher
|
24
|
+
|
25
|
+
def initialize privateKeyData, rackfile
|
26
|
+
super(privateKeyData)
|
27
|
+
@rack_config = rackfile.dup
|
28
|
+
end
|
29
|
+
|
30
|
+
def rack_application
|
31
|
+
raw = File.read(@rack_config)
|
32
|
+
builder = <<~BUILDER
|
33
|
+
Rack::Builder.new do
|
34
|
+
#{raw}
|
35
|
+
end
|
36
|
+
BUILDER
|
37
|
+
eval(builder, nil, @rack_config)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module Ji2p::Server
|
4
|
+
module Models
|
5
|
+
autoload :BaseRecord, File.expand_path('models/base_record.rb', __dir__)
|
6
|
+
autoload :Keypair, File.expand_path('models/keypair.rb', __dir__)
|
7
|
+
autoload :Tunnel, File.expand_path('models/tunnel.rb', __dir__)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
module Ji2p::Server::Models
|
5
|
+
Ji2p::Control::Keypair.class_eval do
|
6
|
+
def to_activerecord
|
7
|
+
row = Ji2p::Server::Models::Keypair.new
|
8
|
+
row.destination = @dest.base64
|
9
|
+
row.base32 = @dest.base32
|
10
|
+
row.private_key_data = Base64.encode64(@data)
|
11
|
+
row
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def write_dummy_stream obj
|
17
|
+
s = StringIO.new
|
18
|
+
obj.writeBytes(s.to_outputstream)
|
19
|
+
Base64.encode64 s.string
|
20
|
+
end
|
21
|
+
end
|
22
|
+
class Keypair < BaseRecord
|
23
|
+
|
24
|
+
def pk_data
|
25
|
+
Base64.decode64(private_key_data)
|
26
|
+
end
|
27
|
+
|
28
|
+
def getKeypairInstance
|
29
|
+
Ji2p::Control::Keypair.load_from_stream! StringIO.new(pk_data)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/ji2p/startup.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module Ji2p
|
2
|
+
module Startup
|
3
|
+
autoload :Bootstrap, File.expand_path('startup/bootstrap.rb', __dir__)
|
4
|
+
autoload :RouterManager, File.expand_path('startup/router_manager.rb', __dir__)
|
5
|
+
|
6
|
+
TMPDIR = File.expand_path('../../tmp', __dir__) unless defined? TMPDIR
|
7
|
+
|
8
|
+
def self.tmp_dir
|
9
|
+
TMPDIR
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'java'
|
2
|
+
|
3
|
+
module Ji2p::Startup
|
4
|
+
java_import java.lang.ClassLoader
|
5
|
+
java_import java.lang.System
|
6
|
+
|
7
|
+
class Bootstrap
|
8
|
+
def initialize defaults={'i2p.dir.config' => TMPDIR}
|
9
|
+
@defaults = defaults
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_system_property key, value
|
13
|
+
System.setProperty key.to_s, value.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_system_property value
|
17
|
+
System.getProperty[value.to_s]
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_jars
|
21
|
+
java_import java.lang.Thread
|
22
|
+
java_import java.net.URL
|
23
|
+
cl = Thread.currentThread.getContextClassLoader
|
24
|
+
dirname = System.getProperties['i2p.dir.base']
|
25
|
+
Dir["#{dirname}/lib/**.jar"].each do |jar|
|
26
|
+
u = Java::JavaNet::URL.new "file://#{jar}"
|
27
|
+
cl.addURL u
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def i2p_loaded?
|
32
|
+
java_import java.lang.Thread
|
33
|
+
cl = Thread.currentThread.getContextClassLoader
|
34
|
+
cl.getURLs.select { |item| item.to_s.include? 'i2p.jar' }.size > 0
|
35
|
+
end
|
36
|
+
|
37
|
+
def check_and_set_props!
|
38
|
+
if System.getProperties['i2p.dir.base'].nil?
|
39
|
+
unless ENV['I2PDIR'].nil?
|
40
|
+
System.setProperty 'i2p.dir.base', ENV['I2PDIR'].to_s
|
41
|
+
else
|
42
|
+
raise ArgumentError, 'The system property i2p.dir.base is missing!', caller if @defaults['i2p.dir.base'].nil?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
if System.getProperties['i2p.dir.config'].nil?
|
46
|
+
raise ArgumentError, 'The system property i2p.dir.config is missing!', caller if @defaults['i2p.dir.config'].nil?
|
47
|
+
System.setProperty 'i2p.dir.config', @defaults['i2p.dir.config']
|
48
|
+
end
|
49
|
+
System.setProperty 'java.awt.headless', 'true' if System.getProperties['java.awt.headless'].nil?
|
50
|
+
System.setProperty 'java.library.path', "#{System.getProperties['i2p.dir.base']}/lib" if System.getProperties['java.library.path'].nil?
|
51
|
+
end
|
52
|
+
|
53
|
+
def boot!
|
54
|
+
check_and_set_props!
|
55
|
+
load_jars unless i2p_loaded?
|
56
|
+
RouterManager.start_router!
|
57
|
+
RouterManager.router_context
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Ji2p
|
4
|
+
module Startup
|
5
|
+
class ClientApplication
|
6
|
+
java_import 'net.i2p.I2PAppContext'
|
7
|
+
|
8
|
+
def initialize name
|
9
|
+
@name = name
|
10
|
+
@ctx = Java::NetI2p::I2PAppContext.getGlobalContext
|
11
|
+
FileUtils.mkdir_p plugin_path unless File.exists? plugin_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def plugin_path
|
15
|
+
@proot_path ||= File.expand_path("plugins/#{@name}", @ctx.getAppDir.getAbsolutePath)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'java'
|
2
|
+
|
3
|
+
module Ji2p::Startup
|
4
|
+
class RouterManager
|
5
|
+
@@router = nil
|
6
|
+
include_package 'net.i2p.router'
|
7
|
+
|
8
|
+
def self.start_router!
|
9
|
+
@@router = RouterLaunch.main ARGV if @@router.nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.router_context
|
13
|
+
RouterContext.getCurrentContext
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.get_leases
|
17
|
+
ctx = RouterManager.router_context
|
18
|
+
ctx.netDb.get_leases.to_a
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'sinatra/base'
|
3
|
+
#require 'sinatra/config_file'
|
4
|
+
require 'sinatra/contrib'
|
5
|
+
require 'sinatra/cookies'
|
6
|
+
require 'sinatra/json'
|
7
|
+
require 'sinatra/namespace'
|
8
|
+
require 'sinatra/reloader'
|
9
|
+
#require 'sinatra/webdav'
|
10
|
+
require 'better_errors'
|
11
|
+
require 'binding_of_caller'
|
12
|
+
|
13
|
+
module Ji2p
|
14
|
+
module Startup
|
15
|
+
class SinatraApp < Sinatra::Base
|
16
|
+
APP_ROOT = File.expand_path('../..', __dir__) unless defined? APP_ROOT
|
17
|
+
|
18
|
+
use Rack::Session::Cookie, :key => 'rack.session',
|
19
|
+
:domain => 'localhost',
|
20
|
+
:path => '/',
|
21
|
+
:expire_after => 2592000, # In seconds
|
22
|
+
:secret => 'kake'
|
23
|
+
|
24
|
+
set :environments, %w{development test production staging}
|
25
|
+
enable :sessions, :logging
|
26
|
+
set :sessions, true
|
27
|
+
set :logging, true
|
28
|
+
set :server, %w[puma webrick]
|
29
|
+
set :app_file, __FILE__
|
30
|
+
set :public_folder, Proc.new { File.join(APP_ROOT, 'public') }
|
31
|
+
set :protection, :session => true
|
32
|
+
unless ENV['APP_ENV'].nil?
|
33
|
+
set :environment, ENV['APP_ENV']
|
34
|
+
else
|
35
|
+
set :environment, :development
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
configure :development do
|
40
|
+
register Sinatra::Reloader
|
41
|
+
|
42
|
+
use BetterErrors::Middleware
|
43
|
+
BetterErrors.application_root = APP_ROOT
|
44
|
+
|
45
|
+
set :reload_stuff, true
|
46
|
+
end
|
47
|
+
|
48
|
+
register Sinatra::Namespace
|
49
|
+
#register Sinatra::ConfigFile
|
50
|
+
|
51
|
+
helpers Sinatra::Cookies
|
52
|
+
|
53
|
+
set :show_exceptions, false
|
54
|
+
|
55
|
+
get '/' do
|
56
|
+
json :sinatra => { :status => 'OK', :request => request.env.to_json }
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
3
|
+
module Ji2p
|
4
|
+
module Utils
|
5
|
+
class BlockingQueue
|
6
|
+
attr_reader :queue, :mutex, :cv
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@queue = Array.new
|
10
|
+
@mutex = Mutex.new
|
11
|
+
@cv = ConditionVariable.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def push(ele)
|
15
|
+
@mutex.synchronize do
|
16
|
+
@queue.push ele
|
17
|
+
@cv.signal
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def pop
|
22
|
+
@mutex.synchronize do
|
23
|
+
while @queue.empty?
|
24
|
+
@cv.wait(@mutex)
|
25
|
+
end
|
26
|
+
|
27
|
+
@queue.pop
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/ji2p/version.rb
ADDED
data/lib/ji2p_jars.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# this is a generated file, to avoid over-writing it just delete this comment
|
2
|
+
begin
|
3
|
+
require 'jar_dependencies'
|
4
|
+
rescue LoadError
|
5
|
+
require 'net/i2p/router/0.9.43/router-0.9.43.jar'
|
6
|
+
require 'net/i2p/client/mstreaming/0.9.43/mstreaming-0.9.43.jar'
|
7
|
+
require 'net/i2p/client/streaming/0.9.43/streaming-0.9.43.jar'
|
8
|
+
require 'net/i2p/i2p/0.9.43/i2p-0.9.43.jar'
|
9
|
+
end
|
10
|
+
|
11
|
+
if defined? Jars
|
12
|
+
require_jar 'net.i2p', 'router', '0.9.43'
|
13
|
+
require_jar 'net.i2p.client', 'mstreaming', '0.9.43'
|
14
|
+
require_jar 'net.i2p.client', 'streaming', '0.9.43'
|
15
|
+
require_jar 'net.i2p', 'i2p', '0.9.43'
|
16
|
+
end
|