#!/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." ;; "AWS_CLI") log_error "AWS CLI setup failed." ;; *) log_error "An unknown error occurred." ;; esac fi } # 파일 다운로드 함수 download_file() { local url="$1" local output="${2:-${url##*/}}" log_info "다운로드 중: $url" wget -q --show-progress -N "$url" -O "$output" 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 EDGE 설치 스크립트 시작..." ##### 필요한 패키지 설치 ##### log_info "필요한 패키지 설치 중..." apt-get update apt-get install -y curl unzip gcc make g++ libssl-dev cpulimit dstat check_error "INSTALLATION" log_info "필요한 패키지 설치 완료" ##### STON 설치 ##### log_info "STON 설치 준비 중..." download_file "api.cws.gscdn.com/api/ston/NPinstall_ub.sh" "/root/NPinstall_ub.sh" # 사용자 입력 받기 read -p "설치할 STON 버전을 입력해 주세요: " version version=$(echo "$version" | xargs) # 앞뒤 공백 제거 log_info "STON 버전 $version 설치 시작..." bash /root/NPinstall_ub.sh "$version" check_error "EXECUTION" # 설치 확인 if [ ! -d "/usr/local/ston" ]; then log_error "Installation did not complete successfully (missing /usr/local/ston directory)." fi log_info "STON $version 설치 완료!" # old_log 디렉토리 생성 mkdir -p /usr/local/ston/old_log log_info "old_log 폴더 생성 완료" ##### 로그 스크립트 설치 ##### log_info "로그 관리 스크립트 설치 중..." # 스크립트 다운로드 및 설치 SCRIPTS=( "new-log-delete.sh" "new-log-livecloud-s3-upload.sh" "new-log-livecloud-manage.sh" ) for script in "${SCRIPTS[@]}"; do download_file "api.cws.gscdn.com/api/injun/Ubuntu_NAVER_LIVECLOUD_EDGE/$script" "/usr/local/src/$script" chmod +x "/usr/local/src/$script" done log_info "로그 관리 스크립트 설치 완료" ##### Crontab 설정 ##### log_info "Crontab 설정 중..." # 크론탭 항목 준비 CRON_ENTRIES=( "" "########## STON LOG ##########" "*/5 * * * * /bin/bash /usr/local/src/new-log-livecloud-manage.sh > /dev/null 2>&1" "*/5 * * * * /bin/bash /usr/local/src/new-log-livecloud-s3-upload.sh > /dev/null 2>&1" "1 6 * * * /bin/bash /usr/local/src/new-log-delete.sh > /dev/null 2>&1" ) # 기존 crontab에서 STON 관련 항목 제거 TEMP_CRON=$(mktemp) crontab -l 2>/dev/null | grep -v "STON" | grep -v "new-log-livecloud-manage.sh" | \ grep -v "new-log-livecloud-s3-upload.sh" | grep -v "new-log-delete.sh" > "$TEMP_CRON" # 새 항목 추가 for entry in "${CRON_ENTRIES[@]}"; do echo "$entry" >> "$TEMP_CRON" done crontab "$TEMP_CRON" rm "$TEMP_CRON" log_info "Crontab 설정 완료" ##### AWS CLI 설치 ##### log_info "AWS CLI 설치 중..." # AWS CLI v2 설치 curl -s "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "/root/awscliv2.zip" check_error "DOWNLOAD" cd /root unzip -q awscliv2.zip check_error "INSTALLATION" ./aws/install check_error "AWS_CLI" # 설치 확인 aws --version check_error "AWS_CLI" # AWS 자격 증명 설정 log_info "AWS 자격 증명 설정 중..." AWS_ACCESS_KEY_ID="AKIASY72XKP4Y2AMIVHO" AWS_SECRET_ACCESS_KEY="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" # ~/.aws 디렉토리 생성 mkdir -p ~/.aws # 자격 증명 파일 작성 cat > ~/.aws/credentials << EOF [default] aws_access_key_id = $AWS_ACCESS_KEY_ID aws_secret_access_key = $AWS_SECRET_ACCESS_KEY EOF cat > ~/.aws/config << EOF [default] EOF # 자격 증명 확인 aws sts get-caller-identity check_error "AWS_CLI" log_info "AWS CLI 설정 완료" ##### 라이브러리 설치 ##### log_info "STON 확장 라이브러리 설치 중..." STON_LIB_DIR="/usr/local/ston" cd /root # 라이브러리 목록 설정 LIBS=( "lib_akamai_smp_v1.5_20240206 lib_akamai_smp_v1.5.so lib_akamai_smp_v1.5" "libgslsuauth_20240223 liblightsecureurl.so libgslsuauth_20240223" "lib_akamai_smp_v1.10_20250523 lib_akamai_smp_v1.10.so lib_akamai_smp_v1.10_20250523" ) # 라이브러리 설치 함수 install_library() { local LIB_TAR_NAME=$1 local LIB_FILE=$2 local EXPECTED_LIB_DIR=$3 local LIB_TAR="/root/${LIB_TAR_NAME}.tar.gz" log_info "$LIB_TAR_NAME 라이브러리 설치 중..." # 다운로드 download_file "api.cws.gscdn.com/api/injun/Ubuntu_NAVER_LIVECLOUD_EDGE/${LIB_TAR_NAME}.tar.gz" "$LIB_TAR" # 압축 해제 tar -xzf "$LIB_TAR" -C /root/ check_error "INSTALLATION" # 실제 생성된 폴더 찾기 local EXTRACTED_DIR=$(tar -tzf "$LIB_TAR" | head -1 | cut -f1 -d"/") if [ -z "$EXTRACTED_DIR" ] || [ ! -d "/root/$EXTRACTED_DIR" ]; then log_error "Extracted directory not found." fi # 빌드 실행 cd "/root/$EXTRACTED_DIR" make check_error "INSTALLATION" # 라이브러리 이동 if [ -f "$LIB_FILE" ]; then cp -f "$LIB_FILE" "$STON_LIB_DIR/$LIB_FILE" log_info "$LIB_TAR_NAME 라이브러리 빌드 및 설치 완료" else log_error "빌드된 라이브러리를 찾을 수 없습니다: $LIB_FILE" fi # 작업 디렉토리 복원 cd /root } # 모든 라이브러리 설치 실행 for lib_info in "${LIBS[@]}"; do install_library $lib_info done log_info "모든 라이브러리 설치 완료" ##### 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" ##### STON 웹 어드민 비밀번호 변경 ##### log_info "STON 웹 어드민 비밀번호 변경 중..." cd /root curl http://api.cws.gscdn.com/api/secure/change_passwd_2025.sh.enc -o /root/change_passwd_2025.sh.enc openssl enc -d -aes-256-cbc -md sha256 -a -in change_passwd_2025.sh.enc -k 'npart#admin!@#' | bash - log_info "STON 웹 어드민 비밀번호 변경 완료" log_info "Ubuntu NAVER LIVECLOUD EDGE 통합 설치가 모두 완료되었습니다."