Semaphore/api/tasks/logging.go

102 lines
2.3 KiB
Go
Raw Normal View History

package tasks
import (
"bufio"
2016-05-01 13:24:09 +02:00
"encoding/json"
"os/exec"
2016-05-08 11:36:17 +02:00
"time"
2016-05-24 11:55:48 +02:00
"github.com/ansible-semaphore/semaphore/api/sockets"
2017-02-23 06:12:16 +01:00
"github.com/ansible-semaphore/semaphore/db"
"github.com/ansible-semaphore/semaphore/util"
log "github.com/Sirupsen/logrus"
)
func (t *task) log(msg string) {
now := time.Now()
2016-04-17 12:41:36 +02:00
for _, user := range t.users {
2016-05-01 13:24:09 +02:00
b, err := json.Marshal(&map[string]interface{}{
"type": "log",
2016-05-08 11:36:17 +02:00
"output": msg,
"time": now,
2016-05-01 13:24:09 +02:00
"task_id": t.task.ID,
"project_id": t.projectID,
})
util.LogPanic(err)
2016-05-01 13:24:09 +02:00
sockets.Message(user, b)
2016-04-17 12:41:36 +02:00
}
go func() {
_, err := db.Mysql.Exec("insert into task__output (task_id, task, output, time) VALUES (?, '', ?, ?)", t.task.ID, msg, now)
util.LogPanicWithFields(err, log.Fields{"error": "Failed to insert task output"})
}()
}
func (t *task) updateStatus() {
for _, user := range t.users {
b, err := json.Marshal(&map[string]interface{}{
"type": "update",
"start": t.task.Start,
"end": t.task.End,
"status": t.task.Status,
"task_id": t.task.ID,
"project_id": t.projectID,
})
util.LogPanic(err)
sockets.Message(user, b)
}
2017-02-23 06:12:16 +01:00
if _, err := db.Mysql.Exec("update task set status=?, start=?, end=? where id=?", t.task.Status, t.task.Start, t.task.End, t.task.ID); err != nil {
t.panicOnError(err, "Failed to update task status")
}
}
// Readln reads from the pipe
2017-07-12 04:08:00 +02:00
func Readln(r *bufio.Reader) (string, error) {
var (
isPrefix = true
err error
2017-07-12 04:08:00 +02:00
line, ln []byte
)
for isPrefix && err == nil {
line, isPrefix, err = r.ReadLine()
ln = append(ln, line...)
}
2017-07-12 04:08:00 +02:00
return string(ln), err
}
func (t *task) logPipe(reader *bufio.Reader) {
line, err := Readln(reader)
for err == nil {
t.log(line)
line, err = Readln(reader)
}
2017-07-12 04:08:00 +02:00
if err != nil && err.Error() != "EOF" {
2017-07-12 06:48:49 +02:00
//don't panic on this errors, sometimes it throw not dangerous "read |0: file already closed" error
util.LogWarningWithFields(err, log.Fields{"error": "Failed to read task output"})
2017-07-12 04:08:00 +02:00
}
}
func (t *task) logCmd(cmd *exec.Cmd) {
stderr, _ := cmd.StderrPipe()
stdout, _ := cmd.StdoutPipe()
2017-07-12 04:08:00 +02:00
go t.logPipe(bufio.NewReader(stderr))
go t.logPipe(bufio.NewReader(stdout))
}
func (t *task) panicOnError(err error, msg string) {
if err != nil {
t.log(msg)
util.LogPanicWithFields(err, log.Fields{"error": msg})
}
}