File: //bigscoots/ovz/node/duplicate_ip_check.sh
#!/bin/bash
source /bigscoots/includes/common.sh
# File containing the list of server IPs
IP_FILE="/root/playbooks/nodes.ips"
TMP_DIR="/tmp/ip_check"
mkdir -p "$TMP_DIR"
declare -A ipMap # Associative array to track IPs and their corresponding nodes
# Function to fetch IPs, container hostnames, and node information from a server
fetch_ips() {
local server=$1
local node_ip=$server
local node_hostname=$(ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PasswordAuthentication=no -o BatchMode=yes -p 2222 "$server" 'hostname' </dev/null)
ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PasswordAuthentication=no -o BatchMode=yes -p 2222 "$server" 'vzlist -H -o ip,hostname | awk "{print \$1,\$2}" | grep -v -' </dev/null > "$TMP_DIR/$node_hostname.ips"
echo "$node_ip $node_hostname" > "$TMP_DIR/$node_hostname.nodeinfo"
}
# Read IPs from the file and start fetching in parallel
while IFS= read -r server; do
fetch_ips "$server" &
done < "$IP_FILE"
# Wait for all background jobs to complete
wait
# Process the results
for nodeinfo in $(ls "$TMP_DIR" | grep '.nodeinfo'); do
node_ip=$(awk '{print $1}' "$TMP_DIR/$nodeinfo")
node_hostname=$(awk '{print $2}' "$TMP_DIR/$nodeinfo")
ips_file="${node_hostname}.ips"
while IFS= read -r line; do
ip=$(echo "$line" | awk '{print $1}')
container_hostname=$(echo "$line" | awk '{print $2}')
if [[ -z "${ipMap[$ip]}" ]]; then
ipMap["$ip"]="{\"container_hostnames\": [\"$container_hostname\"], \"nodes\": [{\"node_ip\": \"$node_ip\", \"node_hostname\": \"$node_hostname\"}]}"
else
current_entry=$(echo "${ipMap[$ip]}" | jq '.container_hostnames += ["'"$container_hostname"'"] | .nodes += [{"node_ip": "'"$node_ip"'", "node_hostname": "'"$node_hostname"'"}]')
ipMap["$ip"]=$current_entry
fi
done < "$TMP_DIR/$ips_file"
done
# Check for duplicates and prepare the result array
result=()
plain_text_result=""
for ip in "${!ipMap[@]}"; do
if [[ $(echo "${ipMap[$ip]}" | jq '.nodes | length') -gt 1 ]]; then
result+=("{\"ip\": \"$ip\", \"data\": ${ipMap[$ip]}}")
plain_text_result+="IP: $ip\n"
plain_text_result+="Container Hostnames: $(echo "${ipMap[$ip]}" | jq -r '.container_hostnames | join(", ")')\n"
plain_text_result+="Nodes:\n"
nodes=$(echo "${ipMap[$ip]}" | jq -c '.nodes[]')
while IFS= read -r node; do
node_ip=$(echo "$node" | jq -r '.node_ip')
node_hostname=$(echo "$node" | jq -r '.node_hostname')
plain_text_result+=" - Node IP: $node_ip, Node Hostname: $node_hostname\n"
done <<< "$nodes"
plain_text_result+="\n"
fi
done
# Join the result array elements into a JSON array
json_result=$(printf "%s\n" "${result[@]}" | jq -s .)
# Create the final JSON response using the generate_json_response function
json_response=$(generate_json_response true "Duplicate IPs found" "$json_result")
# Check if result is empty before sending to Slack
if [[ $(echo "$json_result" | jq '. | length') -gt 0 ]]; then
# Send the plain text response to Slack
send_slack_alert "#node-alerts" ":fire:" "Duplicate IP" "N/A" "\`\`\`$plain_text_result\`\`\`"
fi
# Print the result in JSON format for debugging purposes
# echo "JSON response:"
# echo "$json_response" | jq '.'
# Clean up temporary files
rm -rf "$TMP_DIR"