Files
Linux-Server-Management-Too…/modules/performance/network-bandwidth-analyzer.sh
T
cschantz a51d968185 Initial commit: Server Management Toolkit v2.0
- Complete security menu restructure (3-mode: Analysis/Actions/Live)
- Intelligent cPHulk enablement with CSF whitelist import
- Live network security monitoring dashboard
- Multi-source threat detection and classification
- 50+ organized security tools across 4-level menu hierarchy
- System health diagnostics with cPanel/WHM integration
- Reference database for cross-module intelligence sharing
2025-11-03 18:21:40 -05:00

644 lines
25 KiB
Bash
Executable File

#!/bin/bash
# Network & Bandwidth Analyzer
# Analyzes bandwidth usage, network performance, and traffic patterns
# Get the script's directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TOOLKIT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Source required libraries
source "$TOOLKIT_ROOT/lib/common-functions.sh"
source "$TOOLKIT_ROOT/lib/system-detect.sh"
source "$TOOLKIT_ROOT/lib/reference-db.sh"
# Initialize system detection
detect_system
# Load system info from reference database
if [ -f "$TOOLKIT_ROOT/.sysref" ]; then
SYS_HOSTNAME=$(grep "^SYS|HOSTNAME|" "$TOOLKIT_ROOT/.sysref" 2>/dev/null | cut -d'|' -f3)
SYS_PANEL=$(grep "^SYS|CONTROL_PANEL|" "$TOOLKIT_ROOT/.sysref" 2>/dev/null | cut -d'|' -f3)
SYS_PANEL_VER=$(grep "^SYS|CONTROL_PANEL|" "$TOOLKIT_ROOT/.sysref" 2>/dev/null | cut -d'|' -f4)
SYS_OS=$(grep "^SYS|OS|" "$TOOLKIT_ROOT/.sysref" 2>/dev/null | cut -d'|' -f3)
SYS_OS_VER=$(grep "^SYS|OS|" "$TOOLKIT_ROOT/.sysref" 2>/dev/null | cut -d'|' -f4)
fi
# Color definitions
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'
# Report file
REPORT_FILE="/tmp/network_bandwidth_report_$(date +%Y%m%d_%H%M%S).txt"
# Analysis results storage
declare -a FINDINGS=()
declare -a RECOMMENDATIONS=()
# Function to add finding
add_finding() {
local severity="$1"
local title="$2"
local details="$3"
local recommendation="$4"
# Use @@@SEP@@@ as separator to avoid conflicts with content
FINDINGS+=("[$severity] $title@@@SEP@@@$details@@@SEP@@@$recommendation")
}
# Function to check if command exists
command_exists() {
command -v "$1" &>/dev/null
}
# Function to install vnstat if needed
check_and_offer_vnstat() {
if ! command_exists vnstat; then
echo -e "${YELLOW}[INFO]${NC} vnstat is not installed. vnstat provides historical bandwidth tracking."
echo ""
read -p "Would you like to install vnstat now? (y/n): " install_vnstat
if [[ "$install_vnstat" =~ ^[Yy]$ ]]; then
echo -e "${CYAN}[INFO]${NC} Installing vnstat..."
if command_exists yum; then
yum install -y vnstat
elif command_exists apt-get; then
apt-get update && apt-get install -y vnstat
else
echo -e "${RED}[ERROR]${NC} Could not determine package manager"
return 1
fi
# Initialize vnstat database
echo -e "${CYAN}[INFO]${NC} Initializing vnstat database..."
systemctl enable vnstat --now 2>/dev/null || service vnstat start 2>/dev/null
sleep 2
echo -e "${GREEN}[OK]${NC} vnstat installed and started!"
echo -e "${YELLOW}[NOTE]${NC} vnstat needs time to collect data. Initial stats will be limited."
echo ""
else
echo -e "${YELLOW}[INFO]${NC} Skipping vnstat installation. Historical bandwidth data will not be available."
return 1
fi
fi
return 0
}
# Function to analyze bandwidth with vnstat
analyze_bandwidth_vnstat() {
echo -e "${CYAN}[INFO]${NC} Analyzing historical bandwidth usage..."
if ! check_and_offer_vnstat; then
add_finding "INFO" "Historical Bandwidth Tracking Not Available" \
"vnstat is not installed - cannot show historical bandwidth data" \
"Install vnstat for bandwidth tracking: yum install vnstat"
return
fi
# Get primary interface
local interface=$(ip route | grep default | awk '{print $5}' | head -1)
if [ -z "$interface" ]; then
add_finding "WARNING" "Cannot Determine Network Interface" \
"Unable to detect primary network interface" \
"Check network configuration: ip route show"
return
fi
# Check if vnstat has data for this interface
if ! vnstat -i "$interface" &>/dev/null; then
echo -e "${YELLOW}[INFO]${NC} Initializing vnstat for interface $interface..."
vnstat --create -i "$interface" 2>/dev/null
echo -e "${YELLOW}[NOTE]${NC} vnstat database created. Data collection will begin now."
echo " Run this tool again after some time to see bandwidth statistics."
echo ""
add_finding "INFO" "Bandwidth Monitoring Initialized" \
"vnstat database created for interface $interface
Data collection started - statistics will be available after some usage" \
"Run this analyzer again in 1+ hours to see bandwidth trends"
return
fi
# Get monthly bandwidth
local monthly_data=$(vnstat -i "$interface" -m --json 2>/dev/null)
if [ -n "$monthly_data" ]; then
# Extract current month data using basic parsing (fallback if jq not available)
local current_month_rx=$(vnstat -i "$interface" -m | grep "$(date +%Y-%m)" | awk '{print $3, $4}' | head -1)
local current_month_tx=$(vnstat -i "$interface" -m | grep "$(date +%Y-%m)" | awk '{print $6, $7}' | head -1)
local current_month_total=$(vnstat -i "$interface" -m | grep "$(date +%Y-%m)" | awk '{print $9, $10}' | head -1)
if [ -n "$current_month_total" ]; then
add_finding "INFO" "Monthly Bandwidth Usage ($(date +%B))" \
"Interface: $interface
Download: $current_month_rx
Upload: $current_month_tx
Total: $current_month_total" \
"Monitor bandwidth trends daily to prevent overage"
fi
fi
# Get daily bandwidth
local daily_summary=$(vnstat -i "$interface" -d | tail -n 15 | head -n 10)
if [ -n "$daily_summary" ]; then
add_finding "INFO" "Daily Bandwidth Summary (Last 7 Days)" \
"$daily_summary" \
"Review daily patterns to identify unusual spikes"
fi
# Get hourly bandwidth for today
local hourly_summary=$(vnstat -i "$interface" -h | tail -n 8)
if [ -n "$hourly_summary" ]; then
add_finding "INFO" "Hourly Bandwidth (Last 24 Hours)" \
"$hourly_summary" \
"Hourly view helps identify peak usage times"
fi
# Check for high bandwidth usage patterns
local today_total=$(vnstat -i "$interface" -d | grep "$(date +%Y-%m-%d)" | awk '{print $9}')
local today_value=$(echo "$today_total" | awk '{print $1}')
local today_unit=$(echo "$today_total" | awk '{print $2}')
if [ "$today_unit" = "GiB" ] && [ -n "$today_value" ]; then
if (( $(echo "$today_value > 50" | bc -l 2>/dev/null || echo 0) )); then
add_finding "WARNING" "High Daily Bandwidth Usage" \
"Today's usage: $today_total
This is significantly higher than typical usage" \
"Investigate traffic sources:
• Check top bandwidth consumers (see analysis below)
• Review Apache logs for unusual traffic
• Check for backups or updates running
• Look for bot/crawler traffic"
fi
fi
}
# Function to analyze Apache/web server traffic
analyze_web_traffic() {
echo -e "${CYAN}[INFO]${NC} Analyzing web server traffic patterns..."
# Find Apache log directory
local log_dir=""
if [ -d "/var/log/apache2/domlogs" ]; then
log_dir="/var/log/apache2/domlogs"
elif [ -d "/etc/apache2/logs/domlogs" ]; then
log_dir="/etc/apache2/logs/domlogs"
elif [ -d "/var/log/httpd" ]; then
log_dir="/var/log/httpd"
fi
if [ -z "$log_dir" ] || [ ! -d "$log_dir" ]; then
add_finding "INFO" "Web Server Logs Not Found" \
"Could not locate Apache/web server logs" \
"Web traffic analysis requires Apache logs"
return
fi
# Analyze top requesting IPs
echo -e "${CYAN}[INFO]${NC} Finding top requesting IP addresses..."
local top_ips=$(find "$log_dir" -name "*.log" -type f -mtime -1 -exec cat {} \; 2>/dev/null | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -10 | \
awk '{printf " • %8s requests - %s\n", $1, $2}')
if [ -n "$top_ips" ]; then
add_finding "INFO" "Top Requesting IPs (Last 24 Hours)" \
"$top_ips" \
"Investigate high-volume IPs:
• Check if legitimate (search engines, monitoring)
• Look for bot patterns in User-Agent
• Consider rate limiting if abusive
• Use Bot Analyzer for detailed analysis"
fi
# Analyze bandwidth by domain (if cPanel)
if [ "$SYS_PANEL" = "cpanel" ]; then
echo -e "${CYAN}[INFO]${NC} Analyzing per-domain bandwidth..."
local domain_bandwidth=""
for logfile in "$log_dir"/*.log; do
[ -f "$logfile" ] || continue
local domain=$(basename "$logfile" .log)
local bytes=$(awk '{sum+=$10} END {print sum}' "$logfile" 2>/dev/null || echo "0")
if [ "$bytes" -gt 0 ]; then
local mb=$(echo "scale=2; $bytes / 1048576" | bc 2>/dev/null || echo "0")
domain_bandwidth+="$(printf '%-40s %10.2f MB' "$domain" "$mb")"$'\n'
fi
done
if [ -n "$domain_bandwidth" ]; then
domain_bandwidth=$(echo "$domain_bandwidth" | sort -k2 -rn | head -10)
add_finding "INFO" "Top Bandwidth-Consuming Domains (Last 24 Hours)" \
"$domain_bandwidth" \
"Review high-bandwidth domains for:
• Large file downloads
• Media streaming
• Bot/crawler traffic
• Possible attacks or abuse"
fi
fi
# Analyze top requested URLs/files
echo -e "${CYAN}[INFO]${NC} Finding most requested URLs..."
local top_urls=$(find "$log_dir" -name "*.log" -type f -mtime -1 -exec cat {} \; 2>/dev/null | \
awk '{print $7}' | sort | uniq -c | sort -rn | head -10 | \
awk '{printf " • %8s requests - %s\n", $1, $2}')
if [ -n "$top_urls" ]; then
add_finding "INFO" "Most Requested URLs (Last 24 Hours)" \
"$top_urls" \
"Check for:
• Broken links (404s)
• Bot crawling patterns
• Resource-intensive endpoints
• Potential attack vectors"
fi
# Check for high bandwidth files
echo -e "${CYAN}[INFO]${NC} Finding large bandwidth-consuming requests..."
local large_transfers=$(find "$log_dir" -name "*.log" -type f -mtime -1 -exec cat {} \; 2>/dev/null | \
awk '$10 > 10485760 {sum+=$10; count++} END {if (count > 0) printf " • Total large files: %d\n • Combined size: %.2f GB\n", count, sum/1073741824}')
if [ -n "$large_transfers" ]; then
add_finding "INFO" "Large File Transfers (>10MB each)" \
"$large_transfers" \
"Large file downloads can consume significant bandwidth
• Consider CDN for large static files
• Implement download throttling
• Check for legitimate vs bot downloads"
fi
}
# Function to analyze network connections
analyze_network_connections() {
echo -e "${CYAN}[INFO]${NC} Analyzing network connections..."
# Count connections by state
local conn_states=$(netstat -an 2>/dev/null | awk '/^tcp/ {print $6}' | sort | uniq -c | sort -rn | \
awk '{printf " • %-20s %s\n", $2, $1}')
if [ -n "$conn_states" ]; then
add_finding "INFO" "TCP Connection States" \
"$conn_states" \
"Monitor connection states:
• High TIME_WAIT: Normal after busy traffic
• High CLOSE_WAIT: Possible application issues
• High SYN_RECV: Possible SYN flood attack"
fi
# Count total connections
local total_conn=$(netstat -an 2>/dev/null | grep -c "^tcp")
if [ "$total_conn" -gt 1000 ]; then
add_finding "WARNING" "High Number of TCP Connections" \
"Current TCP connections: $total_conn
This may indicate high traffic or connection leak" \
"Investigate connection sources:
• netstat -an | grep ESTABLISHED | awk '{print \$5}' | cut -d: -f1 | sort | uniq -c | sort -rn
• Check for connection pooling issues
• Review application connection handling"
fi
# Top connecting IPs
local top_conn_ips=$(netstat -an 2>/dev/null | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | \
sort | uniq -c | sort -rn | head -10 | awk '{printf " • %8s connections - %s\n", $1, $2}')
if [ -n "$top_conn_ips" ]; then
add_finding "INFO" "Top Connected IP Addresses" \
"$top_conn_ips" \
"Review connection patterns from these IPs"
fi
}
# Function to check network performance
analyze_network_performance() {
echo -e "${CYAN}[INFO]${NC} Analyzing network performance..."
# Get primary interface
local interface=$(ip route | grep default | awk '{print $5}' | head -1)
if [ -z "$interface" ]; then
add_finding "WARNING" "Cannot Determine Network Interface" \
"Unable to detect primary network interface" \
"Check network configuration: ip route show"
return
fi
# Get interface statistics
local rx_errors=$(cat "/sys/class/net/$interface/statistics/rx_errors" 2>/dev/null || echo "0")
local tx_errors=$(cat "/sys/class/net/$interface/statistics/tx_errors" 2>/dev/null || echo "0")
local rx_dropped=$(cat "/sys/class/net/$interface/statistics/rx_dropped" 2>/dev/null || echo "0")
local tx_dropped=$(cat "/sys/class/net/$interface/statistics/tx_dropped" 2>/dev/null || echo "0")
if [ "$rx_errors" -gt 100 ] || [ "$tx_errors" -gt 100 ]; then
add_finding "WARNING" "Network Interface Errors Detected" \
"Interface: $interface
RX Errors: $rx_errors
TX Errors: $tx_errors
RX Dropped: $rx_dropped
TX Dropped: $tx_dropped" \
"Network errors may indicate:
• Hardware issues (cable, NIC)
• Driver problems
• Network congestion
Check: dmesg | grep -i $interface | tail -20"
fi
# Get MTU
local mtu=$(ip link show "$interface" 2>/dev/null | grep mtu | awk '{print $5}')
if [ -n "$mtu" ]; then
if [ "$mtu" -ne 1500 ] && [ "$mtu" -ne 9000 ]; then
add_finding "INFO" "Non-Standard MTU Detected" \
"Interface: $interface
Current MTU: $mtu
Standard MTU is typically 1500 (or 9000 for jumbo frames)" \
"Ensure MTU matches your network infrastructure
• Test MTU: ping -M do -s 1472 8.8.8.8
• Set MTU: ip link set $interface mtu 1500"
else
add_finding "INFO" "Network Interface Configuration" \
"Interface: $interface
MTU: $mtu
RX Errors: $rx_errors
TX Errors: $tx_errors
RX Dropped: $rx_dropped
TX Dropped: $tx_dropped" \
"Network interface appears healthy"
fi
fi
# Check TCP statistics
local tcp_retrans=$(netstat -s 2>/dev/null | grep "segments retransmitted" | awk '{print $1}' || echo "0")
local tcp_out=$(netstat -s 2>/dev/null | grep "segments sent out" | awk '{print $1}' || echo "1")
if [ "$tcp_out" -gt 1000000 ]; then
local retrans_percent=$(echo "scale=2; $tcp_retrans * 100 / $tcp_out" | bc 2>/dev/null || echo "0")
if (( $(echo "$retrans_percent > 5" | bc -l 2>/dev/null || echo 0) )); then
add_finding "WARNING" "High TCP Retransmission Rate" \
"Retransmission rate: ${retrans_percent}%
Segments retransmitted: $tcp_retrans
Total segments sent: $tcp_out" \
"High retransmission indicates network problems:
• Test packet loss: ping -c 100 8.8.8.8
• Check MTU settings
• Review network congestion
• Contact hosting provider if persistent"
else
add_finding "INFO" "TCP Retransmission Rate" \
"Retransmission rate: ${retrans_percent}% (healthy)
Segments retransmitted: $tcp_retrans
Total segments sent: $tcp_out" \
"TCP retransmission rate is within normal range"
fi
fi
# Test connectivity to common DNS
echo -e "${CYAN}[INFO]${NC} Testing network connectivity..."
local ping_result=$(ping -c 5 -W 2 8.8.8.8 2>/dev/null | grep "packet loss" | awk '{print $6}' | tr -d '%')
if [ -n "$ping_result" ]; then
if (( $(echo "$ping_result > 5" | bc -l 2>/dev/null || echo 0) )); then
add_finding "WARNING" "Packet Loss Detected" \
"Packet loss to 8.8.8.8: ${ping_result}%
This indicates network connectivity issues" \
"Investigate packet loss:
• Test multiple targets: ping -c 100 [your-dns-server]
• Check for network congestion
• Review with hosting provider
• Check interface errors (see above)"
else
local avg_latency=$(ping -c 5 -W 2 8.8.8.8 2>/dev/null | grep "avg" | awk -F'/' '{print $5}')
add_finding "INFO" "Network Connectivity Test" \
"Packet loss: ${ping_result}% (excellent)
Average latency: ${avg_latency}ms" \
"Network connectivity is healthy"
fi
fi
}
# Function to recommend monitoring tools
recommend_monitoring_tools() {
echo -e "${CYAN}[INFO]${NC} Checking for real-time monitoring tools..."
local tools_needed=()
local tools_installed=()
# Check iftop
if command_exists iftop; then
tools_installed+=("iftop - Real-time bandwidth by connection")
else
tools_needed+=("iftop - Real-time bandwidth monitoring (yum install iftop)")
fi
# Check nethogs
if command_exists nethogs; then
tools_installed+=("nethogs - Bandwidth by process")
else
tools_needed+=("nethogs - Per-process bandwidth monitoring (yum install nethogs)")
fi
# Check nload
if command_exists nload; then
tools_installed+=("nload - Simple real-time traffic graph")
else
tools_needed+=("nload - Simple bandwidth monitor (yum install nload)")
fi
# Check iperf3
if command_exists iperf3; then
tools_installed+=("iperf3 - Network performance testing")
else
tools_needed+=("iperf3 - Bandwidth testing tool (yum install iperf3)")
fi
if [ ${#tools_installed[@]} -gt 0 ]; then
local installed_list=$(printf ' • %s\n' "${tools_installed[@]}")
add_finding "INFO" "Installed Monitoring Tools" \
"$installed_list" \
"Use these tools for real-time bandwidth monitoring"
fi
if [ ${#tools_needed[@]} -gt 0 ]; then
local needed_list=$(printf ' • %s\n' "${tools_needed[@]}")
add_finding "INFO" "Recommended Monitoring Tools" \
"Consider installing these tools for better monitoring:
$needed_list" \
"Install tools: yum install iftop nethogs nload iperf3
Usage examples:
• iftop -i $interface (real-time bandwidth by connection)
• nethogs $interface (bandwidth by process)
• nload $interface (simple traffic graph)
• vnstat -l (live traffic stats)"
fi
}
# Function to generate report
generate_report() {
local report_content=""
report_content+="=============================================================================="$'\n'
report_content+="NETWORK & BANDWIDTH ANALYSIS - $(date '+%Y-%m-%d %H:%M:%S')"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="System: $SYS_HOSTNAME"$'\n'
report_content+="Control Panel: $SYS_PANEL ${SYS_PANEL_VER:-unknown}"$'\n'
report_content+="OS: $SYS_OS ${SYS_OS_VER:-unknown}"$'\n'
report_content+=""$'\n'
# Group findings by category
local -A categories
categories["BANDWIDTH"]=""
categories["WEB_TRAFFIC"]=""
categories["CONNECTIONS"]=""
categories["PERFORMANCE"]=""
categories["TOOLS"]=""
categories["OTHER"]=""
for finding in "${FINDINGS[@]}"; do
# Split by @@@SEP@@@ delimiter
local severity_title="${finding%%@@@SEP@@@*}"
local temp="${finding#*@@@SEP@@@}"
local details="${temp%%@@@SEP@@@*}"
local recommendation="${temp#*@@@SEP@@@}"
# Extract severity from [SEVERITY] Title format
local severity=$(echo "$severity_title" | sed -n 's/^\[\([^]]*\)\].*/\1/p')
local title=$(echo "$severity_title" | sed 's/^\[[^]]*\] //')
local category="OTHER"
if [[ "$title" == *"Bandwidth"* ]] || [[ "$title" == *"Monthly"* ]] || [[ "$title" == *"Daily"* ]] || [[ "$title" == *"Hourly"* ]]; then
category="BANDWIDTH"
elif [[ "$title" == *"Domain"* ]] || [[ "$title" == *"URL"* ]] || [[ "$title" == *"Web"* ]] || [[ "$title" == *"IP"* ]]; then
category="WEB_TRAFFIC"
elif [[ "$title" == *"Connection"* ]]; then
category="CONNECTIONS"
elif [[ "$title" == *"Network"* ]] || [[ "$title" == *"TCP"* ]] || [[ "$title" == *"MTU"* ]] || [[ "$title" == *"Packet"* ]]; then
category="PERFORMANCE"
elif [[ "$title" == *"Tool"* ]] || [[ "$title" == *"Monitoring"* ]]; then
category="TOOLS"
fi
local entry=""
entry+="[$severity] $title"$'\n'
entry+="$details"$'\n'
if [ -n "$recommendation" ]; then
entry+="Recommendation:"$'\n'
entry+="$recommendation"$'\n'
fi
entry+=""$'\n'
entry+="------------------------------------------------------------------------------"$'\n'
entry+=""$'\n'
categories[$category]+="$entry"
done
# Output sections
if [ -n "${categories[BANDWIDTH]}" ]; then
report_content+="=============================================================================="$'\n'
report_content+="BANDWIDTH USAGE"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="${categories[BANDWIDTH]}"
fi
if [ -n "${categories[WEB_TRAFFIC]}" ]; then
report_content+="=============================================================================="$'\n'
report_content+="WEB TRAFFIC ANALYSIS"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="${categories[WEB_TRAFFIC]}"
fi
if [ -n "${categories[CONNECTIONS]}" ]; then
report_content+="=============================================================================="$'\n'
report_content+="NETWORK CONNECTIONS"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="${categories[CONNECTIONS]}"
fi
if [ -n "${categories[PERFORMANCE]}" ]; then
report_content+="=============================================================================="$'\n'
report_content+="NETWORK PERFORMANCE"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="${categories[PERFORMANCE]}"
fi
if [ -n "${categories[TOOLS]}" ]; then
report_content+="=============================================================================="$'\n'
report_content+="MONITORING TOOLS"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="${categories[TOOLS]}"
fi
if [ -n "${categories[OTHER]}" ]; then
report_content+="=============================================================================="$'\n'
report_content+="OTHER FINDINGS"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="${categories[OTHER]}"
fi
report_content+="=============================================================================="$'\n'
report_content+="NEXT STEPS"$'\n'
report_content+="=============================================================================="$'\n'
report_content+=""$'\n'
report_content+="Priority Actions:"$'\n'
report_content+=" 1. Review bandwidth usage trends for unusual patterns"$'\n'
report_content+=" 2. Investigate high-volume IP addresses and domains"$'\n'
report_content+=" 3. Address any network performance issues"$'\n'
report_content+=" 4. Consider installing monitoring tools for real-time tracking"$'\n'
report_content+=""$'\n'
report_content+="Additional Analysis Available:"$'\n'
report_content+=" • Bot Analyzer (Main Menu → Security) for bot/attack traffic analysis"$'\n'
report_content+=" • System Health Check (Main Menu) for overall server health"$'\n'
report_content+=""$'\n'
report_content+="Report saved to: $REPORT_FILE"$'\n'
report_content+=""$'\n'
echo "$report_content"
echo "$report_content" > "$REPORT_FILE"
}
# Main execution
main() {
show_banner
echo -e "${BLUE}${BOLD}🌐 Network & Bandwidth Analyzer${NC}"
echo ""
echo ""
echo -e "${CYAN}[INFO]${NC} Starting network and bandwidth analysis..."
echo ""
# Run analyses
analyze_bandwidth_vnstat
analyze_web_traffic
analyze_network_connections
analyze_network_performance
recommend_monitoring_tools
echo ""
echo -e "${GREEN}[OK]${NC} Analysis complete!"
echo ""
# Generate and display report
generate_report
echo ""
echo -e "${GREEN}[INFO]${NC} Full report saved to: ${CYAN}$REPORT_FILE${NC}"
echo ""
echo ""
press_enter
}
# Run main function
main