OSX Server: Switch fault tolerance m.b.v. bash script

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Hi allen,

Momenteel ben ik bezig met het bouwen van een script t.b.v. switch fault tolerance binnen OSX server. Mogelijk zou dit topic ook onder PNS/ASD kunnen vallen, echter betreft het een non-windows OS, dus probeer ik het eerst hier.

Binnen ons bedrijf hebben wij een tweetal OSX servers welke indesign documenten genereren. Deze servers zijn verbonden met een tweetal switches (Dell Powerconnect 6248's). Binnen OSX heb je helaas enkel de mogelijkheid om de twee aanwezige ethernet adapters in een LAG (bond) te zetten, laat het nu zo zijn dat een LAG verdeeld over 2 switches niet mogelijk is.

In mijn zoektocht naar een oplossing om ethernet failover te realiseren ben ik het volgende artikel tegen gekomen. Helaas betreft dit een oude oplossing, welke in OSX 10.6.4 niet meer werkt. Nu komen we dus uit op een scripte oplossing. De volgende oplossing heb ik geschreven, echter zitten er nog een aantal haken en ogen aan:

- Fout gevoelig.
- Scripting niet de voorkeur voor kritische handelingen.
- Geen output buiten de server (oplosbaar).
- Elif regex op packet loss is erg kort door de bocht.
- Wat te doen bij twee inactive adapters.

Het betreft het volgende script:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/bin/bash

##############################################################################################################
#
# Declare server settings
#
    SERVER_NAME=$HOSTNAME
    SERVER_IP="192.168.1.171"
    SERVER_MASK="255.255.255.0"
    SERVER_GW="192.168.1.254"
    SERVER_DNS="192.168.0.31 192.168.0.32 192.168.0.33"
    SERVER_SD="domain.local"
#
##############################################################################################################

# Start
/usr/bin/logger "$SERVER_NAME: NicFailover: Start. `/bin/date`."

# Get active adapter
ACTIVE_ETH=`/sbin/ifconfig -a | grep -B 2 -A 2 "inet $SERVER_IP" | grep -o -w en[[:digit:]] | cut -c 1-3`
# Set standby adapter
if [ "$ACTIVE_ETH" = "en0" ]; then
    STANDBY_ETH="en1"
elif [ "$ACTIVE_ETH" = "en1" ]; then
    STANDBY_ETH="en0"
else
    ACTIVE_ETH="error"
    STANDBY_ETH="error"
# Log results
/usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: No active adapter was found. `/bin/date`."
fi

# Set OS adapter names
if [ "$ACTIVE_ETH" = "en0" ]; then
    ACTIVE_ETHNAME="Ethernet 1"
    STANDBY_ETHNAME="Ethernet 2"
elif  [ "$ACTIVE_ETH" = "en1" ]; then
    ACTIVE_ETHNAME="Ethernet 2"
    STANDBY_ETHNAME="Ethernet 1"
else
    ACTIVE_ETHNAME="error"
    STANDBY_ETHNAME="error"
# Log results
/usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: OS adapter names cannot be determined. `/bin/date`."
fi

if [ "$ACTIVE_ETH" != "error" ] or [ "$ACTIVE_ETHNAME" != "error" ]; then
    # Log results
    /usr/bin/logger "$SERVER_NAME: NicFailover: Current active adapter is $ACTIVE_ETHNAME ($ACTIVE_ETH), standby adapter is $STANDBY_ETHNAME ($STANDBY_ETH). `/bin/date`."

    # Check network connectivity
    /usr/bin/logger "$SERVER_NAME: NicFailover: Testing current active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) against $SERVER_GW. `/bin/date`."
    TEST_COMMAND=`ping -c 10 $SERVER_GW | grep '0.0% packet loss' | cut -c 46-61`

    # Process results
    if [ "$TEST_COMMAND" = "0.0% packet loss" ]; then
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is fully functional ($TEST_COMMAND). Nothing to do. `/bin/date`."
        # End
        /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
        exit 0
    elif [[ "$TEST_COMMAND" =~ [1-9] ]]; then
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) detected packet loss ($TEST_COMMAND). Switching to standby adapter $STANDBY_ETHNAME ($STANDBY_ETH). `/bin/date`."

        # Disable current active adapter
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off. `/bin/date`."
        /usr/sbin/networksetup -setnetworkserviceenabled "$ACTIVE_ETHNAME" off

        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Former active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is now disabled and inactive. `/bin/date`"

        # Enable current standby adapter
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$STANDBY_ETHNAME\" on. `/bin/date`."
        /usr/sbin/networksetup -setnetworkserviceenabled "$STANDBY_ETHNAME" on
        sleep 3

        # Set IP address
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setmanual \"$STANDBY_ETHNAME\" $SERVER_IP $SERVER_MASK $SERVER_GW. `/bin/date`."
        /usr/sbin/networksetup -setmanual "$STANDBY_ETHNAME" $SERVER_IP $SERVER_MASK $SERVER_GW

        # Set DNS servers
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setdnsservers \"$STANDBY_ETHNAME\" $SERVER_DNS. `/bin/date`."
        /usr/sbin/networksetup -setdnsservers "$STANDBY_ETHNAME" $SERVER_DNS

        # Set search domains
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setsearchdomains \"$STANDBY_ETHNAME\" $SERVER_SD. `/bin/date`."
        /usr/sbin/networksetup -setsearchdomains "$STANDBY_ETHNAME" $SERVER_SD

        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Former standby adapter $STANDBY_ETHNAME ($STANDBY_ETH) is now enabled and active. `/bin/date`"

        # End
        /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
        exit 0
    else
        # Something is wrong, check the output of the different grep commands
        # Results from ping / grep where not "0.0% packet loss" and did not contain any numbers
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: Unable to determine networking state. Check TEST_COMMAND output. `/bin/date`."
        # End
        /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
        exit 1
    fi
