scripts: prune-kernel:remove old kernels and modules dir from system
diff mbox series

Message ID 20191030095445.912435-1-unixbhaskar@gmail.com
State New
Headers show
Series
  • scripts: prune-kernel:remove old kernels and modules dir from system
Related show

Commit Message

Bhaskar Chowdhury Oct. 30, 2019, 9:54 a.m. UTC
This patch will remove old kernels and modules directorey related
to that kernel from the system by interactively and silently.Here
are few interactions with the scripts

1)

✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
14:52 $ ./scripts/prune-kernel -h
Usage: prune-kernel [ri]

 -r | --remove kernel_ver modules_dir_name

  -i | --interactive use as interactive way
  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
  
  14:52 $ ./scripts/prune-kernel --help
  Usage: prune-kernel [ri]

   -r | --remove kernel_ver modules_dir_name

    -i | --interactive use as interactive way
   
 2)

 ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
 14:52 $ ./scripts/prune-kernel -r 5.3.3
 You need to provide kernel version and modules dir name
 
 ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
 14:53 $ ./scripts/prune-kernel -r
 You need to provide kernel version and modules dir name
 
 ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
 14:54 $ ./scripts/prune-kernel -r 5.3.3 5.3.3-foo

3)

$ ./scripts/prune-kernel --remove
You need to provide kernel version and modules dir name

✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
14:55 $ ./scripts/prune-kernel --remove 5.3.3
You need to provide kernel version and modules dir name

✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
14:55 $ ./scripts/prune-kernel --remove 5.3.3 5.3.3-foo


4)14:55 $ ./scripts/prune-kernel -i

Enter kernel version to remove or blank/empty to exit:


5)14:57 $ ./scripts/prune-kernel --interactive

Enter kernel version to remove or blank/empty to exit:
✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]


6)14:59 $ ./scripts/prune-kernel --interactive

Enter kernel version to remove or blank/empty to exit:5.3.3
Please give the full modules directory name to remove:5.3.3-foo



Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.


7)15:00 $ ./scripts/prune-kernel -i

Enter kernel version to remove or blank/empty to exit:5.3.3
Please give the full modules directory name to remove:5.3.3-foo



Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.


Signed-off-by: Bhaskar Chowdhury <unixbhaskar@gmail.com>
---
 scripts/prune-kernel | 63 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

--
2.23.0

Comments

Randy Dunlap Oct. 31, 2019, 2:33 a.m. UTC | #1
Hi,

On 10/30/19 2:54 AM, Bhaskar Chowdhury wrote:
> This patch will remove old kernels and modules directorey related
> to that kernel from the system by interactively and silently.Here
> are few interactions with the scripts
> 
> 1)
> 
> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
> 14:52 $ ./scripts/prune-kernel -h
> Usage: prune-kernel [ri]
> 
>  -r | --remove kernel_ver modules_dir_name
> 
>   -i | --interactive use as interactive way
>   ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>   
>   14:52 $ ./scripts/prune-kernel --help
>   Usage: prune-kernel [ri]

That "[ri]" is confusing to me.

> 
>    -r | --remove kernel_ver modules_dir_na]
> 
>     -i | --interactive use as interactive way
>    
>  2)
> 
>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>  14:52 $ ./scripts/prune-kernel -r 5.3.3
>  You need to provide kernel version and modules dir name
>  
>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>  14:53 $ ./scripts/prune-kernel -r
>  You need to provide kernel version and modules dir name
>  
>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>  14:54 $ ./scripts/prune-kernel -r 5.3.3 5.3.3-foo

This one above didn't remove any kernel files.
Needs more testing.

> 3)
> 
> $ ./scripts/prune-kernel --remove
> You need to provide kernel version and modules dir name
> 
> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
> 14:55 $ ./scripts/prune-kernel --remove 5.3.3
> You need to provide kernel version and modules dir name
> 
> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
> 14:55 $ ./scripts/prune-kernel --remove 5.3.3 5.3.3-foo
> 
> 
> 4)14:55 $ ./scripts/prune-kernel -i
> 
> Enter kernel version to remove or blank/empty to exit:
> 
> 
> 5)14:57 $ ./scripts/prune-kernel --interactive
> 
> Enter kernel version to remove or blank/empty to exit:
> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
> 
> 
> 6)14:59 $ ./scripts/prune-kernel --interactive
> 
> Enter kernel version to remove or blank/empty to exit:5.3.3
> Please give the full modules directory name to remove:5.3.3-foo
> 
> 
> 
> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
> 
> 
> 7)15:00 $ ./scripts/prune-kernel -i
> 
> Enter kernel version to remove or blank/empty to exit:5.3.3
> Please give the full modules directory name to remove:5.3.3-foo
> 
> 
> 
> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
> 
> 
> Signed-off-by: Bhaskar Chowdhury <unixbhaskar@gmail.com>
> ---
>  scripts/prune-kernel | 63 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 63 insertions(+)
> 
> diff --git a/scripts/prune-kernel b/scripts/prune-kernel
> index a25aa2160d47..a91010d0e2af 100755
> --- a/scripts/prune-kernel
> +++ b/scripts/prune-kernel
> @@ -1,3 +1,66 @@
>  #!/bin/bash
>  # SPDX-License-Identifier: GPL-2.0
> +#This script will delete old kernels and modules directory related to it
> +#-h with the script will show you the help
> +#-r with the script take two parameter: kernel_ver and modules_dir_name
> +#-i with the script allow you do the removing interactive way
> 
> +flag=$1
> +kernel_ver=$2
> +modules_dir_name=$3
> +boot_dir=/boot
> +modules_dir=/lib/modules
> +
> +remove_old_kernel() {
> +	cd $boot_dir
> +	rm -If vmlinuz-$kernel_version System.map-$kernel_version config-$kernel_version
> +	return 0
> +}
> +
> +remove_old_modules_dir() {
> +	cd $modules_dir
> +	rm -rf $modules_version
> +	return 0
> +}
> +
> +usage() {
> +	printf "Usage: $(basename $0) [ri] \n"
> +	printf "\n -r | --remove kernel_ver modules_dir_name \n"
> +	printf "\n -i | --interactive use as interactive way \n"
> +}
> +
> +for arg in "$@"

what is the purpose (use) of "arg" here?

