PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/bin/
Upload File :
Current File : //bin/bond2team
#!/bin/bash
#
# Translate tool from bonding configuration to team.
#
# Copyright (C) 2013 Flavio Leitner <fbl@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#

VERSION="0.97"

PR_QUIET=0
PR_ERR=1
PR_WARN=2
PR_INFO=3
PR_DBG=4

#defaults
ARGC=$#

FORMAT_IFCFG=0
FORMAT_JANSSON=1
OUTPUT_FORMAT=${FORMAT_IFCFG}

MODE_IFCFG=0
MODE_NOIFCFG=1
MODE=${MODE_IFCFG}

OUTPUT_FILE=
RENAME=
DEVICE=
BOND_MASTER=
STDOUT=1
BONDING_OPTS=
CONFIGDIR="/etc/sysconfig/network-scripts"
PR_LVL=3
OUTPUT_DIR=
OUTPUT_TMP_DIR=
TMP_FILES=()
RUNNER_OPTS=()
LWATCH_OPTS=()
# array: ( 'port ifname', 'opt1', 'opt2', 'optn', 'opt4', 'port ifname', ... )
PORT_LIST=
PORTS_OPTS=()
PRIMARY=
PRIMARY_RESELECT=

# building file scratch memory area
VFILE=

show_examples()
{
	cat << EOF

The following commands will deliver the ifcfg files into a temporary
directory. You can review the files and copy to the right location.

Add the following argument to the commands below to print the output
to the screen instead of writing to files.
  --stdout

Add the following arguments to the commands below to set the
destination directory for the output files.
  --outputdir </path/to/dir>

Add the following argument to the commands below to output the
files in teamd format (JSON) instead of the default ifcfg format.
  --json

To convert the current "bond0" ifcfg configuration to team ifcfg:
# $0 --master bond0

To convert the current "bond0" ifcfg configuration out of the
standard ifcfg-:
# $0 --master bond0 --configdir </path/to/ifcfg>

To convert the current "bond0" ifcfg configuration to team ifcfg
renaming the interface name to "team0". (carefull: firewall rules,
aliases interfaces, etc., will break after the renaming because the
tool will only change the ifcfg file, nothing else)
# $0 --master bond0 --rename team0

To convert given bonding parameters without any ifcfg:
# $0 --bonding_opts "mode=1 miimon=500"

To convert given bonding parameters without any ifcfg with ports:
# $0 --bonding_opts "mode=1 miimon=500 primary=eth1 primary_reselect-0" \\
     --port eth1 --port eth2 --port eth3 --port eth4

EOF
}
usage()
{
	cat << EOF
usage: $0 [options]

This tool translates bonding configuration to team.
See bond2team(1) for detailed information.

OPTIONS:

  --master <interface>	set the master interface name or ifcfg

  --rename <iface>	rename the master interface to <iface>

  --ifcfg		set the output format to ifcfg style

  --json		set the output format to teamd style

  --bonding_opts	pass the bonding options instead of reading
			from the ifcfg- file

  --port <iface>	add the interface to the port's list

  --configdir <dir>	set where the ifcfg- files are
			default: /etc/sysconfig/network-scripts

  --outputdir <dir>	set the output diretory
			default: temporary diretory

  --stdout		print to stdout instead of
			modify the system's files.

  --debug		increase debug level

  --quiet		no messages

  --version		show the tool version

  --help		this screen

  --examples		show command examples

EOF
}

# Output Functions
pr()
{
	if [ $1 -le $PR_LVL ]; then
		shift;
		echo "$*" > /dev/stderr
	fi
}

pr_error()
{
	pr ${PR_ERR} "ERROR: " $*
}

pr_warn()
{
	pr ${PR_WARN} "WARNING: " $*
}

pr_info()
{
	pr ${PR_INFO} "INFO: " $*
}

pr_dbg()
{
	pr ${PR_DBG} "DEBUG: " $*
}

to_stdout()
{
	return ${STDOUT}
}

