1

Есть кривой скрипт. Сам писал. Как бы его улучшить, что бы он подписывал сразу все пакеты, а не спрашивал пароль для каждого пакета?
Еще хочется что бы была проверка уже подписанных пакетов и подписывать только новые. Поможете?

#!/bin/bash

rep_i586="/var/www/html/packages.mageialinux.ru/mageia2/RPMS/i586/"
rep_x86_64="/var/www/html/packages.mageialinux.ru/mageia2/RPMS/x86_64/"
spisok_i586=`ls ${rep_i586}`;
spisok_x64=`ls ${rep_x86_64}`;

function gpg_i586(){
for rpmpkg586 in `echo $spisok_i586`
do
/usr/bin/expect << EOF
        spawn rpm --addsign $rep_i586$rpmpkg586
         expect "Введите ключевую фразу: " { send " \n" }
         expect "# " { send "q" }
        exit
EOF
done
}

function gpg_x86_64(){
for rpmpkg_x64 in `echo $spisok_x64`
do
/usr/bin/expect << EOF
        spawn rpm --addsign $rep_x86_64$rpmpkg_x64
         expect "Введите ключевую фразу: " { send " \n" }
         expect "# " { send "q" }
        exit
EOF
done
}

gpg_i586
gpg_x86_64
MX 23.6 Libretto x86_64
Чем больше я работаю админом, тем больше понимаю, насколько волшебна фраза - "Нет технической возможности!"

2

Вынеси запрос на ввод пароля из функции, запомни пароль в переменную, да и дело с концом. И там, где надо, подставляй. А перед началом процесса подписывания пройдись по списку циклом с rpm --checksig, и на основе этого формируй список неподписанных пакетов, который и скармливай функциям подписывания...

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

3 (14.04.2013 18:57:51 отредактировано XliN)

Окей попробую. Но я не силен в баше, хотя сделать точно надо. Буду стараться. Если что надеюсь на помощь форума. А может подскажите, пример кинете, как сделать? Понимаю что не айс просьба ))) Но все же.

Да и пароль пустой.

MX 23.6 Libretto x86_64
Чем больше я работаю админом, тем больше понимаю, насколько волшебна фраза - "Нет технической возможности!"

4

XliN пишет:

Да и пароль пустой.

Это rpm требует пароль? (немного непонятно, зачем тогда его спрашивать, если он пустой)
Ок, тогда чуток попозже -- нужно накатить что-нибудь rpm-based, чтобы отладить скрипт.

+ открыть спойлер

P.S. В Интернете я не так чтобы уж совсем щепетильно отношусь к обращению «ты»/«вы», так что можете ко мне и на «ты», да и вроде бы в одной команде работаем  ah

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

5 (14.04.2013 19:37:03 отредактировано XliN)

yars,
Проблема в том что rpm --addsign спрашивает ключевую фразу сразу после отработки. Из-за него и пришлось использовать expect.

Собственно скрипт рабочий. Хоть и для каждого пакета вводится пустой пароль, главное что в автомате. Подскажи как мне на него напустить именно те пакеты которые еще не подписаны?

MX 23.6 Libretto x86_64
Чем больше я работаю админом, тем больше понимаю, насколько волшебна фраза - "Нет технической возможности!"

6

Вот так он отрабатывает

spawn rpm --addsign /root/key/bmpanel2-2.1pre1-1.mrc.mga2.i586.rpm
Введите ключевую фразу: 
Ключевая фраза принята.
/root/key/bmpanel2-2.1pre1-1.mrc.mga2.i586.rpm:
предупреждение: /root/key/bmpanel2-2.1pre1-1.mrc.mga2.i586.rpm already contains identical signature, skipping
spawn rpm --addsign /root/key/bmpanel2-debug-2.1pre1-1.mrc.mga2.i586.rpm
Введите ключевую фразу: 
Ключевая фраза принята.
/root/key/bmpanel2-debug-2.1pre1-1.mrc.mga2.i586.rpm:
предупреждение: /root/key/bmpanel2-debug-2.1pre1-1.mrc.mga2.i586.rpm already contains identical signature, skipping
spawn rpm --addsign /root/key/key.sh
Введите ключевую фразу: 
Ключевая фраза принята.
/root/key/key.sh:
ошибка: /root/key/key.sh: not an rpm package
MX 23.6 Libretto x86_64
Чем больше я работаю админом, тем больше понимаю, насколько волшебна фраза - "Нет технической возможности!"