else
    # Something is wrong, check the output of the different grep commands
    # Results from ifconfig / grep where not an adapter name
    # Log results
    /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: Unable to determine adapter state. Check ACTIVE_ETH output. `/bin/date`."
    # End
    /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
    exit 1
fi


Graag hoor ik van jullie welke suggesties er nog zijn. Ook vraag ik me af hoe jullie over een bepaald scenario denken. De werking van het script is als volgt (globaal):

- Check via ifconfig / grep welke adapter actief is.
- Bepaal a.d.h.v. de output welke adapter standby is.
- Ping de gateway van de actieve adapter 10 keer.
- Grep op de output, onderneem actie indien nodig.
- Indien de output niet begrepen wordt, doe niets.

Opzich werk het script naar behoren, indien er een link is, maar geen verkeer mogelijk, wordt de tweede adapter actief gemaakt. In de volgende loop zal deze gechecked worden.

Wanneer er echter geen link meer is (switch geheel dood / uit), worden beide adapters op inactive gezet door OSX, hierdoor kan de actieve adapter niet bepaald worden. Dit wordt afgevangen en gelogd in het script (eerste 2 if's), echter vraag ik mij af wat voor een actie ik hierop het beste kan ondernemen.

Het is in dit stadium voor het script niet meer mogelijk te bepalen welke adapter actief is / was, en zodoende weet het script niet welke adapter hierna geactiveerd moet worden. Hoe zouden jullie dit aanpakken? Ik kan simpelweg de eerste adapter actief maken / test / ok = niets doen, indien niet ok tweede adapter zelfde riedeltje, is echter imho niet de mooiste oplossing.

Wie heeft er hier nog ideeen / suggesties / opmerkingen? Alles is welkom!

[ Voor 3% gewijzigd door wasted247 op 10-08-2010 20:34 ]


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
NOS > ASD, aangezien het over OSX gaat.

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Toch wel... Aight, thnx...

Acties:
  • 0 Henk 'm!

  • rvtk
  • Registratie: Juni 2001
  • Laatst online: 14:24
Ik snap wat je wilt, maar wat is uberhaupt de kans dat 1 van de 2 switches de geest geeft?

En zijn de 2 OSX server replica's van elkaar of genereren ze allebei verschillende documenten?
(als ze alle 2 hetzelfde doen, dan heb je natuurlijk geen fault tolerance nodig, je systeem zal blijven werken, helaas op enkele snelheid.)

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
De kans is nihil, maar dat is natuurlijk geen reden om een enterprise omgeving maar niet redundant uit te voeren. Als dat mijn insteek was geweest had ik mijn bureau wel een stuk eerder kunnen opruimen :)

