Получите размер обновления с помощью команды yum

#awk #upgrade #yum

Вопрос:

Я хотел бы получить размер обновлений Linux с yum помощью .

Для apt я сделал это:

 `def get_upgradable() : #récupère la list des paquets
            command = "apt list --upgradable 2>/dev/null"
            process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, encoding='utf8')
            packages_name = []
            for out in process.stdout :
                if "/" in out :
                    packages_name.append(out[:out.index('/')])
            return packages_name

        def get_size(*args, return_somme=True) : #fait la somme du poids de chaque paquets
            command = "apt-cache --no-all-versions show {pkg} | grep "^Size" | cut -d' ' -f2"
            sizes = []
            somme = 0
            for pkg in args :
                size = int(
                    subprocess.Popen(command.format(pkg=pkg), shell=True, stdout=subprocess.PIPE, encoding='utf8'
                    ).stdout.read())
                sizes.append(size)
                somme  = size
            if return_somme : return somme
            return sizes

        somme=get_size(*get_upgradable())`
 

И я пробую это, но я не знаю, как получить только размер :

 yum check-update | awk '/S s [0-9]S s S / {print $1 }' > updates
 

Комментарии:

1. Эй, я опубликовал ответ, из вашего вопроса я понял, что нужно получить информацию о размере пакетов, как вы ясно упомянули об этом. Так что это может быть связано с обработкой текста. Вот почему мой ответ awk -это решение. Вам это помогает?

Ответ №1:

 # yes N | yum update | awk '{if($5=="k"||$5=="M") print $1,$4,$5}' > checksize.txt
 

Я посмотрел на распечатанный результат yum check-update команды, но там, похоже, не указан размер загрузки (обновления). Так что в основном;

  • yum update Вместо этого запустите, который выводит информацию о размере загрузки.
  • Затем N заранее отправьте ключ в запрос на подтверждение загрузки, чтобы избежать какой-либо загрузки.
  • if инструкция предназначена для того, чтобы избежать печати строк, которые не содержат информации о размере.
  • Чтобы напечатать только размер, кроме имен пакетов, просто удалите $1, команду «Печать».

ВЫВОД head и tail ):

 # cat -n checksize.txt | (head; tail)
     1  centos-linux-release 22 k
     2  kernel 5.9 M
     3  kernel-core 36 M
     4  kernel-modules 28 M
     5  PackageKit 599 k
     6  PackageKit-command-not-found 27 k
     7  PackageKit-glib 140 k
     8  PackageKit-gstreamer-plugin 17 k
     9  PackageKit-gtk3-module 18 k
    10  abattis-cantarell-fonts 156 k
   886  subscription-manager-rhsm-certificates 260 k
   887  cups-ipptool 5.8 M
   888  oddjob-mkhomedir 49 k
   889  openssh-askpass 92 k
   890  python3-html5lib 214 k
   891  python3-pexpect 138 k
   892  python3-tracer 123 k
   893  elfutils-debuginfod-client 65 k
   894  kpatch-dnf 17 k
   895  memstrack 48 k
 

Если вам нужен только общий размер загрузки:

 # yes N | yum update | awk -F": " '/^Total download size/{print $2}'
1.0 G
 

Комментарии:

1. Привет, спасибо, это мне помогло. Но на самом деле у меня не такой же результат.

2. С некоторыми изменениями это будет работать. Так что еще раз спасибо вам 🙂

3. @бастьен, каков результат при выполнении последней команды? Это ошибка корневых привилегий?

4. Я попробовал еще раз, и все работает так, как ожидалось. но это займет некоторое время, так что подождите еще немного

5. У меня нет вывода с последней командой. И просто : «Тайл : 951 М» с первым. Это ОС Redhat.

Ответ №2:

Поэтому мы с другом работаем над этим и обновляем решение. Напоминание : Я отправляю скрипт python на сервер, чтобы получить размер обновления.

 def get_upgradable() :
        if os.path.isfile("/usr/bin/apt"):
            command = "apt list --upgradable 2>/dev/null | cut -d'/' -f1"
        elif os.path.isfile("/usr/bin/yum"):
            #command = "yum check-update 2>/dev/null | grep ".x86_64" | cut -d' ' -f1"
            command="yum check-update | awk '/S s [0-9]S s S / {print $1 }'"
        else :
            raise PkgManager("Not found package manager")
            return None
        process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, encoding='utf8')
        packages_name = []
        for out in process.stdout :
            packages_name.append(out[:-1])
        return packages_name

def get_yum_size(*args, return_somme=True) :
    command = "yum info {pkg} | egrep "(Taille|Size)""
    factor = {"k" : 1000,
              "M" : 1000000,
              "G" : 1000000000}
    somme = 0
    sizes = []
    for pkg in args :
        lines = subprocess.Popen(command.format(pkg=pkg),
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf8',
                                ).stdout.readlines()
        infos = lines[-1][:-1].split(' ')
        size = float(infos[-2])*factor[infos[-1]]
        sizes.append(size)
        somme  = size
    if return_somme : return somme
    return sizes
 

Вы называете это с :

 def get_size(*args, **kwargs) :
    if os.path.isfile("/usr/bin/apt"):
        return get_apt_size(*args, **kwargs)
    elif os.path.isfile("/usr/bin/yum"):
        return get_yum_size(*args, **kwargs)
    else :
        raise PkgManager("Not found package manager")
 

И в основном :

 get_size(*get_upgradable())