154 lines
4.9 KiB
Bash
Executable File
154 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Directory to monitor
|
|
BASE_DIR="/home/shane/foodie_automator"
|
|
CHECKSUM_FILE="$BASE_DIR/.file_checksum"
|
|
LOG_FILE="$BASE_DIR/logs/manage_scripts.log"
|
|
VENV_PYTHON="$BASE_DIR/venv/bin/python"
|
|
LOCK_DIR="$BASE_DIR/locks"
|
|
|
|
# Log function
|
|
log() {
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
|
|
}
|
|
|
|
# Calculate checksum of files (excluding logs, JSON files, and venv)
|
|
calculate_checksum() {
|
|
find "$BASE_DIR" -type f \
|
|
-not -path "$BASE_DIR/logs/*" \
|
|
-not -path "$BASE_DIR/*.json" \
|
|
-not -path "$BASE_DIR/.file_checksum" \
|
|
-not -path "$BASE_DIR/venv/*" \
|
|
-not -path "$BASE_DIR/locks/*" \
|
|
-exec sha256sum {} \; | sort | sha256sum | awk '{print $1}'
|
|
}
|
|
|
|
# Check if a script is running (using lock file)
|
|
check_running() {
|
|
local script_name="$1"
|
|
local lock_file="$LOCK_DIR/${script_name}.lock"
|
|
if [ -f "$lock_file" ]; then
|
|
local pid=$(cat "$lock_file")
|
|
if ps -p "$pid" > /dev/null; then
|
|
log "$script_name is already running (PID: $pid)"
|
|
return 0
|
|
else
|
|
log "Stale lock file found for $script_name, removing"
|
|
rm -f "$lock_file"
|
|
fi
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
# Run a script and extract sleep_time
|
|
run_script() {
|
|
local script="$1"
|
|
local script_name="${script%.py}"
|
|
local script_log="$BASE_DIR/logs/${script_name}.log"
|
|
if check_running "$script_name"; then
|
|
return 1
|
|
fi
|
|
log "Running $script..."
|
|
# Run script and capture output
|
|
"$VENV_PYTHON" "$script" >> "$script_log" 2>&1
|
|
# Extract sleep_time from the last log line
|
|
sleep_time=$(tail -n 1 "$script_log" | grep -oP 'sleep_time: \K[0-9]+' || echo $((RANDOM % 601 + 1200)))
|
|
log "$script completed, sleep_time: $sleep_time seconds"
|
|
echo "$sleep_time"
|
|
}
|
|
|
|
# Stop scripts
|
|
stop_scripts() {
|
|
log "Stopping scripts..."
|
|
for script in foodie_automator_*.py; do
|
|
if [ -f "$script" ] && [ "$script" != "foodie_weekly_thread.py" ] && [ "$script" != "foodie_engagement_tweet.py" ]; then
|
|
local script_name="${script%.py}"
|
|
pkill -TERM -f "$VENV_PYTHON.*$script_name" || true
|
|
fi
|
|
done
|
|
sleep 10
|
|
for script in foodie_automator_*.py; do
|
|
if [ -f "$script" ] && [ "$script" != "foodie_weekly_thread.py" ] && [ "$script" != "foodie_engagement_tweet.py" ]; then
|
|
local script_name="${script%.py}"
|
|
pkill -9 -f "$VENV_PYTHON.*$script_name" || true
|
|
rm -f "$LOCK_DIR/${script_name}.lock"
|
|
log "Removed lock file for $script_name"
|
|
fi
|
|
done
|
|
log "Scripts stopped."
|
|
}
|
|
|
|
# Update dependencies
|
|
update_dependencies() {
|
|
log "Updating dependencies..."
|
|
cd "$BASE_DIR" || { log "Failed to change to $BASE_DIR"; exit 1; }
|
|
if [ ! -d "venv" ]; then
|
|
python3 -m venv venv
|
|
log "Created new virtual environment"
|
|
fi
|
|
source "$BASE_DIR/venv/bin/activate"
|
|
"$VENV_PYTHON" -m pip install --upgrade pip
|
|
if [ -f "requirements.txt" ]; then
|
|
"$VENV_PYTHON" -m pip install -r requirements.txt || {
|
|
log "Failed to install requirements.txt, attempting fallback dependencies"
|
|
"$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager
|
|
log "Fallback: Installed core dependencies"
|
|
}
|
|
else
|
|
log "Error: requirements.txt not found, installing core dependencies"
|
|
"$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager
|
|
fi
|
|
log "Dependencies updated."
|
|
}
|
|
|
|
# Main logic
|
|
log "Checking for file changes..."
|
|
CURRENT_CHECKSUM=$(calculate_checksum)
|
|
|
|
if [ -f "$CHECKSUM_FILE" ]; then
|
|
PREVIOUS_CHECKSUM=$(cat "$CHECKSUM_FILE")
|
|
else
|
|
PREVIOUS_CHECKSUM=""
|
|
fi
|
|
|
|
if [ "$CURRENT_CHECKSUM" != "$PREVIOUS_CHECKSUM" ]; then
|
|
log "File changes detected. Previous checksum: $PREVIOUS_CHECKSUM, Current checksum: $CURRENT_CHECKSUM"
|
|
|
|
# Stop scripts if running
|
|
if pgrep -f "$VENV_PYTHON.*foodie_automator" > /dev/null; then
|
|
stop_scripts
|
|
fi
|
|
|
|
# Update dependencies
|
|
update_dependencies
|
|
|
|
# Update checksum
|
|
echo "$CURRENT_CHECKSUM" > "$CHECKSUM_FILE"
|
|
log "Checksum updated."
|
|
fi
|
|
|
|
# Run scripts sequentially if not running
|
|
cd "$BASE_DIR" || { log "Failed to change to $BASE_DIR"; exit 1; }
|
|
source "$BASE_DIR/venv/bin/activate"
|
|
if [ -f "$BASE_DIR/.env" ]; then
|
|
export $(grep -v '^#' "$BASE_DIR/.env" | xargs)
|
|
log ".env variables loaded"
|
|
else
|
|
log "Error: .env file not found at $BASE_DIR/.env"
|
|
exit 1
|
|
fi
|
|
|
|
for script in foodie_automator_rss.py foodie_automator_reddit.py foodie_automator_google.py; do
|
|
if [ -f "$script" ]; then
|
|
sleep_time=$(run_script "$script")
|
|
if [ -n "$sleep_time" ]; then
|
|
log "Sleeping for $sleep_time seconds after $script"
|
|
sleep "$sleep_time"
|
|
fi
|
|
else
|
|
log "Script $script not found"
|
|
fi
|
|
done
|
|
|
|
log "All scripts processed."
|
|
exit 0 |