# [SYSTEM] CubCleaner: per alleggerire portage

## lxnay

 UPDATE: Versione 0.61

E' da stamattina che mi è venuta voglia di mettere in moto il mio cervello, beh quello che vedete sotto è ciò che ne è scaturito ( :Very Happy: ): un programma scritto in bash che cancella i sorgenti scaricati da portage più vecchi di xx giorni. C'è la modalità --date=xx, che elimina effettivamente i file, e la modalità --simulate=xx, che simula l'eliminazione. Probabilmente implementerò anche la modalità di eliminazione dei sorgenti usando il numero di versione. Ho già trovato qualcosa sul forum internazionale di gentoo, ma voglio migliorarlo.

UPDATE1: aggiunto sistema di controllo tramite numero di versione

```

#!/bin/bash

#==============================================================

#

#   lxnay-CubCleaner for Gentoo

# 

# made by lxnay, some rights

#       reserved :-)

#

#

#==============================================================

#==============================================================

# EXIT CODES TABLE:

# 

# 1. root access required

# 5. bad parameters

#

#==============================================================

# Env Variables

program_version="lxnay-CubCleaner 0.61 for Gentoo"

date_command=/usr/bin/date

portage_loc=/usr/portage/

distfiles_loc=distfiles

tmp_dir=/tmp/cubcleaner

tmp2_dir=/tmp/cubcleaner2

#==============================================================

# check if bash arguments for date command are valid

#==============================================================

validate_parameters_date ()

{

   # DEBUG: INSERT WORD FILTER

   # If parameter1 value is valid, go ahead

   

   

   if [[ -z "$parameter1_value" && -z "$parameter2_value"  ]]

     then

           bad_parameters

      exit 5

   fi

   

   # if you don't specify "=" after --date

   if [[ "$parameter1_value" = "$parameter1" && "$parameter2_value" = "$parameter2" ]]

     then

        bad_parameters

      exit 5

   fi

   

   # Where's date value?

   if [ "$parameter1" = "--date" ]

     then

       date_value=$parameter1_value

       which_one="1"

     elif [ "$parameter2" = "--date" ]

       then

        date_value=$parameter2_value

        which_one="2"

     else

       bad_parameters

       exit 5

   fi

   

   

   

   # Denied combinations

   # date value is in $1

   if [ "$which_one" = "1" ]

     then

       

       # if param2 exist, check it

       if [ -n "$parameter2" ]

       then

           

      if [[ "$parameter2" = "--help" || "$parameter2" = "--version" ]]

      then

          bad_parameters

          exit 5

          

          elif [[ "$parameter2" = "--simulate" || "$parameter2" = "--simulate" ]]

            then

          simulate_mode="on"

           else

          simulate_mode="off"

      fi

      

       else

       

          simulate_mode="off"

       fi

   

   # date value is in $2

   elif [ "$which_one" = "2" ]

      then

     

        if [[ "$parameter1" = "--help" || "$parameter1" = "--version" ]]

          then

       bad_parameters

       exit 5

     

        elif [[ "$parameter1" = "--simulate" || "$parameter1" = "--simulate" ]]

          then

            simulate_mode="on" 

          else

            simulate_mode="off"

        fi      

   

   else

   

      bad_parameters

      exit 5

      

   fi

   

   

   # check parameter value range

   if [ "$date_value" -eq "0" ]

     then

        bad_parameters

      exit 5

   fi

   

   if [ "$date_value" -gt "2000" ]

     then

           bad_parameters

      exit 5

   fi

   days_old=$date_value

   

}

#==============================================================

# check if bash arguments for version command are valid

#==============================================================

validate_parameters_version ()

{

   # DEBUG: INSERT WORD FILTER

   # If parameter1 value is valid, go ahead

   

   

   if [[ -z "$parameter1_value" && -z "$parameter2_value"  ]]

     then

           bad_parameters

      exit 5

   fi

   

   # Where's v value?

   if [ "$parameter1" = "--version" ]

     then

       which_one="1"

     elif [ "$parameter2" = "--version" ]

       then

        which_one="2"

     else

       bad_parameters

       exit 5

   fi

   

   

   

   # Denied combinations

   # version value is in $1

   if [ "$which_one" = "1" ]

     then

       

       # if param2 exist, check it

       if [ -n "$parameter2" ]

       then

           

      if [[ "$parameter2" = "--help" || "$parameter2" = "--date" ]]

      then

          bad_parameters

          exit 5

          

          elif [[ "$parameter2" = "--simulate" || "$parameter2" = "--simulate" ]]

            then

          simulate_mode="on"

           else

          simulate_mode="off"

      fi

      

       else

       

          simulate_mode="off"

       fi

   

   # version value is in $2

   elif [ "$which_one" = "2" ]

      then

     

        if [[ "$parameter1" = "--help" || "$parameter1" = "--date" ]]

          then

       bad_parameters

       exit 5

     

        elif [[ "$parameter1" = "--simulate" || "$parameter1" = "--simulate" ]]

          then

            simulate_mode="on" 

          else

            simulate_mode="off"

        fi      

   

   else

   

      bad_parameters

      exit 5

      

   fi

   

}

#==============================================================

# Show synthax error message

#==============================================================

bad_parameters ()

{

echo "$program_version"

echo

echo "!!! Wrong synthax, type --help to view program informations"

echo

}

#==============================================================

# check for a leap year

#==============================================================

leap_year_check ()

{

             year=$deadline_year

        if [ "$((year % 4))" -ne 0 ] ; then

             leap_year=""

         elif [ "$((year % 400))" -eq 0 ] ; then

         leap_year="yes"

       elif [ "$((year % 100))" -eq 0 ] ; then

             leap_year=""

       else

          leap_year="yes"

       fi 

      unset year

}

#==============================================================

# An easy function that calculate the dimension of portage tree

#==============================================================

calculate_portage_dim ()

{

   du -sh "$portage_loc"

}

#==============================================================

# Show System info function

#==============================================================

show_sys_info ()

{

# Variables

os_type=$(uname -o)

kernel_ver=$(uname -r)

   echo -e " \t Hostname: \t $HOSTNAME"

   echo -e " \t Machine Type: \t $HOSTTYPE"

   echo -e " \t Op. System: \t $os_type"

   echo -e " \t Kernel ver.: \t $kernel_ver"

}

#==============================================================

# Sleep 5 seconds function

#==============================================================

sleep5sec ()

{

   echo

   echo -en " \t 1"

   sleep 1

   echo -en "  2"

   sleep 1

   echo -en "  3"

   sleep 1

   echo -en "  4"

   sleep 1

   echo -en "  5"

   sleep 1

   echo -en "   TIMEOUT!"

   echo

}

#==============================================================

# Used in real mode, show differences between cleaned and not

# cleaned portage tree dimensions

#==============================================================

show_old_and_new_portage_size ()

{

       echo

       echo -en " \t OLD Portage size:"

       echo -e " \t \t $old_portage_dim"

       echo -en "\t NEW Portage size: \t \t "

         calculate_portage_dim

       echo

       echo

}

#==============================================================

# Used in simulation modes, show differences between cleaned

# and not cleaned portage tree dimensions

#==============================================================

show_old_and_new_portage_size_simulate ()

{

      echo -en " \t OLD Portage size:"

      echo -e " \t \t $old_portage_dim"

      echo -en " \t SIMULATED Portage size: \t "

      calculate_portage_dim

}

#==============================================================

# Function that removes distfiles using --date argument

#==============================================================

remove_distfiles_using_date ()

{

# Variables

old_portage_dim=$(du -sh "$portage_loc")

   echo

   echo

   

   # Print current date

   echo -en "    Starting: "

   $date_command

   # switching "echo" looking at function first argument

   if [ "$simulate_mode" = "off" ]

     then

       echo -e "    Starting: removing files $days_old days old from $portage_loc$distfiles_loc"

   elif [ "$simulate_mode" = "on" ]

     then

       echo -e "    Starting: simulation on files $days_old days old of $portage_loc$distfiles_loc"

   fi

   

   

   echo

   echo

   echo -e " \t \t \t Current DATE \t Calculated DATE"

   

   

   

   # CURRENT DATE

   

   

   

   # Get the current year and save to a variable

   current_year=$( "$date_command" | tail -c 5)

   

   # Get the current month and save to a variable

   # if month is for eg. 08 or 06, it cuts to 8 or 6

   if [ $( "$date_command" +%D | cut -b 1) -eq "0" ]

     then

       current_month=$( "$date_command" +%D | cut -b 2 )

     else

       current_month=$( "$date_command" +%D | cut -b 1,2 )

   fi

   

   # Get the current day and save to a variable

   # cut acts like above

   if [ $( "$date_command" +%D | cut -b 4) -eq "0" ]

     then

       current_day=$( "$date_command" +%D | cut -b 5 )

     else

       current_day=$( "$date_command" +%D | cut -b 4,5 )

   fi

   

   

   # CALCULATED DATE

   

      

   # if the current day is greater than days old variable

   if [ "$current_day" -gt "$days_old" ]

     then

       let "deadline_day = $current_day - $days_old"

       deadline_year=$current_year

       deadline_month=$current_month

   fi

   

   

   

   # if the current day is less or equal than days old variable

   if [ "$current_day" -le "$days_old" ]   

     then

     

     

     # Beginning of day/month/year calculation

     days_loop=$days_old

     deadline_day=$current_day

     deadline_month=$current_month

     deadline_year=$current_year

     

     for ((a=1; a <= $days_loop; a++))

       do

       

          # leap year check function

      leap_year_check

      

          let "deadline_day = $deadline_day - 1"

      

      # are we arrived to the beginning of the month?

          if [ "$deadline_day" -eq "0" ]

       then

         let "deadline_month = $deadline_month - 1"

         

         

         # are we arrived to the beginning of the year?

         if [ "$deadline_month" -eq "0" ]

           then

              deadline_month="12"

         let "deadline_year = $deadline_year - 1"

         # leap year check function, inserted for security

         leap_year_check

         fi

      

         case "$deadline_month" in

             1   ) deadline_day="31" ;;

         2   )      if [ "$leap_year" = "yes" ]

                 then deadline_day="29"

                 else deadline_day="28"

                   fi ;;

         3   ) deadline_day="31"  ;;

         4   ) deadline_day="30"  ;;

         5   ) deadline_day="31"  ;;

         6   ) deadline_day="30"  ;;

         7   ) deadline_day="31"  ;;

         8   ) deadline_day="31"  ;;

         9   ) deadline_day="30"  ;;

         10  ) deadline_day="31" ;;

         11  ) deadline_day="30" ;;

         12  ) deadline_day="31" ;;

             esac    

         

          fi

         

       done

   fi

   

   # NOW PRINTS ALL RESULTS:

   # Day

   echo -en " \t Day: \t \t $current_day \t \t $deadline_day"

   echo   

   # Month

   echo -en " \t Month: \t $current_month \t \t $deadline_month"

   echo

   

      

   # Year

   echo -en " \t Year: \t \t $current_year \t \t $deadline_year"

   echo

   

   # merging variables in a big one

   deadline_date="$deadline_day/$deadline_month/$deadline_year"

   echo

   echo -en " \t \t \t \t Target day: $deadline_date"

   echo

   

   sleep5sec

   

   echo

   

   

   if [ $simulate_mode = "off" ]

     then

   

      file_list=$( find /usr/portage/distfiles/ -ctime +$days_old )

      echo -en " \t Removing files..."

      rm $file_list -rf &> /dev/null

      echo "Done"

      show_old_and_new_portage_size

      

   elif [ $simulate_mode = "on" ]

     then

        file_list=$( find /usr/portage/distfiles/ -atime +$days_old )

      echo -en " \t Simulation mode: Moving files..."

        rm -rf $tmp_dir &> /dev/null

        mkdir $tmp_dir

        cp -R -p $file_list $tmp_dir &> /dev/null

        rm $file_list &> /dev/null

      

      echo "Done"

      echo

      

      show_old_and_new_portage_size_simulate

      

        cp -R -p $tmp_dir/$distfiles_loc/* $portage_loc$distfiles_loc/ &> /dev/null

        rm -rf $tmp_dir &> /dev/null

        rmdir $tmp_dir &> /dev/null

      

      echo -en " \t Reverted Portage size: \t "

      calculate_portage_dim

      

   fi

}

#==============================================================

# Function that removes distfiles using --date argument

#==============================================================

remove_distfiles_using_version ()

{

# from clean_sources.sh

# Remove old source files from portage

   echo

   echo

   

   # Print current date

   echo -en "    Starting: "

   $date_command

   # switching "echo" looking at function first argument

   if [ "$simulate_mode" = "off" ]

     then

       echo -e "    Starting: removing older application file versions from $portage_loc"

   elif [ "$simulate_mode" = "on" ]

     then

       echo -e "    Starting: simulating deletion of older application file versions from $portage_loc"

   fi

   

   

   echo

   

   sleep5sec

   

   echo -en "\t Creating temp dir..."

   # If $tmp_dir and 2 exist, remove and recreate it

   

   

   if [ ! -e "$tmp_dir" ]

   then

        mkdir $tmp_dir &> /dev/null

   else

        rm -rf $tmp_dir &> /dev/null

       mkdir $tmp_dir  &> /dev/null

   fi

   

   if [ ! -e "$tmp2_dir" ]

   then

        mkdir $tmp2_dir &> /dev/null

   else

        rm -rf $tmp2_dir &> /dev/null

       mkdir $tmp2_dir  &> /dev/null

   fi   

   

   echo -e "\t \t Done"

   

   echo -en "\t Collecting info..."

   old_portage_dim=$(du -sh "$portage_loc")

   echo -e "\t \t Done"

   

   echo -en "\t Moving files..."

   packages=$(qpkg -I -nc | sort)

   for package in $packages

      do

         versions=$(qpkg -I -v -nc $package | sort)

         cd $portage_loc$package/files &> /dev/null

   

            for version in $versions

               do

                  digest="digest-$(basename $version)"

                     if [ -e $digest ]

                       then

                         sources=$(cat $digest | cut -d " " -f 3)

                         #echo -e "$version" &> /dev/null

                            for source in $sources

                           do

                              file=$portage_loc$distfiles_loc/$source

                              if [ -e $file ]

                               then

                                    #echo $file &> /dev/null

                                    mv $file $tmp_dir &> /dev/null

                              fi

                        done

                     

               fi

            done

   done

   

   echo -e "\t \t Done"

   echo

   

   if [ $simulate_mode = "off" ]

     then

       echo -en " \t Removing files..."

         rm -rf $portage_loc$distfiles_loc/*  #&> /dev/null

         mv $tmp_dir/* $portage_loc$distfiles_loc -f #&> /dev/null

         rm -rf $tmp_dir #&> /dev/null

       echo -e " \t \t Done"

       

       show_old_and_new_portage_size

       

   elif [ $simulate_mode = "on" ]

     then

       echo -en " \t Testing files..."

         mv $portage_loc$distfiles_loc/* $tmp2_dir/ -f &> /dev/null

         mv $tmp_dir/* $portage_loc$distfiles_loc -f &> /dev/null

         rm -rf $tmp_dir &> /dev/null

       echo -e " \t  \t Done"

       echo

       

       show_old_and_new_portage_size_simulate

       

       #echo -en " \t Reverting back"

       

         mv $tmp2_dir/* $portage_loc$distfiles_loc -f &> /dev/null

         rm -rf $tmp2_dir &> /dev/null

       

       #echo -e " \t \t Done" 

       

       echo -en " \t Reverted Portage size: \t "

         calculate_portage_dim

       echo

       echo

   

   fi

 

}

#==============================================================

# MAIN PROGRAM: made by lxnay check parameters from shell

# configured for 3 parameters // DEBUG: insert 4th parameter

#==============================================================

# Variables

parameter1=$(echo "$1" | cut -d '=' -f 1)

parameter1_value=$(echo "$1" | cut -d '=' -f 2)

parameter2=""

parameter2_value=""

# if bash command has two parameters

if [ -n "$2" ]

  then

    parameter2=$(echo "$2" | cut -d '=' -f 1)

    parameter2_value=$(echo "$2" | cut -d '=' -f 2)

fi

# If Parameter 1 is date, start "date" script

if [[ $parameter1 = "--date" || $parameter2 = "--date" ]]

  then

   

   validate_parameters_date

   

   echo

   show_sys_info

   

   if [ "$UID" -eq "0" ]

    then

       remove_distfiles_using_date

      exit 0

    else

      echo;echo "    You must be root";echo

      exit 1

   fi

   

# here you can add other parameters

elif [[ $parameter1 = "--version" || $parameter2 = "--version" ]]

  then

     

   validate_parameters_version

  

   echo

   show_sys_info

   

   

   if [ "$UID" -eq "0" ]

    then

       remove_distfiles_using_version

      exit 0

    else

      echo;echo "    You must be root";echo

      exit 1

   fi   

   

# If Parameter 1 is help, start "help" script

elif [[ $parameter1 = "--help" && $parameter2 = "" ]]

  then

     echo

   echo "$program_version"

   echo "This application deletes all useless files from portage tree older than"

   echo "specified days or by version number"

   echo "Usage:"

   echo -e " \t --date=xx \t date mode, clean all files older than xx days (from 1 to 2000)"

   echo -e " \t --version \t version mode, clean all files using version number"

   echo -e " \t --simulate \t Only a simulation, nothing seriously deleted"

   echo -e " \t \t you can use it with --date and --version"

   echo -e " \t --help \t This help :-)"

   echo

   echo "Copyright - 2004 - lxnay aka Fabio Erculiani - fabio@amdplanet.it - fabio.erculiani@tiscali.it"

   echo

     exit 0

  

   

else

   bad_parameters

fi

```

