anthtrigger
Version:
Trigger events via http service
183 lines (151 loc) • 3.75 kB
text/coffeescript
Ctrl = require './controller.coffee'
spawn = require('child_process').spawn
path = require 'path'
exports.route = (app)->
app.post '/scripts/create', (req, res)->
Ctrl
.addScript(req.body, req.cookies.uid)
.fin (cb, err, script)->
res.json {
success: !!!err
script: script,
error: err
}
_evt.script_add req.cookies.user, !!!err, script
app.get '/scripts/find/:id', (req, res)->
scriptId = req.param('id')
Ctrl
.findById '' + scriptId
.fin (cb, err, script)->
res.json {
success: !!!err
error: err
script: script
}
app.get '/scripts/tags', (req, res)->
q = req.param('q')
Ctrl
.getTags q
.fin (cb, err, list)->
res.json list
app.get '/scripts/list', (req, res)->
page = req.param('page')
page = parseInt(page) or 1
pageSize = req.param('pageSize')
pageSize = parseInt(pageSize) or 10
q = req.param('q')
user = req.session.user
if not user then return res.json {
success: false
error: 400
}
q_reg = new RegExp(q)
searchStr_critical = {
"$or": [
{ 'title': q_reg },
{
'tags': {
'$elemMatch': { $in: [ q ] }
}
}
]
}
userPermission_critical = if user and user.role isnt 'admin' then {
"$or": [
{ 'createByUser': user._id },
{
"tags": {
"$elemMatch": {
$in: user.tags
}
}
}
]
} else {}
critical = {
"$and": [
userPermission_critical,
searchStr_critical
]
}
Ctrl
.listByPage critical, {
skip: (page-1)*pageSize
limit: pageSize
sort: {
lastRunAt: -1
}
}
.fin (cont, err, list, total)->
res.json {
success: !!!err
total: total
list: list or []
}
app.post '/scripts/edit/:id', (req, res)->
sid = '' + req.param('id')
Ctrl
.editScript(sid, req.body, req.cookies.uid)
.fin (cont, err, count, script)->
res.json {
success: !!!err
script: script
error: err
}
_evt.script_edit req.cookies.user, !!!err, script
app.delete '/scripts/delete/:key', (req, res)->
key = req.param('key')
Ctrl
.deleteScript(key)
.fin (cont, err, count, script)->
res.json {
success: !!!err
error: err
}
_evt.script_delete req.cookies.user, !!!err, script
app.put '/scripts/run/:id', (req, res)->
sid = '' + req.param('id')
args = req.body.args
notes = req.body.notes
Ctrl
.runScript sid, args, app.get('configs').spawnOptions, req.session.user, notes
.then (cb, result, doc, logs)->
res.json {
success: true,
error: result.error
script: doc
code: result.code
logs: logs
}
_evt.script_run req.cookies.user, true, doc, logs
app.post '/scripts/kill/:scriptId', (req, res)->
sid = '' + req.param('scriptId')
Ctrl
.killScript sid
.fin (cb, err, script, logs)->
res.json {
success: !!!err
error: err
script: script
logs: logs
}
_evt.script_kill req.cookies.user, logs
app.post '/hook', (req, res)->
shellOutput = ''
projectName = req.body.repository.name
projectConfig = configs.projects[projectName]
if not projectConfig
res.send 404, 'Project not configured.'
return
shellFile = path.join(configs.shellDir, projectConfig.shell)
execution = spawn projectConfig.cmd, [
shellFile,
JSON.stringify(req.body)
]
execution.stdout.on 'data', (data)-> shellOutput += data
execution.stderr.on 'data', (data)-> shellOutput += data
execution.on 'close', (code)->
return res.send(500, shellOutput) if code isnt 0