create_output_file()
{
	local f=$1

	if [ ! -d "${OUTPUT_TMP_DIR}" ]; then
		OUTPUT_TMP_DIR=$(LANG=C mktemp -d /tmp/bond2team.XXXXXX)
	fi

	if [ ! -d "${OUTPUT_TMP_DIR}" ]; then
		pr_error "${FUNCNAME} can't create dir ${OUTPUT_TMP_DIR}"
		return 1
	fi

	local tmpfile=${OUTPUT_TMP_DIR}/${f}
	touch ${tmpfile}
	if [ ! -f ${tmpfile} ]; then
		pr_error "${FUNCNAME} can't create file ${tmpfile}"
		return 1
	fi

	local pos=${#TMP_FILES[*]}
	TMP_FILES[${pos}]="${tmpfile}"
	OUTPUT_FILE=${tmpfile}
}

show_output_files()
{
	echo ""
	echo "Resulted files:"
	for tmpf in $(seq 0 $((${#TMP_FILES[@]} - 1)))
	do
		echo "  ${TMP_FILES[$tmpf]}"
	done
}

clean_up()
{
	pr_dbg "${FUNCNAME} $*"
	for tmpf in $(seq 0 $((${#TMP_FILES[@]} - 1)))
	do
		pr_dbg "rm -f ${TMP_FILES[$tmpf]}"
		rm -f ${TMP_FILES[$tmpf]}
	done

	if [ -d "{OUTPUT_TMP_DIR}" ]; then
		rmdir ${OUTPUT_TMP_DIR}
	fi
}

ifcfg_get_device()
{
	local ifcfg=$1
	if [ ! -f ${ifcfg} ]; then
		pr_error "file not found: ${ifcfg}"
		return 1
	fi

	DEVICE=`LANG=C sed -n \
		"s@^[[:space:]]*DEVICE=[\"]*\(.*\)\([[:space:]#]\|\"\|$\)@\1@p" \
		$ifcfg`

	if [ -z "${DEVICE}" ]; then
		pr_error "ifcfg file not supported: ${ifcfg}"
		return 1
	fi
}

ifcfg_get_master_file()
{
	local dev=${1}
	MASTER="${dev}"

	if [ "${MODE}" -eq "${MODE_NOIFCFG}" ]; then
		return 0
	fi

	if [ ! -f ${MASTER} ]; then
		MASTER="${CONFIGDIR}/ifcfg-${dev}"
		if [ -f ${MASTER} ]; then
			return 0
		fi

		if [ -n "${BONDING_OPTS}" ]; then
			# options provided, set noifcfg
			MODE=${MODE_NOIFCFG}
			MASTER=${dev}
			return 0
		fi

		pr_error "Can't find ifcfg file for ${dev}"
		return 1
	fi

	return 0
}

ifcfg_overwrite_files()
{
	pr_dbg "${FUNCNAME} $*"

	/bin/cp -f ${OUTPUT_TMP_DIR}/ifcfg* ${OUTPUT_DIR}
}

ifcfg_get_bond_opts()
{
	pr_dbg "${FUNCNAME} $*"
	local ifcfg=$1

	if [ -n "${BONDING_OPTS}" ]; then
		pr_dbg "${FUNCNAME} bonding_opts=${BONDING_OPTS}"
		return 0
	fi

	if [ ! -f ${ifcfg} ]; then
		pr_error "File not found: ${ifcfg}"
		return 1
	fi

	BONDING_OPTS=`LANG=C sed -n \
		"s@^[[:space:]]*BONDING_OPTS=[\"]*\(.*\)\([[:space:]#]\|\"\|$\)@\1@p" \
		$ifcfg`

	if [ -z "${BONDING_OPTS}" ]; then
		pr_error "ifcfg file not supported: ${MASTER}"
		return 1
	fi

	pr_dbg "${FUNCNAME} bonding_opts=${BONDING_OPTS}"
	return 0
}

vfile_reset()
{
	VFILE=()
}

vfile_load_ifcfg()
{
	pr_dbg "${FUNCNAME} $*"
	local ifcfg=$1

	vfile_reset

	if [ ${MODE} -eq ${MODE_NOIFCFG} ]; then
		return 0
	fi

	# filter out bonding and team options and
	#  don't break lines with spaces
	oIFS="$IFS"
	IFS=$'\n'
	VFILE=( $(LANG=C \
		grep -iv 'BONDING_OPTS\|SLAVE\|MASTER\|DEVICETYPE\|TEAM' \
		$ifcfg ))
	IFS="$oIFS"
}

vfile_write_to_file()
{
	pr_dbg "${FUNCNAME} $*"
	local output=$1
	for ln in $(seq 0 $((${#VFILE[@]} - 1)))
	do
		echo "${VFILE[$ln]}" >> $output
	done

	return 0
}

ifcfg_dump_stdout()
{
	local dev="${1}"
	local ifcfg="ifcfg-${dev}"
	if [ -z "${dev}" ]; then
		ifcfg="ifcfg-<interface name>"
	fi

	for ln in $(seq 0 $((${#VFILE[@]} - 1)))
	do
		[ $ln -eq 0 ] && echo "---8<--- ${ifcfg} ---8<---"
		echo "${VFILE[$ln]}"
	done

	echo "---8<--- ${ifcfg} ---8<---"
	echo ""

	return 0
}

vfile_get_device()
{
	pr_dbg "${FUNCNAME} $*"
	if [ ${MODE} -eq ${MODE_NOIFCFG} ]; then
		pr_dbg "${FUNCNAME} using DEVICE=${MASTER}"
		DEVICE=${MASTER}
		return 0
	fi

	for ln in $(seq 0 $((${#VFILE[@]} - 1)))
	do
		local line=${VFILE[$ln]}
		if [ "${line%%=*}" = "DEVICE" ]; then
			local name_line="${line##*=}"
			local name="${name_line%%[ #	]*}"
			DEVICE=${name}
			pr_dbg "${FUNCNAME} from file: DEVICE=${DEVICE}"
			return 0
		fi
	done

	pr_error "Failed to find the device's name"
	return 1
}

vfile_get_ipaddr()
{
	for ln in $(seq 0 $((${#VFILE[@]} - 1)))
	do
		local line=${VFILE[$ln]}
		if [ "${line%%=*}" = "IPADDR" ]; then
			local ipaddr_line="${line##*=}"
			local ipaddr="${ipaddr_line%%[ #	]*}"
			echo "${ipaddr}"
		fi
	done
}

vfile_add_line()
{
	pr_dbg "${FUNCNAME} $*"
	local pos=${#VFILE[*]}
	VFILE[${pos}]="$1"
}

ifcfg_device_rename()
{
	local device=$1
	local rename=$2

	# neither device nor rename was provided
	if [ -z "${rename}" ]; then
		return 0
	fi

	# renaming with no ifcfg?
	if [ ${MODE} -eq ${MODE_NOIFCFG} ]; then
		return 0
	fi

	for ln in $(seq 0 $((${#VFILE[@]} - 1)))
	do
		local line=${VFILE[$ln]}
		if [ "${line%%=*}" = "DEVICE" ]; then
			newdev="${line/${device}/${rename}}"
			VFILE[$ln]="$newdev"
			TEAM_MASTER=${rename}
			return 0
		fi
	done
	pr_error "Failed to rename $device to $rename"
	return 1
}

team_port_set_devtype()
{
	pr_dbg "${FUNCNAME} $*"
	local master=$1
	vfile_add_line "DEVICETYPE=\"TeamPort\""
	vfile_add_line "TEAM_MASTER=\"$master\""
}

team_port_set_config()
{
	pr_dbg "${FUNCNAME} $*"
	local port=$1
	local team_port_config=""

	if [ "${PRIMARY}" ==  "$port" ]; then
		team_port_config="'{ \"prio\" : -10"
	else
		team_port_config="'{ \"prio\" : -100"
	fi

	if [ -n "${PRIMARY_RESELECT}" ]; then
		if [ "${PRIMARY}" ==  "$port" ]; then
			if [ -z "${team_port_config}" ]; then
				team_port_config="'{ \"sticky\" : true }'"
			else
				team_port_config="${team_port_config}, \"sticky\" : true }'"
			fi
		else
			if [ -z "${team_port_config}" ]; then
				team_port_config="{ \"sticky\" : false }'"
			else
				team_port_config="${team_port_config}, \"sticky\" : false }'"
			fi
		fi
	else
		if [ -n "${team_port_config}" ]; then
			team_port_config="${team_port_config} }'"
		fi

	fi

	if [ -n "$team_port_config" ]; then
		vfile_add_line "TEAM_PORT_CONFIG=$team_port_config"
	fi
}

team_port_ifcfg_create()
{
	local dev=$1
	vfile_load_ifcfg $dev

	if ! vfile_get_device; then
		return  1
	fi

	team_port_set_devtype ${TEAM_MASTER}
	team_port_set_config ${DEVICE}
	return 0
}

team_master_set_devtype()
{
	pr_dbg "${FUNCNAME} $*"
	vfile_add_line "DEVICETYPE=\"Team\""
}

team_master_set_config()
{
	pr_dbg "${FUNCNAME} $*"
	local team_config="'{ \"runner\" : { "
	local nr_opt=0

	nr_opt=${#RUNNER_OPTS[@]}
	if [ $nr_opt -eq 0 ]; then
		# default to miimon/ethtool
		team_config="${team_config} \"name\" : \"roundrobin\" }"
	else
		# add runner options
		for pos in $(seq 0 $((${#RUNNER_OPTS[@]} - 1)))
		do
			if [ $pos -ne 0 ]; then
				team_config="${team_config}, "
			fi

			team_config="${team_config} ${RUNNER_OPTS[$pos]}"
		done

		team_config="${team_config} }"
	fi

	nr_opt=${#LWATCH_OPTS[@]}
	if [ $nr_opt -eq 0 ]; then
		# default to miimon/ethtool
		team_config="${team_config}, \"link_watch\" : { \"name\" : \"ethtool\" }"
	else
		team_config="${team_config}, \"link_watch\" : { "
		# add linkwatch options
		for pos in $(seq 0 $(($nr_opt - 1)))
		do
			if [ $pos -ne 0 ]; then
				team_config="${team_config}, "
			fi

			team_config="${team_config} ${LWATCH_OPTS[$pos]}"
		done

		team_config="${team_config} }"

	fi

	team_config="${team_config} }'"
	pr_dbg "built team_config=${team_config}"
	vfile_add_line "TEAM_CONFIG=${team_config}"
	return 0
}

team_ifcfg_dump_stdout()
{
	pr_dbg "${FUNCNAME} $*"
	local dev=$1
	if ! ifcfg_dump_stdout ${dev}; then
		return 1
	fi

	return 0
}

team_ifcfg_write_file()
{
	pr_dbg "${FUNCNAME} $*"
	local dev=$1
	OUTPUT_FILE=

	local filenm="ifcfg-${dev}"
	if [ -z "${dev}" ]; then
		filenm="ifcfg"
	fi

	create_output_file ${filenm}
	if [ ! -f "${OUTPUT_FILE}" ]; then
		return 1
	fi

	if ! vfile_write_to_file ${OUTPUT_FILE}; then
		return 1
	fi

	return 0
}

team_master_ifcfg_create()
{
	pr_dbg "${FUNCNAME} $*"
	if ! team_master_set_devtype; then
		return 1
	fi

	if ! team_master_set_config; then
		return 1
	fi

	return 0
}

team_ifcfg_write()
{
	pr_dbg "${FUNCNAME} $*"
	local dev=${1}

	if to_stdout; then
		team_ifcfg_dump_stdout ${dev} || return 1
	else
		team_ifcfg_write_file ${dev} || return 1
	fi

	return 0
}

team_ifcfg_deliver()
{
	pr_dbg "${FUNCNAME} $*"
	if ! to_stdout; then
		return 0
	fi

	if [ -z "${OUTPUT_DIR}" ]; then
		show_output_files
	else
		ifcfg_overwrite_files
		clean_up
	fi

	return 0
}

teamd_config_create()
{
	vfile_reset
	vfile_add_line "{"
	# add runner options
	vfile_add_line "  \"device\" : \"${DEVICE}\","
	vfile_add_line "  \"runner\" : {"
	local runner_nr=${#RUNNER_OPTS[@]}
	if [ ${runner_nr} -eq 0 ]; then
		# default roundrobin
		vfile_add_line "     \"runner\" : \"roundrobin\" "
	else
		local last_pos=$((${runner_nr} - 1))
		for pos in $(seq 0 ${last_pos})
		do
			if [ $pos -eq ${last_pos} ]; then
				vfile_add_line "     ${RUNNER_OPTS[$pos]}"
			else
				vfile_add_line "     ${RUNNER_OPTS[$pos]},"
			fi
		done
	fi

	vfile_add_line "  },"
	vfile_add_line "  \"link_watch\" : {"

	local lwatch_nr=${#LWATCH_OPTS[@]}
	if [ ${lwatch_nr} -eq 0 ]; then
		# default to miimon
		lwatch_add_opt "\"name\" : \"ethtool\""
	else
		for pos in $(seq 0 ${last_pos})
		do
			last_pos=$((${lwatch_nr} - 1))
			if [ $pos -eq ${last_pos} ]; then
				vfile_add_line "     ${LWATCH_OPTS[$pos]}"
			else
				vfile_add_line "     ${LWATCH_OPTS[$pos]},"
			fi
		done
	fi

	vfile_add_line "  },"
	return 0
}

teamd_config_close()
{
	vfile_add_line "}"
	return 0
}

teamd_dump_stdout()
{
	for ln in $(seq 0 $((${#VFILE[@]} - 1)))
	do
		[ $ln -eq 0 ] && echo "---8<--- teamd.conf ---8<---"
		echo "${VFILE[$ln]}"
	done

	echo "---8<--- teamd.conf ---8<---"
	echo ""

	return 0
}

teamd_write_file()
{
	pr_dbg "${FUNCNAME} $*"
	local dev=$1
	OUTPUT_FILE=

	create_output_file "teamd.conf"
	if [ ! -f "${OUTPUT_FILE}" ]; then
		return 1
	fi

	if ! vfile_write_to_file ${OUTPUT_FILE}; then
		return 1
	fi

	return 0
}


teamd_config_write()
{
	pr_dbg "${FUNCNAME} $*"

	if to_stdout; then
		teamd_dump_stdout || return 1
	else
		teamd_write_file ${dev} || return 1
		show_output_files
	fi

	return 0
}

teamd_port_create()
{
	vfile_add_line "  \"ports\" : {"
	return 0
}

teamd_port_close()
{
	vfile_add_line "  }"
	return 0
}

teamd_port_add()
{
	pr_dbg "${FUNCNAME} $*"
	local dev=${1}
	local lastone=${2}

	if [ -n "${PORT_LIST}" ]; then
		DEVICE=${dev}
	else
		if ! ifcfg_get_device ${dev}; then
			return  1
		fi
	fi

	vfile_add_line "    \"${DEVICE}\" : {"
	if [ "${PRIMARY}" ==  "${DEVICE}" ]; then
		vfile_add_line "        \"prio\" : -10,"
	else
		vfile_add_line "        \"prio\" : -100,"
	fi

	if [ -n "${PRIMARY_RESELECT}" ]; then
		if [ "${PRIMARY}" ==  "$port" ]; then
			vfile_add_line "        \"sticky\" : true "
		else
			vfile_add_line "        \"sticky\" : false "
		fi
	else
		vfile_add_line "        \"sticky\" : false "
	fi

	if [ ${lastone} -eq 1 ]; then
		vfile_add_line "    }"
	else
		vfile_add_line "    },"
	fi

	return 0
}

# Runner Functions
runner_add_opt()
{
	pr_dbg "${FUNCNAME} $*"
	local pos=${#RUNNER_OPTS[*]}
	RUNNER_OPTS[${pos}]="$1"
}

runner_parse_adselect()
{
	pr_dbg "${FUNCNAME} $*"
	local value=$1

	case $value in
	"0"|"stable")
		runner_add_opt "\"agg_select_policy\" : \"bandwidth\"" || return 1
		;;
	"1"|"bandwidth")
		runner_add_opt "\"agg_select_policy\" : \"bandwidth\"" || return 1
		;;
	"2"|"count")
		runner_add_opt "\"agg_select_policy\" : \"count\"" || return 1
		;;
	*)
		pr_error "parameter ad_select=$value is not supported"
		return 1
		esac
}

runner_parse_failovermac()
{
	pr_dbg "${FUNCNAME} $*"
	local value=$1

	case $value in
	"0")
		runner_add_opt "\"hwaddr_policy\" : \"same_all\"" || return 1
		;;
	"1"|"active")
		runner_add_opt "\"hwaddr_policy\" : \"by_active\"" || return 1
		;;
	"2"|"follow")
		runner_add_opt "\"hwaddr_policy\" : \"only_active\"" || return 1
		;;
	*)
		pr_error "parameter fail_over_mac $value is not supported"
		return 1
		;;
	esac

}

runner_parse_lacprate()
{
	pr_dbg "${FUNCNAME} $*"
	local value=$1

	case $value in
	"slow"|"0")
		runner_add_opt "\"fast_rate\" : 0" || return 1
		;;
	"fast"|"1")
		runner_add_opt "\"fast_rate\" : 1" || return 1
		;;
	*)
		pr_error "parameter lacp_rate=$value is not supported"
		return 1
		;;
	esac
}

runner_parse_xmit_policy()
{
	pr_dbg "${FUNCNAME} $*"
	local value=$1

	case $value in
	"layer2")
		runner_add_opt "\"tx_hash\" : [ \"eth\" ]" || return 1
		;;
	"layer2+3")
		runner_add_opt "\"tx_hash\" : [ \"eth\", \"l3\" ]" || return 1
		;;
	"layer3+4")
		runner_add_opt "\"tx_hash\" : [ \"l3\", \"l4\" ]" || return 1
		;;
	*)
		pr_error "parameter xmit_hash_policy=$value is not supported"
		return 1
	esac
}

runner_parse_mode()
{
	pr_dbg "${FUNCNAME} $*"
	local value=$1

	case $value in
	"0"|"balance-rr")
		runner_add_opt "\"name\" : \"roundrobin\"" || return 1
		;;
	"1"|"active-backup")
		runner_add_opt "\"name\" : \"activebackup\"" || return 1
		;;
	"2"|"balance-xor")
		# FIXME
		runner_add_opt "\"name\" : \"loadbalance\"" || return 1
		;;
	"3"|"broadcast")
		runner_add_opt "\"name\" : \"broadcast\"" || return 1
		;;
	"4"|"802.3ad")
		runner_add_opt "\"name\" : \"lacp\"" || return 1
		;;
	"5"|"balance-tlb")
		runner_add_opt "\"name\" : \"loadbalance\"" || return 1
		;;
	"6"|"balance-alb")
		pr_error "parameter mode=$value is not supported"
		return 1
		;;
	*)
		pr_error "parameter mode=$value is not supported"
		return 1
		;;
	esac
}

runner_parse_opt()
{
	pr_dbg "${FUNCNAME} $*"
	local param=$1
	local value=$2

	case $param in
	"ad_select")
		runner_parse_adselect $value || return 1
		;;
	"fail_over_mac")
		runner_parse_failovermac $value || return 1
		;;
	"lacp_rate")
		runner_parse_lacprate $value || return 1
		;;
	"min_links")
		runner_add_opt "\"min_ports\" : $value" || return 1
		;;
	"mode")
		runner_parse_mode $value || return 1
		;;
	"xmit_hash_policy")
		runner_parse_xmit_policy $value || return 1
		;;
	esac
}

# Link Watch functions
lwatch_add_opt()
{
	pr_dbg "${FUNCNAME} $*"
	local pos=${#LWATCH_OPTS[*]}
	LWATCH_OPTS[${pos}]="$1"
}

lwatch_parse_arp_validate()
{
	pr_dbg "${FUNCNAME} $*"
	local value=$1

	case $value in
	"0"|"none")
		;;
	"1"|"active")
		lwatch_add_opt "\"validate_active\" : 1" || return 1
		;;
	"2"|"backup")
		lwatch_add_opt "\"validate_inactive\" : 1" || return 1
		;;
	"3"|"all")
		lwatch_add_opt "\"validate_active\" : 1" || return 1
		lwatch_add_opt "\"validate_inactive\" : 1" || return 1
		;;
	*)
		pr_error "parameter arp_validate=$value is not supported"
		return 1
	;;
	esac

}

lwatch_parse_arpiptarget()
{
	#FIXME: supports only one arp_ip_target address.
	# otherwise a new linkwatch section must be create
	pr_dbg "${FUNCNAME} $*"
	local ip_addrs=$1
	local ip_list=${ip_addrs//,/ }
	local ip_array=($ip_list)
	if [ ${#ip_array[*]} -ne 1 ]; then
		pr_error "parameter arp_ip_target= with multiple IP addresses is not supported"
		return 1
	fi

	for addr in ${ip_list}
	do
		lwatch_add_opt "\"target_host\" : \"$addr\""
	done
}

lwatch_parse_opt()
{
	pr_dbg "${FUNCNAME} $*"
	local param=$1
	local value=$2

	case $param in
	"arp_interval")
		lwatch_add_opt "\"interval\" : $value"
		;;
	"arp_ip_target")
		lwatch_add_opt "\"name\" : \"arp_ping\""
		if ! lwatch_parse_arpiptarget $value; then
			return 1
		fi
		;;
	"arp_validate")
		lwatch_parse_arp_validate $value
		;;
	"downdelay")
		lwatch_add_opt "\"delay_down\" : $value"
		;;
	"miimon")
		lwatch_add_opt "\"name\" : \"ethtool\""
		;;
	"updelay")
		lwatch_add_opt "\"delay_up\" : $value"
		;;
	*)
		pr_error "parameter $param=$value is not supported"
		return 1
		;;
	esac
}

port_parse_opt()
{
	pr_dbg "${FUNCNAME} $*"
	local param=$1
	local value=$2

	case $param in
	"primary")
		PRIMARY="$value"
		;;
	"primary_reselect")
		case $value in
		"0"|"always")
			PRIMARY_RESELECT=1
			;;
		"1"|"better")
			;;
		"2"|"failure")
			;;
		*)
			pr_error "parameter $param=$value is not supported"
			return 1
		esac
		;;
	*)
		pr_error "parameter $param=$value is not supported"
		return 1
		;;
	esac

}

