142 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/sh
 | ||
| set -e
 | ||
| 
 | ||
| # Parse command-line arguments
 | ||
| while [ $# -gt 0 ]; do
 | ||
|   case "$1" in
 | ||
|     --es-address)
 | ||
|       case "$2" in
 | ||
|         "" | -*) echo "Error: Missing value for $1" >&2; exit 1;;
 | ||
|       esac
 | ||
|       ES_ADDR_ARG="$2"
 | ||
|       shift 2
 | ||
|       ;;
 | ||
|     --index-dir)
 | ||
|       case "$2" in
 | ||
|         "" | -*) echo "Error: Missing value for $1" >&2; exit 1;;
 | ||
|       esac
 | ||
|       INDEX_DIR_ARG="$2"
 | ||
|       shift 2
 | ||
|       ;;
 | ||
|     --docker-host)
 | ||
|       case "$2" in
 | ||
|         "true" | "false") REPLACE_ES_ADDR_WITH_DOCKER_HOST_ARG="$2" ;;
 | ||
|         *) echo "Error: Invalid value for $1. Must be 'true' or 'false'" >&2; exit 1;;
 | ||
|       esac
 | ||
|       shift 2
 | ||
|       ;;
 | ||
|     *)
 | ||
|       # unknown option
 | ||
|       shift
 | ||
|       ;;
 | ||
|   esac
 | ||
| done
 | ||
| 
 | ||
| # If ES_ADDR_ARG argument is provided, use it. Otherwise, use environment variable or default logic.
 | ||
| if [ -n "$ES_ADDR_ARG" ]; then
 | ||
|   ES_ADDR=$ES_ADDR_ARG
 | ||
| fi
 | ||
| 
 | ||
| REPLACE_ES_ADDR=${REPLACE_ES_ADDR_WITH_DOCKER_HOST_ARG:-true}
 | ||
| if [ "$REPLACE_ES_ADDR" = "true" ]; then
 | ||
|   case "$ES_ADDR" in
 | ||
|     *localhost*|*"127.0.0.1"*)
 | ||
|       echo "ES_ADDR is localhost, using docker address: http://elasticsearch:9200"
 | ||
|       ES_ADDR="http://elasticsearch:9200"
 | ||
|       ;;
 | ||
|   esac
 | ||
| fi
 | ||
| 
 | ||
| # If INDEX_DIR_ARG argument is provided, use it. Otherwise, use the default.
 | ||
| if [ -n "$INDEX_DIR_ARG" ]; then
 | ||
|   INDEX_DIR=$INDEX_DIR_ARG
 | ||
| else
 | ||
|   INDEX_DIR=/es_index_schema
 | ||
| fi
 | ||
| 
 | ||
| echo "ES_ADDR: $ES_ADDR"
 | ||
| echo "INDEX_DIR: $INDEX_DIR"
 | ||
| 
 | ||
| AUTH_PARAM=""
 | ||
| if [ -n "$ES_USERNAME" ]; then
 | ||
|   AUTH_PARAM="-k -u $ES_USERNAME:$ES_PASSWORD"
 | ||
| fi
 | ||
| 
 | ||
| for i in $(seq 1 60); do
 | ||
|   echo "Checking Elasticsearch availability... (attempt $i)"
 | ||
|   if curl -s -f $AUTH_PARAM "${ES_ADDR}/_cat/health"; then
 | ||
|     echo "Elasticsearch is up and running!"
 | ||
|     break
 | ||
|   fi
 | ||
|   echo "Elasticsearch not available, retrying in 1 seconds..."
 | ||
|   sleep 1
 | ||
| done
 | ||
| 
 | ||
| echo -e "🔍 Checking smartcn plugin status..."
 | ||
| if ! curl -s $AUTH_PARAM "${ES_ADDR}/_cat/plugins" | grep -q "analysis-smartcn"; then
 | ||
|   echo -e "❌ smartcn plugin not loaded correctly, please ensure the plugin is installed and Elasticsearch is restarted"
 | ||