7

Сделал проверку на подпись. Не криво ли?

#!/bin/bash

rep_i586="/var/www/html/packages.mageialinux.ru/mageia2/RPMS/i586/"
spisok_i586=`ls ${rep_i586}`;
pass=" "


for rpmpkg586 in `echo $spisok_i586`
do
if  rpm --checksig $rep_i586$rpmpkg586
then
#               echo "Есть подпись!"
        echo $rpmpkg586 >> pkg_sig.log
else   
        echo "Нет подписи!"
        echo $rpmpkg586 >> pkg_no_sig.log
        /usr/bin/expect << EOF
                spawn rpm --addsign $rep_i586$rpmpkg586
                expect "Введите ключевую фразу: " { send " \n" }
                expect "# " { send "q" }
                exit
EOF
fi
done
MX 23.6 Libretto x86_64
Чем больше я работаю админом, тем больше понимаю, насколько волшебна фраза - "Нет технической возможности!"

8

Нормально, ИМХО. Я сам в bash не джедай ab

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

9

На всякий случай: нашёл у себя, как когда-то вводил пароль по запросу скрипта:

#!/bin/bash

/bin/echo -n -e "Enter password 9: .........\b\b\b\b\b\b\b\b\b"
read pssw
export pssw
echo $pssw

Пётр.

Пётр.

10

Если не ошибаюсь, rpm сам не подписывает, а вызывает для подписи gpg. После освоения gpg накатал такой скриптик:

+ открыть спойлер
#!/bin/bash
# Sign the packages in a specified directory.
# Written by yars, Tambovskaya oblast, Russia.
# <yars068@yandex.ru>
# Copyright 2012. All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

checkgpg()
{
    gpg --verify $1
}

funcgpg()
{
    echo -n "Enter passphrase: "
    read pass
    for file in `find $1 -name "*.txz"` ; do
    echo "Checking the signature of $file:"
    if [ ! `checkgpg "$file" 2>/dev/null` ] ; then 
        echo -n "Signature not found. Signing up package: $file: "
        gpg -ba --yes --no-tty --passphrase $pass $file 2>/dev/null 1>/dev/null && echo " Done."
    fi;
    done
}

# Checking for arguments are specified:
case $# in
    0) echo "Usage: $0 path-to-directory"
       exit 1;;
    *) funcgpg $1;;
esac

Еще немного допилить надо, чуть позже выложу окончательный вариант ab
UPD: пока так:

+ открыть спойлер
#!/bin/bash
# Sign or verify the signatures of packages in a directory.
# Written by Yaroslav Shmelev, Tambovskaya oblast, Russia.
# aka yars <yars068@yandex.ru>
# Copyright 2012. All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

set -e

SIGTYPE="asc"

checkgpg()
{
    if `gpg --verify  "$1" 2>/dev/null` ;then
    return 0
    else
    return 1
    fi;
}

funcgpg()
{
    echo -n "Enter passphrase: "
    read -s pass
    echo "Location of packages: $1."
    while read l ; do
    echo -n "Checking the signature of $(basename "$l")... "
    if ! `checkgpg "$l.$SIGTYPE" 2>/dev/null` ; then 
        echo "Signature not found."
        echo -n "Signing up package: $(basename "$l")... "
        gpg -ba --yes --no-tty --passphrase $pass "$l" 2>/dev/null 1>/dev/null && echo " Done."
    else
        echo "Already signed. Skipping." 
    fi;
    done < <( find $1 -name "*.txz" )
}

# Checking for arguments are specified:
case $1 in
    --sign)  shift
         if [ -d $1 ]; then 
         funcgpg $1
         fi;;
    --check) shift
         if [ -d $1 ]; then 
            echo "Location of packages is: $1."
            while read l; do
                echo -n "Checking: $(basename "$l")... "
                if `checkgpg "$l.$SIGTYPE"` ; then 
                echo " Signed"
                else 
                echo " Not signed."
            fi;
            done < <( find $1 -name "*.txz" );
         else
            echo "$1 isn't directory. Exiting."
         fi;;
    *)          echo "Usage: $0 --sign | --check path-to-directory"
         exit 0;;