Het zijn geen replica's van elkaar, de diverse diensten die beide leveren staan los van elkaar, en zijn daarnaast in mijn ogen niet relevant in het bovenstaande verhaal. Daarnaast is het natuurlijk zo, dat wanneer 1 switch uitvalt, de 2e server ook down is, die hangt immers ook aan dezelfde switch (ok, hiervoor kun je ze weer gekruisd op de switches aansluiten, maar netjes is anders). In een later stadium zullen er meer servers bijkomen, welke samen via custom software aangestuurd worden om jobs te verdelen cq. te laten genereren. Op dit moment betreft het een development server en een productie server.

Nu kan ik ze op de 2e switch een ander ip geven, probleem opgelost. Wat ik echter wil, is een bestaande techniek gebruiken die hiervoor bedoeld is. Dat de dames en heren bij Apple niet de moeite hebben genomen dit zelf te implementeren, tsja.

Voor de beeldvorming, het betreft een tweetal servers in een datacenter, binnen een omgeving welke volledig redundant is (firewall, ethernet, ac, servers, fiber, san). Zoals je uit de eerdere opmerking begrijpt zullen ook de OSX servers t.z.t. in 'pools' gaan draaien, echter zitten we op dit moment in de begin fase van het desbetreffende project.

Je begrijpt dat ik echter op zoveel mogelijk niveau's storingen wil afvangen, zo ook op ethernet niveau binnen de OSX servers. Eerlijk gezegd was ik behoorlijk verbaasd dat Apple enkel de mogelijkheid bied een LAG aan te maken, nog verbaasder was ik over het feit dat niemand hier eerder iets op verzonnen heeft (vast wel, ik kan het iig niet vinden).

Acties:
  • 0 Henk 'm!

  • mieJas
  • Registratie: April 2005
  • Niet online

mieJas

Ja, maar nee.

Geen mogelijkheid om van die 2 PowerConnects 1 logische switch te maken?

Misschien heb je hier iets aan: http://www.afp548.com/article.php?story=kicker

Yes, but no.


Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Nope, dan zijn de switches niet meer onafhankelijk. Dat doet het hele redundante opzetje een beetje teniet. Het artikel wat je aankaart staat ook in de TS. Die werkt niet onder OSX 10.6.4.

Acties:
  • 0 Henk 'm!

  • mcmd
  • Registratie: December 2004
  • Laatst online: 18:45
Afgezien van functionaliteit,wel wat commentaar op bash stijl:
* in de script worden vele externe programmas met volledig pad gegeven,maar niet allemaal. Ik zou PATH variabele zetten en overal het volledig pad weglaten.
* indent stijl is niet consequent. Voor commentaar introduceer je ook nog een extra indent niveau, dan wordt al snel de code minder goed leesbaar.
* ik zou de if/elif met de bijhorende then op 1 regel houden, iets als:
# Set standby adapter
if [ "$ACTIVE_ETH" = "en0" ]; then
STANDBY_ETH="en1"

elif [ "$ACTIVE_ETH" = "en1" ]; then
STANDBY_ETH="en0"

else
ACTIVE_ETH="error"
STANDBY_ETH="error"
# Log results
logger "$SERVER_NAME: NicFailover: ERROR: No active adapter was found. `date`."
fi

