Δημιουργία ενός virtual network interface δυναμικά

Giorgos Keramidas keramida at ceid.upatras.gr
Sat May 31 05:27:27 EEST 2008


On Fri, 30 May 2008 19:47:58 +0300, George Notaras <gnot at g-loaded.eu> wrote:
> Έστω ότι έχουμε το παρακάτω cronjob που τρέχει το 'vif-start' κάθε ένα
> λεπτό.
>
> */1 * * * * johndoe /etc/vif-start
>
>
> Τα περιεχόμενα του /etc/vif-start:
> -----------------------------------------
> #!/bin/sh
> VMUSER=$(/usr/bin/whoami)
> interface=$(sudo /usr/sbin/tunctl -b -u "$VMUSER")
> echo "Interface: $interface" >> /home/$VMUSER/test.log
> -----------------------------------------
>
> Κανονικά θα έπρεπε κάθε φορά που εκτελείται το script να:
>
> 1. Δημιουργεί ένα virtual network interface με όνομα tapN (όπου N ένας
>    αριθμός)
> 2. Να σώζει το όνομα του interface στο 'interface'
> 3. Να στέλνει το όνομα του interface στο: /home/johndoe/test.log
>
> Αυτό που συμβαίνει είναι να μην δημιουργείται κανένα tapN interface
> όταν το script εκτελείται μέσω _cron_, αλλά να **δημιουργείται**
> _κανονικά_ όταν εκτελείται από τον χρήστη johndoe απ'αυθείας.
>
> Παρατηρήσεις:
> - Προβλήματα με permissions δεν υπάρχουν.
> - Το /usr/sbin/tunctl βρίσκεται κανονικά στο /etc/sudoers ώστε να μην
> χρειάζεται password για το group 'vmusers', του οποίου μέλος είναι ο
> johndoe.
> - Το 'tunctl -b' έχει ως αποτέλεσμα να εκτυπώνεται το όνομα του
> δημιουργημένου interface στο stdout.
>
> Γιατί δεν παίζει από cron?

Το cron τρέχει τα scripts με 'περιορισμένο' environment, το οποίο έχει
σημαντικές διαφορές από ένα `standard login shell'.

Το καλύτερο που μπορείς να κάνεις σε τέτοια περίπτωση είναι να
παρακολουθείς *ΠΟΛΥ* προσεκτικά το return code από ΚΑΘΕ εντολή, και να
τυπώνεις μηνύματα λάθους στο stderr, για να σου στείλει τουλάχιστον
κάποιο είδος βοήθειας μέσω email το cron.

Οπότε αντί για ένα 'quick "έλα μωρέ, αφού παίζει" hack' σαν το script με
τις 3 γραμμές παραπάνω, βάλε αυτό στο cron job:

: #!/bin/sh
:
: progname=`basename "$0"`
:
: err()
: {
:         errcode="$1"
:         shift
:         if [ -z "${errcode}" ]; then
:                 errcode=1
:         fi
:         errmsg="$*"
:         if [ -n "${errmsg}" ]; then
:                 echo "${progname}: error: ${errmsg}" >&2
:         fi
:         err 1
: }
:
: vmuser=`whoami` || \
:     err 1 "whoami: cannot find current username"
:
: ifname=`sudo tunctl -b -u "${vmuser}"` || \
:     err 2 "tunctl: failed to create new interface"
:
: testlog="/home/${vmuser}/test.log"
: echo "Interface: ${ifname}" >> "${testlog}" || \
:     err 3 "${testlog}: cannot save interface name \`${ifname}' in logfile"

Οπότε:

  [1] Έλεγξε ότι το cron μπορεί να στείλει email.  Hint: ενας απλός
      τρόπος είναι να βάλεις στο crontab σου ένα script που κάνει:

        #!/bin/sh
        echo "Foo foo, akougomai kala?" >&2
        exit 1

      [1.1] Αν αυτό σου στείλει κανονικά email ότι «απέτυχε», είσαι ok.

      [1.2] Αν _δεν_ σου στείλει email, κάνε ότι ρυθμίσεις χρειάζονται
            για να παίζει σωστά το email delivery από το cron στο
            σύστημά σου.  Πολλές φορές το μόνο που έχεις ως εργαλείο για
            να δεις τι πήγε στραβά με ένα cron job είναι ένα email με το
            stderr του.

  [2] Βάλε το παραπάνω quoted script με το tunctl στο crontab.

Και περίμενε email :P



More information about the Linux-greek-users mailing list