Show More
Commit Description:
[grader] import script now support raw with testruns...
Commit Description:
[grader] import script now support raw with testruns
git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@267 6386c4cd-e34a-4fa8-8920-d93eb39b512e
References:
File last commit:
Show/Diff file:
Action:
grader
| 212 lines
| 4.5 KiB
| text/plain
| TextLexer
|
|
r0 | #!/usr/bin/ruby | ||
|
r24 | def stop_grader(id) | ||
if id==:all | ||||
File.open(File.dirname(__FILE__) + "/stop.all",'w').close | ||||
else | ||||
File.open(File.dirname(__FILE__) + "/stop.#{id}",'w').close | ||||
end | ||||
|
r6 | end | ||
def check_stopfile | ||||
|
r24 | FileTest.exist?(File.dirname(__FILE__) + "/stop.all") or | ||
FileTest.exist?(File.dirname(__FILE__) + "/stop.#{Process.pid}") | ||||
|
r6 | end | ||
def clear_stopfile | ||||
|
r24 | if FileTest.exist?(File.dirname(__FILE__) + "/stop.#{Process.pid}") | ||
system("rm " + File.dirname(__FILE__) + "/stop.#{Process.pid}") | ||||
end | ||||
|
r0 | end | ||
|
r6 | |||
|
r22 | def config | ||
Grader::Configuration.get_instance | ||||
end | ||||
|
r23 | def log_file_name | ||
|
r25 | if !File.exists?(config.log_dir) | ||
raise "Log directory does not exist: #{config.log_dir}" | ||||
end | ||||
|
r23 | config.log_dir + | ||
"/#{GRADER_ENV}_#{config.grader_mode}.#{Process.pid}" | ||||
end | ||||
def log(str) | ||||
|
r22 | if config.talkative | ||
puts str | ||||
end | ||||
|
r23 | if config.logging | ||
fp = File.open(log_file_name,"a") | ||||
fp.puts("GRADER: #{Time.new.strftime("%H:%M")} #{str}") | ||||
fp.close | ||||
end | ||||
end | ||||
def display_manual | ||||
puts <<USAGE | ||||
Grader. | ||||
using: (1) grader | ||||
(2) grader environment [mode] | ||||
|
r24 | (3) grader stop [all|pids-list] | ||
|
r23 | (4) grader --help | ||
(1) call grader with environment = 'exam', mode = 'queue' | ||||
(2) possible modes are: 'queue', 'prob', 'test_request' | ||||
(3) create stop-file to stop running grader in queue mode | ||||
(4) You are here. | ||||
USAGE | ||||
|
r22 | end | ||
|
r11 | ######################################### | ||
# main program | ||||
######################################### | ||||
|
r23 | # with --help | ||
if (ARGV.length==1) and (/help/.match(ARGV[0])) | ||||
display_manual | ||||
exit(0) | ||||
end | ||||
|
r6 | # reading environment and options | ||
if (ARGV.length >= 1) and (ARGV[0]=='stop') | ||||
|
r24 | if ARGV.length==1 | ||
puts "you should specify pid-list or 'all'" | ||||
display_manual | ||||
elsif (ARGV.length==2) and (ARGV[1]=='all') | ||||
stop_grader(:all) | ||||
puts "A global stop file ('stop.all') created." | ||||
puts "You should remove it manually later." | ||||
else | ||||
(1..ARGV.length-1).each do |i| | ||||
stop_grader(ARGV[i]) | ||||
end | ||||
puts "stop file(s) created" | ||||
end | ||||
|
r6 | exit(0) | ||
end | ||||
if check_stopfile | ||||
|
r24 | puts "Stop file exists. Terminated." | ||
|
r6 | clear_stopfile | ||
exit(0) | ||||
end | ||||
|
r9 | grader_mode = 'queue' | ||
|
r6 | if ARGV.length >= 1 | ||
GRADER_ENV = ARGV[0] | ||||
|
r9 | if ARGV.length >=2 | ||
grader_mode = ARGV[1] | ||||
end | ||||
|
r6 | else | ||
GRADER_ENV = 'exam' | ||||
end | ||||
puts "environment: #{GRADER_ENV}" | ||||
|
r22 | require File.join(File.dirname(__FILE__),'config/environment') | ||
|
r0 | |||
|
r23 | # add grader_mode to config | ||
# this is needed because method log needs it. TODO: clean this up | ||||
class << config | ||||
attr_accessor :grader_mode | ||||
end | ||||
config.grader_mode = grader_mode | ||||
# reading rails environment | ||||
log 'Reading rails environment' | ||||
|
r0 | |||
|
r22 | RAILS_ENV = config.rails_env | ||
require RAILS_ROOT + '/config/environment' | ||||
|
r23 | # register grader process | ||
|
r22 | if config.report_grader | ||
grader_proc = GraderProcess.register(config.grader_hostname, | ||||
|
r20 | Process.pid, | ||
grader_mode) | ||||
else | ||||
grader_proc = nil | ||||
end | ||||
|
r23 | #set loggin environment | ||
ENV['GRADER_LOGGING'] = log_file_name | ||||
# | ||||
# MAIN LOOP | ||||
# | ||||
|
r22 | |||
|
r9 | case grader_mode | ||
|
r23 | when "queue", "test_request" | ||
log "Grader: #{grader_mode}" | ||||
if grader_mode=="queue" | ||||
engine = Grader::Engine.new | ||||
else | ||||
engine = Grader::Engine.new(Grader::TestRequestRoomMaker.new, | ||||
Grader::TestRequestReporter.new) | ||||
end | ||||
runner = Grader::Runner.new(engine, grader_proc) | ||||
|
r9 | while true | ||
|
r20 | |||
|
r9 | if check_stopfile # created by calling grader stop | ||
clear_stopfile | ||||
|
r23 | log "stopped (with stop file)" | ||
|
r22 | break | ||
|
r9 | end | ||
|
r23 | |||
if grader_mode=="queue" | ||||
task = runner.grade_oldest_task | ||||
else | ||||
task = runner.grade_oldest_test_request | ||||
end | ||||
|
r22 | if task==nil | ||
|
r23 | sleep(1) | ||
|
r9 | end | ||
end | ||||
when "prob" | ||||
|
r23 | engine = Grader::Engine.new | ||
runner = Grader::Runner.new(engine, grader_proc) | ||||
|
r20 | |||
grader_proc.report_active if grader_proc!=nil | ||||
|
r51 | ARGV.shift | ||
ARGV.shift | ||||
ARGV.each do |prob_name| | ||||
prob = Problem.find_by_name(prob_name) | ||||
if prob==nil | ||||
puts "cannot find problem: #{prob_name}" | ||||
else | ||||
runner.grade_problem(prob) | ||||
end | ||||
|
r6 | end | ||
|
r23 | |||
|
r61 | when "sub" | ||
engine = Grader::Engine.new | ||||
runner = Grader::Runner.new(engine, grader_proc) | ||||
grader_proc.report_active if grader_proc!=nil | ||||
ARGV.shift | ||||
ARGV.shift | ||||
ARGV.each do |sub_id| | ||||
puts "Grading #{sub_id}" | ||||
begin | ||||
submission = Submission.find(sub_id.to_i) | ||||
rescue ActiveRecord::RecordNotFound | ||||
puts "Record not found" | ||||
submission = nil | ||||
end | ||||
if submission!=nil | ||||
runner.grade_submission(submission) | ||||
end | ||||
end | ||||
|
r23 | else | ||
display_manual | ||||
exit(0) | ||||
|
r0 | end | ||
|
r20 | # report inactive | ||
grader_proc.report_inactive if grader_proc!=nil | ||||
|
r9 | |||