* de exit code wordt op 0 gezet bij "something is wrong". Dat zou >0 moeten zijn!
* ik zou de exit codes van de externe programma's op zijn minst analyseren. B.v.:

networksetup -setdnsservers "$STANDBY_ETHNAME" $SERVER_DNS || logger "networksetup problem"

eventueel zelfs stoppen!

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Kijk, hier heb ik wat aan, dank, ik zal wat aanpassingen doorvoeren. Nogmaals, ik moet hier ook even inkomen. Als er manieren zijn om het netter te doen, ofwel simpeler, hoor ik het graag! Wel is het zo da bvb indents en waar die horen vrij persoonlijk zijn, ik vindt em bijzonder prettig lezen.

Betreffende de exit codes, hier heb ik idd nog niets mee gedaan, er zit nog geen error afhandeling achter de diverse commando's, valide punt dus. Exit 0 heb ik klakkerloos gekopieerd, op meerdere plaatsen. Hier zal ik me zeker nog even in verdiepen.

Edit: E.e.a. aangepast aan de indents en exit codes. Paden e.d. kijk ik morgen naar. Meer suggesties zijn overigins welkom, ook over de functionaliteit. Zoals eerder genoemd mist er nog een stukje; wat te doen bij geen link.

[ Voor 51% gewijzigd door wasted247 op 10-08-2010 20:28 ]


Acties:
  • 0 Henk 'm!

  • tafkaw
  • Registratie: December 2002
  • Laatst online: 10:23
Kun je niet een sync tool de twee folders/disks met files laten syncen? Uiteindelijk is dat hetgeen wat je wilt toch? Zorgen dat op beide servers hetzelfde staat.

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Gr0wLiThE schreef op dinsdag 10 augustus 2010 @ 21:20:
Kun je niet een sync tool de twee folders/disks met files laten syncen? Uiteindelijk is dat hetgeen wat je wilt toch? Zorgen dat op beide servers hetzelfde staat.
Errhhmm, nee. Waar haal je dat uit? Ik wil de ethernet nics laten failoveren (beide servers hangen aan een SAN via xSan, shared storage is er dus ook ;) heeft echter niets met de bovenstaande vraag te maken).

[ Voor 5% gewijzigd door wasted247 op 10-08-2010 21:33 ]


Acties:
  • 0 Henk 'm!

  • shytah
  • Registratie: Maart 2004
  • Laatst online: 27-01 12:04
Wellicht dat je hier iets aan hebt.

Je zegt dat je gebruik maakt van bonded ethernet adapters. Als ik het goed begrijp heb je in elke servers 2 ethernet adapters.

Als ik je verhaal zo lees wil je in eerste instantie gebruik maken van 2 servers met 2 actieve ehternet adapters die verbonden zijn met 2 switches. Een soort link aggregation, maar dan met 2 switches.

Hiervoor zijn wel oplossingen.

Echter wat wellicht ook een optie is om een 2-tal ethernet adapters in een active/backup situatie te laten draaien.

ik heb momenteel een 2-tal linux servers draaien met 3 netwerkkaarten elk waarvan er 2 zijn bonded. Er is telkens maar 1 ethernet adapter van deze bonded interface actief. Elk van de adapters is verbonden met 1 switch. Mocht 1 switch uitvallen, dan wordt afhankelijk van de situatie de andere ethernet adapter gebruikt die weer verder communiceert met de andere switch.