convert_bond_opts()
{
	local bonding_opts=$1
	pr_dbg "${FUNCNAME} $*"

	for arg in $bonding_opts
	do
		key=${arg%%=*};
		value=${arg##*=};
		pr_dbg "parsing $key=$value"
		case "$key" in
			"active_slave"|"max_bonds"|"use_carrier")
				pr_info "parameter $key not supported, ignoring"
				continue
				;;
			"all_slaves_active"|"resend_igmp"|"num_grat_arp"|"num_unsol_na")
				pr_error "parameter $key not supported, aborting"
				return 1
				;;
			"ad_select"|"fail_over_mac"|"lacp_rate"|"min_links"|"mode"|"xmit_hash_policy")
				runner_parse_opt $key $value || return 1
				;;
			"arp_interval"|"arp_ip_target"|"arp_validate"|"downdelay"|"miimon"|"updelay")
				lwatch_parse_opt $key $value || return 1
				;;
			"primary"|"primary_reselect")
				port_parse_opt $key $value || return 1
				;;
			*)
				pr_error "unknown parameter $key=$value, aborting"
				return 1
				;;
		esac
	done
}



# Parse command line options
while :;
do
	case "$1" in
	"--master")
		MASTER="$2"
		shift 2
		;;
	"--bonding_opts")
		BONDING_OPTS="$2"
		shift 2
		;;
	"--ifcfg")
		OUTPUT_FORMAT=${FORMAT_IFCFG}
		shift
		;;
	"--json")
		OUTPUT_FORMAT=${FORMAT_JANSSON}
		shift
		;;
        "--quiet")
		PR_LVL=${PR_QUIET}
		shift
		;;
        "--debug")
		PR_LVL=`expr ${PR_LVL} + 1`
		shift
		;;
	"--outputdir")
		OUTPUT_DIR="$2"
		shift 2
		;;
	"--configdir")
		CONFIGDIR="$2"
		shift 2
		;;
	"--rename")
		[ -n "${RENAME}" ] && usage && exit 1
		RENAME="$2"
		shift 2
		;;
	"--stdout")
		STDOUT=0
		shift
		;;
	"--port")
		PORT_LIST="${PORT_LIST} $2"
		shift 2
		;;
	"--version")
		echo "$VERSION"
		exit 0
		;;
	"--help")
		usage
		exit 0
		;;
	"--examples")
		show_examples
		exit 0
		;;
	*)
		if [ -z "$1" ]; then
			break
		fi
		pr_error "unknown parameter: $1"
		usage
		exit 1
		;;
	esac
