webhooksd/src/webhooksd.cr

84 lines
1.7 KiB
Crystal
Raw Normal View History

2020-11-26 14:51:57 +01:00
require "http/server"
require "option_parser"
2020-11-26 16:15:04 +01:00
require "./payload.cr"
2020-11-26 14:51:57 +01:00
VERSION = 0.1
port = 3000
2020-11-27 02:39:27 +01:00
storage = "webhooksd-data"
2020-11-26 16:31:50 +01:00
args = [] of String
2020-11-26 14:51:57 +01:00
OptionParser.parse do |parser|
2020-11-27 02:39:27 +01:00
parser.banner = "usage: webhooksd [option]"
2020-11-26 14:51:57 +01:00
parser.on "-v", "--version", "Show version" do
puts "version #{VERSION}"
exit
end
parser.on "-h", "--help", "Show help" do
puts parser
exit
end
parser.on "-p PORT", "--port=PORT", "Port to listen for connections. Default: 3000" do |p|
port = p.to_i
end
2020-11-26 16:31:50 +01:00
2020-11-27 02:39:27 +01:00
parser.on "-s STORAGE", "--storage=STORAGE", "Default: #{storage}" do |s|
storage = s
end
2020-11-26 16:31:50 +01:00
parser.invalid_option do |flag|
STDERR.puts "ERROR: #{flag} is not a valid option."
STDERR.puts parser
exit 1
end
parser.unknown_args do |x|
args = x
2020-11-27 02:39:27 +01:00
if args.size != 0
2020-11-26 16:31:50 +01:00
puts parser
exit 1
end
end
end
2020-11-27 02:39:27 +01:00
scriptfile = "on-push"
2020-11-26 14:51:57 +01:00
server = HTTP::Server.new do |context|
2020-11-26 15:27:17 +01:00
if context.request.method != "POST" || context.request.path != "/"
context.response.status = HTTP::Status::NOT_FOUND
else
2020-11-26 16:15:04 +01:00
payload = Payload.new(context.request)
2020-11-27 02:39:27 +01:00
path_project = storage + "/" + payload.project
path_scriptfile = path_project + "/" + scriptfile
status = false
if File.exists?(path_project) == false
STDERR.puts "ERROR: Project #{payload.project} not found"
status = false
else
if File.exists?(path_scriptfile) == false
STDERR.puts "ERROR: Scriptfile not found"
status = false
else
context.response.content_type = "text/plain"
status = Process.run command: "sh", args: [scriptfile], shell: true,
error: STDERR, output: STDOUT, chdir: path_project
end
end
if status
2020-11-26 16:31:50 +01:00
context.response.print "SUCCESS"
else
context.response.print "FAILURE"
end
2020-11-26 15:27:17 +01:00
end
2020-11-26 14:51:57 +01:00
end
address = server.bind_tcp port
server.listen