ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ  jpddlmZmZddlmZmZmZmZmZddlm Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZddlmZddlmZddlmZdd lmZdd lmZd d lmZ d d lm!Z"d dlm#Z$e%jMejNjQejNjSe*de ejVe,dz<e"ejVe,dz<e$ejVe,dz<e Ze"Z!e$Z#e jZe,Z.Gdde Z/Gdde Z0e1e0Z2eeee3ee4effee3ee4efe5ffZ6GddZ7GddZ8y))datetime timedelta)AnyDictListTupleUnion)EnumN)CANONICAL_TIMESTRING_FORMAT) Encryptor)EncryptionKeyNotFound) runCommand) create_file)Retry) constants) encryptor)sizesutilz .constantsz .encryptorz.sizesceZdZdZdZdZdZy)OpTypecp_opos_opcp_os_opunknownN)__name__ __module__ __qualname__ CONTROL_PANELOPERATING_SYSTEMCONTROL_PANEL_OPERATING_SYSTEMUNKNOWNL/opt/nydus/tmp/pip-target-mjwu0ny1/lib/python/customer_local_ops/__init__.pyrr sM%/"Gr$rceZdZdZdZdZdZy) ResourceTypeovh openstack virtuozzo_vmopenstack_hostingcloudN)rrrOVH OPENSTACK VIRTUOZZO_VMOPENSTACK_HOSTINGCLOUDr#r$r%r'r'(s CI!L5r$r'cheZdZdZd dedeeefdefdZ e defdZ e defd Z de fd Zy) OpResultzN Class whose objects encapsulate the complete result of an operation. Nsuccessresultretry_intervalc.||_||_||_y)a Initialize an OpResult instance :param success: Indicates whether or not the operation was successful :param result: A dictionary containing any messages or other data from the operation :param retry_interval: An optional retry interval, in seconds. If this value is greater that or equal to zero, the operation will be retried in that many seconds. N)r2r3r4)selfr2r3r4s r%__init__zOpResult.__init__9s  ,r$returncrt|jtr|jjddSdS)zDConvenience property for accessing the 'errs` key in the result dicterrs isinstancer3dictgetr6s r%r:z OpResult.errsF,/9d.Kt{{vr*SQSSr$crt|jtr|jjddSdS)zDConvenience property for accessing the 'outs` key in the result dictoutsr;r<r@s r%rCz OpResult.outsKrAr$c|j|j|jfS|j|j|jfS)z Construct and return a correctly-sized tuple, based on whether or not a retry_interval value is present, for passing back to Nydus. )r4r2r3r@s r%as_tuplezOpResult.as_tuplePsC 04/B/B/Jt{{+ GllDKK1D1DE Gr$)FNN)rrr__doc__boolrstrrintr7propertyr:rC NydusResultrEr#r$r%r1r15st - -d38n -]` -TcTTTcTTG+Gr$r1c eZdZdZgZdZdZdZdZdZ e jZ dZ dZdZdZded efd Zd ZdKd ed ed dfdZdededed eeeffdZded efdZdeded efdZ dKdededededed ef dZdddeeeefdededeeefded ef dZ dKdZ!dKd Z"dKd!Z#dKd"Z$dKd#Z%dKd$Z&d eee'ffd%Z(d eeeffd&Z)d eeeffd'Z*d eeee'eefffd(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2e3gd0Z4d1Z5d2Z6d3Z7d4Z8d5eeefd efd6Z9 dLd7ed8ed eeeffd9Z: dLd7ed8ed eeeffd:Z;eZ>e II7 8' 4> > r$c |j}tj||S#t$rtj dwxYw)zDecrypt an encrypted value.zDecrypt failed)r^r decrypt Exceptionr[ exception)r6 encryptedkeys r%r`z Ops.decryptusG &&(C$$Y4 4  MM* +   %( Atargetr8c |j}tj||S#t$rtj dwxYw)z Encrypt a plain-text value. :param target: The value to be encrypted :return: An encrypted string zEncrypt failed)r^r encryptrar[rb)r6rfrds r%rhz Ops.encrypt~sG &&(C$$VS1 1  MM* +  rectjd|t|dd5}|j|dddy#1swYyxYw)NzWriting file: %swzutf-8)encoding)r[debugopenwrite)r6pathcontentfs r% write_filezOps.write_files7 $d+ $g .! GGG / . .s AA rcontrol_panel_class_namecj|jd}|d}|d}d}|,|jtjk(r t |}|*||z}|j }dj |||}ndj ||}tj|} t| |} | }|S) al Get an instance of an operating system Ops class or ControlPanel-OS Ops class :param os_op: The operating system class name e.g. linux.CentOS7 :param control_panel_class_name: The control panel class name e.g. cpanel.CPanel :return: An instance of the operating system class e.g. CentOS7 or CP-OS class e.g. CentOS7CPanel .customer_local_opsz4{prefix}.control_panel.{family_name}_{cp_class_name})prefix family_name cp_class_namez'{prefix}.operating_system.{family_name})ryrz) splitrTrrrHlowerformat importlib import_modulegetattr) r6rrspartsos_namerzryr{ module_pathmodclass_s r% get_os_opz Ops.get_os_ops C )Bi % # +0@0@0BfFZFZ0Z(+4y $ # / 88G4::r?rTrrHr~rCr:r2rrE) r6r3rdatarSrrryrCr:s r%build_result_from_other_resultz"Ops.build_result_from_other_results, fe $M##F+ dkk4 (kkooi1A1A1C1I1IJG KKOOIw?M{{z3t9=H;BB7]eQ^C`F*11dii1PD99D.55V$))5T||4;;'4;;',,T4A }}r$r]success_messagecB|dk(}|r||}||j|||fS)a6 This function takes a result from a command output (exit_code, outs, errs) and builds and returns a result tuple with op metadata and errors if appropriate :param exit_code: The exit code returned from the run command :param outs: The stdout from the run command :param errs: The stderr from the run command :param op_name: the name of the op calling this function :param success_message: A message to use in place of 'outs' if the command ran successfully (optional) :return: a result tuple r)r)r6r]rCr:rrr2s r%build_result_from_cmd_outputz Ops.build_result_from_cmd_outputs4q. 2"D..tT7CCCr$intermediate_resultcommandargsrkwcVt||g|i|\}}}|j|||||S)aRun command, return result suitable for a Nydus operation. :param command: command list or string as per runCommand :param op_name: name of the operation; used as runCommand tag and result op_name :param args: additional positional arguments for runCommand :param intermediate_result: Dict containing metadata for retries :param kw: additional keyword arguments for runCommand :return: command result as a Nydus operation result r)r_result_handler) r6rrrrrr]rCr:s r%run_command_and_handle_resultz!Ops.run_command_and_handle_result s>!+7G Id Ib I 4##ItT7Xk#llr$ctrOrVr6payloadunuseds r%add_userz Ops.add_user+!!r$ctrOrVr6rs r%shutdown_cleanzOps.shutdown_clean= "!r$ctrOrVr6usernamers r% enable_adminzOps.enable_adminTrr$ctrOrVrs r% disable_adminzOps.disable_adminYrr$ctrOrVrs r%disable_all_adminszOps.disable_all_admins^rr$ctrOrVrs r% extend_diskzOps.extend_diskcrr$ct)zReturn current CPU utilization. :returns: dictionary with keys: - cpuUsed: percentage in range 0-100 rVr@s r%_get_cpu_utilizationzOps._get_cpu_utilizationhs "!r$c~tj|j}|jdz |jdz dS)zReturn current disk utilization. :returns: dictionary with keys: - diskTotal: mebibytes - diskUsed: mebibytes ) diskTotaldiskUsed)shutil disk_usageDISK_UTILIZATION_PATHtotalused)r6disks r%_get_disk_utilizationzOps._get_disk_utilizationps;  !;!;<!ZZ2- IIO- -r$ct)zReturn current memory utilization. :returns: dictionary with keys: - memoryTotal: mebibytes - memoryUsed: mebibytes rVr@s r%_get_memory_utilizationzOps._get_memory_utilization{s "!r$ci}|j|j|jfD]}|j|t j j t|d<|S)aReturn current system utilization. :returns: dictionary with keys: - collected: current time in :data:`~customer_local_ops.constants.CANONICAL_TIMESTRING_FORMAT` - memoryTotal: mebibytes - memoryUsed: mebibytes - diskTotal: mebibytes - diskUsed: mebibytes - cpuUsed: percentage in range 0-100 collected)rrrupdaterutcnowstrftimer )r6r3statss r%get_utilizationzOps.get_utilizationsm//10022246E MM% 6'oo/88 '){ r$c|j}|d}|d}dj||}|jd}|r|dj|z }|jd}|r|d j| z }|jd }|r|d j| z }|jdd} | r|dz }t||y)z Panopta agent uses a manifest file for configuration of the customer id and templates to use. This method creates that manifest file. customer_key template_idsz_[agent] customer_key = {customer_key} templates = {template_ids} enable_countermeasures = false)rr server_keyz server_key = {server_key})rfqdnz fqdn = {fqdn})r serverNamez server_name = {serverName})rdisable_server_matchFz disable_server_match = trueN)PANOPTA_MANIFEST_FILEr~r?r) r6r manifest_filerrcust_key_contentsrr server_namers r%_create_panopta_manifest_filez!Ops._create_panopta_manifest_files 22 ~. ~. "#)&lQ]&"^  [[.  !>!E!EQ[!E!\ \ {{6"  !2!9!9t!9!D D kk,/  !?!F!FR]!F!^ ^ &{{+A5I  !@ @ M#45r$ctrOrV)r6rrkwargss r%install_panoptazOps.install_panoptarr$ctrOrVr6rrs r%delete_panoptazOps.delete_panoptarr$ctrOrVrs r%get_panopta_server_keyzOps.get_panopta_server_keyrr$iiP)Anydusznydus-executorznydus-exz nydus-ex-apiz panopta-agentzfm-agentzfortimonitor-agentz cloud-initzcloudbase-initwaagent vboxguestzqemu-guest-agentz virtio-winzvirtio-win-gt-x64z gpg-pubkeykernelz shim-signedshimpsafail2banz libpam-plesklibapszmod-security-v3zlibapache2-modsecurity-pleskzlibapache2-mod-aclr2-psazlibapache2-mod-sysenv-psazlibapache2-mod-fcgid-psazFortiMonitor AgentIntegration ServiceszSSMS Post Install TaskszSAV Dynamic Interfacepciutilsusbutils dmidecode irqbalancekmodz base-filesz base-passwdhostname filesystemtzdata coreutilsz util-linuxsedgrep diffutils findutilstargzipzca-certificateszbash-completionz distro-info initscripts chkconfig authselectdebconfaptitudejqbcatgdm4ziprpmlua)Tzcpanel-zplesk-zea-z wp-toolkit-z installatron-zpsa-zsw- mod_passengerzpp18.zlibapache2-mod-passengerimunifyzai-bolitz alt-commonPleskzkernel-z linux-image-zlinux-headers-zlinux-modules-zgrub-zgrub2-z microcode-z firmware-zalsa-zintel-zamd64-zbase-zopen-vm-z qemu-guest-libaltzperl-zruby-zphp-glibcglib2znss-opensslgnupggnutlszubuntu-zdebian-ztask-zadwaita-zhicolor-zlanguage-pack-zlanguage-selector-zfonts-zgnome-z xserver-xorg-z desktop-file-z shared-mime-zapt-zdpkg-zredhat-zfedora-zcentos-z almalinux-zselinux-policyzdracut-zsystemd-zdnf-zyum-zrpm-sendmailzMicrosoft Visual C++zMicrosoft .NETzMicrosoft ASP.NETzMicrosoft EdgezMicrosoft ODBCzMicrosoft SQL ServerzMicrosoft VSS WriterzMicrosoft SilverlightDirectXWebView2KBzCumulative UpdatezSecurity Updatez Service StackzMonthly RollupzCritical UpdatezWindows Driver PackagerzIntel(R)Realtek) passengerzCritical Update for SQL Serverz SQL Server FortiMonitorrc &d}|jddxsd}|jdd}|jddg}|rt|jsd|jdd|fSt|j}|j |}|4d|jdd j |jdd|fS|rG|j |}|4d|jdd j |jdd|fS|rt|jsd}|rJ|rH t j|d }t j|d }||krd|jdd |fS |j|jd }i} g} |D]C} |j| } | !| jdj | 7 | ||| | <Et j j#t$|t|| d}|r||d<| r| |d<t'| dkD}||jt)j*|| rdj-| |fSd|fS#t$rYwxYw#t$r.| jdj | t|Yt$rK} tjd| | jdj | t| Yd} ~ ld} ~ wwxYw)Ncollect_vm_metrics start_dater;end_date metric_typesinstalled_packagesFzstart_date is requiredzInvalid start_date format: {}zInvalid end_date format: {}%Y-%m-%dT%H:%M:%Sz-end_date must be equal to or after start_date)r#processes_services_resourceszUnknown metric type: {}z{}: not supported on {}zFailed to collect metric: %sz{}: {}) collected_atr os_classmetricserrorsrz; )r?rHstripr_normalize_dater~rstrptimer_collect_installed_packages%_collect_processes_services_resourcesappendrWrar[rbrrr rjsondumpsjoin)r6rrr r!r"prov_dtend_dt collectorsr(r) metric_type collectorer3r2s r%rzOps.collect_vm_metricssB&[[r28b ;;z2.{{>4H3IJ s:446$00,g77 7_**, ))*5  $003::KK b134;== = ++H5Hd445<< J356=???S]002H ( "++J8KL!**85HIG# $"8"8KW#VVV$#'"B"B,0,V,V 'K"{3I  7>>{KL D'0X'F $ (%OO-667RS$D    !)F:  %F8 g,".. JJv !'DIIf     -/    G  "' X 7>>{CPTIVW D  (Ux!uu-.15E3F)3SxU  !**:7JK),"??#__-@A '/Bx! !12j@xB  "##K0%ook;GG'/?x! !12g=x?x)UB  ? *  sL"B<:C&C7C<)C%C6CC CCCC-,C-c,g}|D]W}|jdd}|r|dk(r|jd|f0 |jtj|d|fY|j d|S#t$r|jd|fYwxYw)aIParse install dates and pair each package with its datetime. Converts the 'installed_date' string from each package dict into a datetime object. Packages with missing, 'unknown', or unparsable dates get None as their datetime. Returns a list sorted by install time, with None-dated packages at the beginning (treated as datetime.min for sorting purposes). :param packages: List of package dicts, each expected to have 'installed_date' key :return: List of (datetime_or_None, package_dict) tuples, sorted by datetime ascending rDr;rNr$c6|dr|dStjS)Nr)rmin)xs r%z*Ops._parse_install_times..s!A$!A$"@HLL"@r$)rd)r?r/rr,rsort)rAparsedpkg install_dates r%_parse_install_timeszOps._parse_install_timessC77#3R8L<9#< tSk* + x00?RSUXYZ   @ A  + tSk* +s'A44BB thresholdtime_window_minutesct}t|dz }t|Dcgc]\}\}}|||f}}}}d} d} t|} t|D]\} \} }||z }||z}| | kr!|| d|kr| dz } | | kr || d|kr| | kr!|| d|kr| dz } | | kr || d|kr| | z |k\sh|j d|| | D|Scc}}}w)uDetect packages installed in bursts using a sliding window algorithm. Uses a two-pointer sliding window technique to efficiently find all packages whose install time falls within a "burst window" - a period where >= threshold packages were installed within time_window_minutes of each other. Algorithm: O(n) time complexity - For each package with a valid timestamp, create a window of ±(time_window_minutes/2) - Count how many packages fall within that window - If count >= threshold, mark all packages in the window as part of a burst Example: threshold=8, time_window_minutes=30 - Package at 10:15 creates window [10:00, 10:30] - If 8+ packages installed between 10:00-10:30, all are marked as burst :param parsed_packages: List of (datetime_or_None, package_dict) tuples from _parse_install_times :param threshold: Minimum number of packages in a window to qualify as a burst :param time_window_minutes: Total time window in minutes (split ±half around each timestamp) :return: Set of indices (into parsed_packages) that are part of any burst r)minutesrrc3&K|] \}}| ywrOr#).0pkg_idx_times r% z*Ops._find_burst_indices..sU;T%W;Ts)setr enumeraterr)parsed_packagesrWrXburst half_windowi install_time_pkg valid_entriesleftright total_valid current_pos pkg_index window_start window_ends r%_find_burst_indiceszOps._find_burst_indicessO,(;a(?@ ,5_+E +E''L$' +E  -( 7@ 6N 2K2)\'+5L% 3J$t)q*AZ*O +%-*>q*AZ*Ot|y( U=e;TUU7O 7 sC!ctj|}tj|||}t|Dcgc]\}\}}||vs|c}}}Scc}}}w)aExclude packages installed in large batches within a short time window. Filters out packages that were likely installed by automated system updates or provisioning scripts, keeping only packages that appear to be manually installed. Rationale: - System updates (dnf/apt/yum) typically install 10-170+ packages within 5-20 minutes - Human administrators typically install 1-5 packages at a time with longer gaps - Threshold of 8 provides buffer to avoid false positives on legitimate multi-package installs :param packages: List of package dicts with 'installed_date' field :param threshold: Minimum packages in time window to consider a "burst" (default: 8) :param time_window_minutes: Sliding window size in minutes (default: 30) :return: Filtered list containing only packages NOT part of detected bursts )rMrVrpra)rArWrXrb burst_indicesre _datetimerTs r%_filter_batch_installszOps._filter_batch_installssZ&228<//L_` /8/Id/I++IsQVcMc/Iddds A ArTrIc|jdxsd} tj|d|kDS#ttf$rYywxYw)z?True if pkg installed_date parses and is strictly after cutoff.rDr;r$F)r?rr,rrG)rTrIraws r%_package_installed_afterzOps._package_installed_aftersMww'(.B $$S*=>G GI&  s0AA raw_outputcng}|r|js|S|jjdD]|}|jd}t|dk7r#|j|dj|dj|dj|djd~|S) N |rrrr)nameversionrDsource)r*r|rr/)rxrAliners r%_parse_package_lineszOps._parse_package_liness!1!1!3O$$&,,T2DJJsOE5zQ OOa( 8>>+"'(.."2(..*   3r$cdfd}|Dcgc]}||jdr|}}d}t|jkDr|dj}d}t||d}|rd|d<tj|}t|j kDr[|rY|dt|dz}||d <t||d <d|d<tj|}t|j kDr|rY|Scc}w) Nc6d|vr|jddS|S)N:r)r|)r}s r% _strip_archz.Ops._build_package_result.._strip_archs!d{zz#q))Kr$c|sy|}|jvryjD]}|j|syjD]}||vsyy)NTF)INFRA_PACKAGE_EXCLUSIONSINFRA_PACKAGE_PREFIXES startswithINFRA_PACKAGE_CONTAINS)r}baseryneedlerr6s r% _is_infraz,Ops._build_package_result.._is_infra sdt$Dt44455??6*655T>6r$r}FT)countitems truncatedrrr)r?rMAX_METRIC_ITEMSr0r1MAX_METRIC_JSON_SIZE)r6rArrHrr3json_strrs` @r%_build_package_resultzOps._build_package_results    (Hx!yv/GAxH x=400 0 6!6!67HI]  "&F; ::f%(md777H 3X!!34H&F7O!(mF7O"&F; zz&)H (md777H -Is C=C=ctj|j|j|||||dz\}}|s+|jD]}||vs|i}||d<t |cS||fS)aTake the result from a run command and check for retryable errors. If found, return a Retry. If not, return a Nydus result tuple. :param exit_code: The exit code from the executed command :param outs: The stdout output from the executed command :param errs: The stderr output from the executed command :param op_name: The name of the op :param intermediate_result: Dict containing metadata for retries :return: A Nydus result tuple, or Retry z succeededretryable_error)r[infoRETRYABLE_ERRSrr) r6r]rCr:rrr2r3 retryable_errs r%rzOps._result_handler0s $$%;;ItTSZ\cfr\rs!%!4!4  D(*2.0+=J'(9: !455 "5 r$rO)r;)r;r)rr)HrrrrrrDISTRO OS_VERSIONQEMU_PACKAGE_NAMErQrr"rSrTrXr^r`rHrhrrrrrrr1rrKrrIrr rrrrrrrrfloatrrrrrrrrrrTOP_PROCESSES_BY_RESOURCE frozensetrrrBATCH_INSTALL_THRESHOLD!BATCH_INSTALL_TIME_WINDOW_MINUTESrr-r. staticmethodr+rLrVrprtrrGrwrrrr#r$r%rMrMYs N9 FJ'nnG" c c  scU>cstCQTH~$&c&h&(#S#3#;#L=ADcDDCDZ]D69DEPD,MQ m/4T#Y^/Dm/2m.1m<@S> m -0 m 5@ m<"$"." " " " "d3:&6" -tCH~ -"c3h"c5S+A&A!B*66"""  !(* ,8 )+%G $sCx.G [G T57"c".1";?S>" ?A""8;"EI#s(^"CE#t),</123T#s(^(<*-(+-09=T#s(^8L4tDcN';655RU55n01:<ed38n)=e*-e47eAEd3PS8nAUee.d38nh4d38n1E )d4S>.B)tCQTH~)X?CCsS-1#s(^GRr$rM)9rrtypingrrrrr enumr rr0loggingrsys_sysos_os!customer_local_ops.util.constantsr !customer_local_ops.util.encryptorr customer_local_ops.exceptionsr customer_local_ops.util.executercustomer_local_ops.util.helpersrcustomer_local_ops.util.retryrrr _constantsr _encryptorr_sizes__path__r/ror2dirname__file__modulesr getLoggerr[rr'listRESOURCE_TYPESrGrHrIrKr1rMr#r$r%rs9(00  I7?67/))! chh..x8&AB(2 X $%(2 X $%$* X !   g!T646l#E5tCH~!56dDcNTW>W8XXY !G!GHk k r$