132 lines
3.1 KiB
Bash
132 lines
3.1 KiB
Bash
#!/bin/bash
|
|
# Machine registry logic
|
|
|
|
MACHINES_FILE="${DATA_DIR:-/data/fleet}/machines.json"
|
|
STALE_THRESHOLD=60 # seconds
|
|
|
|
# Get current timestamp
|
|
now() {
|
|
date +%s
|
|
}
|
|
|
|
# Read machines file with lock
|
|
read_machines() {
|
|
if [ -f "$MACHINES_FILE" ]; then
|
|
cat "$MACHINES_FILE"
|
|
else
|
|
echo '{}'
|
|
fi
|
|
}
|
|
|
|
# Write machines file with lock
|
|
write_machines() {
|
|
local data="$1"
|
|
echo "$data" > "$MACHINES_FILE.tmp"
|
|
mv "$MACHINES_FILE.tmp" "$MACHINES_FILE"
|
|
}
|
|
|
|
# Update machine status based on lastSeen
|
|
update_status() {
|
|
local machines="$1"
|
|
local current_time=$(now)
|
|
|
|
echo "$machines" | jq --arg now "$current_time" --arg threshold "$STALE_THRESHOLD" '
|
|
to_entries | map(
|
|
.value.status = (
|
|
if (.value.lastSeen | tonumber) < (($now | tonumber) - ($threshold | tonumber))
|
|
then "unknown"
|
|
else .value.status
|
|
end
|
|
)
|
|
) | from_entries
|
|
'
|
|
}
|
|
|
|
# Handle POST /api/machines/register
|
|
handle_register() {
|
|
local body="$1"
|
|
|
|
# Validate JSON
|
|
if ! echo "$body" | jq -e . >/dev/null 2>&1; then
|
|
send_error "400 Bad Request" "Invalid JSON"
|
|
return
|
|
fi
|
|
|
|
# Extract required fields
|
|
local id=$(echo "$body" | jq -r '.id // empty')
|
|
local name=$(echo "$body" | jq -r '.name // empty')
|
|
local url=$(echo "$body" | jq -r '.url // empty')
|
|
|
|
if [ -z "$id" ] || [ -z "$name" ] || [ -z "$url" ]; then
|
|
send_error "400 Bad Request" "Missing required fields: id, name, url"
|
|
return
|
|
fi
|
|
|
|
# Read current machines
|
|
local machines=$(read_machines)
|
|
local current_time=$(now)
|
|
|
|
# Create/update machine entry
|
|
local machine=$(echo "$body" | jq --arg ts "$current_time" '. + {lastSeen: ($ts | tonumber)}')
|
|
|
|
# Add to machines
|
|
machines=$(echo "$machines" | jq --arg id "$id" --argjson machine "$machine" '.[$id] = $machine')
|
|
|
|
# Write back
|
|
write_machines "$machines"
|
|
|
|
send_json "200 OK" "$machine"
|
|
}
|
|
|
|
# Handle GET /api/machines
|
|
handle_list_machines() {
|
|
local machines=$(read_machines)
|
|
|
|
# Update status based on lastSeen
|
|
machines=$(update_status "$machines")
|
|
|
|
# Convert to array
|
|
local result=$(echo "$machines" | jq '[to_entries[] | .value]')
|
|
|
|
send_json "200 OK" "$result"
|
|
}
|
|
|
|
# Handle GET /api/machines/:id
|
|
handle_get_machine() {
|
|
local id="$1"
|
|
local machines=$(read_machines)
|
|
|
|
# Update status
|
|
machines=$(update_status "$machines")
|
|
|
|
# Get machine
|
|
local machine=$(echo "$machines" | jq --arg id "$id" '.[$id] // null')
|
|
|
|
if [ "$machine" = "null" ]; then
|
|
send_error "404 Not Found" "Machine not found"
|
|
return
|
|
fi
|
|
|
|
send_json "200 OK" "$machine"
|
|
}
|
|
|
|
# Handle DELETE /api/machines/:id
|
|
handle_delete_machine() {
|
|
local id="$1"
|
|
local machines=$(read_machines)
|
|
|
|
# Check if exists
|
|
local exists=$(echo "$machines" | jq --arg id "$id" 'has($id)')
|
|
|
|
if [ "$exists" = "false" ]; then
|
|
send_error "404 Not Found" "Machine not found"
|
|
return
|
|
fi
|
|
|
|
# Remove machine
|
|
machines=$(echo "$machines" | jq --arg id "$id" 'del(.[$id])')
|
|
write_machines "$machines"
|
|
|
|
send_json "200 OK" '{"deleted":true}'
|
|
}
|