ed ecco uno "screen" testuale della modalità --date=25 --simulate:

```

         Hostname:       mars

         Machine Type:   i686

         Op. System:     GNU/Linux

         Kernel ver.:    2.6.8-nitro1

    Starting: mer ago 25 02:17:55 CEST 2004

    Starting: simulation on files 25 days old of /usr/portage/distfiles

                         Current DATE    Calculated DATE

         Day:            25              31

         Month:          8               7

         Year:           2004            2004

                                 Target day: 31/7/2004

         1  2  3  4  5   TIMEOUT!

         Simulation mode: Moving files...Done

         OLD Portage size:               693M   /usr/portage/

         SIMULATED Portage size:         464M   /usr/portage/

         Reverted Portage size:          693M   /usr/portage/

```

e lo screen dell'help:

```

lxnay-CubCleaner 0.60 for Gentoo

This application deletes all source files in portage tree older than specified days

Usage:

         --date=xx       date mode, clean all files older than xx days (from 1 to 2000)

         --version       version mode, clean all files using version number

         --simulate      Only a simulation, nothing seriously deleted

                 you can use it with --date and --version

         --help          This help :-)

Copyright - 2004 - lxnay aka Fabio Erculiani - fabio@amdplanet.it - fabio.erculiani@tiscali.it

```

