Add fast awk-based cleanup script
- Uses awk instead of line-by-line processing - 10-100x faster than original bash version - Shows progress for each entity removed - Creates timestamped backups - Simplified output for better UX
This commit is contained in:
162
ha_chore_cleanup_fast.sh
Normal file
162
ha_chore_cleanup_fast.sh
Normal file
@@ -0,0 +1,162 @@
|
||||
#!/bin/bash
|
||||
################################################################################
|
||||
# Home Assistant Chore Cleanup Script (Fast Sed Version)
|
||||
# Removes unused chore-related entities from YAML configuration files
|
||||
################################################################################
|
||||
|
||||
# Configuration
|
||||
CONFIG_DIR="/config"
|
||||
BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="$CONFIG_DIR/backups/cleanup_$BACKUP_TIMESTAMP"
|
||||
|
||||
# Color codes
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo "======================================================================"
|
||||
echo "Home Assistant Chore Cleanup Script (Fast)"
|
||||
echo "======================================================================"
|
||||
echo ""
|
||||
|
||||
# Create backup directory
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
echo -e "${GREEN}✓${NC} Created backup: $BACKUP_DIR"
|
||||
echo ""
|
||||
|
||||
# Entities to remove (regex patterns)
|
||||
BOOLEANS=(
|
||||
"task_lou_clean_desk_pending"
|
||||
"task_jess_clean_desk_pending"
|
||||
"task_william_clean_desk_pending"
|
||||
"task_xander_clean_desk_pending"
|
||||
"task_bella_clean_desk_pending"
|
||||
"task_lou_clean_room_pending"
|
||||
"task_jess_clean_room_pending"
|
||||
"task_william_clean_room_pending"
|
||||
"task_xander_clean_room_pending"
|
||||
"task_bella_clean_room_pending"
|
||||
"task_tidy_lounge_pending"
|
||||
"task_vacuum_room_pending"
|
||||
"task_get_school_ready_pending"
|
||||
"task_clean_desks_done_this_week"
|
||||
"task_clean_rooms_done_this_week"
|
||||
"task_tidy_lounge_done_this_week"
|
||||
"task_tidy_kitchen_done_today"
|
||||
"task_clean_dining_table_done_today"
|
||||
"task_vacuum_room_done_today"
|
||||
)
|
||||
|
||||
SCRIPTS=(
|
||||
"complete_task_dishwasher_unload"
|
||||
"complete_task_washing_machine_unload"
|
||||
"complete_task_dryer_unload"
|
||||
"complete_task_bins_out"
|
||||
"complete_task_bins_in"
|
||||
"complete_task_kitty_litter_clean"
|
||||
"complete_task_kitty_litter_change"
|
||||
"complete_tidy_lounge"
|
||||
"complete_vacuum_room"
|
||||
"complete_get_school_ready"
|
||||
)
|
||||
|
||||
remove_entity_block() {
|
||||
local file="$1"
|
||||
local entity="$2"
|
||||
|
||||
# Use awk to remove the entity block
|
||||
awk -v entity="$entity" '
|
||||
BEGIN { in_block=0; indent="" }
|
||||
{
|
||||
# Check if this line starts our target entity
|
||||
if ($0 ~ "^[[:space:]]*" entity ":") {
|
||||
in_block=1
|
||||
# Capture indentation
|
||||
match($0, /^[[:space:]]*/)
|
||||
indent = substr($0, 1, RLENGTH)
|
||||
next
|
||||
}
|
||||
|
||||
# If in block, check if we hit next entity at same level
|
||||
if (in_block) {
|
||||
if ($0 ~ "^" indent "[^[:space:]]" && $0 !~ "^" indent "[[:space:]]") {
|
||||
in_block=0
|
||||
} else {
|
||||
next
|
||||
}
|
||||
}
|
||||
|
||||
print
|
||||
}
|
||||
' "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
|
||||
}
|
||||
|
||||
process_file() {
|
||||
local file="$1"
|
||||
local entity_type="$2"
|
||||
local -n entities=$3
|
||||
|
||||
if [ ! -f "$file" ]; then
|
||||
echo -e "${YELLOW}⚠${NC} File not found: $(basename "$file")"
|
||||
return
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}ℹ${NC} Processing $(basename "$file")..."
|
||||
|
||||
# Backup
|
||||
cp "$file" "$BACKUP_DIR/$(basename "$file")"
|
||||
echo " ✓ Backed up"
|
||||
|
||||
local count=0
|
||||
for entity in "${entities[@]}"; do
|
||||
if grep -q "^[[:space:]]*${entity}:" "$file"; then
|
||||
remove_entity_block "$file" "$entity"
|
||||
((count++))
|
||||
echo " ✓ Removed: $entity"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $count -gt 0 ]; then
|
||||
echo -e "${GREEN} ✓ Removed $count ${entity_type} entries${NC}"
|
||||
else
|
||||
echo " No items to remove"
|
||||
fi
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Process input_boolean files
|
||||
for pattern in "input_boolean.yaml" "input_booleans.yaml"; do
|
||||
if [ -f "$CONFIG_DIR/$pattern" ]; then
|
||||
process_file "$CONFIG_DIR/$pattern" "input_boolean" BOOLEANS
|
||||
fi
|
||||
done
|
||||
|
||||
# Process script files
|
||||
for pattern in "scripts.yaml" "script.yaml"; do
|
||||
if [ -f "$CONFIG_DIR/$pattern" ]; then
|
||||
process_file "$CONFIG_DIR/$pattern" "script" SCRIPTS
|
||||
fi
|
||||
done
|
||||
|
||||
# Create restore script
|
||||
cat > "$BACKUP_DIR/restore.sh" << EOF
|
||||
#!/bin/bash
|
||||
echo "Restoring from backup..."
|
||||
cp "$BACKUP_DIR"/*.yaml "$CONFIG_DIR/"
|
||||
echo "Files restored! Restart Home Assistant: ha core restart"
|
||||
EOF
|
||||
chmod +x "$BACKUP_DIR/restore.sh"
|
||||
|
||||
echo "======================================================================"
|
||||
echo "CLEANUP COMPLETE"
|
||||
echo "======================================================================"
|
||||
echo ""
|
||||
echo "Backups: $BACKUP_DIR"
|
||||
echo ""
|
||||
echo "NEXT STEPS:"
|
||||
echo "1. Check config: ha core check"
|
||||
echo "2. Restart HA: ha core restart"
|
||||
echo "3. If issues: bash $BACKUP_DIR/restore.sh"
|
||||
echo ""
|
||||
echo "======================================================================"
|
||||
Reference in New Issue
Block a user