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 |