|   exit 1
 | ||
| fi
 | ||
| 
 | ||
| echo -e "🔍 Initializing Elasticsearch index templates..."
 | ||
| ES_TEMPLATES=$(find "$INDEX_DIR" -type f -name "*.index-template.json" | sort)
 | ||
| if [ -z "$ES_TEMPLATES" ]; then
 | ||
|   echo -e "ℹ️ No Elasticsearch index templates found in $INDEX_DIR"
 | ||
|   exit 1
 | ||
| else
 | ||
|   # Add index creation logic
 | ||
|   for template_file in $ES_TEMPLATES; do
 | ||
|     template_name=$(basename "$template_file" | sed 's/\.index-template\.json$//')
 | ||
|     # Check if index template exists
 | ||
|     if curl -s -f $AUTH_PARAM -I "${ES_ADDR}/_index_template/$template_name" >/dev/null; then
 | ||
|       echo -e "ℹ️ Index template $template_name already exists"
 | ||
|     else
 | ||
|       echo -e "➡️ Registering template: $template_name"
 | ||
| 
 | ||
|       # Attempt to register index template
 | ||
|       response=$(curl -s $AUTH_PARAM -X PUT "${ES_ADDR}/_index_template/$template_name" \
 | ||
|         -H "Content-Type: application/json" \
 | ||
|         -d @"$template_file" 2>&1)
 | ||
| 
 | ||
|       # Check if successful
 | ||
|       if echo "$response" | grep -q '"acknowledged":true'; then
 | ||
|         echo -e "✅ Template $template_name registered successfully"
 | ||
|       else
 | ||
|         echo -e "❌ Failed to register template $template_name. Response: $response"
 | ||
|         exit 1
 | ||
|       fi
 | ||
|     fi
 | ||
| 
 | ||
|     index_name=$(basename "$template_file" | sed 's/\.index-template\.json$//')
 | ||
|     # Check if index exists
 | ||
|     if ! curl -s -f $AUTH_PARAM "${ES_ADDR}/_cat/indices/$index_name" >/dev/null; then
 | ||
|       echo -e "➡️ Creating index: $index_name"
 | ||
|       # Create index (matching template's index_patterns)
 | ||
|       curl $AUTH_PARAM -X PUT "${ES_ADDR}/$index_name" -H "Content-Type: application/json"
 | ||
|       echo ""
 | ||
| 
 | ||
|       # Set refresh interval if index was just created
 | ||
|       echo -e "🔄 Setting refresh_interval for index: $index_name..."
 | ||
|       CURL_OUTPUT=$(curl -s $AUTH_PARAM -w "\nHTTP_STATUS_CODE:%{http_code}" -X PUT "${ES_ADDR}/${index_name}/_settings" -H 'Content-Type: application/json' -d'
 | ||
|           {
 | ||
|             "index": {
 | ||
|               "refresh_interval": "10ms"
 | ||
|             }
 | ||
|           }')
 | ||
|       echo -e "📄 Curl command output for $index_name:\n$CURL_OUTPUT"
 | ||
|       # Extract the JSON body from the output, excluding the HTTP_STATUS_CODE line
 | ||
|       JSON_BODY=$(echo "$CURL_OUTPUT" | sed '$d')
 | ||
|       if ! echo "$JSON_BODY" | grep -q '"acknowledged":true'; then
 | ||
|         echo -e "⚠️ Warning: Failed to set refresh interval for $index_name index. Response Body: $JSON_BODY. Please check and set manually."
 | ||
|         exit 1
 | ||
|       else
 | ||
|         echo -e "✅ Successfully set refresh_interval for $index_name."
 | ||
|       fi
 | ||
|     else
 | ||
|       echo -e "ℹ️ Index $index_name already exists"
 | ||
|     fi
 | ||
|   done
 | ||
| fi
 | ||
| 
 | ||
| echo "Elasticsearch setup completed."
 | ||
| exit 0 |