инфо о репах на bash (/etc/apt/sources.list.d/)
Первый раз написал на баш что-то длиннее пары строк, помогите пожалуйста найти ошибки и прочие моветоны..
Общий смысл работы скрипта:
- информация о том, какие репы из списка /etc/apt/sources.list.d/*.list реально используются (список установленных пакетов из данного репозитория)
- информация о том, какие репы из списка /etc/apt/sources.list.d/*.list устарели и не используются
- информация о том, какие репы из списка /etc/apt/sources.list.d/*.list не могут быть использованы (список пакетов пуст или строка deb закомментирована)
Для работы требуются права на чтение /etc/apt/sources.list.d/*.list и /var/lib/apt/lists/*
#!/usr/bin/env bash
DPKG_L="$(dpkg -l)"
INSTALLED=$(echo "$DPKG_L" | sed '1,+6d' | cut -c 5-51)
INSTALLED_VERSIONS=($(echo "$DPKG_L" | sed '1,+6d' | cut -c 52-108))
for FILE in /etc/apt/sources.list.d/*.list
do
echo $(basename $FILE)
FILE_LINE=$(grep '^deb ' "$FILE")
if [[ $FILE_LINE == "" ]]
then
echo -e "\t" DISABLED
continue
fi
PACKAGES_CACHE_FILE=/var/lib/apt/lists/$(echo $FILE_LINE | sed 's|/|_|g; s|deb http:__\([^ ]*\) \([^ ]*\) \([^ ]*\).*|\1_dists_\2_\3_binary-amd64_Packages|; s|_\+|_|g;')
if [[ $(echo $PACKAGES_CACHE_FILE | wc -w) > 1 ]]
then
PACKAGES_CACHE_FILE=/var/lib/apt/lists/$(echo $FILE_LINE | sed 's|/|_|g; s|deb http:__\([^ ]*\) \([^ ]*\).*|\1_\2_Packages|; s|_\+|_|g;')
fi
PACKAGES=($(grep ^Package: "$PACKAGES_CACHE_FILE" | cut -f 2 -d ' '))
PACKAGES_VERSIONS=($(grep ^Version: "$PACKAGES_CACHE_FILE" | cut -f 2 -d ' '))
FROM_CURRENT=''
FROM_OTHER=''
NOT_INSTALLED=''
PACKAGE_KEY=-1
for PACKAGE in ${PACKAGES[*]}
do
PACKAGE_KEY=$[$PACKAGE_KEY+1]
PACKAGE_INSTALLED=$(echo "$INSTALLED" | grep -w -n $PACKAGE)
if [[ $PACKAGE_INSTALLED == "" ]]
then
if [[ $(echo $NOT_INSTALLED | wc -w) < 5 ]]
then
NOT_INSTALLED="$NOT_INSTALLED $PACKAGE"
fi
continue
fi
PACKAGE_INSTALLED_KEY=$[$(echo $PACKAGE_INSTALLED | sed -n 's/\([^:]\+\).*/\1/p') - 1]
if [[ ${PACKAGES_VERSIONS[$PACKAGE_KEY]} == ${INSTALLED_VERSIONS[$PACKAGE_INSTALLED_KEY]} ]]
then
FROM_CURRENT="$FROM_CURRENT $PACKAGE"
if [[ $(echo $FROM_CURRENT | wc -w) < 5 ]]
then
continue
fi
break
fi
if [[ $(echo $FROM_OTHER | wc -w) < 5 ]]
then
FROM_OTHER="$FROM_OTHER $PACKAGE"
fi
done
echo -e -n "\t "
if [[ $(echo $FROM_CURRENT | wc -w) != 0 ]]
then
echo -e "\t \t\t\t $FROM_CURRENT"
continue
fi
if [[ $(echo $FROM_OTHER | wc -w) != 0 ]]
then
echo -e "OBSOLETE \t\t\t $FROM_OTHER"
continue
fi
if [[ $(echo $NOT_INSTALLED | wc -w) != 0 ]]
then
echo -e "NOT INSTALLED \t\t\t $NOT_INSTALLED"
continue
fi
echo -e "NO PACKAGES"
done
Результат работы, в консоли правда поровнее чем на форуме:
[aslok@3r]2011.04.14-02:18:20:~$ aptrepotree
amule-trunk-ppa-maverick.list
amule-common amule amule-utils amule-utils-gui
andrew-crew-kuznetsov-xneur-stable-maverick.list
DISABLED
atareao-atareao-maverick.list
picapy
debfx-virtualbox-maverick.list
NOT INSTALLED virtualbox-ose virtualbox-ose-dbg virtualbox-ose-fuse virtualbox-ose-guest-utils virtualbox-ose-guest-x11
gnome3-team-gnome3-maverick.list
NO PACKAGES
hydr0g3n-ppa-maverick.list
DISABLED
kubuntu-ppa-beta-maverick.list
amarok-common amarok-utils amarok libmygpo-qt1
kubuntu-ppa-ppa-maverick.list
OBSOLETE jovie kmag kmousetool kcron kdeadmin
openoffice-pkgs-ppa-maverick.list
NO PACKAGES
opera.list
opera
rarewares.org.list
NOT INSTALLED cpp-3.0 g++-3.0 gcc-3.0 gcc-3.0-base libcurl2
ripps818-coreavc-maverick.list
mplayer
tuxonice-ppa-maverick.list
OBSOLETE linux-headers-2.6.35-27 linux linux-source linux-image linux-source-2.6.35
webupd8team-y-ppa-manager-maverick.list
y-ppa-manager yad ppa-purge
[aslok@3r]2011.04.14-02:19:32:~$