mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-31 02:38:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1075 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1075 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| #      Check for large files and purge the ones requested                                               #
 | |
| #                                                                                                       #
 | |
| # The -a switch will automatically purge core files when there                                          #
 | |
| # is only 5GB of space left on filesystem.                                                              #
 | |
| #                                                                                                       #
 | |
| # To install as a cron-job, add the following line to /etc/crontab:                                     #
 | |
| # 1 * * * *  root /home/lanforge/scripts/check_large_files.sh -a 2>&1 | logger -t check_large_files     #
 | |
| #                                                                                                       #
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| # set -x
 | |
| # set -e
 | |
| # these are default selections
 | |
| selections=()
 | |
| show_menu=1
 | |
| verbose=0
 | |
| quiet=0
 | |
| starting_dir="$PWD"
 | |
| cleanup_size_mb=$(( 1024 * 5 ))
 | |
| # do not name this file "core_x" because it will get removed
 | |
| lf_core_log="/home/lanforge/found_cores_log.txt"
 | |
| 
 | |
| USAGE="$0 # Check for large files and purge many of the most inconsequencial
 | |
|  -a   # automatic: quietly empty trash and remove crash files if free space is < ${cleanup_size_mb}MB
 | |
|  -b   # remove extra kernels and modules
 | |
|  -c   # remove all core files
 | |
|  -d   # remove old LANforge downloads
 | |
|  -h   # help
 | |
|  -k   # remove ath10k crash files
 | |
|  -l   # remove old files from /var/log, truncate /var/log/messages
 | |
|  -m   # remove orphaned fileio items in /mnt/lf
 | |
|  -q   # quiet
 | |
|  -r   # compress /home/lanforge report data and pcap files
 | |
|  -s   # empty the trash
 | |
|  -t   # remove /var/tmp files
 | |
|  -v   # verbose
 | |
|  -z   # compressed files in /home/lanforge
 | |
| "
 | |
| 
 | |
| eyedee=`id -u`
 | |
| if (( eyedee != 0 )); then
 | |
|     echo "$0: Please become root to use this script, bye"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| debug() {
 | |
|     if [[ x$verbose = x ]] || (( $verbose < 1 )); then return; fi
 | |
|     echo ": $1"
 | |
| }
 | |
| 
 | |
| note() {
 | |
|     if (( $quiet > 0 )); then return; fi
 | |
|     echo "# $1"
 | |
| }
 | |
| 
 | |
| function contains() {
 | |
|     if [[ x$1 = x ]] || [[ x$2 = x ]]; then
 | |
|         echo "contains wants ARRAY and ITEM arguments: if contains name joe; then...  }$"
 | |
|         exit 1
 | |
|     fi
 | |
|     # these two lines below are important to not modify
 | |
|     local tmp="${1}[@]"
 | |
|     local array=( ${!tmp} )
 | |
| 
 | |
|     # if [[ x$verbose = x1 ]]; then
 | |
|     #    printf "contains array %s\n" "${array[@]}"
 | |
|     # fi
 | |
|     if (( ${#array[@]} < 1 )); then
 | |
|         return 1
 | |
|     fi
 | |
|     local item
 | |
|     for item in "${array[@]}"; do
 | |
|         # debug "contains testing $2 == $item"
 | |
|         [[ "$2" = "$item" ]] && return 0
 | |
|     done
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| function remove() {
 | |
|     if [[ x$1 = x ]] || [[ x$2 = x ]]; then
 | |
|         echo "remove wants ARRAY and ITEM arguments: if contains name joe; then...  }$"
 | |
|         exit 1
 | |
|     fi
 | |
|     # these two lines below are important to not modify
 | |
|     local tmp="${1}[@]"
 | |
|     local array=( ${!tmp} )
 | |
| 
 | |
|     # if [[ x$verbose = x1 ]]; then
 | |
|     #    printf "contains array %s\n" "${array[@]}"
 | |
|     # fi
 | |
|     if (( ${#array[@]} < 1 )); then
 | |
|         return 1
 | |
|     fi
 | |
|     local item
 | |
|     for i in "${!array[@]}"; do
 | |
|         if [[ ${array[$i]} = "$2" ]]; then
 | |
|             unset 'array[i]'
 | |
|             debug "removed $2 from $1"
 | |
|             return 0
 | |
|         fi
 | |
|     done
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| function disk_space_below() {
 | |
|     if [[ x$1 = x ]] || [[ x$2 = x ]]; then
 | |
|         echo "disk_free: needs to know what filesystem, size in bytes to alarm on"
 | |
|         return
 | |
|     fi
 | |
|     local amount_left_mb=`df -BM --output=iavail | tail -1`
 | |
|     if (( $amount_left_mb < $cleanup_size_mb )) ; then
 | |
|         debug "amount left $amount_left_mb lt $cleanup_size_mb"
 | |
|         return 0
 | |
|     fi
 | |
|     debug "amount left $amount_left_mb ge $cleanup_size_mb"
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| # ----- ----- M A I N                                   ----- ----- #
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| 
 | |
| #opts=""
 | |
| opts="abcdhklmqrtv"
 | |
| while getopts $opts opt; do
 | |
|   case "$opt" in
 | |
|     a)
 | |
|       if contains "selections" "v"; then
 | |
|           verbose=1
 | |
|       else
 | |
|           verbose=0
 | |
|       fi
 | |
|       quiet=1
 | |
|       selections+=($opt)
 | |
|       selections+=(s) # dump trash
 | |
|       show_menu=0
 | |
|       ;;
 | |
|     b)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     c)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     d)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     h)
 | |
|       echo "$USAGE"
 | |
|       exit 0
 | |
|       ;;
 | |
|     k)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     l)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     m)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     r)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     s)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     q)
 | |
|       quiet=1
 | |
|       verbose=0
 | |
|       ;;
 | |
|     t)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     v)
 | |
|       quiet=0
 | |
