#!/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|2|3) case $CHOICE in 1) TYPE="icmp"; DESC="ICMP Ping"; EX="8.8.8.8";; 2) TYPE="http"; DESC="HTTP Status"; EX="https://google.com";; 3) TYPE="tcp"; DESC="TCP Connect"; EX="1.1.1.1:443";; esac read -rp "Clear existing $DESC targets? [y/N]: " CLEAR_EXIST [[ "$CLEAR_EXIST" =~ ^[Yy]$ ]] && sudo rm -f "$TARGETS_DIR/$TYPE.yml" while true; do echo "--- Adding $DESC Object ---" read -rp "Enter target (e.g. $EX, leave empty to stop): " T_VAL [ -z "$T_VAL" ] && break read -rp "Enter a descriptive name for this target: " T_NAME [ ! -f "$TARGETS_DIR/$TYPE.yml" ] && sudo touch "$TARGETS_DIR/$TYPE.yml" sudo tee -a "$TARGETS_DIR/$TYPE.yml" > /dev/null < /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 "========================================================="