| #!/bin/bash |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| |
| set -e |
| |
| if [ "$#" -gt 1 ] || { [ "$#" -eq 1 ] && [ "$1" != "-f" ]; }; then |
| echo "Usage: $0 [-f]" |
| exit 1 |
| fi |
| if [ "${1:-}" != "-f" ]; then |
| read -r -p "Do you want to clean all the data of IoTDB Edge? y/n (default n): " CLEAN_SERVICE || CLEAN_SERVICE="" |
| if [[ "$CLEAN_SERVICE" != "y" && "$CLEAN_SERVICE" != "Y" ]]; then |
| echo "Exiting..." |
| exit 0 |
| fi |
| fi |
| |
| IOTDB_HOME="${IOTDB_HOME:-$(cd "$(dirname "$0")"/../.. && pwd)}" |
| IOTDB_HOME="$(cd "$IOTDB_HOME" && pwd -P)" |
| export IOTDB_HOME |
| IOTDB_CONF="${IOTDB_CONF:-$IOTDB_HOME/conf}" |
| IOTDB_DATA_HOME="${IOTDB_DATA_HOME:-$IOTDB_HOME}" |
| if [ -d "$IOTDB_DATA_HOME" ]; then |
| IOTDB_DATA_HOME="$(cd "$IOTDB_DATA_HOME" && pwd -P)" |
| fi |
| |
| if [ ! -f "$IOTDB_HOME/sbin/stop-edge.sh" ]; then |
| echo "Cannot find $IOTDB_HOME/sbin/stop-edge.sh. No data has been removed." |
| exit 1 |
| fi |
| |
| # Stop the matching service first so Restart=on-failure cannot race with cleanup. |
| if command -v systemctl >/dev/null 2>&1 && |
| [ "$(systemctl show --property=PIDFile --value iotdb-edge.service 2>/dev/null)" = "$IOTDB_HOME/edge.pid" ]; then |
| systemctl stop iotdb-edge |
| fi |
| bash "$IOTDB_HOME/sbin/stop-edge.sh" -f |
| |
| if [ -f "$IOTDB_CONF/iotdb-system.properties" ]; then |
| CN_CONFIG="$IOTDB_CONF/iotdb-system.properties" |
| DN_CONFIG="$CN_CONFIG" |
| else |
| CN_CONFIG="$IOTDB_CONF/iotdb-confignode.properties" |
| DN_CONFIG="$IOTDB_CONF/iotdb-datanode.properties" |
| fi |
| |
| read_property() { |
| local config="$1" key="$2" fallback="$3" |
| if [ ! -f "$config" ]; then |
| printf '%s\n' "$fallback" |
| return |
| fi |
| # Keep spaces and '=' in values; the last active property wins, as in Java. |
| awk -v key="$key" -v fallback="$fallback" ' |
| { |
| separator = index($0, "=") |
| if (!separator) next |
| name = substr($0, 1, separator - 1) |
| gsub(/^[[:space:]]+|[[:space:]]+$/, "", name) |
| if (name == key) { |
| value = substr($0, separator + 1) |
| gsub(/^[[:space:]]+|[[:space:]]+$/, "", value) |
| } |
| } |
| END { print (value == "" ? fallback : value) } |
| ' "$config" |
| } |
| |
| CLEAN_PATHS=() |
| add_paths() { |
| local directories="$1" base="$2" path protected |
| local paths=() |
| IFS=';,' read -r -a paths <<< "$directories" |
| for path in "${paths[@]}"; do |
| path="${path#"${path%%[![:space:]]*}"}" |
| path="${path%"${path##*[![:space:]]}"}" |
| [ -n "$path" ] || continue |
| case "$path" in |
| *://*|OBJECT_STORAGE) continue ;; |
| /*) ;; |
| *) path="$base/$path" ;; |
| esac |
| # Remove a final symlink itself, not its target. Resolve directory aliases |
| # before checking them so '..' and symlinked parents cannot hide a root. |
| while [[ "$path" != / && "$path" == */ ]]; do path="${path%/}"; done |
| if [ -L "$path" ]; then |
| path="$(cd -P "$(dirname "$path")" && pwd -P)/$(basename "$path")" |
| elif [ -d "$path" ]; then |
| path="$(cd -P "$path" && pwd -P)" |
| elif [ -e "$path" ]; then |
| echo "Refusing to remove a non-directory data path: $path" |
| exit 1 |
| else |
| continue |
| fi |
| if [ "$path" = / ]; then |
| echo "Refusing to remove the filesystem root." |
| exit 1 |
| fi |
| for protected in "$IOTDB_HOME" "$IOTDB_DATA_HOME" "$HOME"; do |
| case "$protected/" in |
| "$path/"*) |
| echo "Refusing to remove a home directory or its parent: $path" |
| exit 1 |
| ;; |
| esac |
| done |
| CLEAN_PATHS+=("$path") |
| done |
| } |
| |
| # The merged process still uses both sets of node directories. Preserve the |
| # local destroy-all behavior as well as every custom path from the node tools. |
| add_paths "data" "$IOTDB_HOME" |
| add_paths "data/datanode" "$IOTDB_DATA_HOME" |
| for key in cn_system_dir cn_consensus_dir; do |
| case "$key" in |
| cn_system_dir) fallback=data/confignode/system ;; |
| cn_consensus_dir) fallback=data/confignode/consensus ;; |
| esac |
| value=$(read_property "$CN_CONFIG" "$key" "$fallback") |
| add_paths "$value" "$IOTDB_HOME" |
| done |
| for key in dn_system_dir dn_data_dirs dn_consensus_dir dn_wal_dirs dn_tracing_dir dn_sync_dir pipe_receiver_file_dirs iot_consensus_v2_receiver_file_dirs sort_tmp_dir; do |
| case "$key" in |
| dn_system_dir) fallback=data/datanode/system ;; |
| dn_data_dirs) fallback=data/datanode/data ;; |
| dn_consensus_dir) fallback=data/datanode/consensus ;; |
| dn_wal_dirs) fallback=data/datanode/wal ;; |
| dn_tracing_dir) fallback=datanode/tracing ;; |
| dn_sync_dir) fallback=data/datanode/sync ;; |
| pipe_receiver_file_dirs) fallback=data/datanode/system/pipe/receiver ;; |
| iot_consensus_v2_receiver_file_dirs) fallback=data/datanode/system/pipe/consensus/receiver ;; |
| sort_tmp_dir) fallback=data/datanode/tmp ;; |
| esac |
| value=$(read_property "$DN_CONFIG" "$key" "$fallback") |
| add_paths "$value" "$IOTDB_DATA_HOME" |
| done |
| |
| # Validate every target before deleting any data, and finish before reporting success. |
| for path in "${CLEAN_PATHS[@]}"; do |
| rm -rf -- "$path" |
| done |
| echo "IoTDB Edge clean done ..." |