|       verbose=1
 | |
|       ;;
 | |
|     z)
 | |
|       selections+=($opt)
 | |
|       ;;
 | |
|     *)
 | |
|       echo "unknown option: $opt"
 | |
|       echo "$USAGE"
 | |
|       exit 1
 | |
|       ;;
 | |
|   esac
 | |
| done
 | |
| 
 | |
| #if (( ${#selections} < 1 )); then
 | |
| #  echo "$USAGE"
 | |
| #  exit 0
 | |
| #fi
 | |
| 
 | |
| HR=" ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----"
 | |
| function hr() {
 | |
|   echo "$HR"
 | |
| }
 | |
| 
 | |
| declare -A totals=(
 | |
|     [b]=0
 | |
|     [c]=0
 | |
|     [d]=0
 | |
|     [k]=0
 | |
|     [l]=0
 | |
|     [m]=0
 | |
|     [r]=0
 | |
|     [s]=0
 | |
|     [t]=0
 | |
|     [z]=0
 | |
| )
 | |
| declare -A desc=(
 | |
|     [b]="kernel files"
 | |
|     [c]="core files"
 | |
|     [d]="lf downloads"
 | |
|     [k]="lf/ath10 files"
 | |
|     [l]="/var/log"
 | |
|     [m]="/mnt/lf files"
 | |
|     [n]="dnf cache"
 | |
|     [r]="report data"
 | |
|     [s]="trash can"
 | |
|     [t]="/var/tmp"
 | |
|     [z]="compressed files"
 | |
| )
 | |
| declare -A surveyors_map=(
 | |
|     [b]="survey_kernel_files"
 | |
|     [c]="survey_core_files"
 | |
|     [d]="survey_lf_downloads"
 | |
|     [k]="survey_ath10_files"
 | |
|     [l]="survey_var_log"
 | |
|     [m]="survey_mnt_lf_files"
 | |
|     [n]="survey_dnf_cache"
 | |
|     [r]="survey_report_data"
 | |
|     [s]="survey_trash_can"
 | |
|     [t]="survey_var_tmp"
 | |
|     [z]="survey_compressed_files"
 | |
| )
 | |
| 
 | |
| declare -A cleaners_map=(
 | |
|     [b]="clean_old_kernels"
 | |
|     [c]="clean_core_files"
 | |
|     [d]="clean_lf_downloads"
 | |
|     [k]="clean_ath10_files"
 | |
|     [l]="clean_var_log"
 | |
|     [m]="clean_mnt_lf_files"
 | |
|     [n]="clean_dnf_cache"
 | |
|     [r]="compress_report_data"
 | |
|     [s]="empty_trash_can"
 | |
|     [t]="clean_var_tmp"
 | |
|     [z]="clean_compressed_files"
 | |
| )
 | |
| 
 | |
