LinuxForum.Fans
Тема

Скрипт подписи пакетов

Автор: XliN 10 сообщений 4198 просмотров
#315188

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

text
#!/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

#315208

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

#315209

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

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

#315212
"XliN" написал:
Да и пароль пустой.

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

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

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

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

#315214

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

text
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
#315217

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

text
#!/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

#315226

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

#315242

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

text

#!/bin/bash

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

Пётр.

#317762

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

Показать
text
#!/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

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

Показать
text
#!/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

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

подписываем
text
./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.

проверяем
text

./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

Войдите или зарегистрируйтесь, чтобы ответить.