106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
package server
|
|
|
|
import (
|
|
"bytes"
|
|
"log/slog"
|
|
"net/http"
|
|
|
|
"git.lastassault.de/speatzle/morffix/constants"
|
|
"git.lastassault.de/speatzle/morffix/types"
|
|
)
|
|
|
|
type IndexData struct {
|
|
Counter []int
|
|
|
|
Workers []IndexWorker
|
|
}
|
|
|
|
type IndexWorker struct {
|
|
ID string
|
|
Worker
|
|
Status *types.WorkerStatus
|
|
QueueEnable bool
|
|
ParallelTasks int
|
|
}
|
|
|
|
func handleIndex(w http.ResponseWriter, r *http.Request) {
|
|
|
|
data := IndexData{
|
|
Workers: []IndexWorker{},
|
|
}
|
|
func() {
|
|
WorkersMutex.Lock()
|
|
defer WorkersMutex.Unlock()
|
|
for i := range Workers {
|
|
|
|
var queueEnable bool
|
|
var parallelTasks int
|
|
err := db.QueryRow(r.Context(), "SELECT queue_enable, parallel_tasks FROM workers WHERE id = $1", i).Scan(&queueEnable, ¶llelTasks)
|
|
if err != nil {
|
|
w.Write([]byte(err.Error()))
|
|
slog.ErrorContext(r.Context(), "Error Querying Worker", "err", err)
|
|
}
|
|
|
|
if Workers[i].Connected {
|
|
var status types.WorkerStatus
|
|
_, err := rpcServer.Call(r.Context(), Workers[i].Conn, "status", nil, &status)
|
|
if err != nil {
|
|
w.Write([]byte(err.Error()))
|
|
slog.ErrorContext(r.Context(), "Error Getting Worker Status", "err", err)
|
|
return
|
|
}
|
|
slog.InfoContext(r.Context(), "Got Worker Status", "id", i, "status", status)
|
|
data.Workers = append(data.Workers, IndexWorker{
|
|
ID: i,
|
|
Worker: *Workers[i],
|
|
Status: &status,
|
|
QueueEnable: queueEnable,
|
|
ParallelTasks: parallelTasks,
|
|
})
|
|
} else {
|
|
data.Workers = append(data.Workers, IndexWorker{
|
|
ID: i,
|
|
Worker: *Workers[i],
|
|
Status: nil,
|
|
QueueEnable: queueEnable,
|
|
ParallelTasks: parallelTasks,
|
|
})
|
|
}
|
|
}
|
|
}()
|
|
|
|
var size int
|
|
err := db.QueryRow(r.Context(), "SELECT SUM(size) AS size FROM files WHERE status = $1", constants.FILE_STATUS_EXISTS).Scan(&size)
|
|
if err != nil {
|
|
size = 0
|
|
}
|
|
data.Counter = splitInt(size)
|
|
|
|
buf := bytes.Buffer{}
|
|
err = templates.ExecuteTemplate(&buf, constants.INDEX_TEMPLATE_NAME, data)
|
|
if err != nil {
|
|
slog.ErrorContext(r.Context(), "Executing index Template", "err", err)
|
|
http.Error(w, "Error Executing Template: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
_, err = w.Write(buf.Bytes())
|
|
if err != nil {
|
|
slog.ErrorContext(r.Context(), "Writing http Response", "err", err)
|
|
}
|
|
}
|
|
|
|
func splitInt(n int) []int {
|
|
slc := []int{}
|
|
for n > 0 {
|
|
slc = append(slc, n%10)
|
|
n /= 10
|
|
}
|
|
|
|
result := []int{}
|
|
for i := range slc {
|
|
result = append(result, slc[len(slc)-1-i])
|
|
}
|
|
|
|
return result
|
|
}
|