Difference between revisions of "Tidy-rpm-cache"
m |
m |
||
Line 1: | Line 1: | ||
<yambe:breadcrumb>Package management tools</yambe:breadcrumb> | <yambe:breadcrumb>Package management tools</yambe:breadcrumb> | ||
=tidy-rpm-cache.py (previous rm_obsolete_rpms.py)= | |||
=Script to delete older versions of rpm files from cache= | |||
Both tidy_rpm_cache and delete_obsolete_rpm seem to have been removed from all download locations. Wierd!!. A simple escript which can achieve similar results is mentioned below. Steps for using the scripts are: | |||
#Save the script as file "tidy_rpm_cache.escript" | |||
#Set execute permissions (chmod +x) on file | |||
#Install erlang (yum -y install erlang). | |||
#Execute escript as root user with arguments "no" <dir> for obtaining list of files that would get deleted upon confirmation. Pipe output to less as the list could be long. | |||
#Change argument "no" to "yes" to confirm and delete old packages. List of files deleted is printed. | |||
<pre> | |||
#!/usr/bin/env escript | |||
%% Invoke as | |||
%% sudo tidy_rpm_cache.escript "yes" */packages | |||
%% from /var/cache/yum/x86_64/6/ folder | |||
%% | |||
main([Confirm | Dir_list]) -> | |||
lists:foreach(fun(Dir1) -> tidy_rpm_cache(Dir1, Confirm) end, Dir_list), | |||
ok. | |||
tidy_rpm_cache(Dir1, Confirm) -> | |||
case file:list_dir(Dir1) of | |||
{ok, File_list1} -> | |||
File_list2=lists:filter(fun(File1) -> | |||
string_ends_with(File1, ".rpm") or string_ends_with(File1, ".drpm") | |||
end, | |||
File_list1), | |||
File_list3=lists:sort(File_list2), | |||
Name_list1 = lists:map(fun(File1) -> | |||
%%Tokenize by . to get second last element as architecture | |||
Tokens1=string:tokens(File1, "."), | |||
Length = length(Tokens1), | |||
Architecture = lists:nth(Length - 1, Tokens1), | |||
Remaining1 = lists:sublist(Tokens1, Length-2), | |||
Remaining2 = string:join(Remaining1, "."), | |||
%%Tokenize remaining by - as first non-digit thing as version | |||
Tokens2 = string:tokens(Remaining2, "-"), | |||
{Name1, Version1} = lists:splitwith(fun(Current_token1) -> | |||
Char1=hd(Current_token1), | |||
(Char1 =< $0) or (Char1 >= $9) | |||
end, | |||
Tokens2), | |||
Name2=string:join(Name1, "-"), | |||
Version2=string:join(Version1, "-"), | |||
{File1, Name2, Version2, Architecture} | |||
end, | |||
File_list3), | |||
io:format("For ~p list is ~p~n", [Dir1, Name_list1]), | |||
lists:foldl(fun(Cur1, Prev1) -> | |||
Cur1_name = element(2, Cur1), | |||
Prev1_name = element(2, Prev1), | |||
if | |||
%%Current is newer version of Previous | |||
Prev1_name =:= Cur1_name -> | |||
Prev1_filename=((Dir1 ++ "/") ++ element(1, Prev1)), | |||
if | |||
Confirm =:= "yes" -> | |||
io:format("Deleting ~p~n", [Prev1_filename]), | |||
file:delete(Prev1_filename); | |||
true -> | |||
io:format("Will delete ~p on confirmation~n", [Prev1_filename]) | |||
end; | |||
%%Current and Previous are different packages | |||
true -> | |||
continue | |||
end, | |||
Cur1 | |||
end, | |||
{"", "", "", ""}, | |||
Name_list1); | |||
{error, Reason1} -> | |||
io:format("Cannot open dir ~p because of ~p~n", [Dir1, Reason1]) | |||
end. | |||
string_ends_with(String1, String2) -> | |||
Length2=length(String2), | |||
Length1=length(String1), | |||
Substr1=string:substr(String1, Length1-Length2+1, Length2), | |||
Substr1 =:= String2. | |||
</pre> | |||
==tidy-rpm-cache.py (previous rm_obsolete_rpms.py)== | |||
We can download latest version of tidy-rpm from internet and then use it to delete obsolete packages from yum-cahce. This script saves considerable disk-space and keeps only latest version of files in cache / repository. | We can download latest version of tidy-rpm from internet and then use it to delete obsolete packages from yum-cahce. This script saves considerable disk-space and keeps only latest version of files in cache / repository. |
Revision as of 05:57, 24 April 2014
<yambe:breadcrumb>Package management tools</yambe:breadcrumb>
Script to delete older versions of rpm files from cache
Both tidy_rpm_cache and delete_obsolete_rpm seem to have been removed from all download locations. Wierd!!. A simple escript which can achieve similar results is mentioned below. Steps for using the scripts are:
- Save the script as file "tidy_rpm_cache.escript"
- Set execute permissions (chmod +x) on file
- Install erlang (yum -y install erlang).
- Execute escript as root user with arguments "no" <dir> for obtaining list of files that would get deleted upon confirmation. Pipe output to less as the list could be long.
- Change argument "no" to "yes" to confirm and delete old packages. List of files deleted is printed.
#!/usr/bin/env escript %% Invoke as %% sudo tidy_rpm_cache.escript "yes" */packages %% from /var/cache/yum/x86_64/6/ folder %% main([Confirm | Dir_list]) -> lists:foreach(fun(Dir1) -> tidy_rpm_cache(Dir1, Confirm) end, Dir_list), ok. tidy_rpm_cache(Dir1, Confirm) -> case file:list_dir(Dir1) of {ok, File_list1} -> File_list2=lists:filter(fun(File1) -> string_ends_with(File1, ".rpm") or string_ends_with(File1, ".drpm") end, File_list1), File_list3=lists:sort(File_list2), Name_list1 = lists:map(fun(File1) -> %%Tokenize by . to get second last element as architecture Tokens1=string:tokens(File1, "."), Length = length(Tokens1), Architecture = lists:nth(Length - 1, Tokens1), Remaining1 = lists:sublist(Tokens1, Length-2), Remaining2 = string:join(Remaining1, "."), %%Tokenize remaining by - as first non-digit thing as version Tokens2 = string:tokens(Remaining2, "-"), {Name1, Version1} = lists:splitwith(fun(Current_token1) -> Char1=hd(Current_token1), (Char1 =< $0) or (Char1 >= $9) end, Tokens2), Name2=string:join(Name1, "-"), Version2=string:join(Version1, "-"), {File1, Name2, Version2, Architecture} end, File_list3), io:format("For ~p list is ~p~n", [Dir1, Name_list1]), lists:foldl(fun(Cur1, Prev1) -> Cur1_name = element(2, Cur1), Prev1_name = element(2, Prev1), if %%Current is newer version of Previous Prev1_name =:= Cur1_name -> Prev1_filename=((Dir1 ++ "/") ++ element(1, Prev1)), if Confirm =:= "yes" -> io:format("Deleting ~p~n", [Prev1_filename]), file:delete(Prev1_filename); true -> io:format("Will delete ~p on confirmation~n", [Prev1_filename]) end; %%Current and Previous are different packages true -> continue end, Cur1 end, {"", "", "", ""}, Name_list1); {error, Reason1} -> io:format("Cannot open dir ~p because of ~p~n", [Dir1, Reason1]) end. string_ends_with(String1, String2) -> Length2=length(String2), Length1=length(String1), Substr1=string:substr(String1, Length1-Length2+1, Length2), Substr1 =:= String2.
tidy-rpm-cache.py (previous rm_obsolete_rpms.py)
We can download latest version of tidy-rpm from internet and then use it to delete obsolete packages from yum-cahce. This script saves considerable disk-space and keeps only latest version of files in cache / repository.
To see list of obsolete RPMs inside a directory recursively and then get option of deleting obsolete RPMs use:
tidy-rpm-cache.py --dir=/var/cache/yum
Information on rm_obsolete_rpms
Normally yum packages are stored in sub-directories inside '/var/cache/yum' and they occupy lot of space. Multiple versions of updates / install files for same package can be present in yum cache which leads to wastage of hard-disk space. We may want to keep only the latest versions in cache so that we can copy cache to other machine and avoid re-download of package over internet. But for this we do not need older versions of packages.
Hence to selectively remove older versions of packages we can use 'rm_obsolete_rpms' python script.
If we use this script on 64-bit systems than it cannot understand that both 32-bit and 64-bit versions of package must be kept. Hence we can run the script as:
./rm_pbsolete_rpms -n 1 -d /var/cache/yum
so that on 64-bit systems last two version of packages are kept. In this case both 64-bit and 32-bit versions of package are left and only older versions are deleted from cache.