#!/bin/bash # ------------------------------------------------------------------------------------------- # sfs - s.earch f.ile s.ize and create a pastebin of the results # sfs Version: 1.1 # Github: https://github.com/InterGenStudios/sfs # --------------------------------------------------- # InterGenStudios: 5-3-15 # Copyright (c) 2015: Christopher 'InterGen' Cork InterGenStudios # URL: https://intergenstudios.com # -------------------------------- # License: GPL-2.0+ # URL: http://opensource.org/licenses/gpl-license.php # --------------------------------------------------- # sfs is free software: # You may redistribute it and/or modify it under the terms of the # GNU General Public License as published by the Free Software # Foundation, either version 2 of the License, or (at your discretion) # any later version. # ------------------ ########################################### ##---------------------------------------## ## BEGIN - INITIAL VARIABLE DECLARATIONS ## ##---------------------------------------## ########################################### # Sets sfs version number vers=1.1 # Simple regex for number checking RE='^[0-9]+$' # Sets timestamp stamp="$(echo $(date +"%m-%d-%Y") $(date +"%T"))" ######################################### ##-------------------------------------## ## END - INITIAL VARIABLE DECLARATIONS ## ##-------------------------------------## ######################################### ####################### ##-------------------## ## BEGIN - FUNCTIONS ## ##-------------------## ####################### # Colors trailing text Red RED="\e[1m\e[31m" # Colors trailing text Green GREEN="\e[1m\e[32m" # Colors trailing text Yellow YELLOW="\e[1m\e[33m" # Colors trailing text Blue BLUE="\e[1m\e[34m" # Colors trailing text Bold White WHITE="\e[1m\e[37m" # Removes any previously set colors NOCOLOR="\e[0m" # A simple divider SEPARATOR () { echo -e "\n\n${BLUE}------------------------------------------------------------------------------${NOCOLOR}\n\n" } # Creates uniform look during script execution when called after any clear command HEADER () { echo -e "\n\n${BLUE}______________________________________________________________________________________________${NOCOLOR}\n" echo -e "${WHITE} sfs v${GREEN}$vers${NOCOLOR}" echo -e "${BLUE}______________________________________________________________________________________________${NOCOLOR}\n\n" } HELPTEXT () { clear HEADER echo -e "${GREEN}sfs help:${NOCOLOR}\n" echo "SFS is a simple cPanel server utility for finding files of a target size" echo -e "and pastebinning the results.\n" echo -e "------------------\n" echo -e "${GREEN}USAGE:${NOCOLOR}\n" echo -e "sfs ...[${GREEN}target_directory${NOCOLOR}] [${GREEN}target_file_size${NOCOLOR}] | ...[${GREEN}target_directory${NOCOLOR}] | ${GREEN}-h ${NOCOLOR}(runs helptext)\n\n" exit 0 } GET_TARGET_FILESIZE () { clear HEADER echo -e -n " ${GREEN}In ${WHITE}MB, ${GREEN}enter target file size${NOCOLOR} [Default = 100]: " read TARGETSIZE if [ -z "$TARGETSIZE" ]; then SIZE=100 sleep 1 elif ! [[ $TARGETSIZE =~ $RE ]]; then echo echo -e "\n${RED}WARNING!${NOCOLOR}\n\n" echo -e "${WHITE}$TARGETSIZE ${GREEN}isn't a number-size in MB.\n Restarting...${NOCOLOR}" sleep 2 GET_TARGET_FILESIZE else SIZE="$TARGETSIZE" sleep 1 fi } LOOP () { echo -e "\n ${RED}WARNING!${NOCOLOR}\n" echo -e " ${WHITE}$CHOICE ${GREEN}isn't a valid path on this server.\n" sleep 1 echo -e " ${GREEN}Please double check that you want to search.${NOCOLOR}\n\n (Restarting...)" SEPARATOR sleep 1 GET_TARGET_FILESIZE } SEARCH () { # Default search size SEARCHSIZE=$(($SIZE * 1000)) tput cuu 2 && tput el echo -e "\n\n ${GREEN}Server: ${WHITE}$HOSTNAME ${NOCOLOR}$stamp" SEPARATOR echo -e " ${GREEN}Searching recursively in ${WHITE}$TARGET_DIR ${GREEN}for files ${WHITE}>= $SIZE${GREEN}M${NOCOLOR}" SEPARATOR find "$TARGET_DIR" -type f -size +"$SEARCHSIZE"k -exec ls -lh {} \; 2>/dev/null | awk '{ printf "%- 130s %s\n", $9,$5; }' echo -e "\n\n ${GREEN}Total Size of ${WHITE}$TARGET_DIR${GREEN}: ${WHITE}$DIR_SIZE${NOCOLOR}\n" COUNT_FILES echo " Search Complete" SEPARATOR printf "\n\n" } PASTE () { PASTEFILE=$@; curl -d name=sfs -d private=1 --data-urlencode text@"$PASTEFILE" -s https://paste.intergen.online/api/create > TEMPASTE sed -i 's/view/view\/raw/g' TEMPASTE SEPARATOR echo -e " ${GREEN}Your results are at${WHITE}:\n" echo -e " ${BLUE} ====> ${WHITE}$(cat TEMPASTE)${NOCOLOR}\n\n ${GREEN}Your paste will expire in 30 days${NOCOLOR}" SEPARATOR rm TEMPASTE } GET_FILECOUNTER_CHOICE () { clear HEADER echo -e -n " ${GREEN}Find the number of total files in the ${WHITE}TARGET DIRECTORY${NOCOLOR} [${WHITE}y/N${NOCOLOR}]? " read FILE_COUNTER } # Checks for FILESEARCH flag CHECK_FILECOUNTER_CHOICE () { if [ -z "$FILE_COUNTER" ] || [ "$FILE_COUNTER" = "N" ] || [ "$FILE_COUNTER" = "n" ]; then FILECOUNTER=NO echo -e "\n ${YELLOW}FILECOUNTER SKIPPED\n ${NOCOLOR}Getting target directory size..." elif [[ $FILE_COUNTER =~ $RE ]]; then echo -e "\n ${RED}WARNING!\n ${NOCOLOR}Incorrect entry...\nRestarting..." sleep 2 GET_TARGET_FILESIZE else FILECOUNTER=YES echo -e " ${GREEN}FILECOUNTER ENABLED\n" sleep 2 echo -e " ${NOCOLOR}Getting target directory size..." fi } # Counts # of files if target directory COUNT_FILES () { if [ "$FILECOUNTER" = "YES" ]; then TOTAL_FILE_COUNT="$(echo $(($(du -ah "$TARGET_DIR" 2>/dev/null | wc -l) - 1)))" echo -e "\n ${GREEN}Total number of files in ${WHITE}$TARGET_DIR${GREEN}: ${WHITE}$TOTAL_FILE_COUNT${NOCOLOR}\n" fi } CHECK_TARGET_DIR_EXISTS () { if [ ! -d "$TARGET_DIR" ]; then LOOP fi } GET_TARGET_DIR () { clear HEADER echo -e " ${GREEN}Enter target search path or choose from the list below${WHITE}:${NOCOLOR}\n" echo -e " ${WHITE}1) ${GREEN}/home Directory${NOCOLOR}" echo -e " ${WHITE}2) ${GREEN}/var/log Directory${NOCOLOR}" echo -e " ${WHITE}3) ${GREEN}/usr/local/cpanel/logs Directory${NOCOLOR}" echo -e " ${WHITE}4) ${GREEN}/var/lib/mysql Directory${NOCOLOR}" echo -e " ${WHITE}5) ${GREEN}/backup Directory${NOCOLOR}\n" echo -e " ${WHITE}( ${GREEN}default${WHITE} =${GREEN} / Root Directory${WHITE} )\n" echo -n " [enter choice or directory path]: " read DIR_CHOICE case "$DIR_CHOICE" in 1) TARGET_DIR=/home;; 2) TARGET_DIR=/var/log;; 3) TARGET_DIR=/usr/local/cpanel/logs;; 4) TARGET_DIR=/var/lib/mysql;; 5) TARGET_DIR=/backup;; *) if [ -z "$DIR_CHOICE" ]; then TARGET_DIR=/ elif ! [[ $DIR_CHOICE =~ $RE ]]; then TARGET_DIR=$DIR_CHOICE fi;; esac } GET_INPUT () { GET_TARGET_FILESIZE GET_TARGET_DIR GET_FILECOUNTER_CHOICE CHECK_FILECOUNTER_CHOICE } ##################### ##-----------------## ## END - FUNCTIONS ## ##-----------------## ##################### ############################################# ##-----------------------------------------## ## BEGIN - MAKE SURE WE'RE RUNNING AS ROOT ## ##-----------------------------------------## ############################################# if [ "$(id -u)" != "0" ]; then echo -e "\n\n${RED}${BLINK}--------${NOCOLOR}" echo -e "${RED}${BLINK}WARNING!${NOCOLOR}" echo -e "${RED}${BLINK}--------${NOCOLOR}\n\n" echo -e "${WHITE}sfs must be run as ${RED}root${NOCOLOR}\n\n" echo -e "${GREEN}(Exiting now...)${NOCOLOR}\n\n" exit 1 fi ########################################### ##---------------------------------------## ## END - MAKE SURE WE'RE RUNNING AS ROOT ## ##---------------------------------------## ########################################### ######################### ##---------------------## ## BEGIN - CORE SCRIPT ## ##---------------------## ######################### if [ "$1" = "-h" ]; then HELPTEXT else if [ -z $1 ]; then GET_INPUT else if [ -d $1 ] && [[ $2 =~ $RE ]]; then TARGET_DIR="$1" SIZE="$2" GET_FILECOUNTER_CHOICE CHECK_FILECOUNTER_CHOICE elif [ -d $1 ] && [ -z $2 ]; then TARGET_DIR="$1" GET_TARGET_FILESIZE GET_FILECOUNTER_CHOICE CHECK_FILECOUNTER_CHOICE fi fi fi CHECK_TARGET_DIR_EXISTS DIR_SIZE="$(du -h $TARGET_DIR 2>/dev/null | tail -1 | awk '{print $1}')" mkdir -p /root/support/logs/sfs_logs clear HEADER SEARCH 2>&1 | tee searchfile sed -i -e 's/[\x01-\x1F\x7F]//g' -e 's|\[1m\[32m||g' -e 's|(B\[m||g' -e 's|\[1m\[34m||g' -e 's|\[2A\[K||g' -e 's|\[1m\[37m||g' -e 's|\[0m||g' searchfile PASTE searchfile mv searchfile /root/support/logs/sfs_logs/sfs_"$HOSTNAME"_"$(date +"%m-%d-%Y_%T")" printf "\n\n" ####################### ##-------------------## ## END - CORE SCRIPT ## ##-------------------## ####################### exit 0