#!/bin/bash
# ntp_quality_log.sh - Log NTP synchronization quality metrics over time
# Run: nohup ./ntp_quality_log.sh > /dev/null 2>&1 &
# Output: ntp_quality.csv (append mode)

INTERVAL=${1:-30}  # seconds between samples, default 30
OUTFILE="${2:-ntp_quality.csv}"

# Write header if file doesn't exist
if [ ! -f "$OUTFILE" ]; then
    echo "timestamp,offset_ns,freq_ppm,rms_offset_ns,skew_ppm,root_delay_ns,root_disp_ns,stratum,leap,ref_id" > "$OUTFILE"
fi

while true; do
    ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)

    # chronyc tracking gives us the key metrics
    tracking=$(chronyc -c tracking 2>/dev/null)
    if [ $? -ne 0 ]; then
        sleep "$INTERVAL"
        continue
    fi

    # Fields from 'chronyc -c tracking':
    # 1:ref_id 2:ref_name 3:stratum 4:ref_time 5:system_time_offset
    # 6:last_offset 7:rms_offset 8:freq_ppm 9:resid_freq 10:skew_ppm
    # 11:root_delay 12:root_dispersion 13:update_interval 14:leap_status
    ref_id=$(echo "$tracking" | cut -d, -f1)
    stratum=$(echo "$tracking" | cut -d, -f3)
    last_offset=$(echo "$tracking" | cut -d, -f6)
    rms_offset=$(echo "$tracking" | cut -d, -f7)
    freq_ppm=$(echo "$tracking" | cut -d, -f8)
    skew_ppm=$(echo "$tracking" | cut -d, -f10)
    root_delay=$(echo "$tracking" | cut -d, -f11)
    root_disp=$(echo "$tracking" | cut -d, -f12)
    leap=$(echo "$tracking" | cut -d, -f14)

    # Convert seconds to nanoseconds for offset fields
    offset_ns=$(echo "$last_offset" | awk '{printf "%.0f", $1 * 1e9}')
    rms_ns=$(echo "$rms_offset" | awk '{printf "%.0f", $1 * 1e9}')
    root_delay_ns=$(echo "$root_delay" | awk '{printf "%.0f", $1 * 1e9}')
    root_disp_ns=$(echo "$root_disp" | awk '{printf "%.0f", $1 * 1e9}')

    echo "$ts,$offset_ns,$freq_ppm,$rms_ns,$skew_ppm,$root_delay_ns,$root_disp_ns,$stratum,$leap,$ref_id" >> "$OUTFILE"

    sleep "$INTERVAL"
done
