feat: add internal error to log database
This commit is contained in:
parent
605871d17a
commit
7806a774e4
41
db.go
41
db.go
@ -18,7 +18,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Change on ANY database update
|
// Change on ANY database update
|
||||||
const currentDatabaseVersion = 2
|
const currentDatabaseVersion = 3
|
||||||
|
|
||||||
const versionField = "db_version"
|
const versionField = "db_version"
|
||||||
|
|
||||||
@ -47,6 +47,8 @@ func createLogTable(db *sql.DB) (err error) {
|
|||||||
distro_release TEXT,
|
distro_release TEXT,
|
||||||
kernel_release TEXT,
|
kernel_release TEXT,
|
||||||
|
|
||||||
|
internal_err TEXT,
|
||||||
|
|
||||||
build_output TEXT,
|
build_output TEXT,
|
||||||
build_ok BOOLEAN,
|
build_ok BOOLEAN,
|
||||||
|
|
||||||
@ -126,13 +128,14 @@ func addToLog(db *sql.DB, q *qemu.System, ka config.Artifact,
|
|||||||
|
|
||||||
stmt, err := db.Prepare("INSERT INTO log (name, type, tag, " +
|
stmt, err := db.Prepare("INSERT INTO log (name, type, tag, " +
|
||||||
"distro_type, distro_release, kernel_release, " +
|
"distro_type, distro_release, kernel_release, " +
|
||||||
|
"internal_err, " +
|
||||||
"build_output, build_ok, " +
|
"build_output, build_ok, " +
|
||||||
"run_output, run_ok, " +
|
"run_output, run_ok, " +
|
||||||
"test_output, test_ok, " +
|
"test_output, test_ok, " +
|
||||||
"qemu_stdout, qemu_stderr, " +
|
"qemu_stdout, qemu_stderr, " +
|
||||||
"kernel_panic, timeout_kill) " +
|
"kernel_panic, timeout_kill) " +
|
||||||
"VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, " +
|
"VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, " +
|
||||||
"$10, $11, $12, $13, $14, $15, $16);")
|
"$10, $11, $12, $13, $14, $15, $16, $17);")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -142,6 +145,7 @@ func addToLog(db *sql.DB, q *qemu.System, ka config.Artifact,
|
|||||||
_, err = stmt.Exec(
|
_, err = stmt.Exec(
|
||||||
ka.Name, ka.Type, tag,
|
ka.Name, ka.Type, tag,
|
||||||
ki.Distro.ID, ki.Distro.Release, ki.KernelRelease,
|
ki.Distro.ID, ki.Distro.Release, ki.KernelRelease,
|
||||||
|
res.InternalErrorString,
|
||||||
res.Build.Output, res.Build.Ok,
|
res.Build.Output, res.Build.Ok,
|
||||||
res.Run.Output, res.Run.Ok,
|
res.Run.Output, res.Run.Ok,
|
||||||
res.Test.Output, res.Test.Ok,
|
res.Test.Output, res.Test.Ok,
|
||||||
@ -158,6 +162,7 @@ func addToLog(db *sql.DB, q *qemu.System, ka config.Artifact,
|
|||||||
func getAllLogs(db *sql.DB, tag string, num int) (les []logEntry, err error) {
|
func getAllLogs(db *sql.DB, tag string, num int) (les []logEntry, err error) {
|
||||||
stmt, err := db.Prepare("SELECT id, time, name, type, tag, " +
|
stmt, err := db.Prepare("SELECT id, time, name, type, tag, " +
|
||||||
"distro_type, distro_release, kernel_release, " +
|
"distro_type, distro_release, kernel_release, " +
|
||||||
|
"internal_err, " +
|
||||||
"build_ok, run_ok, test_ok, kernel_panic, " +
|
"build_ok, run_ok, test_ok, kernel_panic, " +
|
||||||
"timeout_kill FROM log ORDER BY datetime(time) DESC " +
|
"timeout_kill FROM log ORDER BY datetime(time) DESC " +
|
||||||
"LIMIT $1")
|
"LIMIT $1")
|
||||||
@ -173,10 +178,12 @@ func getAllLogs(db *sql.DB, tag string, num int) (les []logEntry, err error) {
|
|||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
|
var internalErr sql.NullString
|
||||||
le := logEntry{}
|
le := logEntry{}
|
||||||
err = rows.Scan(&le.ID, &le.Timestamp,
|
err = rows.Scan(&le.ID, &le.Timestamp,
|
||||||
&le.Name, &le.Type, &le.Tag,
|
&le.Name, &le.Type, &le.Tag,
|
||||||
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
||||||
|
&internalErr,
|
||||||
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
||||||
&le.KernelPanic, &le.KilledByTimeout,
|
&le.KernelPanic, &le.KilledByTimeout,
|
||||||
)
|
)
|
||||||
@ -184,6 +191,8 @@ func getAllLogs(db *sql.DB, tag string, num int) (les []logEntry, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
le.InternalErrorString = internalErr.String
|
||||||
|
|
||||||
if tag == "" || tag == le.Tag {
|
if tag == "" || tag == le.Tag {
|
||||||
les = append(les, le)
|
les = append(les, le)
|
||||||
}
|
}
|
||||||
@ -197,6 +206,7 @@ func getAllArtifactLogs(db *sql.DB, tag string, num int, ka config.Artifact) (
|
|||||||
|
|
||||||
stmt, err := db.Prepare("SELECT id, time, name, type, tag, " +
|
stmt, err := db.Prepare("SELECT id, time, name, type, tag, " +
|
||||||
"distro_type, distro_release, kernel_release, " +
|
"distro_type, distro_release, kernel_release, " +
|
||||||
|
"internal_err, " +
|
||||||
"build_ok, run_ok, test_ok, kernel_panic, " +
|
"build_ok, run_ok, test_ok, kernel_panic, " +
|
||||||
"timeout_kill FROM log WHERE name=$1 AND type=$2 " +
|
"timeout_kill FROM log WHERE name=$1 AND type=$2 " +
|
||||||
"ORDER BY datetime(time) DESC LIMIT $3")
|
"ORDER BY datetime(time) DESC LIMIT $3")
|
||||||
@ -212,10 +222,12 @@ func getAllArtifactLogs(db *sql.DB, tag string, num int, ka config.Artifact) (
|
|||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
|
var internalErr sql.NullString
|
||||||
le := logEntry{}
|
le := logEntry{}
|
||||||
err = rows.Scan(&le.ID, &le.Timestamp,
|
err = rows.Scan(&le.ID, &le.Timestamp,
|
||||||
&le.Name, &le.Type, &le.Tag,
|
&le.Name, &le.Type, &le.Tag,
|
||||||
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
||||||
|
&internalErr,
|
||||||
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
||||||
&le.KernelPanic, &le.KilledByTimeout,
|
&le.KernelPanic, &le.KilledByTimeout,
|
||||||
)
|
)
|
||||||
@ -223,6 +235,8 @@ func getAllArtifactLogs(db *sql.DB, tag string, num int, ka config.Artifact) (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
le.InternalErrorString = internalErr.String
|
||||||
|
|
||||||
if tag == "" || tag == le.Tag {
|
if tag == "" || tag == le.Tag {
|
||||||
les = append(les, le)
|
les = append(les, le)
|
||||||
}
|
}
|
||||||
@ -234,6 +248,7 @@ func getAllArtifactLogs(db *sql.DB, tag string, num int, ka config.Artifact) (
|
|||||||
func getLogByID(db *sql.DB, id int) (le logEntry, err error) {
|
func getLogByID(db *sql.DB, id int) (le logEntry, err error) {
|
||||||
stmt, err := db.Prepare("SELECT id, time, name, type, tag, " +
|
stmt, err := db.Prepare("SELECT id, time, name, type, tag, " +
|
||||||
"distro_type, distro_release, kernel_release, " +
|
"distro_type, distro_release, kernel_release, " +
|
||||||
|
"internal_err, " +
|
||||||
"build_ok, run_ok, test_ok, " +
|
"build_ok, run_ok, test_ok, " +
|
||||||
"build_output, run_output, test_output, " +
|
"build_output, run_output, test_output, " +
|
||||||
"qemu_stdout, qemu_stderr, " +
|
"qemu_stdout, qemu_stderr, " +
|
||||||
@ -244,20 +259,28 @@ func getLogByID(db *sql.DB, id int) (le logEntry, err error) {
|
|||||||
}
|
}
|
||||||
defer stmt.Close()
|
defer stmt.Close()
|
||||||
|
|
||||||
|
var internalErr sql.NullString
|
||||||
err = stmt.QueryRow(id).Scan(&le.ID, &le.Timestamp,
|
err = stmt.QueryRow(id).Scan(&le.ID, &le.Timestamp,
|
||||||
&le.Name, &le.Type, &le.Tag,
|
&le.Name, &le.Type, &le.Tag,
|
||||||
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
||||||
|
&internalErr,
|
||||||
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
||||||
&le.Build.Output, &le.Run.Output, &le.Test.Output,
|
&le.Build.Output, &le.Run.Output, &le.Test.Output,
|
||||||
&le.Stdout, &le.Stderr,
|
&le.Stdout, &le.Stderr,
|
||||||
&le.KernelPanic, &le.KilledByTimeout,
|
&le.KernelPanic, &le.KilledByTimeout,
|
||||||
)
|
)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
le.InternalErrorString = internalErr.String
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLastLog(db *sql.DB) (le logEntry, err error) {
|
func getLastLog(db *sql.DB) (le logEntry, err error) {
|
||||||
err = db.QueryRow("SELECT MAX(id), time, name, type, tag, "+
|
err = db.QueryRow("SELECT MAX(id), time, name, type, tag, "+
|
||||||
"distro_type, distro_release, kernel_release, "+
|
"distro_type, distro_release, kernel_release, "+
|
||||||
|
"internal_err, "+
|
||||||
"build_ok, run_ok, test_ok, "+
|
"build_ok, run_ok, test_ok, "+
|
||||||
"build_output, run_output, test_output, "+
|
"build_output, run_output, test_output, "+
|
||||||
"qemu_stdout, qemu_stderr, "+
|
"qemu_stdout, qemu_stderr, "+
|
||||||
@ -265,6 +288,7 @@ func getLastLog(db *sql.DB) (le logEntry, err error) {
|
|||||||
"FROM log").Scan(&le.ID, &le.Timestamp,
|
"FROM log").Scan(&le.ID, &le.Timestamp,
|
||||||
&le.Name, &le.Type, &le.Tag,
|
&le.Name, &le.Type, &le.Tag,
|
||||||
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
&le.Distro.ID, &le.Distro.Release, &le.KernelRelease,
|
||||||
|
&le.InternalErrorString,
|
||||||
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
&le.Build.Ok, &le.Run.Ok, &le.Test.Ok,
|
||||||
&le.Build.Output, &le.Run.Output, &le.Test.Output,
|
&le.Build.Output, &le.Run.Output, &le.Test.Output,
|
||||||
&le.Stdout, &le.Stderr,
|
&le.Stdout, &le.Stderr,
|
||||||
@ -324,6 +348,19 @@ func openDatabase(path string) (db *sql.DB, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
version = 2
|
version = 2
|
||||||
|
|
||||||
|
} else if version == 2 {
|
||||||
|
_, err = db.Exec(`ALTER TABLE log ADD internal_err TEXT`)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = metaSetValue(db, versionField, "3")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
version = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
if version != currentDatabaseVersion {
|
if version != currentDatabaseVersion {
|
||||||
|
6
log.go
6
log.go
@ -214,7 +214,11 @@ func logLogEntry(l logEntry) {
|
|||||||
artifactInfo := fmt.Sprintf("{[%s] %s}", l.Type, l.Name)
|
artifactInfo := fmt.Sprintf("{[%s] %s}", l.Type, l.Name)
|
||||||
|
|
||||||
colored := ""
|
colored := ""
|
||||||
if l.Type == config.KernelExploit {
|
if l.InternalErrorString != "" {
|
||||||
|
colored = aurora.Sprintf("[%4d %4s] [%s] %40s %40s: %s",
|
||||||
|
l.ID, l.Tag, l.Timestamp, artifactInfo, distroInfo,
|
||||||
|
genOkFail("", false))
|
||||||
|
} else if l.Type == config.KernelExploit {
|
||||||
colored = aurora.Sprintf("[%4d %4s] [%s] %40s %40s: %s %s",
|
colored = aurora.Sprintf("[%4d %4s] [%s] %40s %40s: %s %s",
|
||||||
l.ID, l.Tag, l.Timestamp, artifactInfo, distroInfo,
|
l.ID, l.Tag, l.Timestamp, artifactInfo, distroInfo,
|
||||||
genOkFail("BUILD", l.Build.Ok),
|
genOkFail("BUILD", l.Build.Ok),
|
||||||
|
17
pew.go
17
pew.go
@ -377,7 +377,8 @@ type phasesResult struct {
|
|||||||
Ok bool
|
Ok bool
|
||||||
}
|
}
|
||||||
|
|
||||||
InternalError error
|
InternalError error
|
||||||
|
InternalErrorString string
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyFile(sourcePath, destinationPath string) (err error) {
|
func copyFile(sourcePath, destinationPath string) (err error) {
|
||||||
@ -401,12 +402,14 @@ func copyFile(sourcePath, destinationPath string) (err error) {
|
|||||||
func dumpResult(q *qemu.System, ka config.Artifact, ki distro.KernelInfo,
|
func dumpResult(q *qemu.System, ka config.Artifact, ki distro.KernelInfo,
|
||||||
res *phasesResult, dist, tag, binary string, db *sql.DB) {
|
res *phasesResult, dist, tag, binary string, db *sql.DB) {
|
||||||
|
|
||||||
|
// TODO refactor
|
||||||
|
|
||||||
if res.InternalError != nil {
|
if res.InternalError != nil {
|
||||||
q.Log.Error().Err(res.InternalError).
|
q.Log.Error().Err(res.InternalError).
|
||||||
Str("panic", fmt.Sprintf("%v", q.KernelPanic)).
|
Str("panic", fmt.Sprintf("%v", q.KernelPanic)).
|
||||||
Str("timeout", fmt.Sprintf("%v", q.KilledByTimeout)).
|
Str("timeout", fmt.Sprintf("%v", q.KilledByTimeout)).
|
||||||
Msg("internal")
|
Msg("internal")
|
||||||
return
|
res.InternalErrorString = res.InternalError.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
colored := ""
|
colored := ""
|
||||||
@ -432,10 +435,12 @@ func dumpResult(q *qemu.System, ka config.Artifact, ki distro.KernelInfo,
|
|||||||
additional = "(timeout)"
|
additional = "(timeout)"
|
||||||
}
|
}
|
||||||
|
|
||||||
if additional != "" {
|
if res.InternalError == nil {
|
||||||
q.Log.Info().Msgf("%v %v", colored, additional)
|
if additional != "" {
|
||||||
} else {
|
q.Log.Info().Msgf("%v %v", colored, additional)
|
||||||
q.Log.Info().Msgf("%v", colored)
|
} else {
|
||||||
|
q.Log.Info().Msgf("%v", colored)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err := addToLog(db, q, ka, ki, res, tag)
|
err := addToLog(db, q, ka, ki, res, tag)
|
||||||
|
Loading…
Reference in New Issue
Block a user