what is the purpose of the for loop?

Is any 'shift' needed to consume (or discard) the first 3 positional
command line arguments?

> +do
> +	case "$flag" in
> +		-i | --interactive)
> +			printf "\nEnter kernel version to remove or blank/empty to exit:%s"
> +			read kernel_version
> +			if [[ $kernel_version != "" ]]; then
> +				remove_old_kernel
> +				printf "Please give the full modules directory name to remove:%s"
> +				read modules_version
> +				if [[ $modules_version != "" ]]; then
> +					remove_old_modules_dir
> +					printf "\n\n\n Removed kernel version:$kernel_version and associated modules:$modules_version ...Done. \n"

This message is only printed if $modules_version is non-empty.  If it is empty,
remove_old_kernel() has silently removed some kernel files (if they existed).

> +				else
> +					exit 1
> +				fi
> +			fi
> +			;;
> +		-h | --help)
> +			usage
> +			exit 1
> +			;;
> +		-r | --remove)
> +			if [[ $# -ne 3 ]]; then
> +				printf "You need to provide kernel version and modules dir name\n"
> +				exit 1
> +			else
> +				cd $boot_dir
> +				rm -f $kernel_ver

That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.

> +				cd $modules_dir
> +				rm -rf $modules_dir_name
> +			fi
> +			;;
> +	esac
> +done
> --

The script, after this patch is applied, still contains the old script's for-loop
at the end of the "new" prune-kernel script.

Nack.
Bhaskar Chowdhury Oct. 31, 2019, 3:37 a.m. UTC | #2
Thank you Randy, my response are inline. Please look at it.I am
wondering , what else I could do get this damn! thing going??
Any clue??

On 19:33 Wed 30 Oct 2019, Randy Dunlap wrote:
>Hi,
>
>On 10/30/19 2:54 AM, Bhaskar Chowdhury wrote:
>> This patch will remove old kernels and modules directorey related
>> to that kernel from the system by interactively and silently.Here
>> are few interactions with the scripts
>> 
>> 1)
>> 
>> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>> 14:52 $ ./scripts/prune-kernel -h
>> Usage: prune-kernel [ri]
>> 
>>  -r | --remove kernel_ver modules_dir_name
>> 
>>   -i | --interactive use as interactive way
>>   ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>   
>>   14:52 $ ./scripts/prune-kernel --help
>>   Usage: prune-kernel [ri]
>
>That "[ri]" is confusing to me.
This are the options one has to pass with the script.Like below:
>> 
>>    -r | --remove kernel_ver modules_dir_na]
>> 
>>     -i | --interactive use as interactive way
>>    
>>  2)
>> 
>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>  14:52 $ ./scripts/prune-kernel -r 5.3.3
>>  You need to provide kernel version and modules dir name
>>  
>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>  14:53 $ ./scripts/prune-kernel -r
>>  You need to provide kernel version and modules dir name
>>  
>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>  14:54 $ ./scripts/prune-kernel -r 5.3.3 5.3.3-foo
>
>This one above didn't remove any kernel files.
>Needs more testing.
It does remove but silently, as you and Bruce asked for this feature.
>
>> 3)
>> 
>> $ ./scripts/prune-kernel --remove
>> You need to provide kernel version and modules dir name
>> 
>> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>> 14:55 $ ./scripts/prune-kernel --remove 5.3.3
>> You need to provide kernel version and modules dir name
>> 
>> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>> 14:55 $ ./scripts/prune-kernel --remove 5.3.3 5.3.3-foo
>> 
>> 
>> 4)14:55 $ ./scripts/prune-kernel -i
>> 
>> Enter kernel version to remove or blank/empty to exit:
>> 
>> 
>> 5)14:57 $ ./scripts/prune-kernel --interactive
>> 
>> Enter kernel version to remove or blank/empty to exit:
>> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>> 
>> 
>> 6)14:59 $ ./scripts/prune-kernel --interactive
>> 
>> Enter kernel version to remove or blank/empty to exit:5.3.3
>> Please give the full modules directory name to remove:5.3.3-foo
>> 
>> 
>> 
>> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
>> 
>> 
>> 7)15:00 $ ./scripts/prune-kernel -i
>> 
>> Enter kernel version to remove or blank/empty to exit:5.3.3
>> Please give the full modules directory name to remove:5.3.3-foo
>> 
>> 
>> 
>> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
>> 
>> 
>> Signed-off-by: Bhaskar Chowdhury <unixbhaskar@gmail.com>
>> ---
>>  scripts/prune-kernel | 63 ++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 63 insertions(+)
>> 
>> diff --git a/scripts/prune-kernel b/scripts/prune-kernel
>> index a25aa2160d47..a91010d0e2af 100755
>> --- a/scripts/prune-kernel
>> +++ b/scripts/prune-kernel
>> @@ -1,3 +1,66 @@
>>  #!/bin/bash
>>  # SPDX-License-Identifier: GPL-2.0
>> +#This script will delete old kernels and modules directory related to it
>> +#-h with the script will show you the help
>> +#-r with the script take two parameter: kernel_ver and modules_dir_name
>> +#-i with the script allow you do the removing interactive way
>> 
>> +flag=$1
>> +kernel_ver=$2
>> +modules_dir_name=$3
>> +boot_dir=/boot
>> +modules_dir=/lib/modules
>> +
>> +remove_old_kernel() {
>> +	cd $boot_dir
>> +	rm -If vmlinuz-$kernel_version System.map-$kernel_version config-$kernel_version
>> +	return 0
>> +}
>> +
>> +remove_old_modules_dir() {
>> +	cd $modules_dir
>> +	rm -rf $modules_version
>> +	return 0
>> +}
>> +
>> +usage() {
>> +	printf "Usage: $(basename $0) [ri] \n"
>> +	printf "\n -r | --remove kernel_ver modules_dir_name \n"
>> +	printf "\n -i | --interactive use as interactive way \n"
>> +}
>> +
>> +for arg in "$@"
>
>what is the purpose (use) of "arg" here?

