...
This script provides administrators with an effective way to adjust and monitor Swarm logging, supporting both temporary and permanent log level changes for troubleshooting and performance monitoring.
Script Source Code
Code Block | ||
---|---|---|
| ||
#!/bin/bash
# Function to display usage information
usage() {
echo "Usage: $0 -d swarm_ip -p admin:password -i new_log_level [-t duration_in_seconds]"
echo " -d, --swarm_ip IP address of the Swarm API endpoint"
echo " -p, --credentials Credentials in the format admin:password"
echo " -i, --log.level New log level to set"
echo " -t, --time Duration in seconds to keep the new log level (optional)"
exit 1
}
# Function to format file size
format_size() {
local size=$1
if (( size >= 1073741824 )); then
echo "$(awk "BEGIN {printf \"%.1fGB\", $size/1073741824}")"
elif (( size >= 1048576 )); then
echo "$(awk "BEGIN {printf \"%.1fMB\", $size/1048576}")"
elif (( size >= 1024 )); then
echo "$(awk "BEGIN {printf \"%.1fKB\", $size/1024}")"
else
echo "${size}B"
fi
}
# Function to format duration
format_duration() {
local duration=$1
local hours=$((duration / 3600))
local minutes=$(( (duration % 3600) / 60 ))
local seconds=$((duration % 60))
printf "%02d:%02d:%02d" $hours $minutes $seconds
}
# Parse input arguments
while [[ "$#" -gt 0 ]]; do
case $1 in
-d|--swarm_ip) swarm_ip="$2"; shift ;;
-p|--credentials) credentials="$2"; shift ;;
-i|--log.level) new_log_level="$2"; shift ;;
-t|--time)
if [[ -n "$2" && "$2" != -* ]]; then
duration="$2"
shift
else
read -p "Enter duration in seconds: " duration
fi
;;
*) usage ;;
esac
shift
done
# Check if required arguments are provided
if [[ -z "$swarm_ip" || -z "$credentials" || -z "$new_log_level" ]]; then
usage
fi
# Validate log level
allowed_log_levels=(0 5 10 15 20 30 40 50)
if [[ ! " ${allowed_log_levels[@]} " =~ " ${new_log_level} " ]]; then
echo "Error: Invalid log level. Must be one of: ${allowed_log_levels[*]}"
exit 1
fi
# Retrieve the cluster name
clusterName=$(curl -u admin:caringo -sS "http://$swarm_ip:91/api/storage/clusters" | grep -oP '"name":\s*"\K[^"]+')
if [[ -z "$clusterName" ]]; then
echo "Failed to retrieve the cluster name. Please check your inputs."
exit 1
fi
# Convert duration to an integer if it is set
if [[ -n "$duration" ]]; then
if ! [[ "$duration" =~ ^[0-9]+$ ]]; then
echo "Error: Duration must be a positive integer value in seconds."
exit 1
fi
fi
# Display input parameters
echo "Swarm IP: $swarm_ip"
echo "Credentials: [hidden for security]"
echo "Cluster Name: $clusterName"
# Identify the log file location
log_file=""
if [[ -f "/var/log/caringo/castor.log" ]]; then
log_file="/var/log/caringo/castor.log"
elif [[ -f "/var/log/datacore/castor.log" ]]; then
log_file="/var/log/datacore/castor.log"
fi
# Display log file information
if [[ -n "$log_file" ]]; then
echo "Log file located at: $log_file"
|
...
initial_size=$(stat -c%s "$log_file")
initial_size_formatted=$(format_size "$initial_size")
echo "Initial log file size: $initial_size_formatted" |
...
else
echo "Warning: Log file not found in expected directories."
fi
# Get the current log level
echo ""
echo "Retrieving the current log level..."
current_log_level=$(curl -u "$credentials" -sS "http://$swarm_ip:91/api/storage/clusters/$clusterName/settings/log.level" | grep -oP '"value":\s*\K[0-9]+')
# Check if the current log level was retrieved successfully
if [[ -z "$current_log_level" ]]; then
echo "Failed to retrieve the current log level. Please check your inputs."
exit 1
fi
echo "New log level: $new_log_level"
echo "Current log level is $current_log_level."
# Check if the new log level is the same as the current log level
if [[ "$current_log_level" -eq "$new_log_level" ]]; then
echo ""
echo "Log level is already set to $new_log_level. No changes made."
exit 0
fi
# Update the log level using PUT
echo "Updating log level to $new_log_level..."
response=$(curl -u "$credentials" -sS -X PUT -H "Content-Type: application/json" \
"http://$swarm_ip:91/api/storage/clusters/$clusterName/settings/log.level" \
-d "{\"value\": $new_log_level}") |
...
|
...
updated_log_level=$(echo "$response" | grep -oP '"value":\s*\K[0-9]+')
if [[ "$updated_log_level" -eq "$new_log_level" ]]; then
echo "Log level changed successfully from $current_log_level → $new_log_level."
else
echo "Failed to update log level. Response: $response"
exit 1
fi
# If duration is specified, wait and revert after the specified time
if [[ -n "$duration" && "$duration" -gt 0 ]]; then
echo "Keeping log level at $new_log_level for $duration second(s)..."
echo ""
|
...
for ((i=duration; i>0; i--)); do
|
...
countdown=$(format_duration $i) echo -ne "Countdown: $countdown |
...
remaining...\r" sleep 1 |
...
|
...
|
...
|
...
done |
...
|
...
|
...
echo -e "\n\nTime's up! Reverting log |
...
level back to $current_log_level..." # Revert to original log level response=$(curl -u "$credentials" -sS -X PUT -H "Content-Type: application/json" \ "http://$swarm_ip:91/api/storage/clusters/$clusterName/settings/log.level" \ -d "{\"value\": $current_log_level}") reverted_log_level=$(echo "$response" | grep -oP '"value":\s*\K[0-9]+') if [[ "$reverted_log_level" -eq "$current_log_level" ]]; then echo "Log level reverted successfully back to $current_log_level." else echo "Failed to revert log level. Response: $response" exit 1 fi else echo "Log level change is permanent until manually modified." fi |