Como faço para atrasar o sinal net-device-up do Upstart até que uma condição seja atendida?

1

Preciso esperar que uma condição específica seja atendida. Uma interface de rede é considerada "ativa". O Upstart está enviando seu sinal net-device-up antes que essa condição seja atendida, o que causa a falha dos scripts que dependem dessa condição. Como faço para atrasar o sinal net-device-up do Upstart até que uma condição seja atendida?

    
por cqcallaw 30.09.2012 / 03:38

1 resposta

2

Uma solução é colocar um script em /etc/network/if-up.d/ que é executado antes de qualquer outro script if-up.d e espera que uma condição específica seja atendida ou que ocorra um tempo limite. Por exemplo, aqui está um script para aguardar um endereço IPv6 não vinculado ao local em uma interface IPv6 configurada com o método "auto":

#!/bin/sh

LOG_FILE="/tmp/autoipv6.log"

if [ "$ADDRFAM" = "inet6" -a "$METHOD" = "auto" ]; then
        echo "Auto method detected, waiting for IP address" >> $LOG_FILE

        #wait until we have an IP address, or a timeout occurs
        TIMEOUT=50 #5 second timeout--each iteration sleeps for 1/10th of a second
        #get the number of addresses, excluding link-local addresses
        ADDRESS_COUNT='ip addr show dev eth0 | grep inet6 | grep -v fe80 | wc -l'

        until [ $TIMEOUT -eq 0 ]; do
                NEW_ADDRESS_COUNT='ip addr show dev eth0 | grep inet6 | grep -v fe80 | wc -l'

                # break out of the loop if more IPv6 addresses have been assigned
                # this is implementation is naive: no guarantee is given that the new addresses
                # are the result of the autoconfiguration request
                if [ "$NEW_ADDRESS_COUNT" -gt "$ADDRESS_COUNT" ]; then
                        echo "Detected new IP address, exiting" >> $LOG_FILE
                        ifconfig >> $LOG_FILE
                        exit 0;
                fi

                TIMEOUT=$((TIMEOUT-1))
                sleep .1
        done

        echo "Timeout waiting for IP address" >> $LOG_FILE
        exit 1;
fi

É importante que este script "wait-for-condition" seja executado antes do script if-up.d Upstart executado (o script Upstart if-up.d é onde os sinais net-device-up são gerados ). Os scripts if-up.d são executados por run-parts na ordem de classificação lexical ( na mesma ordem que a saída padrão do comando ls), então uma técnica simples para garantir a ordem é nomear o script "000wait-for-condition".

    
por cqcallaw 30.09.2012 / 03:38