metafiles changed; Sandbox has an own repository: Safebox

This commit is contained in:
Denis Knauf 2010-03-20 23:33:14 +01:00
parent 31cf25c5ab
commit fc04254b8e
5 changed files with 126 additions and 53 deletions

View file

View file

@ -10,8 +10,8 @@ begin
gem.email = "Denis.Knauf@gmail.com"
gem.homepage = "http://github.com/DenisKnauf/logan"
gem.authors = ["Denis Knauf"]
gem.files = ["README", "VERSION", "lib/**/*.rb", "test/**/*.rb"]
gem.require_paths = ["lib"]
gem.files = %w[AUTHORS README.md VERSION lib/**/*.rb test/**/*.rb]
gem.require_paths = %w[lib]
end
Jeweler::GemcutterTasks.new
rescue LoadError

87
bin/box2.rb Executable file
View file

@ -0,0 +1,87 @@
#!/usr/bin/ruby
require 'sbdb'
module Sandbox
def self.run *paras, &exe
exe = paras.shift unless exe
box = paras.shift || Class
Thread.new do
$SAFE = 4
this = box.new *paras
begin
[:value, this.instance_eval( exe, "Sandbox")]
rescue Object
[:exception, $!]
end
end.value
end
def self.create_class *paras, &exe
exe = paras.shift unless exe
run Class, *paras do
eval exe
self
end
end
alias new_class create_class
end
class Box
attr_reader :_, :db
def initialize db, _
@_, @db = _, db
end
def put( key, val) @db[key] = val end
def get( key) @db[key] end
end
class ClassBuilder
end
class Emit
def initialize( db) @db = db end
def emit( key, val) @db[key] = val end
def inspect() "#<%s:0x%016x>" % [ self.class, self.object_id ] end
end
class Persistent < Emit
include Enumerable
def initialize db, cursor
super db
@cursor = cursor
end
alias put emit
alias []= emit
def get( key) @db[key] end
alias [] get
alias fetch get
def each &exe
exe ? @cursor.each( &exe) : Enumerator.new( self, :each)
end
def to_hash
rh = {}
each {|key, val| rh[ key] = val }
rh
end
end
_ = nil
Dir.mkdir 'logs' rescue Errno::EEXIST
SBDB::Env.new 'logs', SBDB::CREATE | SBDB::Env::INIT_TRANSACTION do |logs|
db = logs['test', :type => SBDB::Btree, :flags => SBDB::CREATE]
db = Persistent.new db, db.cursor
$stdout.print "(0)$ "
STDIN.each_with_index do |line, i|
ret = Sandbox.run line, Box, db, _
if :value == ret.first
_ = ret.last
$stdout.puts "=> #{ret.last.inspect}"
else
$stdout.puts ret.last.inspect
end
$stdout.print "(#{i+1})$ "
end
end

22
bin/box3.rb Executable file
View file

@ -0,0 +1,22 @@
#!/usr/bin/ruby
require 'sbdb'
require 'safebox'
_ = nil
Dir.mkdir 'logs' rescue Errno::EEXIST
SBDB::Env.new 'logs', SBDB::CREATE | SBDB::Env::INIT_TRANSACTION do |logs|
db = logs['test', :type => SBDB::Btree, :flags => SBDB::CREATE]
db = Safebox::Persistent.new db, db.cursor
$stdout.print "(0)$ "
STDIN.each_with_index do |line, i|
ret = Safebox.run line, Safebox::Box, db, _
if :value == ret.first
_ = ret.last
$stdout.puts "=> #{ret.last.inspect}"
else
$stdout.puts ret.last.inspect
end
$stdout.print "(#{i+1})$ "
end
end

View file

@ -1,58 +1,22 @@
#!/usr/bin/ruby
require 'sbdb'
require 'safebox'
# Secure Worker. Unsafe code in a sandbox.
class Worker
class Box
def self.start e, c
Thread.new c, &new( e).method( :run)
end
def run
this.untaint
e.taint
$SAFE = 4
end
def initialize e
@emit = e
end
def emit f, k, v
@emit.emit f, k, v
end
end
def emit f, k, v
@out.push [f, k, v]
end
def initalize i, o
@in, @out, @funcs = i, o, {}
super method(:run)
end
def run
$SAFE = 3
@in.each do |o|
@funcs[:]
end
end
end
SBDB::Env.new 'conf' do |conf|
SBDB::Env.new 'logs' do |logs|
SBDB::Env.new 'persist' do |persist|
test = cache[ 'test']
while line = logs[ 'newids'].get( nil, "\0\0\0\0", nil, SBDB::CONSUME_WAIT)
type, obj = line.unpack 'Na*'
case type
when 11
sid, log = obj.unpack 'Na*'
parser = conf[ 'sids.cnf', 'parser'][sid]
end
end
_ = nil
Dir.mkdir 'logs' rescue Errno::EEXIST
SBDB::Env.new 'logs', SBDB::CREATE | SBDB::Env::INIT_TRANSACTION do |logs|
db = logs['test', :type => SBDB::Btree, :flags => SBDB::CREATE]
db = Safebox::Persistent.new db, db.cursor
$stdout.print "(0)$ "
STDIN.each_with_index do |line, i|
ret = Safebox.run line, Safebox::Box, db, _
if :value == ret.first
_ = ret.last
$stdout.puts "=> #{ret.last.inspect}"
else
$stdout.puts ret.last.inspect
end
$stdout.print "(#{i+1})$ "
end
end