#!/bin/bash set -e # Detect Operation System if command -v apt >/dev/null 2>&1; then echo "Detected apt-based system" sudo apt update sudo apt install -y wget curl tar elif command -v dnf >/dev/null 2>&1; then echo "Detected dnf-based system" sudo dnf install -y wget curl tar else echo "Unsupported package manager" exit 1 fi # Download Blackbox Exporter VERSION="0.28.0" ARCH="amd64" CN_URL="https://s3.cloudyun.top/downloads/blackbox_exporter-${VERSION}.linux-${ARCH}.tar.gz" GLOBAL_URL="https://github.com/prometheus/blackbox_exporter/releases/download/v${VERSION}/blackbox_exporter-${VERSION}.linux-${ARCH}.tar.gz" TARGET="/tmp/blackbox_exporter.tar.gz" is_cn=false echo "Detecting geographic location..." COUNTRY=$(curl -s --max-time 3 https://ipinfo.littlediary.cn/country || true) if [ "$COUNTRY" = "CN" ]; then is_cn=true fi if [ "$is_cn" = true ]; then echo "Geolocation: China mainland detected" DOWNLOAD_URL="$CN_URL" else echo "Geolocation: non-China region detected" DOWNLOAD_URL="$GLOBAL_URL" fi echo "Downloading from: $DOWNLOAD_URL" curl -fL -o "$TARGET" "$DOWNLOAD_URL" # Extract echo "Extracting Blackbox Exporter..." tar -zxvf "$TARGET" -C /tmp sudo mkdir -p /blackbox_exporter sudo cp "/tmp/blackbox_exporter-${VERSION}.linux-${ARCH}/blackbox_exporter" /blackbox_exporter/ sudo cp "/tmp/blackbox_exporter-${VERSION}.linux-${ARCH}/blackbox.yml" /blackbox_exporter/ # choosing port DEFAULT_PORT=9115 if [ -t 0 ]; then while true; do read -rp "Please enter blackbox_exporter listen port [default: ${DEFAULT_PORT}]: " PORT PORT=${PORT:-$DEFAULT_PORT} if [[ "$PORT" =~ ^[0-9]+$ ]] && [ "$PORT" -ge 1 ] && [ "$PORT" -le 65535 ]; then break else echo "Invalid port. Please enter a number between 1 and 65535." fi done else PORT=$DEFAULT_PORT echo "No TTY detected, using default port: $PORT" fi # Configure monitoring targets if [ -d "/etc/prometheus" ]; then TARGETS_DIR="/etc/prometheus/blackbox_targets" echo "Prometheus detected, targets will be saved to $TARGETS_DIR" else TARGETS_DIR="/blackbox_exporter/targets" fi if [ -t 0 ]; then sudo mkdir -p "$TARGETS_DIR" echo "=========================================================" echo "Configuring monitoring objects (interactive menu)" echo "=========================================================" while true; do echo "Choose a monitoring type to configure:" echo "1) ICMP (Ping)" echo "2) HTTP Status (2xx)" echo "3) TCP Connect (Port Check)" echo "4) Show Current Configuration" echo "5) Finish Configuration" read -rp "Your choice [1-5]: " CHOICE case $CHOICE in 1) read -rp "Enter ICMP targets (space separated, e.g. 8.8.8.8 1.1.1.1): " VAL if [ -n "$VAL" ]; then echo "- targets:" | sudo tee "$TARGETS_DIR/icmp.yml" > /dev/null for t in $VAL; do echo " - $t" | sudo tee -a "$TARGETS_DIR/icmp.yml" > /dev/null; done echo "Saved to: $TARGETS_DIR/icmp.yml" fi ;; 2) read -rp "Enter HTTP targets (space separated, e.g. https://google.com): " VAL if [ -n "$VAL" ]; then echo "- targets:" | sudo tee "$TARGETS_DIR/http.yml" > /dev/null for t in $VAL; do echo " - $t" | sudo tee -a "$TARGETS_DIR/http.yml" > /dev/null; done echo "Saved to: $TARGETS_DIR/http.yml" fi ;; 3) read -rp "Enter TCP targets (space separated, e.g. 1.1.1.1:443 8.8.8.8:53): " VAL if [ -n "$VAL" ]; then echo "- targets:" | sudo tee "$TARGETS_DIR/tcp.yml" > /dev/null for t in $VAL; do echo " - $t" | sudo tee -a "$TARGETS_DIR/tcp.yml" > /dev/null; done echo "Saved to: $TARGETS_DIR/tcp.yml" fi ;; 4) echo "Current Target Files in $TARGETS_DIR:" ls -l "$TARGETS_DIR"/*.yml 2>/dev/null || echo "No targets configured yet." ;; 5) break ;; *) echo "Invalid choice. Please try again." ;; esac echo "---------------------------------------------------------" done fi # Create systemd service file SERVICE_FILE="/etc/systemd/system/blackbox_exporter.service" echo "Creating systemd service file..." sudo tee "$SERVICE_FILE" > /dev/null < icmp # http -> http_2xx # tcp -> tcp_connect for type in icmp http tcp; do MODULE_NAME="$type" [ "$type" == "http" ] && MODULE_NAME="http_2xx" [ "$type" == "tcp" ] && MODULE_NAME="tcp_connect" if [ -f "$TARGETS_DIR/${type}.yml" ] && ! grep -q "job_name: 'blackbox-${type}'" "$PROMETHEUS_YML"; then echo "Adding job: blackbox-${type}" cat <> "$TEMP_CONF" - job_name: 'blackbox-${type}' metrics_path: /probe params: module: [$MODULE_NAME] file_sd_configs: - files: - $TARGETS_DIR/${type}.yml relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 127.0.0.1:${PORT} EOF fi done if [ -f "$TEMP_CONF" ]; then if [ -t 0 ]; then read -rp "Found $PROMETHEUS_YML. Would you like to append the new blackbox jobs automatically? [y/N]: " DO_APPEND else DO_APPEND="y" fi if [[ "$DO_APPEND" =~ ^[Yy]$ ]]; then cat "$TEMP_CONF" | sudo tee -a "$PROMETHEUS_YML" > /dev/null echo "Jobs appended to $PROMETHEUS_YML." if [ -f "/usr/bin/restart_prometheus" ]; then echo "Restarting Prometheus..." sudo /usr/bin/restart_prometheus else echo "Please restart Prometheus to apply changes." fi fi else echo "No new Blackbox jobs to add to $PROMETHEUS_YML." fi fi echo "=========================================================" echo "Blackbox Exporter installation and integration completed!" echo "Listening on port: ${PORT}" echo "========================================================="