1
0

feat: add internal error to log database

This commit is contained in:
dump_stack() 2023-05-24 22:46:04 +00:00
parent 605871d17a
commit 7806a774e4
Signed by: dump_stack
GPG Key ID: BE44DA8C062D87DC
3 changed files with 55 additions and 9 deletions

41
db.go
View File

@ -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
View File

@ -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),

7
pew.go
View File

@ -378,6 +378,7 @@ type phasesResult struct {
} }
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,11 +435,13 @@ func dumpResult(q *qemu.System, ka config.Artifact, ki distro.KernelInfo,
additional = "(timeout)" additional = "(timeout)"
} }
if res.InternalError == nil {
if additional != "" { if additional != "" {
q.Log.Info().Msgf("%v %v", colored, additional) q.Log.Info().Msgf("%v %v", colored, additional)
} else { } else {
q.Log.Info().Msgf("%v", colored) q.Log.Info().Msgf("%v", colored)
} }
}
err := addToLog(db, q, ka, ki, res, tag) err := addToLog(db, q, ka, ki, res, tag)
if err != nil { if err != nil {