esac

Наверное, тоже не самый оптимальный вариант, но он работает. Умеет проверять и подписывать пакеты...
Примеры:

+ подписываем
./signpackages.sh --sign soft/Linux/Packages/slackware-14.0/
Enter passphrase: 
Location of packages: soft/Linux/Packages/slackware-14.0/.
Checking the signature of gedit-3.4.2-i486-1_yars.txz... Signature not found.
Signing up package: gedit-3.4.2-i486-1_yars.txz...  Done.
Checking the signature of slim-1.3.4-i486-2_yars.txz... Signature not found.
Signing up package: slim-1.3.4-i486-2_yars.txz...  Done.
Checking the signature of network-manager-applet-0.9.8.0-i486-1_yars.txz... Signature not found.
Signing up package: network-manager-applet-0.9.8.0-i486-1_yars.txz...  Done.
Checking the signature of wxPython-2.8.12.1-i486-1_yars.txz... Signature not found.
Signing up package: wxPython-2.8.12.1-i486-1_yars.txz...  Done.
Checking the signature of MPlayer-1.0rc4-i486-1_yars.txz... Signature not found.
Signing up package: MPlayer-1.0rc4-i486-1_yars.txz...  Done.
Checking the signature of opera-12.00-i386-1_yars.txz... Signature not found.
Signing up package: opera-12.00-i386-1_yars.txz...  Done.
Checking the signature of flash-player-plugin-11.2_r270-i486-1_yars.txz... Signature not found.
Signing up package: flash-player-plugin-11.2_r270-i486-1_yars.txz...  Done.
Checking the signature of flash-player-plugin-11.2_r258-i486-1_yars.txz... Signature not found.
Signing up package: flash-player-plugin-11.2_r258-i486-1_yars.txz...  Done.
Checking the signature of opera-12.14-i386-1_yars.txz... Signature not found.
Signing up package: opera-12.14-i386-1_yars.txz...  Done.
Checking the signature of modem-manager-gui-0.0.15.4-i486-1_yars.txz... Signature not found.
Signing up package: modem-manager-gui-0.0.15.4-i486-1_yars.txz...  Done.
Checking the signature of xfce4-xkb-plugin-0.5.4.3-i486-1_yars.txz... Signature not found.
Signing up package: xfce4-xkb-plugin-0.5.4.3-i486-1_yars.txz...  Done.
Checking the signature of xfce4-genmon-plugin-3.4-i486-1_yars.txz... Signature not found.
Signing up package: xfce4-genmon-plugin-3.4-i486-1_yars.txz...  Done.
Checking the signature of xfce4-mailwatch-plugin-git20130427-i486-1_yars.txz... Signature not found.
Signing up package: xfce4-mailwatch-plugin-git20130427-i486-1_yars.txz...  Done.
+ проверяем
./signpackages.sh --check soft/Linux/Packages/slackware-14.0/
Location of packages is: soft/Linux/Packages/slackware-14.0/.
Checking: gedit-3.4.2-i486-1_yars.txz...  Signed
Checking: slim-1.3.4-i486-2_yars.txz...  Signed
Checking: network-manager-applet-0.9.8.0-i486-1_yars.txz...  Signed
Checking: wxPython-2.8.12.1-i486-1_yars.txz...  Signed
Checking: MPlayer-1.0rc4-i486-1_yars.txz...  Signed
Checking: opera-12.00-i386-1_yars.txz...  Signed
Checking: flash-player-plugin-11.2_r270-i486-1_yars.txz...  Signed
Checking: flash-player-plugin-11.2_r258-i486-1_yars.txz...  Signed
Checking: opera-12.14-i386-1_yars.txz...  Signed
Checking: modem-manager-gui-0.0.15.4-i486-1_yars.txz...  Signed
Checking: xfce4-xkb-plugin-0.5.4.3-i486-1_yars.txz...  Signed
Checking: xfce4-genmon-plugin-3.4-i486-1_yars.txz...  Signed
Checking: xfce4-mailwatch-plugin-git20130427-i486-1_yars.txz...  Signed
Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580