$LOAD_PATH.unshift File.dirname(__FILE__)
require "JobLog.rb"
require "BuildComm.rb"
+require "BuildServerException.rb"
class SocketJobRequestListener
case cmd
when "BUILD"
- @log.info "Received REQ: #{req_line}"
handle_cmd_build( req_line, req )
- @log.info "Handled REQ: #{req_line}"
when "RESOLVE"
- @log.info "Received REQ: #{req_line}"
handle_cmd_resolve( req_line, req )
- @log.info "Handled REQ: #{req_line}"
when "QUERY"
handle_cmd_query( req_line, req )
when "CANCEL"
end
+
# "BUILD"
def handle_cmd_build( line, req )
+ @log.info "Received REQ: #{line}"
+
+ begin
+ handle_cmd_build_internal( line, req )
+ rescue BuildServerException => e
+ BuildCommServer.send_begin(req)
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
+ BuildCommServer.send_end(req)
+ end
+
+ @log.info "Handled REQ: #{line}"
+ end
+
+
+ def handle_cmd_build_internal( line, req )
tok = line.split("|").map { |x| x.strip }
if tok.count < 3 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
# check type
if tok[1] != "GIT" then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
# 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14
end
# check distribution
- if not check_distribution(dist_name, req) then
- raise "The distribution error!!"
- end
+ check_distribution(dist_name, req)
# check supported os if not internal job
if not is_internal then
os_list = check_supported_os( os_list , req )
- if os_list.nil? or os_list.empty? then
- raise "Unsupported OS name is used!"
- end
end
# check user email
user_id = @parent_server.check_user_id_from_email( user_email )
if user_id == -1 then
- BuildCommServer.send_begin(req)
- req.puts "Error: Cannot find the user with \"#{user_email}\"!"
- BuildCommServer.send_end(req)
- raise "No user information!"
+ raise BuildServerException.new("ERR004"), user_email
end
else passwd = passwd_list[0] end
check_build_project(pname,passwd,dist_name,req)
if not check_project_user_id(pname,dist_name,user_id) then
- BuildCommServer.send_begin(req)
- req.puts "Error: \"#{user_email}\" can't access \"#{pname}\" project!"
- req.puts "You are not in project control group"
- BuildCommServer.send_end(req)
- raise "#{user_email} can't accesse #{pname} project!"
+ raise BuildServerException.new("ERR005"), "#{user_email} -> #{pname}"
end
os_list.each do |os|
new_job = create_new_job( pname, os, dist_name )
if new_job_list.count > 1 then
new_job = @parent_server.prjmgr.create_new_multi_build_job( new_job_list )
if new_job.nil? then
- raise "Multi-Build Job creation failed!"
+ raise BuildServerException.new("ERR006"),"Multi-Build job"
else
new_job.user_id = user_id
end
elsif new_job_list.count == 1 then
new_job = new_job_list[0]
else
- raise "Multi-Build Job creation failed!"
+ raise BuildServerException.new("ERR006"),"No valid sub jobs in Multi-Build job"
end
# transfered job
new_job = create_new_internal_job(git_repos, os, git_commit, pkg_files, dock_num, dist_name )
if new_job.nil? then
- raise "Internal-Build Job creation failed!"
+ raise BuildServerException.new("ERR006"),"Transfered-Build job"
else
new_job.user_id = user_id
end
check_build_project(pname,passwd,dist_name,req)
if not check_project_user_id(pname,dist_name,user_id) then
- BuildCommServer.send_begin(req)
- req.puts "Error: \"#{user_email}\" can't access \"#{pname}\" project!"
- req.puts "You are not in project control group"
- BuildCommServer.send_end(req)
- raise "#{user_email} can't accesse #{pname} project!"
+ raise BuildServerException.new("ERR005"), "#{user_email} -> #{pname}"
end
new_job = create_new_job( pname, os, dist_name )
if new_job.nil? then
- raise "\"#{pname}\" does not support #{os} in #{dist_name}"
+ raise BuildServerException.new("ERR006"), "\"#{pname}\" does not support #{os} in #{dist_name}"
else
new_job.user_id = user_id
end
else
- BuildCommServer.send_begin(req)
- req.puts "Error: There is no valid job to build!"
- BuildCommServer.send_end(req)
- raise "No valid jobs!"
- end
-
- if new_job.nil? then
- BuildCommServer.send_begin(req)
- req.puts "Error: Creating job failed! (project may not exist)"
- BuildCommServer.send_end(req)
- raise "Internal Error!"
+ raise BuildServerException.new("ERR006"), "Cannot find your project to build!"
end
# check reverse build
def check_build_project(prj_name, passwd, dist_name, req)
# check project
prj = check_project_exist(prj_name, dist_name, req)
- if prj.nil? then
- raise "Requested project \"#{prj_name}\" does not exist!"
- end
# check passwd
- if not check_project_password(prj, passwd, req) then
- raise "Project's password is not matched!!"
- end
+ check_project_password(prj, passwd, req)
# check project type
if prj.type == "BINARY" then
+ raise BuildServerException.new("ERR010"), prj.type
+ end
+ end
+
+
+ # "RESOLVE"
+ def handle_cmd_resolve( line, req )
+ @log.info "Received REQ: #{line}"
+
+ begin
+ handle_cmd_resolve_internal( line, req )
+ rescue BuildServerException => e
BuildCommServer.send_begin(req)
- req.puts "Can't build about Binary type package."
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
BuildCommServer.send_end(req)
- raise "Can't build about Binary type package."
end
+
+ @log.info "Handled REQ: #{line}"
end
- # "RESOLVE"
- def handle_cmd_resolve( line ,req)
+ def handle_cmd_resolve_internal( line ,req)
tok = line.split("|").map { |x| x.strip }
if tok.count < 3 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
case tok[1]
end
# check distribution
- if not check_distribution(dist_name, req) then
- raise "The distribution error!!"
- end
+ check_distribution(dist_name, req)
# check project
prj = check_project_exist(project_name, dist_name, req)
- if prj.nil? then
- raise "Requested project does not exist!"
- end
# check passwd
- if not check_project_password(prj, passwd, req) then
- raise "Project's password is not matched!!"
- end
+ check_project_password(prj, passwd, req)
# check os
os_list = check_supported_os( [os] , req )
- if os_list.nil? or os_list.empty? then
- raise "Unsupported OS name is used!"
- end
os = os_list[0]
# check user email
user_id = @parent_server.check_user_id_from_email( user_email )
if user_id == -1 then
- BuildCommServer.send_begin(req)
- req.puts "Error: Cannot find the user with \"#{user_email}\"!"
- BuildCommServer.send_end(req)
- raise "No user information!"
+ raise BuildServerException.new("ERR004"), user_email
end
# check user accessable
if not check_project_user_id(project_name,dist_name,user_id) then
- BuildCommServer.send_begin(req)
- req.puts "Error: \"#{user_email}\" can't access \"#{project_name}\" project!"
- req.puts "You are not in project control group"
- BuildCommServer.send_end(req)
- raise "#{user_email} can't accesse #{project_name} project!"
+ raise BuildServerException.new("ERR005"), "#{user_email} -> #{project_name}"
end
# create new job
new_job = create_new_job( project_name, os, dist_name )
if new_job.nil? then
- raise "Creating build job failed : #{project_name}, #{os}"
+ raise BuildServerException.new("ERR006"), "Resolve job #{project_name} #{os}"
end
@log.info "Received a request for resolving this project : #{project_name}, #{os}"
@parent_server.jobmgr.add_job( new_job )
else
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
end
# "QUERY"
def handle_cmd_query( line, req )
+ begin
+ handle_cmd_query_internal( line, req )
+ rescue BuildServerException => e
+ BuildCommServer.send_begin(req)
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
+ BuildCommServer.send_end(req)
+ end
+ end
+
+
+ def handle_cmd_query_internal( line, req )
tok = line.split("|").map { |x| x.strip }
if tok.count < 2 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
case tok[1]
BuildCommServer.disconnect(req)
else
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
end
# "CANCEL"
def handle_cmd_cancel( line, req )
+ @log.info "Received REQ: #{line}"
+
+ begin
+ handle_cmd_cancel_internal( line, req )
+ rescue BuildServerException => e
+ BuildCommServer.send_begin(req)
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
+ BuildCommServer.send_end(req)
+ end
+
+ @log.info "Handled REQ: #{line}"
+ end
+
+
+ def handle_cmd_cancel_internal( line, req )
tok = line.split("|").map { |x| x.strip }
if tok.count < 2 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
cancel_job = nil
# check user email
user_id = @parent_server.check_user_id_from_email( tok[3] )
if user_id == -1 then
- BuildCommServer.send_begin(req)
- req.puts "Error: Cannot find the user with \"#{tok[3]}\"!"
- BuildCommServer.send_end(req)
- raise "No user information!"
+ raise BuildServerException.new("ERR004"), tok[3]
end
#CANCEL, JOB
end
end
- BuildCommServer.send_begin(req)
if cancel_job.nil? then
- BuildCommServer.send(req, "There is no job \"#{tok[1]}\"")
- raise "There is no job \"#{tok[1]}\""
+ raise BuildServerException.new("ERR014"), "Job #{tok[1]} not found."
else
if cancel_job.cancel_state == "NONE" then
# check passwd
if not @parent_server.jobmgr.is_user_accessable(cancel_job,user_id) then
- BuildCommServer.send_begin(req)
- req.puts "Error: \"#{tok[3]}\" can't access \"#{cancel_job.get_project.name}\" project!"
- req.puts "You are not in project control group"
- BuildCommServer.send_end(req)
- raise "#{tok[3]} can't accesse #{cancel_job.get_project.name} project!"
+ raise BuildServerException.new("ERR014"), "Access denied #{tok[3]}"
end
if cancel_job.type == "MULTIBUILD" then
cancel_job.get_sub_jobs().select{|x| x.cancel_state == "NONE" }.each do |sub|
- if not check_project_password( sub.get_project, tok[2], req) then
- BuildCommServer.send(req, "Project's password is not matched!!")
- raise "Project's password is not matched!!"
- end
+ check_project_password( sub.get_project, tok[2], req)
end
+ BuildCommServer.send_begin(req)
BuildCommServer.send(req, "\"#{cancel_job.id}, #{cancel_job.get_sub_jobs().map{|x| x.id}.join(", ")}\" will be canceled")
cancel_job.cancel_state = "INIT"
+ BuildCommServer.send_end(req)
+ BuildCommServer.disconnect(req)
else
prj = cancel_job.get_project()
if not prj.nil? then
- if not check_project_password( prj, tok[2], req) then
- BuildCommServer.send(req, "Project's password is not matched!!")
- raise "Project's password is not matched!!"
- else
- BuildCommServer.send(req, "\"#{cancel_job.id}\" will be canceled")
- cancel_job.cancel_state = "INIT"
- end
+ check_project_password( prj, tok[2], req)
+
+ BuildCommServer.send_begin(req)
+ BuildCommServer.send(req, "\"#{cancel_job.id}\" will be canceled")
+ cancel_job.cancel_state = "INIT"
+ BuildCommServer.send_end(req)
+ BuildCommServer.disconnect(req)
else
- BuildCommServer.send(req, "Cannot cancel the job \"#{cancel_job.id}\"")
+ raise BuildServerException.new("ERR014"), "No project infomation"
end
end
else
- BuildCommServer.send(req, "\"#{cancel_job.id}\" is already canceled")
+ raise BuildServerException.new("ERR014"), "Job already canceled."
end
end
- BuildCommServer.send_end(req)
- BuildCommServer.disconnect(req)
end
# "STOP"
def handle_cmd_stop( line, req )
+ @log.info "Received REQ: #{line}"
+
+ begin
+ handle_cmd_stop_internal( line, req )
+ rescue BuildServerException => e
+ BuildCommServer.send_begin(req)
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
+ BuildCommServer.send_end(req)
+ end
+
+ @log.info "Handled REQ: #{line}"
+ end
+
+
+ def handle_cmd_stop_internal( line, req )
tok = line.split("|").map { |x| x.strip }
if tok.count < 2 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
- BuildCommServer.send_begin(req)
if tok[1] != @parent_server.password then
- BuildCommServer.send(req,"Password mismatched!")
+ raise BuildServerException.new("ERR015"), ""
else
+ BuildCommServer.send_begin(req)
BuildCommServer.send(req,"Server will be down!")
+ BuildCommServer.send_end(req)
+ BuildCommServer.disconnect(req)
end
- BuildCommServer.send_end(req)
- BuildCommServer.disconnect(req)
if tok[1] == @parent_server.password then
@parent_server.finish = true
end
# "UPGRADE"
def handle_cmd_upgrade( line, req )
+ @log.info "Received REQ: #{line}"
+
+ begin
+ handle_cmd_upgrade_internal( line, req )
+ rescue BuildServerException => e
+ BuildCommServer.send_begin(req)
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
+ BuildCommServer.send_end(req)
+ end
+
+ @log.info "Handled REQ: #{line}"
+ end
+
+
+ def handle_cmd_upgrade_internal( line, req )
tok = line.split("|").map { |x| x.strip }
if tok.count < 2 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
- BuildCommServer.send_begin(req)
if tok[1] != @parent_server.password then
- BuildCommServer.send(req,"Password mismatched!")
+ raise BuildServerException.new("ERR015"), ""
else
- BuildCommServer.send(req,"Server will be down!")
+ BuildCommServer.send_begin(req)
+ BuildCommServer.send(req,"Server will be upgraded!")
+ BuildCommServer.send_end(req)
+ BuildCommServer.disconnect(req)
end
- BuildCommServer.send_end(req)
- BuildCommServer.disconnect(req)
if tok[1] == @parent_server.password then
@parent_server.finish = true
@parent_server.upgrade = true
# "FULLBUILD"
def handle_cmd_fullbuild( line, req )
+ @log.info "Received REQ: #{line}"
+
+ begin
+ handle_cmd_fullbuild_internal( line, req )
+ rescue BuildServerException => e
+ BuildCommServer.send_begin(req)
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
+ BuildCommServer.send_end(req)
+ end
+
+ @log.info "Handled REQ: #{line}"
+ end
+
+
+ def handle_cmd_fullbuild_internal( line, req )
tok = line.split("|").map { |x| x.strip }
if tok.count < 2 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
server_passwd = tok[1]
end
# check distribution
- if not check_distribution(dist_name, req, true) then
- raise "The distribution error!!"
- end
+ check_distribution(dist_name, req, true)
# check server password
if server_passwd != @parent_server.password then
- BuildCommServer.send_begin(req)
- BuildCommServer.send(req,"Password mismatched!")
- BuildCommServer.send_end(req)
- BuildCommServer.disconnect(req)
- return
+ raise BuildServerException.new("ERR015"), ""
end
# create full build job
# "REGISTER"
def handle_cmd_register( line, req )
+ @log.info "Received REQ: #{line}"
+
+ begin
+ handle_cmd_register_internal( line, req )
+ rescue BuildServerException => e
+ BuildCommServer.send_begin(req)
+ @log.error(e.message)
+ BuildCommServer.send(req, e.err_message())
+ BuildCommServer.send_end(req)
+ end
+
+ @log.info "Handled REQ: #{line}"
+ end
+
+
+ def handle_cmd_register_internal( line, req )
tok = line.split("|").map { |x| x.strip }
if tok.count < 4 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
type = tok[1]
end
# check distribution
- if not check_distribution(dist_name, req) then
- raise "The distribution error!!"
- end
+ check_distribution(dist_name, req)
new_job = @parent_server.jobmgr.create_new_register_job( file_path, dist_name )
logger = JobLog.new( new_job, req )
end
# check distribution
- if not check_distribution(dist_name, req) then
- raise "The distribution error!!"
- end
+ check_distribution(dist_name, req)
# check project
prj = check_project_for_package_file_name(filename, dist_name, req)
- if prj.nil? then
- raise "No project is defined for this binary : #{filename}!"
- end
# check user email
user_id = @parent_server.check_user_id_from_email( user_email )
if user_id == -1 then
- BuildCommServer.send_begin(req)
- req.puts "Error: Cannot find the user with \"#{user_email}\"!"
- BuildCommServer.send_end(req)
- raise "No user information!"
+ raise BuildServerException.new("ERR004"), user_email
end
if not check_project_pkg_name_user_id(filename, dist_name, user_id) then
- BuildCommServer.send_begin(req)
- req.puts "Error: \"#{user_email}\" can't regist \"#{filename}\"!"
- req.puts "You are not in project control group"
- BuildCommServer.send_end(req)
- raise "#{user_email} can't regist #{filename}!"
+ raise BuildServerException.new("ERR005"), "#{user_email} -> #{prj.name}"
end
# check passwd
- if not check_project_password(prj, passwd, req) then
- raise "Project's password is not matched!!"
- end
+ check_project_password(prj, passwd, req)
# create new job
@log.info "Received a request for uploading binaries : #{filename}"
new_job = create_new_upload_job( prj.name, filename, dock, dist_name, req )
if new_job.nil? then
- raise "Creating build job failed : #{prj.name}, #{filename}"
+ raise BuildServerException.new("ERR006"), "Register-job #{filename}, #{prj.name}, #{dist_name}"
end
new_job.user_id = user_id
# add
@parent_server.jobmgr.add_job( new_job )
else
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
+ raise BuildServerException.new("ERR001"), line
end
end
@log.info "Received File transfer REQ : #{line}"
tok = line.split("|").map { |x| x.strip }
- if tok.count < 2 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
- end
-
dock_num = (tok[1].nil? or tok[1].empty?) ? "0" : tok[1].strip
BuildCommServer.send_begin(req)
def handle_cmd_download( line, req )
@log.info "Received File transfer REQ : #{line}"
tok = line.split("|").map { |x| x.strip }
- if tok.count < 3 then
- @log.info "Received Wrong REQ: #{line}"
- raise "Invalid request format is used: #{line}"
- end
-
dock_num = (tok[1].nil? or tok[1].empty?) ? "0" : tok[1].strip
file_name = tok[2]
def check_project_exist(project_name, dist_name, req)
prj = @parent_server.prjmgr.get_project(project_name, dist_name)
if prj.nil? then
- BuildCommServer.send_begin(req)
- req.puts "Error: Requested project \"#{project_name}\" does not exist!"
- req.puts "Info: Check project name using \"query\" command option !"
- BuildCommServer.send_end(req)
- return nil
+ raise BuildServerException.new("ERR009"), "#{project_name} on #{dist_name}"
end
return prj
prj = @parent_server.prjmgr.get_project_from_package_name(pkg_name, dist_name)
if prj.nil? then
- BuildCommServer.send_begin(req)
- req.puts "Error: Requested project does not exist!"
- req.puts "Info: Check project name using \"query\" command option !"
- BuildCommServer.send_end(req)
- return nil
+ raise BuildServerException.new("ERR013"), "#{pkg_name} #{dist_name}"
end
return prj
end
+
private
def check_project_password(prj, passwd, req)
- if prj.is_passwd_set? and not prj.passwd_match?(passwd) then
- BuildCommServer.send_begin(req)
- req.puts "Error: Project's password is not matched!"
- req.puts "Error: Use -w option to input your project password"
- BuildCommServer.send_end(req)
- return false
- end
+ if prj.is_passwd_set? then
+ if passwd.nil? or passwd.empty? then
+ raise BuildServerException.new("ERR011"), "Use -w option to input your project password"
+ end
- return true
+ if not prj.passwd_match?(passwd) then
+ raise BuildServerException.new("ERR012"), ""
+ end
+ end
end
def check_distribution(dist_name, req, only_exist = false)
dist = @parent_server.distmgr.get_distribution(dist_name)
if dist.nil? then
- BuildCommServer.send_begin(req)
- req.puts "Error: The distribution \"#{dist_name}\" does not exist!"
- BuildCommServer.send_end(req)
+ raise BuildServerException.new("ERR002"), dist_name
elsif dist.status != "OPEN" and not only_exist then
- BuildCommServer.send_begin(req)
- req.puts "Error: The distribution \"#{dist_name}\" is locked!"
- BuildCommServer.send_end(req)
- return false
+ raise BuildServerException.new("ERR008"), dist_name
end
-
- return true
end
# check if supported os list contain at least one OS
if @parent_server.supported_os_list.empty? then
- BuildCommServer.send_begin(req)
- req.puts "Error: There is no OS supported by the build server."
- BuildCommServer.send_end(req)
- return nil
+ raise BuildServerException.new("ERR007"), ""
end
result = []
elsif @parent_server.supported_os_list.include?(os) then
result.push os
else
- BuildCommServer.send_begin(req)
- req.puts "Error: Unsupported OS name \"#{os}\" is used!"
- req.puts "Error: Check the following supported OS list. "
+ msgs = "#{os}\n\tSupported OS list.\n"
@parent_server.supported_os_list.each do |os_name|
- req.puts " * #{os_name}"
+ msgs += "\t * #{os_name}\n"
end
- BuildCommServer.send_end(req)
- return nil
+ raise BuildServerException.new("ERR003"),msgs
end
end
+ result.uniq!
if result.empty? then
- BuildCommServer.send_begin(req)
- req.puts "Error: There is no OS supported by the build server."
- BuildCommServer.send_end(req)
- return nil
+ raise BuildServerException.new("ERR003"), "There is no OS name matched."
end
- result.uniq!
-
return result
end
private
def create_new_upload_job( project_name, filename, dock, dist_name, req)
- new_job = @parent_server.prjmgr.get_project(project_name, dist_name).create_new_job(filename, dock)
-
- if new_job.nil? then
- BuildCommServer.send_begin(req)
- req.puts "Error: Creating job failed: #{project_name} #{filename} #{dist_name}"
- BuildCommServer.send_end(req)
- return nil
- end
-
- return new_job
+ return @parent_server.prjmgr.get_project(project_name, dist_name).create_new_job(filename, dock)
end