#!/bin/bash set -e # 에러 발생 시 스크립트 종료 ##### 함수 정의 ##### # 로깅 함수 log_info() { echo -e "\e[32m[INFO] $1\e[0m" } log_warn() { echo -e "\e[33m[WARN] $1\e[0m" } log_error() { echo -e "\e[31m[ERROR] $1\e[0m" exit 1 } # 에러 처리 함수 check_error() { if [ $? -ne 0 ]; then case "$1" in "DOWNLOAD") log_error "Failed to download the required file." ;; "EXECUTION") log_error "Failed to execute the script." ;; "INSTALLATION") log_error "Installation failed." ;; *) log_error "An unknown error occurred." ;; esac fi } # 파일 다운로드 함수 download_file() { local url="$1" local output="$2" local user="$3" local pass="$4" log_info "다운로드 중: $url" if [ -n "$user" ] && [ -n "$pass" ]; then wget --quiet --show-progress --no-check-certificate --user="$user" --password="$pass" "$url" -O "$output" else wget --quiet --show-progress -N "$url" -O "$output" fi check_error "DOWNLOAD" } ##### sudo 권한 확인 ##### if [ "$EUID" -ne 0 ]; then log_error "Please run the script with sudo or as root." fi log_info "Ubuntu NAVER LIVECLOUD SHIELD 설치 스크립트 시작..." ##### dstat 설치 ##### log_info "dstat 설치 중..." apt-get update apt-get install -y dstat ##### XPLATFORM 설치 ##### log_info "XPLATFORM 설치 전 php-fpm 오류 방지 www-data user 추가 중..." if ! getent group www-data > /dev/null 2>&1; then sudo groupadd www-data fi if ! id -u www-data > /dev/null 2>&1; then sudo useradd -g www-data www-data fi log_info "XPLATFORM 설치 전 php-fpm 오류 방지 www-data user 추가 완료" log_info "XPLATFORM 설치 시작..." cd /root download_file "https://xplatform.cdn.gscdn.com/script/v2/xplatform_v2_full_install_ubuntu.sh" \ "/root/xplatform_v2_full_install_ubuntu.sh" "xtiger" "x12#$" log_info "XPLATFORM 설치 스크립트 실행 중..." bash /root/xplatform_v2_full_install_ubuntu.sh check_error "EXECUTION" log_info "XPLATFORM 로그 디렉토리 설정 중..." LOG_DIR="/root/xplatform_log" OLD_LOG_DIR="/root/xplatform_old_log" SYMLINK_TARGET="/usr/local/xplatform/log" # 로그 디렉토리 생성 mkdir -p "$LOG_DIR" mkdir -p "$OLD_LOG_DIR" rm -rf "$SYMLINK_TARGET" ln -sf "$LOG_DIR" "$SYMLINK_TARGET" log_info "XPLATFORM 로그 디렉토리 설정 완료" # influx.php 설치 log_info "xplatform-to-influx.php 설치 중..." download_file "http://api.cws.gscdn.com/api/injun/Ubuntu_NAVER_LIVECLOUD_SHIELD/xplatform-to-influx.txt" \ "/usr/local/xplatform/xplatform-to-influx.php" chmod 755 /usr/local/xplatform/xplatform-to-influx.php # 추가 디렉토리 생성 log_info "캐시 및 코어 디렉토리 생성 중..." mkdir -p /run/xplatform/memcache /run/xplatform/memcache1 /root/core log_info "XPLATFORM 설치 완료" # default 설정 삭제 log_info "XPLATFORM 설정 진행 중..." log_info "기존 XPLATFORM default 설정 삭제 중..." rm -rf /usr/local/xplatform/conf /usr/local/xplatform/license log_info "기존 XPLATFORM default 설정 삭제 완료" # XPLATFORM 백업 파일 설치 cd /usr/local/xplatform download_file "api.cws.gscdn.com/api/injun/Ubuntu_NAVER_LIVECLOUD_SHIELD/Shield_XPLATFORM.tar.gz" \ "/usr/local/xplatform/Shield_XPLATFORM.tar.gz" tar -zxvf Shield_XPLATFORM.tar.gz log_info "Shield 기존 설정 파일 설치 완료" ##### 로그 스크립트 설치 ##### log_info "로그 관리 스크립트 설치 중..." # 스크립트 다운로드 및 설치 SCRIPTS=( "log-livecloud-shield-manage.sh" "log-livecloud-shield-upload.sh" "shield_disk_check.txt" ) for script in "${SCRIPTS[@]}"; do download_file "api.cws.gscdn.com/api/injun/Ubuntu_NAVER_LIVECLOUD_SHIELD/$script" \ "/usr/local/src/$script" chmod 755 "/usr/local/src/$script" log_info "$script 설치 완료" done mv /usr/local/src/shield_disk_check.txt /usr/local/src/shield_disk_check.php ##### Crontab 설정 ##### log_info "Crontab 설정 중..." # 크론탭 항목 준비 CRON_ENTRIES=( "########## 20250703 SHIELD LOG ##########" "1 6 * * * /bin/bash /usr/local/src/log-livecloud-shield-manage.sh > /dev/null 2>&1 &" "*/5 * * * * /bin/bash /usr/local/src/log-livecloud-shield-upload.sh > /dev/null 2>&1 &" "" "########## SHIELD DISK ALERT ##########" "*/5 * * * * /bin/php /usr/local/src/shield_disk_check.php > /dev/null 2>&1" ) # 기존 crontab에서 관련 항목 제거 TEMP_CRON=$(mktemp) crontab -l 2>/dev/null | grep -v "SHIELD" | grep -v "XPLATFORM" | \ grep -v "log-livecloud-shield-manage.sh" | grep -v "log-livecloud-shield-upload.sh" | \ grep -v "shield_disk_check.php" > "$TEMP_CRON" # 새 항목 추가 for entry in "${CRON_ENTRIES[@]}"; do echo "$entry" >> "$TEMP_CRON" done crontab "$TEMP_CRON" rm "$TEMP_CRON" log_info "Crontab 설정 완료" ##### Configure Network Interfaces ##### log_info "Configuring network interfaces for optimal performance..." # Find all network interfaces (excluding loopback) log_info "Detecting network interfaces..." INTERFACES=$(ip -o link show | grep -v "lo:" | awk -F': ' '{print $2}') # Create an array to store active interfaces ACTIVE_INTERFACES=() DEFAULT_INTERFACE="" # Find the default route interface log_info "Detecting default route interface..." DEFAULT_INTERFACE=$(ip route | grep default | awk '{print $5}' | head -n 1) if [ ! -z "$DEFAULT_INTERFACE" ]; then log_info "Default route uses interface: $DEFAULT_INTERFACE" else log_warn "Could not determine default route interface" fi # Check each interface for active status and add to array for INTERFACE in $INTERFACES; do # Check if interface is up and has an IP address IP_INFO=$(ip addr show $INTERFACE 2>/dev/null | grep "inet " | head -n 1) LINK_STATE=$(cat /sys/class/net/$INTERFACE/operstate 2>/dev/null) if [ ! -z "$IP_INFO" ] && [ "$LINK_STATE" = "up" ]; then IP_ADDR=$(echo $IP_INFO | awk '{print $2}' | cut -d/ -f1) log_info "Found active interface: $INTERFACE ($IP_ADDR)" ACTIVE_INTERFACES+=("$INTERFACE") else log_info "Interface $INTERFACE is not active or has no IP address. Skipping." fi done # Display summary of detected interfaces log_info "Detected interfaces summary:" log_info "- Total interfaces found: $(echo $INTERFACES | wc -w)" log_info "- Active interfaces found: ${#ACTIVE_INTERFACES[@]}" if [ ${#ACTIVE_INTERFACES[@]} -eq 0 ]; then log_warn "No active interfaces found. Cannot configure ring buffers." log_info "LVS integration installation completed without NIC configuration." exit 0 fi # Interface selection logic SELECTED_INTERFACES=() # Ask user if multiple active interfaces are found if [ ${#ACTIVE_INTERFACES[@]} -gt 1 ]; then log_info "Multiple active interfaces detected. Please select which ones to configure:" echo -e "\e[33m[IMPORTANT] Select interfaces to configure (space-separated numbers, or 'a' for all):\e[0m" # Display list of active interfaces for i in "${!ACTIVE_INTERFACES[@]}"; do INTERFACE=${ACTIVE_INTERFACES[$i]} SPEED=$(ethtool $INTERFACE 2>/dev/null | grep "Speed:" | awk '{print $2}') SPEED=${SPEED:-"Unknown"} # Mark default interface with an asterisk if [ "$INTERFACE" = "$DEFAULT_INTERFACE" ]; then echo " $((i+1))) $INTERFACE - Speed: $SPEED (default route *)" else echo " $((i+1))) $INTERFACE - Speed: $SPEED" fi done # Get user selection read -p "Enter selection: " SELECTION if [ "$SELECTION" = "a" ] || [ "$SELECTION" = "A" ]; then SELECTED_INTERFACES=("${ACTIVE_INTERFACES[@]}") log_info "Selected all active interfaces for configuration" else # Process space-separated list of numbers for NUM in $SELECTION; do if [[ "$NUM" =~ ^[0-9]+$ ]] && [ "$NUM" -ge 1 ] && [ "$NUM" -le ${#ACTIVE_INTERFACES[@]} ]; then SELECTED_INTERFACES+=("${ACTIVE_INTERFACES[$((NUM-1))]}") else log_warn "Invalid selection: $NUM - skipping" fi done fi else # If only one active interface, use it automatically SELECTED_INTERFACES=("${ACTIVE_INTERFACES[@]}") log_info "Single active interface detected. Will configure ${SELECTED_INTERFACES[0]}" fi # Configure selected interfaces log_info "Configuring selected interfaces..." for INTERFACE in "${SELECTED_INTERFACES[@]}"; do log_info "Checking interface: $INTERFACE" # Get interface speed SPEED=$(ethtool $INTERFACE 2>/dev/null | grep "Speed:" | awk '{print $2}') if [ -z "$SPEED" ]; then log_warn "Could not determine speed for interface $INTERFACE. Skipping configuration." continue fi log_info "Detected speed for $INTERFACE: $SPEED" # Configure ring buffer based on NIC speed if [[ "$SPEED" == "10000Mb/s" || "$SPEED" == "10Gb/s" ]]; then log_info "Configuring 10G NIC ring buffer for $INTERFACE..." ethtool -G $INTERFACE rx 4096 if [ $? -eq 0 ]; then log_info "Successfully set ring buffer size to 4096 for 10G interface $INTERFACE" else log_warn "Failed to set ring buffer size for interface $INTERFACE" fi elif [[ "$SPEED" == "25000Mb/s" || "$SPEED" == "25Gb/s" ]]; then log_info "Configuring 25G NIC ring buffer for $INTERFACE..." ethtool -G $INTERFACE rx 8192 if [ $? -eq 0 ]; then log_info "Successfully set ring buffer size to 8192 for 25G interface $INTERFACE" else log_warn "Failed to set ring buffer size for interface $INTERFACE" fi else log_info "Interface $INTERFACE speed ($SPEED) does not require ring buffer adjustment" fi done log_info "Network interface configuration completed" ##### Telegraf 설치 ##### log_info "Telegraf 설치 중..." apt-get update apt-get install -y telegraf check_error "INSTALLATION" # 호스트명 설정 CONFIG_FILE="/etc/telegraf/telegraf.conf" SERVER_IP=$(hostname -I | awk '{print $1}') if [[ -z "$SERVER_IP" ]]; then log_error "서버 IP 주소를 가져올 수 없습니다." fi sed -i "s/^ hostname = \".*\"/ hostname = \"$SERVER_IP\"/" "$CONFIG_FILE" log_info "Telegraf 호스트명을 $SERVER_IP로 설정 완료" # 추가 설정 파일 다운로드 TELEGRAF_CONFIGS=( "telegraf_new_naver.conf" ) for config in "${TELEGRAF_CONFIGS[@]}"; do download_file "http://api.cws.gscdn.com/api/injun/Ubuntu_NAVER_LIVECLOUD_SHIELD/$config" \ "/etc/telegraf/telegraf.d/$config" done log_info "Telegraf 설정 완료" # Telegraf 서비스 재시작 systemctl restart telegraf systemctl enable telegraf log_info "Telegraf 서비스 시작 완료" log_info "Ubuntu NAVER LIVECLOUD SHIELD 통합 설치가 모두 완료되었습니다"