This variable is used in case statement below.
>what is the purpose of the for loop?
>
It scan through all the parameters pass .
>Is any 'shift' needed to consume (or discard) the first 3 positional
>command line arguments?
Nope, that is not required. And I haven't use any.
>
>> +do
>> +	case "$flag" in
>> +		-i | --interactive)
>> +			printf "\nEnter kernel version to remove or blank/empty to exit:%s"
>> +			read kernel_version
>> +			if [[ $kernel_version != "" ]]; then
>> +				remove_old_kernel
>> +				printf "Please give the full modules directory name to remove:%s"
>> +				read modules_version
>> +				if [[ $modules_version != "" ]]; then
>> +					remove_old_modules_dir
>> +					printf "\n\n\n Removed kernel version:$kernel_version and associated modules:$modules_version ...Done. \n"
>
>This message is only printed if $modules_version is non-empty.  If it is empty,
>remove_old_kernel() has silently removed some kernel files (if they existed).
it will fail to remove anything if the kernel_version or modules_version
are empty and importantly exit.
>
>> +				else
>> +					exit 1
>> +				fi
>> +			fi
>> +			;;
>> +		-h | --help)
>> +			usage
>> +			exit 1
>> +			;;
>> +		-r | --remove)
>> +			if [[ $# -ne 3 ]]; then
>> +				printf "You need to provide kernel version and modules dir name\n"
>> +				exit 1
>> +			else
>> +				cd $boot_dir
>> +				rm -f $kernel_ver
>
>That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
No,it is not using that function rather take the parameter from the
commandline and get into boot dir match with it and remove it.
>
>> +				cd $modules_dir
>> +				rm -rf $modules_dir_name
>> +			fi
>> +			;;
>> +	esac
>> +done
>> --
>
>The script, after this patch is applied, still contains the old script's for-loop
>at the end of the "new" prune-kernel script.

Amazing! now it needs some explanation how I did...you probably want
that ..here are the steps....
1)fetch that prune-kernel file from repos , which contains Bruce's code
in it.
2) get inot it by editior, remove all except first two lines i.e bash
interpreter and PSDX .
3)Save and commit it locally.
4) Write my own code
5) save it and commit it locally.
6) go one level up use checkpatch to see anything bad creeps in
7) Fixed the damn things if it reports.
8) create the patch
9) test it
10) Send it.

Now, how the heck , that for loop is getting staying there is a mystry
to me!! Look like that is ruin all the work.
irk...
>
>Nack.
>
>-- 
>~Randy
Randy Dunlap Oct. 31, 2019, 4:32 a.m. UTC | #3
On 10/30/19 8:37 PM, Bhaskar Chowdhury wrote:
> Thank you Randy, my response are inline. Please look at it.I am
> wondering , what else I could do get this damn! thing going??
> Any clue??
> 
> On 19:33 Wed 30 Oct 2019, Randy Dunlap wrote:
>> Hi,
>>
>> On 10/30/19 2:54 AM, Bhaskar Chowdhury wrote:
>>> This patch will remove old kernels and modules directorey related
>>> to that kernel from the system by interactively and silently.Here
>>> are few interactions with the scripts
>>>
>>> 1)
>>>
>>> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>> 14:52 $ ./scripts/prune-kernel -h
>>> Usage: prune-kernel [ri]
>>>
>>>  -r | --remove kernel_ver modules_dir_name
>>>
>>>   -i | --interactive use as interactive way
>>>   ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>     14:52 $ ./scripts/prune-kernel --help
>>>   Usage: prune-kernel [ri]
>>
>> That "[ri]" is confusing to me.
> This are the options one has to pass with the script.Like below:

I know that.  But it's missing '-', so it looks like
$ prune-kernel r 5.2.5-foobar

would work.

>>>
>>>    -r | --remove kernel_ver modules_dir_na]
>>>
>>>     -i | --interactive use as interactive way
>>>     2)
>>>
>>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>  14:52 $ ./scripts/prune-kernel -r 5.3.3
>>>  You need to provide kernel version and modules dir name
>>>  
>>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>  14:53 $ ./scripts/prune-kernel -r
>>>  You need to provide kernel version and modules dir name
>>>  
>>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>  14:54 $ ./scripts/prune-kernel -r 5.3.3 5.3.3-foo
>>
>> This one above didn't remove any kernel files.
>> Needs more testing.
> It does remove but silently, as you and Bruce asked for this feature.

No, see the code below for -r...

>>> 3)
>>>
>>> $ ./scripts/prune-kernel --remove
>>> You need to provide kernel version and modules dir name
>>>
>>> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>> 14:55 $ ./scripts/prune-kernel --remove 5.3.3
>>> You need to provide kernel version and modules dir name
>>>
>>> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>> 14:55 $ ./scripts/prune-kernel --remove 5.3.3 5.3.3-foo
>>>
>>>
>>> 4)14:55 $ ./scripts/prune-kernel -i
>>>
>>> Enter kernel version to remove or blank/empty to exit:
>>>
>>>
>>> 5)14:57 $ ./scripts/prune-kernel --interactive
>>>
>>> Enter kernel version to remove or blank/empty to exit:
>>> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>
>>>
>>> 6)14:59 $ ./scripts/prune-kernel --interactive
>>>
>>> Enter kernel version to remove or blank/empty to exit:5.3.3
>>> Please give the full modules directory name to remove:5.3.3-foo
>>>
>>>
>>>
>>> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
>>>
>>>
>>> 7)15:00 $ ./scripts/prune-kernel -i
>>>
>>> Enter kernel version to remove or blank/empty to exit:5.3.3
>>> Please give the full modules directory name to remove:5.3.3-foo
>>>
>>>
>>>
>>> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
>>>
>>>
>>> Signed-off-by: Bhaskar Chowdhury <unixbhaskar@gmail.com>
>>> ---
>>>  scripts/prune-kernel | 63 ++++++++++++++++++++++++++++++++++++++++++++
>>>  1 file changed, 63 insertions(+)
>>>
>>> diff --git a/scripts/prune-kernel b/scripts/prune-kernel
>>> index a25aa2160d47..a91010d0e2af 100755
>>> --- a/scripts/prune-kernel
>>> +++ b/scripts/prune-kernel
>>> @@ -1,3 +1,66 @@
>>>  #!/bin/bash
>>>  # SPDX-License-Identifier: GPL-2.0
>>> +#This script will delete old kernels and modules directory related to it
>>> +#-h with the script will show you the help
>>> +#-r with the script take two parameter: kernel_ver and modules_dir_name
>>> +#-i with the script allow you do the removing interactive way
>>>
>>> +flag=$1
>>> +kernel_ver=$2
>>> +modules_dir_name=$3
>>> +boot_dir=/boot
>>> +modules_dir=/lib/modules
>>> +
>>> +remove_old_kernel() {
>>> +    cd $boot_dir
>>> +    rm -If vmlinuz-$kernel_version System.map-$kernel_version config-$kernel_version
>>> +    return 0
>>> +}
>>> +
>>> +remove_old_modules_dir() {
>>> +    cd $modules_dir
>>> +    rm -rf $modules_version
>>> +    return 0
>>> +}
>>> +
>>> +usage() {
>>> +    printf "Usage: $(basename $0) [ri] \n"
>>> +    printf "\n -r | --remove kernel_ver modules_dir_name \n"
>>> +    printf "\n -i | --interactive use as interactive way \n"
>>> +}
>>> +
>>> +for arg in "$@"
>>
>> what is the purpose (use) of "arg" here?
> 
> This variable is used in case statement below.

