#!/bin/bash
# x-console-auto: Timestamp-based execution engine
SCRIPT_FILE="$1"
if [ -z "$SCRIPT_FILE" ] || [ ! -f "$SCRIPT_FILE" ]; then
echo "KC$yttC6: x-console-auto <skripti.xc>"
exit 1
fi
# Otetaan nanosekuntitason baseline
START_TIME=$(date +%s.%N)
echo "[*] x-console-auto kC$ynnistyy. Baseline TS: 0.0s"
# EristetC$C$n kaikki yksilC6lliset sessiot kC$sikirjoituksesta (toinen
sarake)
SESSIONS=$(awk '!/^#/ && NF>2 {print $2}' "$SCRIPT_FILE" | sort -u)
for SESS in $SESSIONS; do
(
# Luetaan ja suoritetaan vain TCMCN session komennot aikajC$rjestyksess
C$
grep -E "^[[:space:]]*\+[0-9]" "$SCRIPT_FILE" | awk -v s="$SESS" '$2
== s {print $0}' | while read -r line; do
# Parsitaan rivi
TS=$(echo "$line" | awk '{print $1}' | tr -d '+s')
ACTION=$(echo "$line" | awk '{print $3}')
# Loppuosa on argumentteja (evaluoidaan, jotta lainausmerkit
sC$ilyvC$t send-komennossa)
ARGS=$(echo "$line" | cut -d' ' -f4-)
# Lasketaan kuinka kauan pitC$C$ odottaa
NOW=$(date +%s.%N)
TARGET=$(awk "BEGIN {print $START_TIME + $TS}")
DELAY=$(awk "BEGIN { d = $TARGET - $NOW; print (d > 0) ? d : 0 }")
# Nukkuminen (blokkaa vain tC$mC$n session sC$iettC$)
if (( $(awk "BEGIN {print ($DELAY > 0)}") )); then
sleep "$DELAY"
fi
# Suoritetaan x-console komento
echo -e "\033[36m[+${TS}s]\033[0m [\033[32m${SESS}\033[0m]
x-console $SESS $ACTION $ARGS"
eval "x-console $SESS $ACTION $ARGS"
# Huom: Jos ACTION on "wait-for", eval-komento blokkaa *tC$tC$*
sC$iettC$
# kunnes teksti lC6ytyy. Seuraava aikaleima tC$lle sessiolle
lasketaan
# vasta wait-forin pC$C$tyttyC$, pitC$en tapahtumat synkassa.
done
) &
done
# Odotetaan, ettC$ kaikkien sessioiden sC$ikeet ovat valmiita
wait
echo "[*] Kaikki kC$sikirjoituksen sC$ikeet suoritettu."