This commit is contained in:
2026-07-28 19:57:39 -05:00
parent 7f24b64906
commit 8dcee4121b
6 changed files with 61 additions and 22 deletions
+12 -5
View File
@@ -23,12 +23,14 @@ var (
)
hexCredentialPattern = regexp.MustCompile(`^[0-9a-f]{64}$`)
fleetValuePattern = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9._+~,:/() -]*$`)
fleetHostnamePattern = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9._-]{0,252}$`)
errorCodePattern = regexp.MustCompile(`^[a-z0-9][a-z0-9_-]*$`)
)
type fleetRequest struct {
SchemaVersion int `json:"schema_version"`
InstallationID string `json:"installation_id"`
Hostname string `json:"hostname,omitempty"`
Credential string `json:"credential,omitempty"`
Event string `json:"event,omitempty"`
Result string `json:"result,omitempty"`
@@ -45,6 +47,7 @@ type fleetRequest struct {
type fleetHostRecord struct {
InstallationID string
Hostname string
VerifiedAt sql.NullTime
FirstSeenAt time.Time
LastSeenAt time.Time
@@ -163,12 +166,14 @@ func decodeFleetRequest(w http.ResponseWriter, r *http.Request, registration boo
return request, false
}
request.InstallationID = strings.ToLower(strings.TrimSpace(request.InstallationID))
request.Hostname = strings.TrimSpace(request.Hostname)
request.Credential = strings.ToLower(strings.TrimSpace(request.Credential))
request.Event = strings.TrimSpace(request.Event)
request.Result = strings.TrimSpace(request.Result)
request.ErrorCode = strings.TrimSpace(request.ErrorCode)
if request.SchemaVersion != 1 ||
!installationIDPattern.MatchString(request.InstallationID) ||
(request.Hostname != "" && !fleetHostnamePattern.MatchString(request.Hostname)) ||
(registration && !hexCredentialPattern.MatchString(request.Credential)) ||
!validFleetMetadata(request) {
writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid host data"})
@@ -233,11 +238,11 @@ func (s *Server) insertFleetHost(
if _, err := tx.ExecContext(
ctx,
`INSERT INTO fleet_hosts
(installation_id, credential_hash, registration_source_hash,
(installation_id, hostname, credential_hash, registration_source_hash,
proxmenu_version, git_commit, pve_version, os_version,
kernel_version, architecture, clustered)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
request.InstallationID, credentialHash, sourceHash,
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
request.InstallationID, request.Hostname, credentialHash, sourceHash,
request.ProxMenuVersion, request.GitCommit, request.PVEVersion,
request.OSVersion, request.KernelVersion, request.Architecture,
request.Clustered,
@@ -272,6 +277,7 @@ func (s *Server) updateFleetHost(ctx context.Context, request fleetRequest, reco
last_event = CASE WHEN ? THEN ? ELSE last_event END,
last_result = CASE WHEN ? THEN ? ELSE last_result END,
last_error_code = CASE WHEN ? THEN ? ELSE last_error_code END,
hostname = CASE WHEN ? <> '' THEN ? ELSE hostname END,
proxmenu_version = ?,
git_commit = ?,
pve_version = ?,
@@ -285,6 +291,7 @@ func (s *Server) updateFleetHost(ctx context.Context, request fleetRequest, reco
recordEvent, request.Event,
recordEvent, request.Result,
recordEvent, request.ErrorCode,
request.Hostname, request.Hostname,
request.ProxMenuVersion, request.GitCommit, request.PVEVersion,
request.OSVersion, request.KernelVersion, request.Architecture,
request.Clustered, request.InstallationID,
@@ -338,7 +345,7 @@ func (s *Server) verifyFleetInstallation(ctx context.Context, installationID str
func (s *Server) listFleetHosts(r *http.Request) ([]fleetHostRecord, error) {
rows, err := s.db.QueryContext(
r.Context(),
`SELECT installation_id, verified_at, first_seen_at, last_seen_at,
`SELECT installation_id, hostname, verified_at, first_seen_at, last_seen_at,
last_success_at, last_event, last_result, last_error_code,
proxmenu_version, git_commit, pve_version, os_version,
kernel_version, architecture, clustered
@@ -354,7 +361,7 @@ func (s *Server) listFleetHosts(r *http.Request) ([]fleetHostRecord, error) {
for rows.Next() {
var record fleetHostRecord
if err := rows.Scan(
&record.InstallationID, &record.VerifiedAt, &record.FirstSeenAt,
&record.InstallationID, &record.Hostname, &record.VerifiedAt, &record.FirstSeenAt,
&record.LastSeenAt, &record.LastSuccessAt, &record.LastEvent,
&record.LastResult, &record.LastErrorCode, &record.ProxMenuVersion,
&record.GitCommit, &record.PVEVersion, &record.OSVersion,