Ik weet niet precies wat de achterliggende gedachte is. Maar ethernet failover heeft natuurlijk alleen zin als al de apparaten in het netwerk met een 2tal ethernet adapters is uitgevoerd en op allebei de switches is verbonden. (correct me if I'm wrong)

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Arosf schreef op dinsdag 10 augustus 2010 @ 21:47:
Wellicht dat je hier iets aan hebt.

Je zegt dat je gebruik maakt van bonded ethernet adapters. Als ik het goed begrijp heb je in elke servers 2 ethernet adapters.

Als ik je verhaal zo lees wil je in eerste instantie gebruik maken van 2 servers met 2 actieve ehternet adapters die verbonden zijn met 2 switches. Een soort link aggregation, maar dan met 2 switches.

Hiervoor zijn wel oplossingen.

Echter wat wellicht ook een optie is om een 2-tal ethernet adapters in een active/backup situatie te laten draaien.

ik heb momenteel een 2-tal linux servers draaien met 3 netwerkkaarten elk waarvan er 2 zijn bonded. Er is telkens maar 1 ethernet adapter van deze bonded interface actief. Elk van de adapters is verbonden met 1 switch. Mocht 1 switch uitvallen, dan wordt afhankelijk van de situatie de andere ethernet adapter gebruikt die weer verder communiceert met de andere switch.

Ik weet niet precies wat de achterliggende gedachte is. Maar ethernet failover heeft natuurlijk alleen zin als al de apparaten in het netwerk met een 2tal ethernet adapters is uitgevoerd en op allebei de switches is verbonden. (correct me if I'm wrong)
toon volledige bericht
Exact wat ik wil, waar ik ook op doel met failover. Echter, OSX server ondersteunt dit niet. Momenteel staan de adapters dan ook niet in een bond, dit omdat ik ze dan enkel in Link Aggragation kan zetten, link aggragation is weer beperkt tot een enkele switch.

Met het script in de TS maak ik zelf een failover config. Wat ik eigenlijk wilde is een van de onderstaande instellingen cq. bond modus:

- Adapter Fault Tolerance (AFT)
- Switch Fault Tolerance (SFT)
- Adaptive Load Balancing (ALB) (Hetzelfde als de bovenstaande opties, enkel kunnen er hierbij wel 2 adapters actief zijn)

Echter zijn deze binnen OSX geen van alle beschikbaar. Met het script doe ik hetzelfde, huidige adapter geen connectiviteit, maak de andere adapter actief met dezelfde gegevens. Het script zal middels lingon iedere 60 seconden aangeroepen worden.

Het is dan ook niet dat ik niet weet wat ik wil, maar meer hoe ik het ga realiseren. Ik heb meerdere servers in deze omgeving op dezelfde manier draaien, echter zijn dit windows of esx hosts.

[ Voor 10% gewijzigd door wasted247 op 10-08-2010 22:54 ]


  • Liegebeest
  • Registratie: Februari 2002
  • Laatst online: 17:11
Ben wel benieuwd naar deze discussie! Wat je wil ruikt heel erg als wat we binnen Solaris kennen als "IPMP": IP MultiPathing: bindt twee NICs aan elkaar als een virtuele NIC en als een van de paden uitvalt gebruik je automatisch de andere.

Een goede vriend van me heeft indertijd een groot OS X server park beheerd en was toen ook op zoek naar een dergelijke oplossing voor OS X. Hij kwam net zo ver als jij: als beide paden over de zelfde switch lopen werkt het wel, maar anders niet. Hij had dan ook een aantal hot standby switches in het rack hangen.

Jammer dat het niet anders kan! Ben benieuwd of vriend Apple daar ooit iets anders op verzint! :)

EDIT:
Wat betreft jouw oplossing, ik had't anders gedaan. Een script elke 60 seconden draaien is wat viezig. Ik had zelf gekeken naar het afvangen van een SNMP trap die verzonden wordt zodra een van de NICs onderuit gaat. Dan ben je er veel sneller bij dan binnen een minuut en bovendien verspil je geen resources (hoe weinig het ook is voor zo'n klein scriptje).

[ Voor 21% gewijzigd door Liegebeest op 12-08-2010 08:21 ]

Liege, liege, liegebeest!


  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Kijk, hij heeft het ook niet (netjes) op kunnen lossen?

Zoals ik mn TS al aanhaal ben ik ook geen fan van deze oplossing. De in de TS aangehaalde link deed het mooier, namelijk op IPv4 status changes. Echter werkt dit momenteel (OSX 10.6.4) niet meer. Ik had een tijdje terug een alternatief, welke ook reageerde op status veranderingen.