I can't find any use of 'arg' anywhere else in the script.
Please show me where it is.

>> what is the purpose of the for loop?
>>
> It scan through all the parameters pass .

What is this script supposed (expected) to do with multiple arg parameters?

>> Is any 'shift' needed to consume (or discard) the first 3 positional
>> command line arguments?
> Nope, that is not required. And I haven't use any.
>>
>>> +do
>>> +    case "$flag" in
>>> +        -i | --interactive)
>>> +            printf "\nEnter kernel version to remove or blank/empty to exit:%s"
>>> +            read kernel_version
>>> +            if [[ $kernel_version != "" ]]; then
>>> +                remove_old_kernel
>>> +                printf "Please give the full modules directory name to remove:%s"
>>> +                read modules_version
>>> +                if [[ $modules_version != "" ]]; then
>>> +                    remove_old_modules_dir
>>> +                    printf "\n\n\n Removed kernel version:$kernel_version and associated modules:$modules_version ...Done. \n"
>>
>> This message is only printed if $modules_version is non-empty.  If it is empty,
>> remove_old_kernel() has silently removed some kernel files (if they existed).
> it will fail to remove anything if the kernel_version or modules_version
> are empty and importantly exit.
>>
>>> +                else
>>> +                    exit 1
>>> +                fi
>>> +            fi
>>> +            ;;
>>> +        -h | --help)
>>> +            usage
>>> +            exit 1
>>> +            ;;
>>> +        -r | --remove)
>>> +            if [[ $# -ne 3 ]]; then
>>> +                printf "You need to provide kernel version and modules dir name\n"
>>> +                exit 1
>>> +            else
>>> +                cd $boot_dir
>>> +                rm -f $kernel_ver
>>
>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
> No,it is not using that function rather take the parameter from the
> commandline and get into boot dir match with it and remove it.

But it doesn't do that.  I tested it.  It should be more like what
rmeove_old_kernel() does:

		rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver

and if not, please explain why not.


>>> +                cd $modules_dir
>>> +                rm -rf $modules_dir_name
>>> +            fi
>>> +            ;;
>>> +    esac
>>> +done
>>> -- 
>>
>> The script, after this patch is applied, still contains the old script's for-loop
>> at the end of the "new" prune-kernel script.
> 
> Amazing! now it needs some explanation how I did...you probably want
> that ..here are the steps....
> 1)fetch that prune-kernel file from repos , which contains Bruce's code
> in it.
> 2) get inot it by editior, remove all except first two lines i.e bash
> interpreter and PSDX .
> 3)Save and commit it locally.
> 4) Write my own code
> 5) save it and commit it locally.
> 6) go one level up use checkpatch to see anything bad creeps in
> 7) Fixed the damn things if it reports.
> 8) create the patch
> 9) test it
> 10) Send it.
> 
> Now, how the heck , that for loop is getting staying there is a mystry
> to me!! Look like that is ruin all the work.
> irk...

I don't know.  I just know that it's not working AFAICT.
Bhaskar Chowdhury Oct. 31, 2019, 4:52 a.m. UTC | #4
Thank you so much Randy. I am awfully sorry about the ugly code ,
hopefully come up with a better one. If I understood your expectation.

I know we all are blessed with limited resources like patience.Thanks
for holding this long...little more and we will be over it.

:)

