Мы используем собственный репозиторий для пакетов Ubuntu, и мне нужен способ проверить, действительно ли репозиторий используется на каждой рабочей станции. Я могу использовать apt-cache policy|grep 'our-repository-address'
, но некоторым моим коллегам это не нравится из-за "grep". Им это кажется ненадежным хаком... Есть ли другой способ для этой проверки или apt-cache policy|grep 'our-repository-address'
он вполне стандартный?
решение1
Вам необходимо проверить каждый пакет, предоставленный репозиторием, по отдельности.
Если пакет является только локальной пересборкой и строка версии такая же, как в другом репозитории, вам необходимо вручную проверить md5sums в/var/lib/dpkg/info/ПАКЕТ.md5sums(если пакет ничего не компилирует и структуры репозитория не различаются, то нет возможности уточнить происхождение).
Если строки версий отличаются, вы можете использовать следующий фрагмент кода:
#!/usr/bin/python
# Check original repository of installed packages from list.
# Usage: script PACKAGELIST
import apt
import sys
import re
# set values for local repository
component = "main"
archive = "experimental"
origin = "Debian"
label = "Debian"
site = "ftp.debian.org"
def main():
try:
pkglist = []
f = open(sys.argv[1], "r")
for line in f:
if re.match('^Package: ', line):
pkglist.append(re.sub('^Package: ', '', line).rstrip('\n'))
f.close()
cache = apt.Cache()
for package in pkglist:
pkg = cache[package]
# check if package is installed
if not pkg.installed:
continue
if pkg.installed.origins[0].component != component or \
pkg.installed.origins[0].archive != archive or \
pkg.installed.origins[0].origin != origin or \
pkg.installed.origins[0].label != label or \
pkg.installed.origins[0].site != site:
print package
#continue
#else:
# print package + " is in repo."
except KeyboardInterrupt:
print "\nShutdown requested...exiting"
except Exception, e:
sys.stderr.write("An unecpected exeption was encountered: %s" % str(e) + "\n")
sys.exit(1)
if __name__ == "__main__":
main()
Использование, script PACKAGELIST
например:
script /var/lib/apt/lists/ftp.debian.org_debian_dists_experimental_main_binary-amd64_Packages
Вам также необходимо настроить компонент, архив, ... для вашего локального архива (см. соответствующий файл выпуска в разделе /var/lib/apt/lists
).
Если пакет установлен, но не из вашего репозитория, вы получите имя пакета. Если нет, то все в порядке.
решение2
Я предполагаю, что вы уже знаете, что если вы хотите, чтобы ваш репозиторий использовался вместо репозитория Ubuntu по умолчанию, вам следует поместить строку вашего репозитория в начало файла /etc/sources.list
.Вот вопрос и ответпо этой теме.
Если вы уже поместили свой репозиторий в начало файла «sources.list», вы можете проверить, используется ли установка пакета с помощью --print-uris
switch в apt-get
команде, как показано ниже:
sudo apt-get install scribes --print-uris
Эта команда возвращает следующий результат на моей машине(У меня также есть небольшой локальный репозиторий)
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
python-gtksourceview2
Suggested packages:
libgtksourceview2.0-dev
The following NEW packages will be installed:
python-gtksourceview2 scribes
0 upgraded, 2 newly installed, 0 to remove and 634 not upgraded.
Need to get 0 B/1,191 kB of archives.
After this operation, 8,954 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
'file:/media/Main/Linux-Software/Ubuntu/Precise/./precise-debs/python-gtksourceview2_2.10.1-2build1_i386.deb' python-gtksourceview2_2.10.1-2build1_i386.deb 90224 MD5Sum:3db673894b791f8843c3b0dcd8958e38
'file:/media/Main/Linux-Software/Ubuntu/Natty/natty/./scribes_0.4~r910-0ubuntu2_all.deb' scribes_0.4~r910-0ubuntu2_all.deb 1100712 MD5Sum:6555b7060ecd662fe1597724e9846b9c
Последние две строки четко указывают на репозиторий, используемый для двух необходимых файлов.
Надеюсь, это поможет кому-то в решении вашей проблемы.