De suggestie voor SNMP zal ik bekijken, het is sowieso mooier om aan de hand van een gebeurtenis de failover te initiëren. Echter zal ik me nog even wat verder moeten verdiepen in OSX, dit zijn de eerste 2 xservers welke ik beheer. Mijn ervaring met OSX is dus nihil.

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Schopje naar boven... Niemand suggesties?

Acties:
  • 0 Henk 'm!

  • wasted247
  • Registratie: Oktober 2006
  • Laatst online: 18-12-2024
Update:

Ik heb mijn script als volgt aangepast:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
##############################################################################################################
#
# Declare server settings
#
    SERVER_NAME=$HOSTNAME
    SERVER_IP="192.168.1.171"
    SERVER_MASK="255.255.255.0"
    SERVER_GW="192.168.1.254"
    SERVER_DNS="192.168.0.31 192.168.0.32 192.168.0.33"
    SERVER_SD="domain.local"
#
##############################################################################################################

##############################################################################################################
#
# Setup error handeling
#
function error() {
  local PARENT_LINENO="$1"
  local MESSAGE="$2"
  local CODE="${3:-1}"
  if [[ -n "$MESSAGE" ]] ; then
    echo "$SERVER_NAME: NicFailover: ERROR: Error on or near line ${PARENT_LINENO}: ${MESSAGE}; exiting with status ${CODE}"
  else
    echo "$SERVER_NAME: NicFailover: ERROR: Error on or near line ${PARENT_LINENO}; exiting with status ${CODE}"
  fi
  exit "${CODE}"
}
trap 'error ${LINENO}' ERR
#
##############################################################################################################

# Start
/usr/bin/logger "$SERVER_NAME: NicFailover: Start. `/bin/date`."
# Get active adapter
ACTIVE_ETH=`/sbin/ifconfig -a | grep -B 2 -A 2 "inet $SERVER_IP" | grep -o -w en[[:digit:]] | cut -c 1-3`
if [ "$ACTIVE_ETH" = "en0" ]; then
    STANDBY_ETH="en1"
elif [ "$ACTIVE_ETH" = "en1" ]; then
    STANDBY_ETH="en0"
else
    ACTIVE_ETH="error"
    STANDBY_ETH="error"
    # Log results
    /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: No active adapter was found. `/bin/date`."
fi
# Set OS adapter names
if [ "$ACTIVE_ETH" = "en0" ]; then
    ACTIVE_ETHNAME="Ethernet 1"
    STANDBY_ETHNAME="Ethernet 2"
elif  [ "$ACTIVE_ETH" = "en1" ]; then
    ACTIVE_ETHNAME="Ethernet 2"
    STANDBY_ETHNAME="Ethernet 1"
else
    ACTIVE_ETHNAME="error"
    STANDBY_ETHNAME="error"