On 21:32 Wed 30 Oct 2019, Randy Dunlap wrote:
>On 10/30/19 8:37 PM, Bhaskar Chowdhury wrote:
>> Thank you Randy, my response are inline. Please look at it.I am
>> wondering , what else I could do get this damn! thing going??
>> Any clue??
>> 
>> On 19:33 Wed 30 Oct 2019, Randy Dunlap wrote:
>>> Hi,
>>>
>>> On 10/30/19 2:54 AM, Bhaskar Chowdhury wrote:
>>>> This patch will remove old kernels and modules directorey related
>>>> to that kernel from the system by interactively and silently.Here
>>>> are few interactions with the scripts
>>>>
>>>> 1)
>>>>
>>>> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>> 14:52 $ ./scripts/prune-kernel -h
>>>> Usage: prune-kernel [ri]
>>>>
>>>>  -r | --remove kernel_ver modules_dir_name
>>>>
>>>>   -i | --interactive use as interactive way
>>>>   ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>>     14:52 $ ./scripts/prune-kernel --help
>>>>   Usage: prune-kernel [ri]
>>>
>>> That "[ri]" is confusing to me.
>> This are the options one has to pass with the script.Like below:
>
>I know that.  But it's missing '-', so it looks like
>$ prune-kernel r 5.2.5-foobar
>
>would work.
>
Will correct that.
>>>>
>>>>    -r | --remove kernel_ver modules_dir_na]
>>>>
>>>>     -i | --interactive use as interactive way
>>>>     2)
>>>>
>>>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>>  14:52 $ ./scripts/prune-kernel -r 5.3.3
>>>>  You need to provide kernel version and modules dir name
>>>>  
>>>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>>  14:53 $ ./scripts/prune-kernel -r
>>>>  You need to provide kernel version and modules dir name
>>>>  
>>>>  ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>>  14:54 $ ./scripts/prune-kernel -r 5.3.3 5.3.3-foo
>>>
>>> This one above didn't remove any kernel files.
>>> Needs more testing.
>> It does remove but silently, as you and Bruce asked for this feature.
>
>No, see the code below for -r...
>
Okay ...look like some some uniformity missing
>>>> 3)
>>>>
>>>> $ ./scripts/prune-kernel --remove
>>>> You need to provide kernel version and modules dir name
>>>>
>>>> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>> 14:55 $ ./scripts/prune-kernel --remove 5.3.3
>>>> You need to provide kernel version and modules dir name
>>>>
>>>> ✘-1 ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>> 14:55 $ ./scripts/prune-kernel --remove 5.3.3 5.3.3-foo
>>>>
>>>>
>>>> 4)14:55 $ ./scripts/prune-kernel -i
>>>>
>>>> Enter kernel version to remove or blank/empty to exit:
>>>>
>>>>
>>>> 5)14:57 $ ./scripts/prune-kernel --interactive
>>>>
>>>> Enter kernel version to remove or blank/empty to exit:
>>>> ✔ ~/git-linux/linux-kbuild [master|AM 1/1 ↑·59|✔]
>>>>
>>>>
>>>> 6)14:59 $ ./scripts/prune-kernel --interactive
>>>>
>>>> Enter kernel version to remove or blank/empty to exit:5.3.3
>>>> Please give the full modules directory name to remove:5.3.3-foo
>>>>
>>>>
>>>>
>>>> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
>>>>
>>>>
>>>> 7)15:00 $ ./scripts/prune-kernel -i
>>>>
>>>> Enter kernel version to remove or blank/empty to exit:5.3.3
>>>> Please give the full modules directory name to remove:5.3.3-foo
>>>>
>>>>
>>>>
>>>> Removed kernel version:5.3.3 and associated modules:5.3.3-foo ...Done.
>>>>
>>>>
>>>> Signed-off-by: Bhaskar Chowdhury <unixbhaskar@gmail.com>
>>>> ---
>>>>  scripts/prune-kernel | 63 ++++++++++++++++++++++++++++++++++++++++++++
>>>>  1 file changed, 63 insertions(+)
>>>>
>>>> diff --git a/scripts/prune-kernel b/scripts/prune-kernel
>>>> index a25aa2160d47..a91010d0e2af 100755
>>>> --- a/scripts/prune-kernel
>>>> +++ b/scripts/prune-kernel
>>>> @@ -1,3 +1,66 @@
>>>>  #!/bin/bash
>>>>  # SPDX-License-Identifier: GPL-2.0
>>>> +#This script will delete old kernels and modules directory related to it
>>>> +#-h with the script will show you the help
>>>> +#-r with the script take two parameter: kernel_ver and modules_dir_name
>>>> +#-i with the script allow you do the removing interactive way
>>>>
>>>> +flag=$1
>>>> +kernel_ver=$2
>>>> +modules_dir_name=$3
>>>> +boot_dir=/boot
>>>> +modules_dir=/lib/modules
>>>> +
>>>> +remove_old_kernel() {
>>>> +    cd $boot_dir
>>>> +    rm -If vmlinuz-$kernel_version System.map-$kernel_version config-$kernel_version
>>>> +    return 0
>>>> +}
>>>> +
>>>> +remove_old_modules_dir() {
>>>> +    cd $modules_dir
>>>> +    rm -rf $modules_version
>>>> +    return 0
>>>> +}
>>>> +
>>>> +usage() {
>>>> +    printf "Usage: $(basename $0) [ri] \n"
>>>> +    printf "\n -r | --remove kernel_ver modules_dir_name \n"
>>>> +    printf "\n -i | --interactive use as interactive way \n"
>>>> +}
>>>> +
>>>> +for arg in "$@"
>>>
>>> what is the purpose (use) of "arg" here?
>> 
>> This variable is used in case statement below.
>
>I can't find any use of 'arg' anywhere else in the script.
>Please show me where it is.
My bad and apologies for overlooking.
>
>>> what is the purpose of the for loop?
>>>
>> It scan through all the parameters pass .
>
>What is this script supposed (expected) to do with multiple arg parameters?
>
It uses multiple parameter
>>> Is any 'shift' needed to consume (or discard) the first 3 positional
>>> command line arguments?
>> Nope, that is not required. And I haven't use any.
>>>
>>>> +do
>>>> +    case "$flag" in
>>>> +        -i | --interactive)
>>>> +            printf "\nEnter kernel version to remove or blank/empty to exit:%s"
>>>> +            read kernel_version
>>>> +            if [[ $kernel_version != "" ]]; then
>>>> +                remove_old_kernel
>>>> +                printf "Please give the full modules directory name to remove:%s"
>>>> +                read modules_version
>>>> +                if [[ $modules_version != "" ]]; then
>>>> +                    remove_old_modules_dir
>>>> +                    printf "\n\n\n Removed kernel version:$kernel_version and associated modules:$modules_version ...Done. \n"
>>>
>>> This message is only printed if $modules_version is non-empty.  If it is empty,
>>> remove_old_kernel() has silently removed some kernel files (if they existed).
>> it will fail to remove anything if the kernel_version or modules_version
>> are empty and importantly exit.
>>>
>>>> +                else
>>>> +                    exit 1
>>>> +                fi
>>>> +            fi
>>>> +            ;;
>>>> +        -h | --help)
>>>> +            usage
>>>> +            exit 1
>>>> +            ;;
>>>> +        -r | --remove)
>>>> +            if [[ $# -ne 3 ]]; then
>>>> +                printf "You need to provide kernel version and modules dir name\n"
>>>> +                exit 1
>>>> +            else
>>>> +                cd $boot_dir
>>>> +                rm -f $kernel_ver
>>>
>>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
>> No,it is not using that function rather take the parameter from the
>> commandline and get into boot dir match with it and remove it.
>
>But it doesn't do that.  I tested it.  It should be more like what
>rmeove_old_kernel() does:
>
>		rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver
>
>and if not, please explain why not.
Okay, again some uniformity missing in the code, I would like to your
suggested method,i.e call remove_old_kernel to do the job instead of 
depending on individual kernel.
>
>
>>>> +                cd $modules_dir
>>>> +                rm -rf $modules_dir_name
>>>> +            fi
>>>> +            ;;
>>>> +    esac
>>>> +done
>>>> -- 
>>>
>>> The script, after this patch is applied, still contains the old script's for-loop
>>> at the end of the "new" prune-kernel script.
>> 
>> Amazing! now it needs some explanation how I did...you probably want
>> that ..here are the steps....
>> 1)fetch that prune-kernel file from repos , which contains Bruce's code
>> in it.
>> 2) get inot it by editior, remove all except first two lines i.e bash
>> interpreter and PSDX .
>> 3)Save and commit it locally.
>> 4) Write my own code
>> 5) save it and commit it locally.
>> 6) go one level up use checkpatch to see anything bad creeps in
>> 7) Fixed the damn things if it reports.
>> 8) create the patch
>> 9) test it
>> 10) Send it.
>> 
>> Now, how the heck , that for loop is getting staying there is a mystry
>> to me!! Look like that is ruin all the work.
>> irk...
>
>I don't know.  I just know that it's not working AFAICT.
Thank you, will be more vigilant in next iteration.
>
>-- 
>~Randy
>
Randy Dunlap Oct. 31, 2019, 5:27 a.m. UTC | #5
On 10/30/19 9:52 PM, Bhaskar Chowdhury wrote:
>>>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
>>> No,it is not using that function rather take the parameter from the
>>> commandline and get into boot dir match with it and remove it.
>>
>> But it doesn't do that.  I tested it.  It should be more like what
>> rmeove_old_kernel() does:
>>
>>         rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver
>>
>> and if not, please explain why not.
> Okay, again some uniformity missing in the code, I would like to your
> suggested method,i.e call remove_old_kernel to do the job instead of depending on individual kernel.

