Ошибка пакета deb во время выполнения скрипта postinst bash

Я делаю bash-скрипт для пользовательских плагинов и конфигурации nagios, я использую эквивы для его простоты.

вот мой контрольный файл.

в разделе Files: я говорю файлам копировать себя по правильному пути.

Files: check_cpu_loadx /usr/lib/nagios/plugins
 check_ipmi_sensors /usr/lib/nagios/plugins
 check_libreoffice_count /usr/lib/nagios/plugins
 check_ram_per_user /usr/lib/nagios/plugins
 check_ram_usage2 /usr/lib/nagios/plugins
 check_ram_usage_percentage /usr/lib/nagios/plugins
 check_tcptraffic /usr/lib/nagios/plugins
 nrpe_custom.cfg /etc/nagios

в разделе postinst это скрипт bash, который используется для пост-установки

 File: postinst
     #!/bin/bash -e
     set -x
     echo 'configuring nrpe.conf file.'
     mv /etc/nagios/nrpe.cfg /etc/nagios/nrpe.original.backup
     mv /etc/nagios/nrpe_custom.cfg /etc/nagios/nrpe.cfg
     chmod -R +x /usr/lib/nagios/plugins
     echo 'Installing tcp-ip addon..'
     FLAG=0
     Interfaces=`ifconfig -a | grep -o -e "[a-z][a-z]*[0-9]*[ ]*Link" | perl -pe "s|^([a-z]*[0-9]*)[ ]*Link|\1|"`
     for Interface in $Interfaces; do
        INET=`ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$"`
        MASK=`ifconfig $Interface | grep -o -e "Mask:[^ ]*"      | grep -o -e "[^:]*$"`
        STATUS="up"
        #loopback
        if [ "$Interface" == "lo" ]; then
            continue
        fi
        #if eth is down
        if [ -z "$INET" ]; then
            continue
        fi
         #if eth ip not starts with 10. or 192.
        if [[ "$INET" == 10.* ]]
        then
            ActiveEth=$Interface;
            break
        elif [[ "$INET" == 192.* ]]
        then
        ActiveEth=$Interface;
            break
        else
            echo "Ethernet Selection Failed!Configure nrpe.cfg manually.Change tcp_traffic plugin paramethers according to your current ethernet.";
            FLAG=1
            break
        fi    
     done
     if [[ "$FLAG" == 0 ]]
     then
         echo 'Selected Ethernet :'$ActiveEth
         sed -i -e "s/eth0/$ActiveEth/g" /etc/nagios/nrpe.cfg
     fi
     echo 'nrpe.conf changed.'
     echo 'Nagios-nrpe-server restarting.'
     service nagios-nrpe-server restart
     echo 'IPMI modules are loading.'
     modprobe ipmi_devintf
     modprobe ipmi_msghandler
     echo "IPMI modules are added to startup."
     #echo "ipmi_si" >> /etc/modules
     echo "ipmi_devintf" >> /etc/modules
     echo "ipmi_msghandler" >> /etc/modules

проблема здесь, когда я скомпилировал его в пакет deb, я получил "подпроцесс, установленный после установки, скрипт возвращает статус выхода 1"

затем я добавил set -x для отладки. проблема заключается в настройке надстройки tcp-ip, есть некоторые машины, у которых есть более одной сетевой карты. Поэтому мне нужно выбрать ту, у которой IP-адрес начинается с 10. * или 192.*

во втором разделе есть строка INET=ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$", когда устройство Ethernet не имеет IP-адреса, grep возвращает значение null, а переменная INET становится нулевой, поэтому статус выхода процесса равен 1. после этой строки, когда я ввожу "$?" , там написано 1

поэтому проблема здесь в том, что когда я запускаю dpkg -i для установки этого пакета, скрипт bash завершает работу после того, как видит, что INET становится нулевым.

любая помощь будет оценена. Я новичок в этом bash.


person Eren Yagdiran    schedule 04.02.2013    source источник


Ответы (1)


если вы хотите убедиться, что команда bash всегда успешна, даже если последняя программа возвращает ненулевое значение, просто добавьте «самую последнюю» команду, которая будет успешной.

что-то типа

INET=$(/sbin/ifconfig eth0 | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$" || true)

здесь мы вызываем true (небольшая программа, которая всегда завершается успешно) каждый раз, когда grep терпит неудачу (|| означает OR и является способом объединения программ в цепочку в зависимости от состояния выхода предыдущей)

однако ваш сценарий имеет ряд недостатков:

  • ваше выражение grep «inet addr:» даст правильные результаты только в английской локали; например при работе в немецкой среде (LANG=de) вы могли получить такие строки, как inet Adresse: 192.168.7.10 (sic!)
  • вы безоговорочно перемещаете файлы; что произойдет, если этих файлов нет?
  • вы безоговорочно перемещаете файлы в /etc. /etc — это место, где системный администратор настраивает систему под свои нужды; вы не должны удалять или возвращать конфигурацию системного администратора. вам лучше задокументировать, как правильно настроить систему (чтобы системные администраторы могли сделать это сами); если вы настаиваете на «помощи» путем автоматической настройки системы, вам следует использовать что-то вроде debconf
  • вы предполагаете, что установлено много программного обеспечения, и что это программное обеспечение находится на вашем пути. вам, вероятно, следует использовать полные пути к двоичным файлам, которые вы используете, например. /sbin/ifconfig, а не просто ifconfig
person umläute    schedule 05.02.2013