done

if [ -n "${OUTPUT_DIR}" -a ! -d "${OUTPUT_DIR}" ]; then
	pr_error "Invalid output diretory: ${OUTPUT_DIR}"
	usage
	exit 1
fi

if [ -z "${MASTER}" -a -z "${BONDING_OPTS}" ]; then
	pr_error "No master interface or bonding options specified"
	usage
	exit 1
fi

# no master means no ifcfg to read
if [ -z "${MASTER}" ]; then
	MODE=${MODE_NOIFCFG}
fi

if [ ${OUTPUT_FORMAT} -eq ${FORMAT_JANSSON} -a -z "${MASTER}" ]; then
	MASTER="team0"
fi

if ! ifcfg_get_master_file ${MASTER}; then
	exit 1
fi

# load the ifcfg file
if ! vfile_load_ifcfg ${MASTER}; then
	exit 1
fi

# get the bonding options
if ! ifcfg_get_bond_opts ${MASTER}; then
	exit 1
fi

if ! convert_bond_opts "${BONDING_OPTS}"; then
	exit 1
fi

if ! vfile_get_device; then
	exit 1
fi

TEAM_MASTER=${DEVICE}
if ! ifcfg_device_rename ${DEVICE} ${RENAME}; then
	exit 1
fi

BOND_MASTER=${DEVICE}