Per ulteriori info, avviare il programma con --help (vedi sopra)

Ragazzi andateci piano che è il mio primo programma in linguaggio bash che scrivo....  :Rolling Eyes: 

EDIT: l'ho scritto con Kate ma qui sopra l'identazione mi sembra un po' grossolana. Al link qui sotto trovate il programma:

Versione 0.61: http://www.amdplanet.it/fabio/cubcleaner.sh

----------

## motaboy

Ciao, bella idea. Mi dispiace ma non ho ancora provato il tuo script, peró volevo dirti che su gentoo.it ce ne é uno molto simile che uso spesso. Si chiama distclean e ti permette di cancellare tutti i sorgenti dei pacchetti non installati nel sistema. Magari potreste unire le cose in un unico programma.

----------

## lxnay

Questo programma elimina i file in base al numero di giorni passato come argomento. Ovvero, se si passa il comando --date=15, il programma eliminerà tutti i file più vecchi di 15 giorni della cartella distfiles nel portage tree.

Secondo te è rischioso farlo funzionare anche per le ebuild più vecchie di x giorni?

----------

## lxnay

Sto testando la nuova versione  :Smile: 

appena finisco il "debugging" la pubblico...

FATTO  :Smile:  

----------

## FonderiaDigitale

se ti va di inserirlo nel gekit, mandami un pm  :Smile: 

----------

## lxnay

perfetto  :Smile: 

----------

## lxnay

* bump *

tutti in vacanza? nessuno ha voglia di provarlo  :Smile:  ?

----------

