#!/bin/bash # Configuration SESSION_NAME="bybitbtc" NTP_SERVER="pool.ntp.org" MAX_TIME_OFFSET=0.5 # Seconds PYTHON_VERSION="3.10" # Adjust as needed # Colors for output G='\033[0;32m' R='\033[0;31m' Y='\033[1;33m' NC='\033[0m' log() { echo -e "${G}[MOTHER]${NC} $1"; } warn() { echo -e "${Y}[WARN]${NC} $1"; } err() { echo -e "${R}[ERROR]${NC} $1"; } # 1. Dependency Check & Installation setup() { log "Starting dependency installation..." # Check for tmux if ! command -v tmux &> /dev/null; then err "tmux not found. Please install it." exit 1 fi # Go Services for dir in "input" "onramp"; do if [ -d "$dir" ]; then log "Setting up Go service: $dir" (cd "$dir" && go mod tidy) fi done # Python Services for dir in "analysis" "signals" "monitor"; do if [ -d "$dir" ]; then log "Setting up Python service: $dir" (cd "$dir" && pipenv install) fi done log "Setup complete." } # 2. Tick Verification (NTP Sync Check) verify_time() { log "Verifying system clock sync with $NTP_SERVER..." if ! command -v ntpdate &> /dev/null; then warn "ntpdate not installed. Skipping precise tick verification." return fi # Query NTP offset without setting the clock (-q) OFFSET=$(ntpdate -q $NTP_SERVER | tail -1 | awk '{print $6}' | tr -d '-') if [ -z "$OFFSET" ]; then err "Could not reach NTP server." return fi log "Current time offset: $OFFSET seconds" # Compare offset using bc (bash doesn't do float comparison well) IS_SYNCED=$(echo "$OFFSET < $MAX_TIME_OFFSET" | bc) if [ "$IS_SYNCED" -eq 1 ]; then log "Time sync is within healthy parameters." else err "Clock desync detected ($OFFSET s)! Trades might be rejected or delayed." read -p "Continue anyway? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi fi } # 3. Start Services in Tmux start() { verify_time # Kill existing session if it exists tmux kill-session -t $SESSION_NAME 2>/dev/null log "Launching services in tmux session: $SESSION_NAME" # 1. Start INPUT log "Stage 1: Starting Input (Websocket)..." tmux new-session -d -s $SESSION_NAME -n "input" tmux send-keys -t $SESSION_NAME:input "cd input && go run input.go" C-m sleep 3 # Wait for WS connection and first file creation # 2. Start ONRAMP log "Stage 2: Starting Onramp (DB Writer)..." tmux new-window -t $SESSION_NAME -n "onramp" tmux send-keys -t $SESSION_NAME:onramp "cd onramp && go run onramp.go" C-m sleep 5 # Wait for candles.db to be initialized and first rows inserted # 3. Start ANALYST log "Stage 3: Starting Analyst (Indicators)..." tmux new-window -t $SESSION_NAME -n "analysis" tmux send-keys -t $SESSION_NAME:analysis "cd analysis && pipenv run python analyst.py" C-m sleep 8 # Analyst needs time to calculate indicators for the first time # 4. Start SIGNALS log "Stage 4: Starting Signals (Logic)..." tmux new-window -t $SESSION_NAME -n "signals" tmux send-keys -t $SESSION_NAME:signals "cd signals && pipenv run python signals.py" C-m sleep 3 # Wait for the Unix Socket (/tmp/signals.sock) to be created # 5. Start MONITOR log "Stage 5: Starting Monitor..." tmux new-window -t $SESSION_NAME -n "monitor" tmux send-keys -t $SESSION_NAME:monitor "cd monitor && pipenv run python monitor.py" C-m log "${G}All services started in sequence.${NC}" log "Use 'tmux attach -t $SESSION_NAME' to view logs." log "Use './mother.sh stop' to kill all services." } stop() { log "Stopping tmux session $SESSION_NAME..." tmux kill-session -t $SESSION_NAME 2>/dev/null log "Stopped." } status() { if tmux has-session -t $SESSION_NAME 2>/dev/null; then log "Status: ${G}RUNNING${NC}" tmux list-windows -t $SESSION_NAME else log "Status: ${R}STOPPED${NC}" fi } # Main Command Switch case "$1" in setup) setup ;; start) start ;; stop) stop ;; status) status ;; restart) stop start ;; *) echo "Usage: $0 {setup|start|stop|status|restart}" exit 1 esac