if [ ${OUTPUT_FORMAT} -eq ${FORMAT_IFCFG} ]; then
	if ! team_master_ifcfg_create; then
		exit 1
	fi

	if ! team_ifcfg_write ${TEAM_MASTER}; then
		clean_up
		exit 1
	fi

	# process all ports
	for portcfg in $(LANG=C grep -s -l "^[[:space:]]*MASTER=\"\?${BOND_MASTER}\"\?\([[:space:]#]\|$\)" ${CONFIGDIR}/ifcfg-*)
	do
		if ! team_port_ifcfg_create $portcfg; then
			clean_up
			exit 1
		fi

		if ! team_ifcfg_write ${DEVICE}; then
			clean_up
			exit 1
		fi

	done

	team_ifcfg_deliver
else
	if ! teamd_config_create; then
		exit 1
	fi

	if ! teamd_port_create; then
		exit 1
	fi

	if [ -n "${PORT_LIST}" ]; then
		portcfg_list=${PORT_LIST}
	else
		portcfg_list=$(LANG=C grep -s -l "^[[:space:]]*MASTER=\"\?${BOND_MASTER}\"\?\([[:space:]#]\|$\)" ${CONFIGDIR}/ifcfg-*)
	fi
	# count number of ports
	portcfg_total=0
	for portcfg in ${portcfg_list}
	do
		portcfg_total=$((${portcfg_total} + 1))
	done
	# process all ports
	portcfg_nr=0
	lastone=0
	for portcfg in ${portcfg_list}
	do
		portcfg_nr=$((${portcfg_nr} + 1))
		if [ ${portcfg_nr} -eq ${portcfg_total} ]; then
			lastone=1
		fi

		if ! teamd_port_add ${portcfg} ${lastone}; then
			exit 1
		fi
	done

	if ! teamd_port_close; then
		exit 1
	fi

	if ! teamd_config_close; then
		exit 1
	fi

	if ! teamd_config_write; then
		exit 1
	fi

fi