The simplest thing to do is set kernel_version=$kernel_ver
and then call remove_old_kernel().
And set modules_version=$modules_dir_name and call remove_old_modules_dir().

But it would be cleaner to pass a parameter (kernel_version) to the
remove_old_kernel() function and to pass a parameter (modules_dir) to the
remove_old_modules_dir() function.
Bhaskar Chowdhury Oct. 31, 2019, 7:18 a.m. UTC | #6
On 22:27 Wed 30 Oct 2019, Randy Dunlap wrote:
>On 10/30/19 9:52 PM, Bhaskar Chowdhury wrote:
>>>>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
>>>> No,it is not using that function rather take the parameter from the
>>>> commandline and get into boot dir match with it and remove it.
>>>
>>> But it doesn't do that.  I tested it.  It should be more like what
>>> rmeove_old_kernel() does:
>>>
>>>         rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver
>>>
>>> and if not, please explain why not.
>> Okay, again some uniformity missing in the code, I would like to your
>> suggested method,i.e call remove_old_kernel to do the job instead of depending on individual kernel.
>
>The simplest thing to do is set kernel_version=$kernel_ver
>and then call remove_old_kernel().
>And set modules_version=$modules_dir_name and call remove_old_modules_dir().
>
>But it would be cleaner to pass a parameter (kernel_version) to the
>remove_old_kernel() function and to pass a parameter (modules_dir) to the
>remove_old_modules_dir() function.

>

Thank you...I have just modified the code and call both the function
under remove option. BTW I didn't set the extra variable $kernel_ver 
name it $kernel_version and instead of $modules_dir_name name it $mo
dules_version.

Capturing command line parameter in $kernel_version and $modules_version

