PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /opt/saltstack/salt/lib/python3.10/site-packages/salt/modules
Viewing File: /opt/saltstack/salt/lib/python3.10/site-packages/salt/modules/cimc.py
""" Module to provide Cisco UCS compatibility to Salt :codeauthor: ``Spencer Ervin <spencer_ervin@hotmail.com>`` :maturity: new :depends: none :platform: unix Configuration ============= This module accepts connection configuration details either as parameters, or as configuration settings in pillar as a Salt proxy. Options passed into opts will be ignored if options are passed into pillar. .. seealso:: :py:mod:`Cisco UCS Proxy Module <salt.proxy.cimc>` About ===== This execution module was designed to handle connections to a Cisco UCS server. This module adds support to send connections directly to the device through the rest API. """ import logging import salt.proxy.cimc import salt.utils.platform log = logging.getLogger(__name__) __virtualname__ = "cimc" def __virtual__(): """ Will load for the cimc proxy minions. """ try: if salt.utils.platform.is_proxy() and __opts__["proxy"]["proxytype"] == "cimc": return __virtualname__ except KeyError: pass return False, "The cimc execution module can only be loaded for cimc proxy minions." def activate_backup_image(reset=False): """ Activates the firmware backup image. CLI Example: Args: reset(bool): Reset the CIMC device on activate. .. code-block:: bash salt '*' cimc.activate_backup_image salt '*' cimc.activate_backup_image reset=True """ dn = "sys/rack-unit-1/mgmt/fw-boot-def/bootunit-combined" r = "no" if reset is True: r = "yes" inconfig = """<firmwareBootUnit dn='sys/rack-unit-1/mgmt/fw-boot-def/bootunit-combined' adminState='trigger' image='backup' resetOnActivate='{}' />""".format( r ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def create_user(uid=None, username=None, password=None, priv=None): """ Create a CIMC user with username and password. Args: uid(int): The user ID slot to create the user account in. username(str): The name of the user. password(str): The clear text password of the user. priv(str): The privilege level of the user. CLI Example: .. code-block:: bash salt '*' cimc.create_user 11 username=admin password=foobar priv=admin """ if not uid: raise salt.exceptions.CommandExecutionError("The user ID must be specified.") if not username: raise salt.exceptions.CommandExecutionError("The username must be specified.") if not password: raise salt.exceptions.CommandExecutionError("The password must be specified.") if not priv: raise salt.exceptions.CommandExecutionError( "The privilege level must be specified." ) dn = f"sys/user-ext/user-{uid}" inconfig = """<aaaUser id="{0}" accountStatus="active" name="{1}" priv="{2}" pwd="{3}" dn="sys/user-ext/user-{0}"/>""".format( uid, username, priv, password ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def get_bios_defaults(): """ Get the default values of BIOS tokens. CLI Example: .. code-block:: bash salt '*' cimc.get_bios_defaults """ ret = __proxy__["cimc.get_config_resolver_class"]("biosPlatformDefaults", True) return ret def get_bios_settings(): """ Get the C240 server BIOS token values. CLI Example: .. code-block:: bash salt '*' cimc.get_bios_settings """ ret = __proxy__["cimc.get_config_resolver_class"]("biosSettings", True) return ret def get_boot_order(): """ Retrieves the configured boot order table. CLI Example: .. code-block:: bash salt '*' cimc.get_boot_order """ ret = __proxy__["cimc.get_config_resolver_class"]("lsbootDef", True) return ret def get_cpu_details(): """ Get the CPU product ID details. CLI Example: .. code-block:: bash salt '*' cimc.get_cpu_details """ ret = __proxy__["cimc.get_config_resolver_class"]("pidCatalogCpu", True) return ret def get_disks(): """ Get the HDD product ID details. CLI Example: .. code-block:: bash salt '*' cimc.get_disks """ ret = __proxy__["cimc.get_config_resolver_class"]("pidCatalogHdd", True) return ret def get_ethernet_interfaces(): """ Get the adapter Ethernet interface details. CLI Example: .. code-block:: bash salt '*' cimc.get_ethernet_interfaces """ ret = __proxy__["cimc.get_config_resolver_class"]("adaptorHostEthIf", True) return ret def get_fibre_channel_interfaces(): """ Get the adapter fibre channel interface details. CLI Example: .. code-block:: bash salt '*' cimc.get_fibre_channel_interfaces """ ret = __proxy__["cimc.get_config_resolver_class"]("adaptorHostFcIf", True) return ret def get_firmware(): """ Retrieves the current running firmware versions of server components. CLI Example: .. code-block:: bash salt '*' cimc.get_firmware """ ret = __proxy__["cimc.get_config_resolver_class"]("firmwareRunning", False) return ret def get_hostname(): """ Retrieves the hostname from the device. .. versionadded:: 2019.2.0 CLI Example: .. code-block:: bash salt '*' cimc.get_hostname """ ret = __proxy__["cimc.get_config_resolver_class"]("mgmtIf", True) try: return ret["outConfigs"]["mgmtIf"][0]["hostname"] except Exception as err: # pylint: disable=broad-except return "Unable to retrieve hostname" def get_ldap(): """ Retrieves LDAP server details. CLI Example: .. code-block:: bash salt '*' cimc.get_ldap """ ret = __proxy__["cimc.get_config_resolver_class"]("aaaLdap", True) return ret def get_management_interface(): """ Retrieve the management interface details. CLI Example: .. code-block:: bash salt '*' cimc.get_management_interface """ ret = __proxy__["cimc.get_config_resolver_class"]("mgmtIf", False) return ret def get_memory_token(): """ Get the memory RAS BIOS token. CLI Example: .. code-block:: bash salt '*' cimc.get_memory_token """ ret = __proxy__["cimc.get_config_resolver_class"]( "biosVfSelectMemoryRASConfiguration", False ) return ret def get_memory_unit(): """ Get the IMM/Memory unit product ID details. CLI Example: .. code-block:: bash salt '*' cimc.get_memory_unit """ ret = __proxy__["cimc.get_config_resolver_class"]("pidCatalogDimm", True) return ret def get_network_adapters(): """ Get the list of network adapters and configuration details. CLI Example: .. code-block:: bash salt '*' cimc.get_network_adapters """ ret = __proxy__["cimc.get_config_resolver_class"]("networkAdapterEthIf", True) return ret def get_ntp(): """ Retrieves the current running NTP configuration. CLI Example: .. code-block:: bash salt '*' cimc.get_ntp """ ret = __proxy__["cimc.get_config_resolver_class"]("commNtpProvider", False) return ret def get_pci_adapters(): """ Get the PCI adapter product ID details. CLI Example: .. code-block:: bash salt '*' cimc.get_disks """ ret = __proxy__["cimc.get_config_resolver_class"]("pidCatalogPCIAdapter", True) return ret def get_power_configuration(): """ Get the configuration of the power settings from the device. This is only available on some C-Series servers. .. versionadded:: 2019.2.0 CLI Example: .. code-block:: bash salt '*' cimc.get_power_configuration """ ret = __proxy__["cimc.get_config_resolver_class"]("biosVfResumeOnACPowerLoss", True) return ret def get_power_supplies(): """ Retrieves the power supply unit details. CLI Example: .. code-block:: bash salt '*' cimc.get_power_supplies """ ret = __proxy__["cimc.get_config_resolver_class"]("equipmentPsu", False) return ret def get_snmp_config(): """ Get the snmp configuration details. CLI Example: .. code-block:: bash salt '*' cimc.get_snmp_config """ ret = __proxy__["cimc.get_config_resolver_class"]("commSnmp", False) return ret def get_syslog(): """ Get the Syslog client-server details. CLI Example: .. code-block:: bash salt '*' cimc.get_syslog """ ret = __proxy__["cimc.get_config_resolver_class"]("commSyslogClient", False) return ret def get_syslog_settings(): """ Get the Syslog configuration settings from the system. .. versionadded:: 2019.2.0 CLI Example: .. code-block:: bash salt '*' cimc.get_syslog_settings """ ret = __proxy__["cimc.get_config_resolver_class"]("commSyslog", False) return ret def get_system_info(): """ Get the system information. CLI Example: .. code-block:: bash salt '*' cimc.get_system_info """ ret = __proxy__["cimc.get_config_resolver_class"]("computeRackUnit", False) return ret def get_users(): """ Get the CIMC users. CLI Example: .. code-block:: bash salt '*' cimc.get_users """ ret = __proxy__["cimc.get_config_resolver_class"]("aaaUser", False) return ret def get_vic_adapters(): """ Get the VIC adapter general profile details. CLI Example: .. code-block:: bash salt '*' cimc.get_vic_adapters """ ret = __proxy__["cimc.get_config_resolver_class"]("adaptorGenProfile", True) return ret def get_vic_uplinks(): """ Get the VIC adapter uplink port details. CLI Example: .. code-block:: bash salt '*' cimc.get_vic_uplinks """ ret = __proxy__["cimc.get_config_resolver_class"]("adaptorExtEthIf", True) return ret def mount_share( name=None, remote_share=None, remote_file=None, mount_type="nfs", username=None, password=None, ): """ Mounts a remote file through a remote share. Currently, this feature is supported in version 1.5 or greater. The remote share can be either NFS, CIFS, or WWW. Some of the advantages of CIMC Mounted vMedia include: Communication between mounted media and target stays local (inside datacenter) Media mounts can be scripted/automated No vKVM requirements for media connection Multiple share types supported Connections supported through all CIMC interfaces Note: CIMC Mounted vMedia is enabled through BIOS configuration. Args: name(str): The name of the volume on the CIMC device. remote_share(str): The file share link that will be used to mount the share. This can be NFS, CIFS, or WWW. This must be the directory path and not the full path to the remote file. remote_file(str): The name of the remote file to mount. It must reside within remote_share. mount_type(str): The type of share to mount. Valid options are nfs, cifs, and www. username(str): An optional requirement to pass credentials to the remote share. If not provided, an unauthenticated connection attempt will be made. password(str): An optional requirement to pass a password to the remote share. If not provided, an unauthenticated connection attempt will be made. CLI Example: .. code-block:: bash salt '*' cimc.mount_share name=WIN7 remote_share=10.xxx.27.xxx:/nfs remote_file=sl1huu.iso salt '*' cimc.mount_share name=WIN7 remote_share=10.xxx.27.xxx:/nfs remote_file=sl1huu.iso username=bob password=badpassword """ if not name: raise salt.exceptions.CommandExecutionError("The share name must be specified.") if not remote_share: raise salt.exceptions.CommandExecutionError( "The remote share path must be specified." ) if not remote_file: raise salt.exceptions.CommandExecutionError( "The remote file name must be specified." ) if username and password: mount_options = " mountOptions='username={},password={}'".format( username, password ) else: mount_options = "" dn = f"sys/svc-ext/vmedia-svc/vmmap-{name}" inconfig = """<commVMediaMap dn='sys/svc-ext/vmedia-svc/vmmap-{}' map='{}'{} remoteFile='{}' remoteShare='{}' status='created' volumeName='Win12' />""".format( name, mount_type, mount_options, remote_file, remote_share ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def reboot(): """ Power cycling the server. CLI Example: .. code-block:: bash salt '*' cimc.reboot """ dn = "sys/rack-unit-1" inconfig = """<computeRackUnit adminPower="cycle-immediate" dn="sys/rack-unit-1"></computeRackUnit>""" ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def set_hostname(hostname=None): """ Sets the hostname on the server. .. versionadded:: 2019.2.0 Args: hostname(str): The new hostname to set. CLI Example: .. code-block:: bash salt '*' cimc.set_hostname foobar """ if not hostname: raise salt.exceptions.CommandExecutionError("Hostname option must be provided.") dn = "sys/rack-unit-1/mgmt/if-1" inconfig = ( """<mgmtIf dn="sys/rack-unit-1/mgmt/if-1" hostname="{}" ></mgmtIf>""".format( hostname ) ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) try: if ret["outConfig"]["mgmtIf"][0]["status"] == "modified": return True else: return False except Exception as err: # pylint: disable=broad-except return False def set_logging_levels(remote=None, local=None): """ Sets the logging levels of the CIMC devices. The logging levels must match the following options: emergency, alert, critical, error, warning, notice, informational, debug. .. versionadded:: 2019.2.0 Args: remote(str): The logging level for SYSLOG logs. local(str): The logging level for the local device. CLI Example: .. code-block:: bash salt '*' cimc.set_logging_levels remote=error local=notice """ logging_options = [ "emergency", "alert", "critical", "error", "warning", "notice", "informational", "debug", ] query = "" if remote: if remote in logging_options: query += f' remoteSeverity="{remote}"' else: raise salt.exceptions.CommandExecutionError( "Remote Severity option is not valid." ) if local: if local in logging_options: query += f' localSeverity="{local}"' else: raise salt.exceptions.CommandExecutionError( "Local Severity option is not valid." ) dn = "sys/svc-ext/syslog" inconfig = f"""<commSyslog dn="sys/svc-ext/syslog"{query} ></commSyslog>""" ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def set_ntp_server(server1="", server2="", server3="", server4=""): """ Sets the NTP servers configuration. This will also enable the client NTP service. Args: server1(str): The first IP address or FQDN of the NTP servers. server2(str): The second IP address or FQDN of the NTP servers. server3(str): The third IP address or FQDN of the NTP servers. server4(str): The fourth IP address or FQDN of the NTP servers. CLI Example: .. code-block:: bash salt '*' cimc.set_ntp_server 10.10.10.1 salt '*' cimc.set_ntp_server 10.10.10.1 foo.bar.com """ dn = "sys/svc-ext/ntp-svc" inconfig = """<commNtpProvider dn="sys/svc-ext/ntp-svc" ntpEnable="yes" ntpServer1="{}" ntpServer2="{}" ntpServer3="{}" ntpServer4="{}"/>""".format( server1, server2, server3, server4 ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def set_power_configuration(policy=None, delayType=None, delayValue=None): """ Sets the power configuration on the device. This is only available for some C-Series servers. .. versionadded:: 2019.2.0 Args: policy(str): The action to be taken when chassis power is restored after an unexpected power loss. This can be one of the following: reset: The server is allowed to boot up normally when power is restored. The server can restart immediately or, optionally, after a fixed or random delay. stay-off: The server remains off until it is manually restarted. last-state: The server restarts and the system attempts to restore any processes that were running before power was lost. delayType(str): If the selected policy is reset, the restart can be delayed with this option. This can be one of the following: fixed: The server restarts after a fixed delay. random: The server restarts after a random delay. delayValue(int): If a fixed delay is selected, once chassis power is restored and the Cisco IMC has finished rebooting, the system waits for the specified number of seconds before restarting the server. Enter an integer between 0 and 240. CLI Example: .. code-block:: bash salt '*' cimc.set_power_configuration stay-off salt '*' cimc.set_power_configuration reset fixed 0 """ query = "" if policy == "reset": query = ' vpResumeOnACPowerLoss="reset"' if delayType: if delayType == "fixed": query += ' delayType="fixed"' if delayValue: query += f' delay="{delayValue}"' elif delayType == "random": query += ' delayType="random"' else: raise salt.exceptions.CommandExecutionError( "Invalid delay type entered." ) elif policy == "stay-off": query = ' vpResumeOnACPowerLoss="reset"' elif policy == "last-state": query = ' vpResumeOnACPowerLoss="last-state"' else: raise salt.exceptions.CommandExecutionError( "The power state must be specified." ) dn = "sys/rack-unit-1/board/Resume-on-AC-power-loss" inconfig = """<biosVfResumeOnACPowerLoss dn="sys/rack-unit-1/board/Resume-on-AC-power-loss"{}> </biosVfResumeOnACPowerLoss>""".format( query ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def set_syslog_server(server=None, type="primary"): """ Set the SYSLOG server on the host. Args: server(str): The hostname or IP address of the SYSLOG server. type(str): Specifies the type of SYSLOG server. This can either be primary (default) or secondary. CLI Example: .. code-block:: bash salt '*' cimc.set_syslog_server foo.bar.com salt '*' cimc.set_syslog_server foo.bar.com primary salt '*' cimc.set_syslog_server foo.bar.com secondary """ if not server: raise salt.exceptions.CommandExecutionError( "The SYSLOG server must be specified." ) if type == "primary": dn = "sys/svc-ext/syslog/client-primary" inconfig = """<commSyslogClient name='primary' adminState='enabled' hostname='{}' dn='sys/svc-ext/syslog/client-primary'> </commSyslogClient>""".format( server ) elif type == "secondary": dn = "sys/svc-ext/syslog/client-secondary" inconfig = """<commSyslogClient name='secondary' adminState='enabled' hostname='{}' dn='sys/svc-ext/syslog/client-secondary'> </commSyslogClient>""".format( server ) else: raise salt.exceptions.CommandExecutionError( "The SYSLOG type must be either primary or secondary." ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def set_user(uid=None, username=None, password=None, priv=None, status=None): """ Sets a CIMC user with specified configurations. .. versionadded:: 2019.2.0 Args: uid(int): The user ID slot to create the user account in. username(str): The name of the user. password(str): The clear text password of the user. priv(str): The privilege level of the user. status(str): The account status of the user. CLI Example: .. code-block:: bash salt '*' cimc.set_user 11 username=admin password=foobar priv=admin active """ conf = "" if not uid: raise salt.exceptions.CommandExecutionError("The user ID must be specified.") if status: conf += f' accountStatus="{status}"' if username: conf += f' name="{username}"' if priv: conf += f' priv="{priv}"' if password: conf += f' pwd="{password}"' dn = f"sys/user-ext/user-{uid}" inconfig = """<aaaUser id="{0}"{1} dn="sys/user-ext/user-{0}"/>""".format(uid, conf) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def tftp_update_bios(server=None, path=None): """ Update the BIOS firmware through TFTP. Args: server(str): The IP address or hostname of the TFTP server. path(str): The TFTP path and filename for the BIOS image. CLI Example: .. code-block:: bash salt '*' cimc.tftp_update_bios foo.bar.com HP-SL2.cap """ if not server: raise salt.exceptions.CommandExecutionError( "The server name must be specified." ) if not path: raise salt.exceptions.CommandExecutionError("The TFTP path must be specified.") dn = "sys/rack-unit-1/bios/fw-updatable" inconfig = """<firmwareUpdatable adminState='trigger' dn='sys/rack-unit-1/bios/fw-updatable' protocol='tftp' remoteServer='{}' remotePath='{}' type='blade-bios' />""".format( server, path ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret def tftp_update_cimc(server=None, path=None): """ Update the CIMC firmware through TFTP. Args: server(str): The IP address or hostname of the TFTP server. path(str): The TFTP path and filename for the CIMC image. CLI Example: .. code-block:: bash salt '*' cimc.tftp_update_cimc foo.bar.com HP-SL2.bin """ if not server: raise salt.exceptions.CommandExecutionError( "The server name must be specified." ) if not path: raise salt.exceptions.CommandExecutionError("The TFTP path must be specified.") dn = "sys/rack-unit-1/mgmt/fw-updatable" inconfig = """<firmwareUpdatable adminState='trigger' dn='sys/rack-unit-1/mgmt/fw-updatable' protocol='tftp' remoteServer='{}' remotePath='{}' type='blade-controller' />""".format( server, path ) ret = __proxy__["cimc.set_config_modify"](dn, inconfig, False) return ret