# Log results
/usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: OS adapter names cannot be determined. `/bin/date`."
fi
if [ "$ACTIVE_ETH" != "error" ] or [ "$ACTIVE_ETHNAME" != "error" ]; then
    # Log results
    /usr/bin/logger "$SERVER_NAME: NicFailover: Current active adapter is $ACTIVE_ETHNAME ($ACTIVE_ETH), standby adapter is $STANDBY_ETHNAME ($STANDBY_ETH). `/bin/date`."
    # Check network connectivity
    /usr/bin/logger "$SERVER_NAME: NicFailover: Testing current active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) against $SERVER_GW. `/bin/date`."
    TEST_COMMAND=`ping -c 10 $SERVER_GW | grep '0.0% packet loss' | cut -c 46-61`
    # Process results
    if [ "$TEST_COMMAND" = "0.0% packet loss" ]; then
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is fully functional ($TEST_COMMAND). `/bin/date`."
        # End
        /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
        exit 0
    elif [[ "$TEST_COMMAND" =~ [1-9] ]]; then
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) detected packet loss ($TEST_COMMAND). Switching to standby adapter $STANDBY_ETHNAME ($STANDBY_ETH). `/bin/date`."
        # Disable current active adapter
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off. `/bin/date`."
        /usr/sbin/networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Former active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is now disabled and inactive. `/bin/date`"
        # Enable halt on error
        set -e
        # Enable current standby adapter
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$STANDBY_ETHNAME\" on. `/bin/date`."
        /usr/sbin/networksetup -setnetworkserviceenabled "$STANDBY_ETHNAME" on
        sleep 3
        # Set IP address
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setmanual \"$STANDBY_ETHNAME\" $SERVER_IP $SERVER_MASK $SERVER_GW. `/bin/date`."
        /usr/sbin/networksetup -setmanual "$STANDBY_ETHNAME" $SERVER_IP $SERVER_MASK $SERVER_GW
        # Set DNS servers
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setdnsservers \"$STANDBY_ETHNAME\" $SERVER_DNS. `/bin/date`."
        /usr/sbin/networksetup -setdnsservers "$STANDBY_ETHNAME" $SERVER_DNS
        # Set search domains
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setsearchdomains \"$STANDBY_ETHNAME\" $SERVER_SD. `/bin/date`."
        /usr/sbin/networksetup -setsearchdomains "$STANDBY_ETHNAME" $SERVER_SD
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Former standby adapter $STANDBY_ETHNAME ($STANDBY_ETH) is now enabled and active. `/bin/date`"
        # Disable halt on error
        set +e
        # End
        /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
    else
        # Something is wrong, check the output of the diffrent grep commands
        # Results from ping / grep where not "0.0% packet loss" and did not contain any numbers
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: Unable to determine networking state. Check TEST_COMMAND output. `/bin/date`."
        # Disable halt on error
        set +e
        # End
        /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
        exit 0
    fi