| kernel_to_relnum() {
 | |
|     #set -euxv
 | |
|     local hunks=()
 | |
|     # 1>&2 echo "KERNEL RELNUM:[$1]"
 | |
|     local my1="${1/*[^0-9]-/}" # Dang, this is not intuitive to a PCRE user
 | |
|     #1>&2 echo "KERNEL [$1] REGEX:[$my1]"
 | |
|     my1="${my1//\+/}"
 | |
|     if [[ $my1 =~ ^[^0-9] ]]; then
 | |
|         1>&2 echo "BAD SERIES: [$1]"
 | |
|         exit 1
 | |
|     fi
 | |
|     IFS="." read -ra hunks <<< "$my1"
 | |
|     IFS=
 | |
|     local tmpstr
 | |
|     local max_width=8
 | |
|     local last_len=0
 | |
|     local expandos=()
 | |
|     for i in 0 1 2; do
 | |
|         if (( $i < 2 )); then
 | |
|             #1>&2 echo "HUNK $i: [${hunks[$i]}]"
 | |
|             expandos+=( $(( 100 + ${hunks[$i]} )) )
 | |
|         else
 | |
|             tmpstr="00000000${hunks[i]}"
 | |
|             last_len=$(( ${#tmpstr} - $max_width ))
 | |
|             expandos+=( ${tmpstr:$last_len:${#tmpstr}} )
 | |
|             #1>&2 echo "TRIMMED ${tmpstr:$last_len:${#tmpstr}}"
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     set +x
 | |
|     #1>&2 echo "EXPANDO: ${expandos[0]}${expandos[1]}${expandos[2]}"
 | |
|     echo "k${expandos[0]}${expandos[1]}${expandos[2]}"
 | |
| }
 | |
| 
 | |
| empty_trash_can() {
 | |
|     #set -vux
 | |
|     if [ -x /usr/bin/trash-empty ]; then
 | |
|         for can in "${trash_cans[@]}"; do
 | |
|             if [[ $can = /home* ]]; then
 | |
|                 # that =() nonsense is turning the '/' into spaces and letting default IFS let () treat it as array items
 | |
|                 local hunks=(${can//\// })
 | |
|                 local uzer="${hunks[1]}"
 | |
|                 su -l $uzer -c "unset DISPLAY; /usr/bin/trash-empty"
 | |
|             else
 | |
|                 # we should be root
 | |
|                 /usr/bin/trash-empty
 | |
|             fi
 | |
|         done
 | |
|     else
 | |
|         note "trash-cli not installed, destroying trash files"
 | |
|         for can in "${trash_cans[@]}"; do
 | |
|             find "${can}" -type f -exec rm -vf {} \;
 | |
|         done
 | |
|     fi
 | |
|     totals[s]=0
 | |
|     set +vux
 | |
| }
 | |
| 
 | |
| clean_compressed_files() {
 | |
|     note "Listing compressed files..."
 | |
|     local f
 | |
|     if (( ${#compressed_files[@]} > 0 )); then
 | |
|         for f in "${compressed_files[@]}"; do
 | |
|             echo "$f"
 | |
|         done | paste - - - | less
 | |
|     else
 | |
|         echo "No compressed files."
 | |
|     fi
 | |
|     totals[z]=0
 | |
| }
 | |
| clean_old_kernels() {
 | |
|     note "Cleaning old CT kernels..."
 | |
|     local f
 | |
|     if (( ${#removable_packages[@]} > 0 )); then
 | |
|         for f in "${removable_packages[@]}"; do
 | |
|             echo "$f\*"
 | |
|         done | xargs /usr/bin/rpm --nodeps -hve
 | |
|     fi
 | |
|     if (( ${#removable_kernels[@]} > 0 )); then
 | |
|         for f in "${removable_kernels[@]}"; do
 | |
|             echo "$f"
 | |
|         done | xargs rm -f
 | |
|     fi
 | |
| 
 | |
|     if (( ${#removable_libmod_dirs[@]} > 0 )); then
 | |
|         printf "        removable_libmod_dirs[/lib/modules/%s]\n" "${removable_libmod_dirs[@]}"
 | |
|         for f in "${removable_libmod_dirs[@]}"; do
 | |
|             echo "/lib/modules/$f"
 | |
|         done | xargs rm -rf
 | |
|     fi
 | |
|     # check to see if there are 50_candela-x files that
 | |
|     # lack a /lib/modules directory
 | |
|     local fifty_files=(`ls /etc/grub.d/50_candela_*`)
 | |
|     local k_v
 | |
|     for file in "${fifty_files[@]}"; do
 | |
|         k_v=${file#/etc/grub.d/50_candela_}
 | |
|         #echo "K_V[$k_v]"
 | |
|         if [ ! -d /lib/modules/$k_v ]; then
 | |
|             echo "/lib/modules/$k_v not found, removing /etc/grub.d/50_candela_$k_v"
 | |
|             rm -f "/etc/grub.d/50_candela_${k_v}"
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     grub2-mkconfig -o /boot/grub2/grub.cfg
 | |
| 
 | |
|     if [ -d "/boot2" ]; then
 | |
|         rm -rf /boot2/*
 | |
|         rsync -a /boot/. /boot2/
 | |
|         local dev2=`df /boot2/ |awk '/dev/{print $1}'`
 | |
|         if [ x$dev2 != x ]; then
 | |
|             /usr/sbin/grub2-install $dev2 ||:
 | |
|         fi
 | |
|     fi
 | |
| }
 | |
| 
 | |
| clean_core_files() {
 | |
|     note "Cleaning core files..."
 | |
|     if (( ${#core_files[@]} < 1 )); then
 | |
|         debug "No core files ?"
 | |
|         return 0
 | |
|     fi
 | |
| 
 | |
|    local counter=0
 | |
|     if [ ! -f "$lf_core_log" ]; then
 | |
|         touch "$lf_core_log"
 | |
|     fi
 | |
|     date +"%Y-%m-%d-%H:%M.%S" >> $lf_core_log
 | |
|     for f in "${core_files[@]}"; do
 | |
|         file "$f" >> "$lf_core_log"
 | |
|     done
 | |
|     note "Recorded ${#core_files[@]} core files to $lf_core_log: "
 | |
|     tail -n $(( 1 + ${#core_files[@]} )) $lf_core_log
 | |
|     local do_delete=0
 | |
|     if contains "selections" "a"; then
 | |
|         disk_space_below /      $cleanup_size_mb && do_delete=$(( $do_delete + 1 ))
 | |
|         disk_space_below /home  $cleanup_size_mb && do_delete=$(( $do_delete + 1 ))
 | |
|         (( $do_delete > 0)) && note "disk space below $cleanup_size_mfb, removing core files"
 | |
|     elif contains "selections" "c"; then
 | |
|         do_delete=1
 | |
|         note "core file cleaning selected"
 | |
|     fi
 | |
|     if (( $do_delete > 0 )); then
 | |
|         for f in "${core_files[@]}"; do
 | |
|             echo -n "-"
 | |
|             rm -f "$f" && remove "core_files" "$f"
 | |
|             counter=$(( counter + 1 ))
 | |
|             if (( ($counter % 100) == 0 )); then
 | |
|                 sleep 0.2
 | |
|             fi
 | |
|         done
 | |
|     else
 | |
|         note "disk space above $cleanup_size_mb, not removing core files"
 | |
|     fi
 | |
|     #set +vux
 | |
|     echo ""
 | |
|     totals[c]=0
 | |
|     survey_core_files
 | |
| }
 | |
| 
 | |
| clean_lf_downloads() {
 | |
|     if (( ${#lf_downloads[@]} < 1 )); then
 | |
|         note "No /home/lanforge/downloads files to remove"
 | |
|         return 0
 | |
|     fi
 | |
|     note "Clean LF downloads..."
 | |
|     if (( $verbose > 0 )); then
 | |
|         echo "Would Delete: "
 | |
|         printf "[%s] " "${lf_downloads[@]}" | sort
 | |
|     fi
 | |
|     cd /home/lanforge/Downloads
 | |
|     for f in "${lf_downloads[@]}"; do
 | |
|         [[ "$f" = "/" ]] && echo "Whuuut? this is not good, bye." && exit 1
 | |
|         # echo "Next:[$f]"
 | |
|         sleep 0.02
 | |
|         rm -f "$f"
 | |
|     done
 | |
|     totals[d]=0
 | |
|     cd "$starting_dir"
 | |
| }
 | |
| 
 | |
| clean_ath10_files() {
 | |
|     note "clean_ath10_files WIP"
 | |
|     local f
 | |
|     while read f; do
 | |
|         echo "removing $f"
 | |
|         rm -f "$f"
 | |
|     done < <( find /home/lanforge -type f -iname "ath10*" ||:)
 | |
| }
 | |
| 
 | |
| clean_var_log() {
 | |
|     note "Vacuuming journal..."
 | |
|     journalctl --vacuum-size 1M
 | |
|     if (( ${#var_log_files[@]} < 1 )); then
 | |
|         note "No notable files in /var/log to remove"
 | |
|         return
 | |
|     fi
 | |
|     local vee=""
 | |
|     if (( $verbose > 0 )); then
 | |
|         printf "%s\n" "${var_log_files[@]}"
 | |
|         vee="-v"
 | |
|     fi
 | |
|     cd /var/log
 | |
|     while read file; do
 | |
|         if [[ $file = /var/log/messages ]]; then
 | |
|             echo "" > /var/log/messages
 | |
|         else
 | |
|             rm -f $vee "$file"
 | |
|         fi
 | |
|     done <<< "${var_log_files[@]}"
 | |
|     cd "$starting_dir"
 | |
| }
 | |
| 
 | |
| clean_dnf_cache() {
 | |
|     local yum="dnf"
 | |
|     which --skip-alias dnf &> /dev/null
 | |
|     (( $? < 0 )) && yum="yum"
 | |
|     debug "Purging $yum cache"
 | |
|     $yum clean all
 | |
|     totals[n]=0
 | |
| }
 | |
| 
 | |
| clean_mnt_lf_files() {
 | |
|     note "cleaning mnt lf files..."
 | |
|     if (( $verbose > 0 )); then
 | |
|         printf "%s\n" "${mnt_lf_files[@]}"
 | |
|     fi
 | |
|     rm -f  "${mnt_lf_files[@]}"
 | |
|     totals[m]=0
 | |
| }
 | |
| 
 | |
| compress_report_data() {
 | |
|     note "compress report data..."
 | |
|     cd /home/lanforge
 | |
|     # local csvfiles=( $( find /home/lanforge -iname "*.csv"  -print0 ))
 | |
|     local vile_list=(`find html-reports/ lf_reports/ report-data/ tmp/ -type f \
 | |
|          -a \( -name '*.csv' -o -name '*.pdf' -o -name '*.pdf' -o -name '*.pcap'  -o -name '*.pcapng' \)`)
 | |
|     counter=1
 | |
|     for f in "${vile_list[@]}"; do
 | |
|         (( $verbose > 0 )) && echo "    compressing $f" || echo -n " ${counter}/${#vile_list[@]}"
 | |
|         nice xz -T0 -5 "$f"
 | |
|         (( counter+=1 ))
 | |
|     done
 | |
|     totals[r]=0
 | |
|     cd -
 | |
|     echo ""
 | |
| }
 | |
| 
 | |
| clean_var_tmp() {
 | |
|     note "clean var tmp"
 | |
|     if (( $verbose > 0 )); then
 | |
|         printf "    %s\n" "${var_tmp_files[@]}"
 | |
|         sleep 1
 | |
|     fi
 | |
|     for f in "${var_tmp_files[@]}"; do
 | |
|         rm -f "$f"
 | |
|         sleep 0.2
 | |
|     done
 | |
| }
 | |
| 
 | |
| kernel_files=()         # temp
 | |
| lib_module_dirs=()      # temp
 | |
| declare -A kernel_sort_names
 | |
| declare -A pkg_sort_names
 | |
| declare -A libmod_sort_names
 | |
| removable_kernels=()    # these are for CT kernels
 | |
| removable_libmod_dirs=() # these are for CT kernels
 | |
| removable_packages=()   # these are for Fedora kernels
 | |
| removable_pkg_series=()
 | |
| survey_kernel_files() {
 | |
|     unset removable_kernels
 | |
|     unset removable_libmod_dirs
 | |
|     unset removable_packages
 | |
|     unset lib_module_dirs
 | |
|     unset kernel_sort_names
 | |
|     unset kernel_sort_serial
 | |
|     unset pkg_sort_names
 | |
|     unset libmod_sort_names
 | |
|     declare -A kernel_sort_serial=()
 | |
|     declare -A kernel_sort_names=()
 | |
|     declare -A pkg_sort_names=()
 | |
|     declare -A libmod_sort_names=()
 | |
|     local ser
 | |
|     local file
 | |
|     debug "Surveying Kernel files"
 | |
|     mapfile -t kernel_files < <(find /boot -maxdepth 1 -type f -a \( \
 | |
|         -iname "System*" -o -iname "init*img" -o -iname "vm*" -o -iname "ct*" \) \
 | |
|         2>/dev/null | grep -v rescue | sort)
 | |
|     mapfile -t lib_module_dirs < <(find /lib/modules -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
 | |
|     local booted=`uname -r`
 | |
| 
 | |
|     note "** You are running kernel $booted **"
 | |
| 
 | |
|     local file
 | |
|     local fiile
 | |
|     for file in "${kernel_files[@]}"; do
 | |
|         debug "kernel_file [$file]"
 | |
|         [[ $file =~ /boot/initramfs* ]] && continue
 | |
|         [[ $file =~ *.fc*.x86_64 ]] && continue
 | |
|         [[ $file = *initrd-plymouth.img ]] && continue
 | |
|         fiile=$( basename $file )
 | |
|         fiile=${fiile%.img}
 | |
| 
 | |
|         if [[ $fiile =~ $booted ]]; then
 | |
|             debug "    ignoring booted CT kernel $file"
 | |
|             # sleep 2
 | |
|             continue
 | |
|         else
 | |
|             ser=$( kernel_to_relnum ${fiile#*ct} )
 | |
|             kernel_sort_serial[$ser]=1
 | |
|             # debug "file[$file] ser[$ser]"
 | |
|             kernel_sort_names["$file"]="$ser"
 | |
|             removable_kernels+=($file)
 | |
|         fi
 | |
|     done
 | |
|     # sleep 2
 | |
|     local booted_ser=$( kernel_to_relnum $booted )
 | |
|     if (( ${#kernel_sort_names[@]} > 0 )); then
 | |
|         declare -A ser_files
 | |
|         for file in "${!kernel_sort_names[@]}"; do
 | |
|             ser="${kernel_sort_names[$file]}"
 | |
|         done
 | |
|         debug "Removable CT kernels:"
 | |
|         while read ser; do
 | |
|             (( $verbose > 0 )) && printf "    kernel file [%s]\n" "${kernel_sort_names[$ser]}"
 | |
|             removable_kernels+=(${kernel_sort_names["$ser"]})
 | |
|         done < <(echo  "${!kernel_sort_names[@]}" | sort | head -n -1)
 | |
|     fi
 | |
| 
 | |
|     debug "Module directories elegible for removal: "
 | |
|     for file in "${lib_module_dirs[@]}"; do
 | |
|         file=${file#/lib/modules/}
 | |
|         # debug "/lib/modules/ ... $file"
 | |
|         if [[ $file =~ $booted ]]; then
 | |
|             debug "     Ignoring booted module directory $file"
 | |
|             continue
 | |
|         elif [[ $file = *.fc??.x86_64 ]]; then
 | |
|             debug "     Ignoring Fedora module directory $file"
 | |
|             continue
 | |
|         else
 | |
|             ser=$( kernel_to_relnum $file )
 | |
|             # debug "     eligible [$ser] -> $file"
 | |
|             libmod_sort_names[$ser]="$file"
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     if (( ${#libmod_sort_names[@]} > 0 )); then
 | |
|         # debug "Removable libmod dirs: "
 | |
|         while read ser; do
 | |
|             file="${libmod_sort_names[$ser]}"
 | |
|             # debug "     $ser -> $file"
 | |
|             if [[ $file =~ $booted ]]; then
 | |
|                 debug "     Ignoring booted $booted module directory $file"
 | |
|                 continue
 | |
|             fi
 | |
|             removable_libmod_dirs+=( "$file" )
 | |
|             # echo "    [$ser][${libmod_sort_names[$ser]}] -> $file"
 | |
|         done < <( printf "%s\n" "${!libmod_sort_names[@]}" | sort | uniq)
 | |
|         # we don't need to sort these ^^^ because they were picked out near line 419
 | |
|     fi
 | |
|     #if (( $verbose > 0 )); then
 | |
|     #    printf " removable_libmod_dirs: %s\n" "${removable_libmod_dirs[@]}"
 | |
|     #fi
 | |
|     # set +veux
 | |
| 
 | |
|     local boot_image_sz=$(du -hc "${kernel_files[@]}" | awk '/total/{print $1}')
 | |
|     local lib_dir_sz=$(du -hc "${lib_module_dirs[@]}" | awk '/total/{print $1}')
 | |
|     totals[b]="kernels: $boot_image_sz, modules: $lib_dir_sz"
 | |
| 
 | |
|     local pkg
 | |
|     local k_pkgs=()
 | |
|     removable_pkg_series=()
 | |
| 
 | |
|     # need to avoid most recent fedora kernel
 | |
|     if [ ! -x /usr/bin/rpm ]; then
 | |
|         note "Does not appear to be an rpm system."
 | |
|         return 0
 | |
|     fi
 | |
|     local ur=$( uname -r )
 | |
|     local kern_pkgs=( $( rpm -qa 'kernel*' | sort ) )
 | |
|     local ser
 | |
|     local zpkg
 | |
|     declare -A pkg_to_ser
 | |
|     for pkg in "${kern_pkgs[@]}"; do
 | |
|         if [[ $pkg = kernel-tools-* ]] \
 | |
|             || [[ $pkg = kernel-headers-* ]] \
 | |
|             || [[ $pkg = kernel-devel-* ]] ; then
 | |
|             continue
 | |
|         fi
 | |
|         if [[ $pkg =~ $booted ]]; then
 | |
|             debug "     ignoring current kernel [$pkg]"
 | |
|             continue
 | |
|         fi
 | |
|         k_pkgs+=( $pkg )
 | |
|     done
 | |
| 
 | |
|     for pkg in "${k_pkgs[@]}"; do
 | |
|         zpkg="$pkg"
 | |
|         zpkg=${pkg##kernel-modules-extra-}
 | |
|         zpkg=${pkg##kernel-modules-}
 | |
|         zpkg=${pkg##kernel-core-}
 | |
|         zpkg=${pkg%.fc??.x86_64}
 | |
| 
 | |
|         if [[ $zpkg =~ $booted ]]; then
 | |
|             continue
 | |
|         fi
 | |
|         kernel_series=$( kernel_to_relnum ${zpkg##kernel-} )
 | |
| 
 | |
|         pkg_to_ser[$pkg]="$kernel_series"
 | |
|         pkg_sort_names[$kernel_series]=1
 | |
|     done
 | |
| 
 | |
|     while read ser; do
 | |
|         # debug "    can remove series [$ser] "
 | |
|         removable_pkg_series+=($ser)
 | |
|     done < <( printf "%s\n" "${!pkg_sort_names[@]}" | sort | head -n -1)
 | |
| 
 | |
|     for pkg in "${k_pkgs[@]}"; do
 | |
|         pkg=${pkg%.fc??.x86_64}
 | |
|         ser=$( kernel_to_relnum $pkg )
 | |
|         if (( ${#removable_pkg_series[@]} > 0 )); then
 | |
|             for zpkg in "${removable_pkg_series[@]}"; do
 | |
|                 if (( $ser == $zpkg )); then
 | |
|                     removable_packages+=($pkg)
 | |
|                 fi
 | |
|             done
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     set +x
 | |
|     if (( $quiet < 1 )); then
 | |
|         if [[ ${removable_packages+x} = x ]] && (( ${#removable_packages[@]} > 0 )); then
 | |
|             echo "Removable packages "
 | |
|             printf "    %s\n" "${removable_packages[@]}"
 | |
|         fi
 | |
|         if [[ ${removable_kernels+x} = x ]] && (( ${#removable_kernels[@]} > 0 )); then
 | |
|             echo "Removable kernel files "
 | |
|             printf "    %s\n" "${removable_kernels[@]}"
 | |
|         fi
 | |
|         if [[ ${removable_libmod_dirs+x} = x ]] && (( ${#removable_libmod_dirs[@]} > 0 )); then
 | |
|             echo "Removable /lib/module directories "
 | |
|             printf "    %s\n" "${removable_libmod_dirs[@]}"
 | |
|         fi
 | |
|     fi
 | |
| } # ~survey_kernel_files
 | |
| 
 | |
| # check the trash can
 | |
| trash_cans=()
 | |
| survey_trash_can() {
 | |
|     debug "Checking trash can"
 | |
|     local lstf=".local/share/Trash/files"
 | |
|     local some_items=()
 | |
|     mapfile -t trash_cans < <(ls -d /root/$lstf /home/lanforge/$lstf 2>/dev/null) 2>/dev/null
 | |
|     if [[ $verbose = 1 ]] && (( ${#trash_cans} > 0 )); then
 | |
|         printf "    %s\n" "${trash_cans[@]}"
 | |
|     fi
 | |
|     if (( ${#trash_cans[@]} > 0 )); then
 | |
|         totals[s]=$( du -hc "${trash_cans[@]}" | awk '/total/{print $1}' )
 | |
|         [[ x${totals[s]} = x ]] && totals[s]=0 ||:
 | |
|         for can in "${trash_cans[@]}"; do
 | |
|             mapfile -t -O "${#some_items[@]}" some_items < <(find "$can" -type f | head 2>/dev/null )
 | |
|         done
 | |
|     fi
 | |
|     if (( ${#some_items[@]} > 0 )) && (( $quiet < 1 )) && (( $verbose > 0 )); then
 | |
|         hr
 | |
|         note "Some trash can items:"
 | |
|         note "${some_items[@]}"
 | |
|         hr
 | |
|         # sleep 1
 | |
|     fi
 | |
|     if [ ! -x /usr/bin/trash-empty ] && (( $quiet < 1 )); then
 | |
|         note "Package trash-cli not installed. Please install it using command:"
 | |
|         note "sudo dnf install -y trash-cli"
 | |
|         sleep 2
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Find core files
 | |
| core_files=()
 | |
| survey_core_files() {
 | |
|     debug "Surveying core files"
 | |
|     cd /
 | |
| 
 | |
|     mapfile -t core_files < <(ls /core* /home/lanforge/core* 2>/dev/null) 2>/dev/null
 | |
|     if [[ $verbose = 1 ]] && (( ${#core_files[@]} > 0 )); then
 | |
|         printf "    %s\n" "${core_files[@]}" | head
 | |
|     fi
 | |
|     if (( ${#core_files[@]} > 0 )); then
 | |
|         totals[c]=$(du -hc "${core_files[@]}" | awk '/total/{print $1}')
 | |
|         [[ x${totals[c]} = x ]] && totals[c]=0 ||:
 | |
|     else
 | |
|         totals[c]=0
 | |
|     fi
 | |
| 
 | |
|     cd "$starting_dir"
 | |
| }
 | |
| 
 | |
| # downloads
 | |
| lf_downloads=()
 | |
| survey_lf_downloads() {
 | |
|     debug "Surveying /home/lanforge downloads"
 | |
|     [ ! -d "/home/lanforge/Downloads" ] && note "No downloads folder " && return 0
 | |
|     cd /home/lanforge/Downloads
 | |
|     mapfile -t lf_downloads < <(ls *gz *z2 *-Installer.exe *firmware* kinst_* *Docs* 2>/dev/null)
 | |
|     if [[ ${lf_downloads+x} = x ]]; then
 | |
|         totals[d]=$(du -hc "${lf_downloads[@]}" | awk '/total/{print $1}')
 | |
|         [[ x${totals[d]} = x ]] && totals[d]=0
 | |
|     else
 | |
|         totals[d]=0
 | |
|     fi
 | |
|     cd "$starting_dir"
 | |
| }
 | |
| 
 | |
| # Find ath10k crash residue
 | |
| ath10_files=()
 | |
| survey_ath10_files() {
 | |
|     debug "Surveying ath10 crash files"
 | |
|     mapfile -t ath10_files < <(ls /home/lanforge/ath10* 2>/dev/null)
 | |
|     if [[ ${ath10_files+x} = x ]]; then
 | |
|         totals[k]=$(du -hc "${ath10_files[@]}" 2>/dev/null | awk '/total/{print $1}')
 | |
|         [[ x${totals[k]} = x ]] && totals[k]=0 ||:
 | |
|     else
 | |
|         totals[k]=0
 | |
|         return
 | |
|     fi
 | |
| 
 | |
| }
 | |
| 
 | |
| # stuff in var log
 | |
| var_log_files=()
 | |
| survey_var_log() {
 | |
|     debug "Surveying var log"
 | |
|     mapfile -t var_log_files < <(find /var/log -type f -size +35M \
 | |
|         -not \( -path '*/journal/*' -o -path '*/sa/*' -o -path '*/lastlog' \) 2>/dev/null ||:)
 | |
|     if [[ ${var_log_files+x} = x ]]; then
 | |
|         totals[l]=$(du -hc "${var_log_files[@]}" 2>/dev/null | awk '/total/{print $1}' )
 | |
|         [[ x${totals[l]} = x ]] && totals[l]=0 ||:
 | |
|     else
 | |
|         totals[l]=0
 | |
|         return
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # stuff in var tmp
 | |
| var_tmp_files=()
 | |
| survey_var_tmp() {
 | |
|     debug "Surveying var tmp"
 | |
|     mapfile -t var_tmp_files < <(find /var/tmp -type f 2>/dev/null || :)
 | |
|     if [[ ${var_tmp_files+x} = x ]]; then
 | |
|         totals[t]=$(du -sh "${var_tmp_files[@]}" 2>/dev/null | awk '/total/{print $1}' )
 | |
|         [[ x${totals[t]} = x ]] && totals[t]=0 ||:
 | |
|     else
 | |
|         totals[t]=0
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Find size of /mnt/lf that is not mounted
 | |
| mnt_lf_files=()
 | |
| survey_mnt_lf_files() {
 | |
|     [ ! -d /mnt/lf ] && return 0
 | |
|     debug "Surveying mnt lf"
 | |
| 
 | |
|     mapfile -t mnt_lf_files < <(find /mnt/lf -xdev -type f 2>/dev/null ||:)
 | |
|     if [[ ${mnt_lf_files+x} = x ]]; then
 | |
|         if (( ${#mnt_lf_files[@]} < 1 )); then
 | |
|             totals[m]=0
 | |
|             return
 | |
|         fi
 | |
|         totals[m]=$( du -xhc "${mnt_lf_files[@]}" 2>/dev/null | awk '/total/{print $1}' )
 | |
|         [[ x${totals[m]} = x ]] && totals[m]=0 ||:
 | |
|     else
 | |
|         totals[m]=0
 | |
|         return
 | |
|     fi
 | |
|     # set +vx
 | |
| }
 | |
| 
 | |
| survey_dnf_cache() {
 | |
|     local yum="dnf"
 | |
|     which --skip-alias dnf &> /dev/null
 | |
|     (( $? < 0 )) && yum="yum"
 | |
|     debug "Surveying $yum cache"
 | |
|     totals[n]=$(du -hc '/var/cache/{dnf,yum}' 2>/dev/null | awk '/total/{print $1}')
 | |
| }
 | |
| 
 | |
| compressed_files=()
 | |
| survey_compressed_files() {
 | |
|     debug "Surveying compressed /home/lanforge "
 | |
|     cd /home/lanforge
 | |
|     mapfile -t compressed_files < <( find Documents/ html-reports/ lf_reports/ report-data/ tmp/ -type f \
 | |
|         -a \( -name "*.gz" -o -name "*.xz" -o -name "*.bz2" -o -name "*.7z" -o -name "*.zip" \) 2>/dev/null ||:)
 | |
|     if (( ${#compressed_files[@]} < 1 )); then
 | |
|         debug "no compressed files found"
 | |
|         totals[z]=0
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     totals[z]=$( du -xhc "${compressed_files[@]}" 2>/dev/null | awk '/total/{print $1}' )
 | |
|     # set +veux
 | |
|     [[ x${totals[z]} = x ]] && totals[z]=0 ||:
 | |
|     cd -
 | |
| }
 | |
| 
 | |
| ## Find size of /lib/modules
 | |
| # cd /lib/modules
 | |
| # mapfile -t usage_libmod < <(du -sh *)
 | |
| 
 | |
| # Find how many kernels are installed
 | |
| # cd /boot
 | |
| # mapfile -t boot_kernels < <(ls init*)
 | |
| # boot_usage=`du -sh .`
 | |
| 
 | |
| # report_files=()
 | |
| survey_report_data() {
 | |
|     debug "Surveying for lanforge report data"
 | |
|     cd /home/lanforge
 | |
| 
 | |
|     local fsiz=0
 | |
|     local fnum=0
 | |
|     local csv_list=(`find report-data/ html-reports/ lf_reports/ -type f -a -name '*.csv' 2>/dev/null ||:`)
 | |
|     local pdf_list=(`find report-data/ html-reports/ lf_reports/ Documents/ -type f -a -name '*.pdf' 2>/dev/null ||:`)
 | |
|     local pcap_list=(`find tmp/ report-data/ local/tmp/ lf_reports/ Documents/ -type f -a \( -name '*.pcap' -o -name '*.pcapng' \) 2>/dev/null ||:`)
 | |
|     fnum=$(( ${#csv_list[@]} + ${#pdf_list[@]} + ${#pcap_list[@]} ))
 | |
| 
 | |
|     if (( $fnum > 0 )); then
 | |
|         fsiz=$(du -hc "${csv_list[@]}" "${pdf_list[@]}" "${pcap_list[@]}" | awk '/total/{print $1}')
 | |
|     fi
 | |
|     totals[r]="$fnum files ($fsiz): ${#csv_list[@]} csv, ${#pdf_list[@]} pdf, ${#pcap_list[@]} pcap"
 | |
|     [[ x${totals[r]} = x ]] && totals[r]=0
 | |
|     # report_files=("CSV files: $fnum tt $fsiz")
 | |
|     cd "$starting_dir"
 | |
| }
 | |
| 
 | |
| 
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| #       gather usage areas
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| survey_areas() {
 | |
|     local area
 | |
|     note "Surveying..."
 | |
|     for area in "${!surveyors_map[@]}"; do
 | |
|         if (( $quiet < 1 )) && (( $verbose < 1 )); then
 | |
|             echo -n "#"
 | |
|         fi
 | |
| 
 | |
|         if [[ $area = b ]]; then
 | |
|             if [[ ${kernel_sort_names+x} != x ]] || (( ${#kernel_sort_names[@] < 1 } )); then
 | |
|                 debug "surveying kernel area"
 | |
|                 # sleep 5
 | |
|                 ${surveyors_map[$area]}
 | |
|             else
 | |
|                 debug "kernel area already surveyed"
 | |
|             fi
 | |
| 
 | |
|         else
 | |
|             debug "surveying $area"
 | |
|             # sleep 2
 | |
|             ${surveyors_map[$area]}
 | |
|         fi
 | |
|     done
 | |
|     if (( $quiet < 1 )); then
 | |
|         echo ""
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| #       report sizes here                                                 #
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| disk_usage_report() {
 | |
|     for k in "${!totals[@]}"; do
 | |
|         echo -e "\t${desc[$k]}:\t${totals[$k]}"
 | |
|     done
 | |
| }
 | |
| survey_areas
 | |
| disk_usage_report
 | |
| 
 | |
| if (( ${#core_files[@]} > 0 )); then
 | |
|     hr
 | |
|     note "${#core_files[@]} Core Files detected:"
 | |
|     declare -A core_groups
 | |
|     # set -e
 | |
|     # note that the long pipe at the bottom of the loop is the best way to get
 | |
|     # the system to operate with thousands of core files
 | |
|     while read group7; do
 | |
|         (( $verbose > 0 )) && echo -n '+'
 | |
|         group7="${group7%, *}"
 | |
|         group7="${group7//\'/}"
 | |
|         [[ ${core_groups[$group7]+_} != _ ]] && core_groups[$group7]=0
 | |
|         core_groups[$group7]=$(( ${core_groups[$group7]} + 1 ))
 | |
|     done < <(echo "${core_files[@]}" | xargs file | awk -F": " '/execfn:/{print $7}')
 | |
|     echo ""
 | |
|     echo "These types of core files were found:"
 | |
|     for group in "${!core_groups[@]}"; do
 | |
|         echo "${core_groups[$group]} files of $group"
 | |
|     done | sort -n
 | |
|     hr
 | |
|     (( ${#core_files[@]} > 0 )) && selections+=("c")
 | |
| fi
 | |
| 
 | |
| #echo "Usage of /mnt: $usage_mnt"
 | |
| #echo "Usage of /lib/modules: $usage_libmod"
 | |
| #echo "Boot usage: $boot_usage"
 | |
| 
 | |
| #if (( ${#boot_kernels[@]} > 1 )); then
 | |
| #    echo "Boot ramdisks:"
 | |
| #    hr
 | |
| #    printf '     %s\n' "${boot_kernels[@]}"
 | |
| #    hr
 | |
| #fi
 | |
| 
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| #   delete extra things now                                               #
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| 
 | |
| if contains "selections" "a" ; then
 | |
|     # note "Automatic deletion will include: "
 | |
|     # printf "%s\n" "${selections[@]}"
 | |
|     debug "Doing automatic cleanup"
 | |
|     for z in "${selections[@]}"; do
 | |
|         debug "Will perform ${desc[$z]}"
 | |
|         ${cleaners_map[$z]}
 | |
|     done
 | |
|     survey_areas
 | |
|     disk_usage_report
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| if (( ${#selections[@]} > 0 )) ; then
 | |
|     debug "Doing selected cleanup: "
 | |
|     # printf "    %s\n" "${selections[@]}"
 | |
|     # sleep 1
 | |
|     for z in "${selections[@]}"; do
 | |
|         debug "Performing ${desc[$z]}"
 | |
|         ${cleaners_map[$z]}
 | |
|         # selections=("${selections[@]/$z}")
 | |
|         remove selections "$z"
 | |
|     done
 | |
|     survey_areas
 | |
|     disk_usage_report
 | |
| else
 | |
|     debug "No selections present"
 | |
| fi
 | |
| 
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| #   ask for things to remove if we are interactive                        #
 | |
| # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
 | |
| choice=""
 | |
| refresh=0
 | |
| while [[ $choice != q ]]; do
 | |
|     echo ""
 | |
|     hr
 | |
|     df -h --type ext4
 | |
|     echo ""
 | |
|     hr
 | |
|     echo "What would you like to delete or compress? "
 | |
|     echo "  b) old kernels                : ${totals[b]}"
 | |
|     echo "  c) core crash files           : ${totals[c]}"
 | |
|     echo "  d) old LANforge downloads     : ${totals[d]}"
 | |
|     echo "  k) ath10k crash files         : ${totals[k]}"
 | |
|     echo "  l) old /var/log files         : ${totals[l]}"
 | |
|     echo "  m) orphaned /mnt/lf files     : ${totals[m]}"
 | |
|     echo "  n) purge dnf/yum cache        : ${totals[n]}"
 | |
|     echo "  r) report data                : ${totals[r]}"
 | |
|     echo "  s) trash cans                 : ${totals[s]}"
 | |
|     echo "  t) clean /var/tmp             : ${totals[t]}"
 | |
|     echo "  z) list compressed files      : ${totals[z]}"
 | |
|     echo "  q) quit"
 | |
|     read -p "> " choice
 | |
|     refresh=0
 | |
|     case "$choice" in
 | |
|     b )
 | |
|         clean_old_kernels
 | |
|         refresh=1
 | |
|         ;;
 | |
|     c )
 | |
|         clean_core_files
 | |
|         refresh=1
 | |
|         ;;
 | |
|     d )
 | |
|         clean_lf_downloads
 | |
|         refresh=1
 | |
|         ;;
 | |
|     k )
 | |
|         clean_ath10_files
 | |
|         refresh=1
 | |
|         ;;
 | |
|     l )
 | |
|         clean_var_log
 | |
|         refresh=1
 | |
|         ;;
 | |
|     m )
 | |
|         clean_mnt_lf_files
 | |
|         refresh=1
 | |
|         ;;
 | |
|     r )
 | |
|         compress_report_data
 | |
|         refresh=1
 | |
|         ;;
 | |
|     s )
 | |
|         empty_trash_can
 | |
|         refresh=1
 | |
|         ;;
 | |
|     t )
 | |
|         clean_var_tmp
 | |
|         refresh=1
 | |
|         ;;
 | |
|     z )
 | |
|         clean_compressed_files
 | |
|         refresh=1
 | |
|         ;;
 | |
|     q )
 | |
|         echo ""
 | |
|         exit
 | |
|         ;;
 | |
|     * )
 | |
|         echo "not an option [$choice]"
 | |
|         ;;
 | |
|     esac
 | |
|     if (( $refresh > 0 )) ; then
 | |
|         survey_areas
 | |
|         disk_usage_report
 | |
|     fi
 | |
| done
 | |
| echo bye
 | 
