File: //bigscoots/wpo/backups/container_discovery.sh
#!/bin/bash
NODE_IPS_FILE="/root/playbooks/node.ips"
MYSQL_DB="vps_monitor"
MYSQL_TABLE="containers"
SSH_PORT=2222
DEBUG=false
PARALLEL_JOBS=10
# Parse --debug flag
if [[ "$1" == "--debug" ]]; then
DEBUG=true
fi
# Inline everything into one exported function
process_node() {
local node_ip=$1
local DEBUG=$2
local MYSQL_DB=$3
local MYSQL_TABLE=$4
local SSH_PORT=$5
log() {
[[ "$DEBUG" == true ]] && echo -e "$1"
}
echo -e "\nš Connecting to node: $node_ip..."
if ssh -p "$SSH_PORT" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
-o PasswordAuthentication=no -o BatchMode=yes -q root@"$node_ip" </dev/null 'echo "ā
SSH Success"' 2>/dev/null; then
log "š” Fetching VEID + hostname from $node_ip"
data=$(ssh -p "$SSH_PORT" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
-o PasswordAuthentication=no -o BatchMode=yes -q root@"$node_ip" </dev/null "
hostname=\$(hostname | sed -E 's/\..*//' | tr -cd '[:alnum:]')
vzlist -H -a -o veid,hostname 2>/dev/null | while read -r line; do
veid=\$(echo \"\$line\" | awk '{print \$1}')
site=\$(echo \"\$line\" | cut -d ' ' -f2-)
echo \"\$hostname|\$veid|\$site\"
done
")
values=""
while IFS='|' read -r node_hostname veid hostname; do
if [[ -n \"$veid\" && -n \"$hostname\" ]]; then
log " š¦ $node_hostname: VEID=$veid | Hostname=$hostname"
safe_hostname=$(echo "$hostname" | sed "s/'/''/g")
safe_node=$(echo "$node_hostname" | sed "s/'/''/g")
values+="('$safe_node', '$veid', '$safe_hostname', NOW()),"
else
echo " ā ļø Skipping invalid row on $node_ip: $line"
fi
done <<< "$data"
# Trim trailing comma
values=${values%,}
if [[ -n "$values" ]]; then
query="INSERT IGNORE INTO $MYSQL_DB.$MYSQL_TABLE (node_hostname, veid, hostname, last_updated) VALUES $values;"
if ! echo "$query" | mysql --silent 2>/dev/null; then
[[ "$DEBUG" == true ]] && echo -e "ā Failed query for $node_ip:
$query"
echo "ā Batch insert failed for $node_ip"
else
log "ā
Batch insert completed for $node_ip"
fi
else
log "ā ļø No valid container data found on $node_ip"
fi
else
echo "ā SSH FAILED for $node_ip ā skipping this node."
fi
}
export -f process_node
# Launch in parallel
cat "$NODE_IPS_FILE" | xargs -n1 -P"$PARALLEL_JOBS" -I{} bash -c \
'process_node "$@"' _ {} "$DEBUG" "$MYSQL_DB" "$MYSQL_TABLE" "$SSH_PORT"