else
    # Something is wrong, check the output of the diffrent grep commands
    # Results from ifconfig / grep where not an adapter name
    # Log results
    /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: Unable to determine adapter state. Check ACTIVE_ETH output. `/bin/date`."
    # Try both adapters
    /usr/bin/logger "$SERVER_NAME: NicFailover: State undetermined, checking both adapters. `/bin/date`."
    ACTIVE_ETH="en0"
    ACTIVE_ETHNAME="Ethernet 1"
    STANDBY_ETH="en1"
    STANDBY_ETHNAME="Ethernet 2"
    /usr/bin/logger "$SERVER_NAME: NicFailover: Bringing down both adapters. `/bin/date`."
    # Enable halt on error
    set -e
    # Disable both adapters
    /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off. `/bin/date`."
    /usr/sbin/networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off
    /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$STANDBY_ETHNAME\" off. `/bin/date`."
    /usr/sbin/networksetup -setnetworkserviceenabled \"$STANDBY_ETHNAME\" off
    # Try primairy adapter
    /usr/bin/logger "$SERVER_NAME: NicFailover: Trying primairy adapter. `/bin/date`."
    /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" on. `/bin/date`."
    /usr/sbin/networksetup -setnetworkserviceenabled "$ACTIVE_ETHNAME" on
    sleep 3
    # Set IP address
    /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setmanual \"$ACTIVE_ETHNAME\" $SERVER_IP $SERVER_MASK $SERVER_GW. `/bin/date`."
    /usr/sbin/networksetup -setmanual "$ACTIVE_ETHNAME" $SERVER_IP $SERVER_MASK $SERVER_GW
    # Set DNS servers
    /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setdnsservers \"$ACTIVE_ETHNAME\" $SERVER_DNS. `/bin/date`."
    /usr/sbin/networksetup -setdnsservers "$ACTIVE_ETHNAME" $SERVER_DNS
    # Set search domains
    /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setsearchdomains \"$ACTIVE_ETHNAME\" $SERVER_SD. `/bin/date`."
    /usr/sbin/networksetup -setsearchdomains "$ACTIVE_ETHNAME" $SERVER_SD
    # Log results
    /usr/bin/logger "$SERVER_NAME: NicFailover: Adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is now enabled and active. `/bin/date`"
    # Check network connectivity
    /usr/bin/logger "$SERVER_NAME: NicFailover: Testing active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) against $SERVER_GW. `/bin/date`."
    TEST_COMMAND=`ping -c 10 $SERVER_GW | grep '0.0% packet loss' | cut -c 46-61`
    # Process results
    if [ "$TEST_COMMAND" = "0.0% packet loss" ]; then
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is fully functional ($TEST_COMMAND). `/bin/date`."
        # Disable halt on error
        set +e
        # End
        /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
        exit 0
    else
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) not functioning. Trying standby adapter $STANDBY_ETHNAME ($STANDBY_ETH). `/bin/date`."
        # Try secondairy adapter
        # Disable current active adapter
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off. `/bin/date`."
        /usr/sbin/networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Former active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is now disabled and inactive. `/bin/date`"
        # Enable current standby adapter
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$STANDBY_ETHNAME\" on. `/bin/date`."
        /usr/sbin/networksetup -setnetworkserviceenabled "$STANDBY_ETHNAME" on
        sleep 3
        # Set IP address
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setmanual \"$STANDBY_ETHNAME\" $SERVER_IP $SERVER_MASK $SERVER_GW. `/bin/date`."
        /usr/sbin/networksetup -setmanual "$STANDBY_ETHNAME" $SERVER_IP $SERVER_MASK $SERVER_GW
        # Set DNS servers
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setdnsservers \"$STANDBY_ETHNAME\" $SERVER_DNS. `/bin/date`."
        /usr/sbin/networksetup -setdnsservers "$STANDBY_ETHNAME" $SERVER_DNS
        # Set search domains
        /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setsearchdomains \"$STANDBY_ETHNAME\" $SERVER_SD. `/bin/date`."
        /usr/sbin/networksetup -setsearchdomains "$STANDBY_ETHNAME" $SERVER_SD
        # Log results
        /usr/bin/logger "$SERVER_NAME: NicFailover: Adapter $STANDBY_ETHNAME ($STANDBY_ETH) is now enabled and active. `/bin/date`"
        # Check network connectivity
        /usr/bin/logger "$SERVER_NAME: NicFailover: Testing active adapter $STANDBY_ETHNAME ($STANDBY_ETH) against $SERVER_GW. `/bin/date`."
        TEST_COMMAND=`ping -c 10 $SERVER_GW | grep '0.0% packet loss' | cut -c 46-61`
        # Process results
        if [ "$TEST_COMMAND" = "0.0% packet loss" ]; then
            # Log results
            /usr/bin/logger "$SERVER_NAME: NicFailover: Adapter $STANDBY_ETHNAME ($STANDBY_ETH) is fully functional ($TEST_COMMAND). `/bin/date`."
            # Disable halt on error
            set +e
            # End
            /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
            exit 0
        else
            # Log results
            /usr/bin/logger "$SERVER_NAME: NicFailover: Adapters $ACTIVE_ETHNAME ($ACTIVE_ETH) and $STANDBY_ETHNAME ($STANDBY_ETH) both failed to function. `/bin/date`."
            /usr/bin/logger "$SERVER_NAME: NicFailover: Failed to determine error or bring up network connectivity. Waiting for next loop. `/bin/date`."
            # Disable halt on error
            set +e
            # End
            /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`."
            exit 1
        fi
    fi
fi


Nog steeds verre van een mooie oplossing, echter kan ik me nu zo ook niets bedenken. De vraag blijft staan, heeft er iemand verdere suggesties, graag!

Ik blijf me er niet lekker bij voelen om in het geval van onbekende output beide adapters te proberen.

[ Voor 108% gewijzigd door wasted247 op 25-08-2010 10:35 ]

Pagina: 1