Is that fine? Here is a code snippet:

 -r | --remove)
   if [[ $# -ne 3 ]]; then
    printf "You need to provide kernel version and modules directory
    name \n"
    exit 1
    else
    remove_old_kernel
    remove_old_modules_dir
    fi


I have just test it and it works.


And about solitary r option without hypen is ignoring and doing nothing.

Means, if I pass ./scripts/prune-kernel r 5.3.3 

it simply ignore and does nothing.Only with the hypen it can work.

>-- 
>~Randy
>
Bhaskar
Randy Dunlap Oct. 31, 2019, 3:06 p.m. UTC | #7
On 10/31/19 12:18 AM, Bhaskar Chowdhury wrote:
> On 22:27 Wed 30 Oct 2019, Randy Dunlap wrote:
>> On 10/30/19 9:52 PM, Bhaskar Chowdhury wrote:
>>>>>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
>>>>> No,it is not using that function rather take the parameter from the
>>>>> commandline and get into boot dir match with it and remove it.
>>>>
>>>> But it doesn't do that.  I tested it.  It should be more like what
>>>> rmeove_old_kernel() does:
>>>>
>>>>         rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver
>>>>
>>>> and if not, please explain why not.
>>> Okay, again some uniformity missing in the code, I would like to your
>>> suggested method,i.e call remove_old_kernel to do the job instead of depending on individual kernel.
>>
>> The simplest thing to do is set kernel_version=$kernel_ver
>> and then call remove_old_kernel().
>> And set modules_version=$modules_dir_name and call remove_old_modules_dir().
>>
>> But it would be cleaner to pass a parameter (kernel_version) to the
>> remove_old_kernel() function and to pass a parameter (modules_dir) to the
>> remove_old_modules_dir() function.
> 
>>
> 
> Thank you...I have just modified the code and call both the function
> under remove option. BTW I didn't set the extra variable $kernel_ver name it $kernel_version and instead of $modules_dir_name name it $mo
> dules_version.
> 
> Capturing command line parameter in $kernel_version and $modules_version
> 
> Is that fine? Here is a code snippet:

Yes, that should be OK.

> -r | --remove)
>   if [[ $# -ne 3 ]]; then
>    printf "You need to provide kernel version and modules directory
>    name \n"
>    exit 1
>    else
>    remove_old_kernel
>    remove_old_modules_dir
>    fi
> 
> 
> I have just test it and it works.
> 
> 
> And about solitary r option without hypen is ignoring and doing nothing.
> 
> Means, if I pass ./scripts/prune-kernel r 5.3.3
> it simply ignore and does nothing.Only with the hypen it can work.

Is that how it should be?
or what would you expect that to do?
Bhaskar Chowdhury Nov. 1, 2019, 4:23 a.m. UTC | #8
On 08:06 Thu 31 Oct 2019, Randy Dunlap wrote:
>On 10/31/19 12:18 AM, Bhaskar Chowdhury wrote:
>> On 22:27 Wed 30 Oct 2019, Randy Dunlap wrote:
>>> On 10/30/19 9:52 PM, Bhaskar Chowdhury wrote:
>>>>>>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
>>>>>> No,it is not using that function rather take the parameter from the
>>>>>> commandline and get into boot dir match with it and remove it.
>>>>>
>>>>> But it doesn't do that.  I tested it.  It should be more like what
>>>>> rmeove_old_kernel() does:
>>>>>
>>>>>         rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver
>>>>>
>>>>> and if not, please explain why not.
>>>> Okay, again some uniformity missing in the code, I would like to your
>>>> suggested method,i.e call remove_old_kernel to do the job instead of depending on individual kernel.
>>>
>>> The simplest thing to do is set kernel_version=$kernel_ver
>>> and then call remove_old_kernel().
>>> And set modules_version=$modules_dir_name and call remove_old_modules_dir().
>>>
>>> But it would be cleaner to pass a parameter (kernel_version) to the
>>> remove_old_kernel() function and to pass a parameter (modules_dir) to the
>>> remove_old_modules_dir() function.
>> 
>>>
>> 
>> Thank you...I have just modified the code and call both the function
>> under remove option. BTW I didn't set the extra variable $kernel_ver name it $kernel_version and instead of $modules_dir_name name it $mo
>> dules_version.
>> 
>> Capturing command line parameter in $kernel_version and $modules_version
>> 
>> Is that fine? Here is a code snippet:
>
>Yes, that should be OK.
>
>> -r | --remove)
>>   if [[ $# -ne 3 ]]; then
>>    printf "You need to provide kernel version and modules directory
>>    name \n"
>>    exit 1
>>    else
>>    remove_old_kernel
>>    remove_old_modules_dir
>>    fi
>> 
>> 
>> I have just test it and it works.
>> 
>> 
>> And about solitary r option without hypen is ignoring and doing nothing.
>> 
>> Means, if I pass ./scripts/prune-kernel r 5.3.3
>> it simply ignore and does nothing.Only with the hypen it can work.
>
>Is that how it should be?
>or what would you expect that to do?
Yes it should be. Any malformed parameter should be discarded,except
what explicitly given in code form,as help reminder.
OR
Do you want me to reminds user that they are missing thing to operate
correctly?? 

>
>-- 
>~Randy
Bhaskar
>
Bhaskar Chowdhury Nov. 1, 2019, 5:11 a.m. UTC | #9
On 09:53 Fri 01 Nov 2019, Bhaskar Chowdhury wrote:
>On 08:06 Thu 31 Oct 2019, Randy Dunlap wrote:
>>On 10/31/19 12:18 AM, Bhaskar Chowdhury wrote:
>>> On 22:27 Wed 30 Oct 2019, Randy Dunlap wrote:
>>>> On 10/30/19 9:52 PM, Bhaskar Chowdhury wrote:
>>>>>>>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
>>>>>>> No,it is not using that function rather take the parameter from the
>>>>>>> commandline and get into boot dir match with it and remove it.
>>>>>>
>>>>>> But it doesn't do that.  I tested it.  It should be more like what
>>>>>> rmeove_old_kernel() does:
>>>>>>
>>>>>>         rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver
>>>>>>
>>>>>> and if not, please explain why not.
>>>>> Okay, again some uniformity missing in the code, I would like to your
>>>>> suggested method,i.e call remove_old_kernel to do the job instead of depending on individual kernel.
>>>>
>>>> The simplest thing to do is set kernel_version=$kernel_ver
>>>> and then call remove_old_kernel().
>>>> And set modules_version=$modules_dir_name and call remove_old_modules_dir().
>>>>
>>>> But it would be cleaner to pass a parameter (kernel_version) to the
>>>> remove_old_kernel() function and to pass a parameter (modules_dir) to the
>>>> remove_old_modules_dir() function.
>>> 
>>>>
>>> 
>>> Thank you...I have just modified the code and call both the function
>>> under remove option. BTW I didn't set the extra variable $kernel_ver name it $kernel_version and instead of $modules_dir_name name it $mo
>>> dules_version.
>>> 
>>> Capturing command line parameter in $kernel_version and $modules_version
>>> 
>>> Is that fine? Here is a code snippet:
>>
>>Yes, that should be OK.
>>
>>> -r | --remove)
>>>   if [[ $# -ne 3 ]]; then
>>>    printf "You need to provide kernel version and modules directory
>>>    name \n"
>>>    exit 1
>>>    else
>>>    remove_old_kernel
>>>    remove_old_modules_dir
>>>    fi
>>> 
>>> 
>>> I have just test it and it works.
>>> 
>>> 
>>> And about solitary r option without hypen is ignoring and doing nothing.
>>> 
>>> Means, if I pass ./scripts/prune-kernel r 5.3.3
>>> it simply ignore and does nothing.Only with the hypen it can work.
>>
>>Is that how it should be?
>>or what would you expect that to do?
>Yes it should be. Any malformed parameter should be discarded,except
>what explicitly given in code form,as help reminder.
>OR
>Do you want me to reminds user that they are missing thing to operate
>correctly?? 
>
>>
>>-- 
>>~Randy
>Bhaskar
>>
Randy,

I think we should show the help message , whenever user put a malformed
parameter, say they put something like this :

./scripts/prune-kernel f 5.3.3

It should show the help message to indicate what exactly need to pass
with the script to get the desired result.

What do you think??

~Bhaskar

>-----BEGIN PGP SIGNATURE-----
>
>iQEzBAABCAAdFiEEnwF+nWawchZUPOuwsjqdtxFLKRUFAl27s0EACgkQsjqdtxFL
>KRV81wf/cMmIASLvGNbAxdbZY/7xnsdsaOWLsfH5c4twHsVwm74Zbasdq8s1l5Kn
>z8CZeWxKOKsItEY52g2vXbyDMFkk2La77kHZo4O5hQOmenRMaD9M7wcWqSCOJg59
>EbhMUt7RLpJLDKYTtegoGIyNgVZXfV8PpH6iKIvNscyJPMNBvppgRKkn80MWoG7k
>i0rMI6kvchwilxhVz/LPbJgKrIayhriKIBfTbDracSdX+WtJMQbAjdWRgGk0rmGe
>wS0p8nwJmmqXSc/qrrgZPR9VxsknVNMm/PzKS9CTE+GvELjXS8MeG3iwauQ4hx2K
>B255AW+zobp0IQGwTqH7VwO0u2GzLQ==
>=3y5/
>-----END PGP SIGNATURE-----
Randy Dunlap Nov. 1, 2019, 5:45 a.m. UTC | #10
On 10/31/19 10:11 PM, Bhaskar Chowdhury wrote:
> On 09:53 Fri 01 Nov 2019, Bhaskar Chowdhury wrote:
>> On 08:06 Thu 31 Oct 2019, Randy Dunlap wrote:
>>> On 10/31/19 12:18 AM, Bhaskar Chowdhury wrote:
>>>> On 22:27 Wed 30 Oct 2019, Randy Dunlap wrote:
>>>>> On 10/30/19 9:52 PM, Bhaskar Chowdhury wrote:
>>>>>>>>> That 'rm' doesn't remove any files.  Compare what remove_old_kernel() does.
>>>>>>>> No,it is not using that function rather take the parameter from the
>>>>>>>> commandline and get into boot dir match with it and remove it.
>>>>>>>
>>>>>>> But it doesn't do that.  I tested it.  It should be more like what
>>>>>>> rmeove_old_kernel() does:
>>>>>>>
>>>>>>>         rm -If vmlinuz-$kernel_ver System.map-$kernel_ver config-$kernel_ver
>>>>>>>
>>>>>>> and if not, please explain why not.
>>>>>> Okay, again some uniformity missing in the code, I would like to your
>>>>>> suggested method,i.e call remove_old_kernel to do the job instead of depending on individual kernel.
>>>>>
>>>>> The simplest thing to do is set kernel_version=$kernel_ver
>>>>> and then call remove_old_kernel().
>>>>> And set modules_version=$modules_dir_name and call remove_old_modules_dir().
>>>>>
>>>>> But it would be cleaner to pass a parameter (kernel_version) to the
>>>>> remove_old_kernel() function and to pass a parameter (modules_dir) to the
>>>>> remove_old_modules_dir() function.
>>>>
>>>>>
>>>>
>>>> Thank you...I have just modified the code and call both the function
>>>> under remove option. BTW I didn't set the extra variable $kernel_ver name it $kernel_version and instead of $modules_dir_name name it $mo
>>>> dules_version.
>>>>
>>>> Capturing command line parameter in $kernel_version and $modules_version
>>>>
>>>> Is that fine? Here is a code snippet:
>>>
>>> Yes, that should be OK.
>>>
>>>> -r | --remove)
>>>>   if [[ $# -ne 3 ]]; then
>>>>    printf "You need to provide kernel version and modules directory
>>>>    name \n"
>>>>    exit 1
>>>>    else
>>>>    remove_old_kernel
>>>>    remove_old_modules_dir
>>>>    fi
>>>>
>>>>
>>>> I have just test it and it works.
>>>>
>>>>
>>>> And about solitary r option without hypen is ignoring and doing nothing.
>>>>
>>>> Means, if I pass ./scripts/prune-kernel r 5.3.3
>>>> it simply ignore and does nothing.Only with the hypen it can work.
>>>
>>> Is that how it should be?
>>> or what would you expect that to do?
>> Yes it should be. Any malformed parameter should be discarded,except
>> what explicitly given in code form,as help reminder.
>> OR
>> Do you want me to reminds user that they are missing thing to operate
>> correctly??
>>>
>>> -- 
>>> ~Randy
>> Bhaskar
>>>
> Randy,
> 
> I think we should show the help message , whenever user put a malformed
> parameter, say they put something like this :
> 
> ./scripts/prune-kernel f 5.3.3
> 
> It should show the help message to indicate what exactly need to pass
> with the script to get the desired result.
> 
> What do you think??

I agree.  Entering garbage junk should spit out help.

Patch
diff mbox series

diff --git a/scripts/prune-kernel b/scripts/prune-kernel
index a25aa2160d47..a91010d0e2af 100755
--- a/scripts/prune-kernel
+++ b/scripts/prune-kernel
@@ -1,3 +1,66 @@ 
 #!/bin/bash
 # SPDX-License-Identifier: GPL-2.0
+#This script will delete old kernels and modules directory related to it
+#-h with the script will show you the help
+#-r with the script take two parameter: kernel_ver and modules_dir_name
+#-i with the script allow you do the removing interactive way

+flag=$1
+kernel_ver=$2
+modules_dir_name=$3
+boot_dir=/boot
+modules_dir=/lib/modules
+
+remove_old_kernel() {
+	cd $boot_dir
+	rm -If vmlinuz-$kernel_version System.map-$kernel_version config-$kernel_version
+	return 0
+}
+
+remove_old_modules_dir() {
+	cd $modules_dir
+	rm -rf $modules_version
+	return 0
+}
+
+usage() {
+	printf "Usage: $(basename $0) [ri] \n"
+	printf "\n -r | --remove kernel_ver modules_dir_name \n"
+	printf "\n -i | --interactive use as interactive way \n"
+}
+
+for arg in "$@"
+do
+	case "$flag" in
+		-i | --interactive)
+			printf "\nEnter kernel version to remove or blank/empty to exit:%s"
+			read kernel_version
+			if [[ $kernel_version != "" ]]; then
+				remove_old_kernel
+				printf "Please give the full modules directory name to remove:%s"
+				read modules_version
+				if [[ $modules_version != "" ]]; then
+					remove_old_modules_dir
+					printf "\n\n\n Removed kernel version:$kernel_version and associated modules:$modules_version ...Done. \n"
+				else
+					exit 1
+				fi
+			fi
+			;;
+		-h | --help)
+			usage
+			exit 1
+			;;
+		-r | --remove)
+			if [[ $# -ne 3 ]]; then
+				printf "You need to provide kernel version and modules dir name\n"
+				exit 1
+			else
+				cd $boot_dir
+				rm -f $kernel_ver
+				cd $modules_dir
+				rm -rf $modules_dir_name
+			fi
+			;;
+	esac
+done