Browse Source

Work on chroot jails.

master
Ben Kurtovic 8 years ago
parent
commit
36adea515a
6 changed files with 62 additions and 40 deletions
  1. +1
    -0
      lib/kgrader.rb
  2. +6
    -4
      lib/kgrader/assignment.rb
  3. +2
    -2
      lib/kgrader/cli.rb
  4. +24
    -23
      lib/kgrader/filesystem.rb
  5. +20
    -0
      lib/kgrader/jail.rb
  6. +9
    -11
      lib/kgrader/submission.rb

+ 1
- 0
lib/kgrader.rb View File

@@ -4,6 +4,7 @@ require_relative 'kgrader/cli'
require_relative 'kgrader/course'
require_relative 'kgrader/errors'
require_relative 'kgrader/filesystem'
require_relative 'kgrader/jail'
require_relative 'kgrader/roster'
require_relative 'kgrader/submission'
require_relative 'kgrader/task'


+ 6
- 4
lib/kgrader/assignment.rb View File

@@ -24,12 +24,14 @@ module KGrader
end

manifest = @config['manifest']
provided = manifest['provided'].map do |glob|
Dir[File.join @root, 'provided', glob]
end.flatten
provided = manifest['provided'].map do |fn|
{ :name => fn, :path => File.join(@root, 'provided', fn) }
end
graded = manifest['graded'].map { |fn| { :name => fn } }

{
:provided => provided,
:graded => manifest['graded'],
:graded => graded,
:report => manifest['report']
}
end


+ 2
- 2
lib/kgrader/cli.rb View File

@@ -37,7 +37,7 @@ module KGrader
end

def clean
@fs.reset_jail
@fs.jail.reset
@fs.clean_desk
end

@@ -46,7 +46,7 @@ module KGrader
print "are you sure? [y/N] "
abort "aborted" unless ['y', 'yes'].include? STDIN.gets.strip.downcase

@fs.reset_jail
@fs.jail.reset
@fs.reset_desk
end



+ 24
- 23
lib/kgrader/filesystem.rb View File

@@ -8,22 +8,8 @@ module KGrader
@root = root
end

def desk
File.join @root, 'desk'
end

def jail
File.join @root, 'jail'
end

def spec
File.join @root, 'spec'
end

# -------------------------------------------------------------------------

def course(name)
File.join spec, name
File.join spec_dir, name
end

def course_config(name)
@@ -39,17 +25,17 @@ module KGrader
end

def roster(courseid, semester)
File.join desk, courseid, semester, '_roster.csv'
File.join desk_dir, courseid, semester, '_roster.csv'
end

def submission(courseid, semester, assignment, student)
File.join desk, courseid, semester, assignment, student
File.join desk_dir, courseid, semester, assignment, student
end

# -------------------------------------------------------------------------

def courses
Dir[File.join spec, '*', ''].map! { |fn| File.basename fn }
Dir[File.join spec_dir, '*', ''].map! { |fn| File.basename fn }
end

def assignments(courseid)
@@ -79,19 +65,34 @@ module KGrader
raise FilesystemError, "can't read file: #{path}"
end

def reset_jail
FileUtils.rm_rf jail
def jail
@jail ||= Jail.new jail_dir
end

def reset_desk
FileUtils.rm_rf Dir[File.join desk, '*', '']
FileUtils.rm_rf Dir[File.join desk_dir, '*', '']
end

def clean_desk
Dir[File.join desk, '*', '*', '*', '*', 'status.txt'].each do |fn|
Dir[File.join desk_dir, '*', '*', '*', '*', 'status.txt'].each do |fn|
File.write fn, "ungraded" if File.read(fn) == "graded"
end
FileUtils.rm_rf Dir[File.join desk, '*', '*', '*', '*', 'pending']
FileUtils.rm_rf Dir[File.join desk_dir, '*', '*', '*', '*', 'pending']
end

# -------------------------------------------------------------------------

private
def desk_dir
File.join @root, 'desk'
end

def jail_dir
File.join @root, 'jail'
end

def spec_dir
File.join @root, 'spec'
end
end
end

+ 20
- 0
lib/kgrader/jail.rb View File

@@ -0,0 +1,20 @@
module KGrader
class Jail

def initialize(root)
@root = root
end

def init
FileUtils.mkdir_p @root
end

def reset
FileUtils.rm_rf @root
end

def stage(source, target)
puts "[chroot::stage] #{source} -> (jail)/#{target}"
end
end
end

+ 9
- 11
lib/kgrader/submission.rb View File

@@ -53,7 +53,7 @@ module KGrader
stage
# [grade the stuff]
# [save report to gradefile]
# @fs.reset_jail
# @fs.jail.reset
# FileUtils.touch pendingfile
# self.status = :graded
# return grade summary string
@@ -108,17 +108,15 @@ module KGrader
end

def stage
@fs.reset_jail
FileUtils.mkdir_p @fs.jail
@fs.jail.reset
@fs.jail.init

# puts
# @assignment.manifest[:provided].each { |fn| p fn }
# abort

# p @assignment.manifest[:provided], @assignment.manifest[:graded], @assignment.manifest[:report]

# copytree files matching manifest from student submission
# use assignment.stage
@assignment.manifest[:provided].each do |entry|
@fs.jail.stage entry[:path], entry[:name]
end
@assignment.manifest[:graded].each do |entry|
@fs.jail.stage File.join(repo, entry[:name]), entry[:name]
end
end
end
end

Loading…
Cancel
Save