HEX
Server: nginx/1.29.3
System: Linux 11979.bigscoots-wpo.com 6.8.0-88-generic #89-Ubuntu SMP PREEMPT_DYNAMIC Sat Oct 11 01:02:46 UTC 2025 x86_64
User: nginx (1068)
PHP: 7.4.33
Disabled: exec,system,passthru,shell_exec,proc_open,proc_close,popen,show_source,cmd# Do not modify this line # 1684243876
Upload Files
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"