§ ½@¾jö4ãó¶—ddlZddlZddlmZddlmZddlmZmZm Z m Z m Z m Z m Z ddlmZmZmZmZedzZdd d d œZd d dœZd d dœZdd„Zd„Zd„Zdd„Zd„ZdS)éN)Ú mod_makedirsé)Úlve_stats2_lib)Úboolean_to_yes_noÚis_positive_intÚmin_num_notify_converterÚ repack_dictÚstr_to_booleanÚtime_convertor_to_dictÚtime_unit_to_letter)ÚLveStats2ExceptionÚStatsNotifierConfigÚStatsNotifierDirÚ faults_dictz /resellers.d/ÚnotifyResellerÚnotifyResellerOnCustomersÚnotifyCustomers)ÚNOTIFY_RESELLER_ON_TOTAL_FAULTSÚ#NOTIFY_RESELLER_ON_CUSTOMERS_FAULTSÚNOTIFY_CUSTOMERS_ON_FAULTSÚresellerÚcustomer)ÚNOTIFY_MIN_FAULTS_RESELLERÚNOTIFY_MIN_FAULTS_CUSTOMER)ÚNOTIFY_INTERVAL_RESELLERÚNOTIFY_INTERVAL_CUSTOMERÚrcó —d|vrHtj|tjtjztjztjzd¦«}n,tj|tjtjz¦«}tj||d¬¦«S)NÚwé€zutf-8)ÚmodeÚencoding)ÚosÚopenÚO_WRONLYÚO_CREATÚO_TRUNCÚ O_NOFOLLOWÚO_RDONLYÚfdopen)Ú file_namer!Úfds ú&py/clconfig/lve_stats2_reseller_lib.pyÚ_openr./si€à ˆd€{€{Ý ŒW�Y¥¤ ­b¬jÑ 8½2¼:Ñ EÍÌ Ñ UÐW\Ñ ]Ô ]ˆˆå ŒW�Y¥¤ ­b¬mÑ ;Ñ <Ô <ˆÝ Œ9�R˜d¨WÐ 5Ñ 5Ô 5Ð5ócóî—|€td¦«‚d|vs+d|vs'd|vs#d|vstj |¦«rt dd|id œ¦«‚tj t |›d �¦«}tj t ¦«}tj |¦« |tj z¦«st d ||d œd œ¦«‚|S) an Validate ``reseller`` as a bare system username and build its StatsNotifier config path under ResellerStatsNotifierDir. A real reseller username can never contain a path separator, a NUL byte or '..', nor be an absolute path; rejecting those stops os.path.join from silently discarding the base dir (absolute name) or traversing out of it. Nzreseller can`t be Noneú/ú\úz..z#invalid reseller name: %(reseller)sr©ÚmessageÚcontextz_StatsNotifier.cfgz-reseller config path %(path)s escapes %(dir)s)ÚpathÚdir) Ú ValueErrorr#r7Úisabsr ÚjoinÚResellerStatsNotifierDirÚrealpathÚ startswithÚsep)rÚ config_pathÚreal_dirs r-Ú_reseller_config_pathrB8s€ðÐÝÐ1Ñ2Ô2Ð2Ø ˆxˆˆ˜4 8Ð+Ð+¨t°xÐ/?Ð/?Ø�xÐÐ¥2¤7§=¢=°Ñ#:Ô#:ÐÝ Ð-RØ.8¸(Ð-Cð"Eð"EñFôFð Få”'—,’,Õ7¸HÐ9XÐ9XÐ9XÑYÔY€KåŒw×ÒÕ 8Ñ9Ô9€HÝ Œ7× Ò ˜KÑ (Ô (× 3Ò 3°H½r¼vÑ4EÑ FÔ FðVÝ Ð-\Ø6AÈ(Ð-SÐ-Sð"Uð"UñVôVð Và Ðr/có~‡—tj¦« d¦«Šˆfd„dD¦«}d‰d‰dd‰dddœ‰d‰d dd ‰d dd d œ‰d dd ‰d dd d œdœ|‰d dœiS)z; Creates default StatsNotifier config for reseller ÚfaultsNotificationcó.•—i|]}|‰d|“ŒS)ÚfaultsToInclude©)Ú.0ÚkeyÚ admin_configs €r-ú z3_create_default_reseller_config..Us2ø€ðððÀ#�C˜Ð&7Ô8¸Ô=ðððr/)ÚmemÚiopsÚioÚnprocÚconcurrentConnectionsÚcpuÚnotifyResellersÚminimumNumberOfFaultsToNotifyÚadminÚuser)rrÚnotifyÚ unitOfTimeÚperiod)rWrXÚnotifyResellerCustomers)rrSrrVrFr)rÚget_notificationÚget)Ú admin_faultsrJs @r-Ú_create_default_reseller_configr]Psø€õ"Ô2Ñ4Ô4×8Ò8Ð9MÑNÔN€LðððððJðñô€Lð !Ø*6Ð7HÔ*Ià)Ð*IÔJÈ7ÔSØ)Ð*IÔJÈ6ÔRð/Tð/Tð ,Ð,=Ô>Ø3?ÀÔ3IÈ'Ô3RÐS_Ô3`Ø/;¸HÔ/EÀgÔ/NÈxÔ/Xð%Zð%Zà3?ÀÔ3IÈ&Ô3QÐR^Ô3_Ø/;¸HÔ/EÀfÔ/MÈhÔ/Wð%Yð%Yððð !-Ø ,Ð-FÔ Gð ð ð ð r/FcóJ—t|¦«}tj |¦«s|rt ¦«niS t |¦«}| ¦«}| ¦«n>#ttf$r*}tdt|¦«zd|idœ¦«|‚d}~wwxYwi}|D]_}|  d¦«s|  ¦«dkrŒ0| d¦«\}} |   ¦«||<Œ`t} t } t"} t$} t'| |t(¦«}t'| |t(¦«}t'| |t*d¬ ¦«}t'| |t,¦«}||d <||d <||d <d |iS)ak Retrieves lve-stats2 notifications parameters for resellers :param bool defaults: True if we want get defaults when config is not set, else False :param str reseller: reseller name, if we want notifications parameters for a reseller :return: dict. For example: {'faultsNotification': {'notifyResellerCustomers': True, 'notifyResellers': True, 'minimumNumberOfFaultsToNotify': {'admin': 0, 'user': 0}, 'notifyAdmin': True, 'notify': {'admin': {'unitOfTime': 'hours', 'period': 12}, 'user': {'unitOfTime': 'hours', 'period': 12} }, 'faultsToInclude': {'mem': True, 'iops': False, 'io': False, 'nproc': False, 'concurrentConnections': False, 'cpu': True}, 'notifyCustomers': False } } ú%(lvestats_cfg)s read error: Ú lvestats_cfgr4Nú#Úú=r)ÚdefaultrFrSrVrD)rBr#r7Úexistsr]r.Ú readlinesÚcloseÚIOErrorÚOSErrorr Ústrr>ÚstripÚsplitÚreseller_notify_dictrÚreseller_number_notify_dictÚreseller_notify_time_dictr r rr )rÚdefaultsr@ÚfÚconfigÚeÚ config_dictÚlinerIÚvalueÚnotify_dÚfaults_dÚnumber_notify_dÚ notify_time_dÚfaults_notification_dictÚfaults_include_dictÚmin_num_notifyÚ period_notifys r-rZrZhsÉ€õ((¨Ñ1Ô1€Kå Œ7�>Š>˜+Ñ &Ô &ðEØ4<ÐDÕ.Ñ0Ô0Ð0À"ÐDðTÝ �+Ñ Ô ˆØ—’‘”ˆØ �Љ Œ ˆ ˆ øÝ •WÐ ðTðTðTÝ Ð-LÍsÐSTÉvÌvÑ-UØ.<¸kÐ-Jð"Lð"LñMôMØRSð TøøøøðTøøøð€KØð)ð)ˆØ �?Š?˜3Ñ Ô ð  4§:¢:¡<¤<°2Ò#5Ð#5Ø Ø—Z’Z ‘_”_‰ ˆˆUØ Ÿ;š;™=œ=ˆ �CÑÐå#€HÝ€HÝ1€OÝ-€Må*¨8°[Å.ÑQÔQÐÝ% h° ½^ÑLÔLÐÝ  °+Õ?WÐabÐcÑcÔc€NÝ  ¨{Õ$r%}t-d1| d(z›d2|›�zd|id œ¦«|‚d}~wwxYw| |vr| ›d0|| ›�| | <|| =Œ—n>#t4t@f$r*}t-d1t/|¦«zd|id œ¦«|‚d}~wwxYw| ¦«D]\} } |  !| ›d0| ›�¦«Œ t%|d3¦«5}| "d* #| ¦«¦«ddd¦«n #1swxYwYn>#t(t*f$r*}t-d4t/|¦«zd|id œ¦«|‚d}~wwxYwtIj%d5d6d7d8¬9¦«dS):aÖ Sets lve-stats2 notifications parameters :param parameters_dict: Parametres to set. For example: {u'notifyResellers': True, u'faultsToInclude': {u'mem': True, u'iops': False, u'io': False, u'nproc': False, u'concurrentConnections': False, u'cpu': True}, u'minimumNumberOfFaultsToNotify': {u'admin': 0, u'user': 0}, u'notifyAdmin': True, u'notify': {u'admin': {u'unitOfTime': u'hours', u'period': 12}, u'user': {u'unitOfTime': u'hours', u'period': 12} }, u'notifyResellerCustomers': True, u'notifyCustomers': False } :param str reseller: either reseller name or None rN)riír có6—g|]}| ¦«‘ŒSrG©rk©rHrus r-ú z$set_notification..Ñs €Ð?Ð?Ð?¨˜Ÿ š ™ œ Ð?Ð?Ð?r/r_r`r4có —t|¦«S©N©r©Úxs r-úz"set_notification..Ùs€Õ2CÀAÑ2FÔ2F€r/zfaultsToInclude/cpucó —t|¦«Sr…r†r‡s r-r‰z"set_notification..Ús€Õ4EÀaÑ4HÔ4H€r/zfaultsToInclude/nproccó —t|¦«Sr…r†r‡s r-r‰z"set_notification..Ûó€Õ1BÀ1Ñ1EÔ1E€r/zfaultsToInclude/iocó —t|¦«Sr…r†r‡s r-r‰z"set_notification..Üs€Õ5FÀqÑ5IÔ5I€r/zfaultsToInclude/memcó —t|¦«Sr…r†r‡s r-r‰z"set_notification..ÝrŒr/z%faultsToInclude/concurrentConnectionscó —t|¦«Sr…r†r‡s r-r‰z"set_notification..Þs€Õ3DÀQÑ3GÔ3G€r/zfaultsToInclude/iops)Ú NOTIFY_CPUÚ NOTIFY_NPROCÚ NOTIFY_IOÚ NOTIFY_MEMORYÚ NOTIFY_EPÚ NOTIFY_IOPScóB—t|¦«›t|¦«›�Sr…©rr ©rˆÚys r-r‰z"set_notification..áó#€µ_ÀQÑ5GÔ5GÐ2aÕI\Ð]^ÑI_ÔI_Ð2aÐ2a€r/znotify/reseller/periodznotify/reseller/unitOfTimecóB—t|¦«›t|¦«›�Sr…r—r˜s r-r‰z"set_notification..äršr/znotify/customer/periodznotify/customer/unitOfTimecó —t|¦«Sr…r†r‡s r-r‰z"set_notification..çs€Õ6GÈÑ6JÔ6J€r/rcó —t|¦«Sr…r†r‡s r-r‰z"set_notification..ès€Õ:KÈAÑ:NÔ:N€r/rcó —t|¦«Sr…r†r‡s r-r‰z"set_notification..érŒr/rz&minimumNumberOfFaultsToNotify/resellerz&minimumNumberOfFaultsToNotify/customer)rrrrrrrcóž•—| d¦«} ‰}|D] }||}Œ n%#t$r‰d}|D] }||}Œ YnwxYw|S)Nr1rD)rlÚKeyError)r7Ú path_partsÚpointÚpartÚnotifier_paramsÚparameters_dicts €€r-Úget_val_by_pathz)set_notification..get_val_by_pathïsŒø€Ø—Z’Z ‘_”_ˆ ð $Ø#ˆEØ"ð $ð $�ؘdœ ��ð $øåð $ð $ð $Ø#Ð$8Ô9ˆEØ"ð $ð $�ؘdœ ��ð $ð $ð $øøøðˆ s˜(¨A Á A c3ó.•K—|]}‰|¦«V—ŒdSr…rG)rHrˆr¦s €r-ú z#set_notification..s-øèè€Ð*OÐ*OÀ!¨?¨?¸1Ñ+=Ô+=Ð*OÐ*OÐ*OÐ*OÐ*OÐ*Or/rú ú z illegal newline in %(key)s valuerIcó6—g|]}| ¦«‘ŒSrGr�r‚s r-rƒz$set_notification.. s €Ð=Ð=Ð=¨�t—z’z‘|”|Ð=Ð=Ð=r/rarbrcz%(lvestats_cfg)s format error: z: rz%(lvestats_cfg)s write error: z+/sbin/service lvestats reload &>/dev/null &Tz /bin/bashF)ÚshellÚ executableÚcheck)&r#r7rerÚlenrBÚupdater]rZÚdirnamerr$r%r&ÚO_EXCLr(rgÚFileExistsErrorr.rfrhrir rjÚitemsÚ isinstancer Ú enumerater>rkrlr9Ú IndexErrorÚappendÚ writelinesr;Ú subprocessÚrun)r¥rr@r,rqÚ config_linesrsÚfaults_config_mapÚ new_configrIÚvalrvÚconfig_to_writeÚidxrur¦r¤s` @@r-Úset_notificationr sìøøø€õ& Œ7�>Š>Õ-Ñ .Ô .ðµ#°oÑ2FÔ2FÈ!Ò2KÐ2K؈à€OÝ'¨Ñ1Ô1€KÝ Œ7�>Š>˜+Ñ &Ô &ðDØ×ÒÕ>Ñ@Ô@ÑAÔAÐAÐAà×ÒÕ/¸ÐBÑBÔBÑCÔCÐCõ Œ7�>Š>�"œ'Ÿ/š/¨+Ñ6Ô6Ñ 7Ô 7ð:Ý•R”W—_’_ [Ñ1Ô1°5Ñ9Ô9Ð9Ý Œ7�>Š>˜+Ñ &Ô &ð ð Ý”˜¥b¤kµB´JÑ&>ÅÄÑ&JÍRÌ]Ñ&ZÐ\aÑbÔbˆBÝ ŒH�R‰LŒLˆLˆLøÝð ð ð ð ˆDð  øøøð\Ý �+Ñ Ô ˆØ?Ð?°·²±´Ð?Ñ?Ô?ˆ Ø �Љ Œ ˆ ˆ øÝ •WÐ ð\ð\ð\Ý Ð-LÍsÐSTÉvÌvÑ-UØ.<Õ>QÐ-Rð"Tð"TñUôUØZ[ð \øøøøð\øøøð )GÐ(FÐH]Ð'^Ø*HÐ*HÐJaÐ)bØ'EÐ'EÐG[Ð&\Ø+IÐ+IÐK`Ð*aØ'EÐ'EÐGnÐ&oØ)GÐ)GÐI_Ð(`ð bðbÐð×ÒØ%aÐ%aØ%=Ø%Að%Cð&bÐ%aØ%=Ø%Að%Cð-KÐ,JÐL\Ð+]Ø0NÐ0NÐPkÐ/lØ'EÐ'EÐGXÐ&YØ&NØ&Nð Pð Pñ Qô Qð Qð€Jð ð ð ð ð ð ð&×+Ò+Ñ-Ô-ðð‰ˆˆSð ݘ#�sÑ#Ô#ð QØ"1 /°#Ñ"6Ô"6� ˜3‘�à"( # a¤&Ð*OÐ*OÐ*OÐ*OÀsÈ1È2È2ÄwÐ*OÑ*OÔ*OÐ"P� ˜3‘øøÝð ð ð Ø ˆHð øøøð!×&Ò&Ñ(Ô(ð@ð@‰ ˆˆUØ •3�u‘:”:Ð Ð  ­¨U©¬Ð!3Ð!3Ý$Ð1SØ27¸°ð&?ð&?ñ@ô@ð @ð"4ð >Ð=° Ð=Ñ=Ô=€OðTÝ" <Ñ0Ô0ð $ð $‰IˆC�à�Š˜sÑ#Ô#ð  t§z¢z¡|¤|°rÒ'9Ð'9Øð FØ!ŸZšZ¨™_œ_‘ ��U�UøÝð Fð Fð FÝ(Ø@ÀcÈAÁgÐCWÐCWÐQUÐCWÐCWÑWØ .° Ð<ð*>ð*>ñ?ô?àDEðFøøøøð Føøøð�jÐ Ð à*-Ð'AÐ'A° ¸3´Ð'AÐ'A� Ñ$à˜s�Oøð $øõ •jÐ !ðTðTðTÝ Ð-NÕQTÐUVÑQWÔQWÑ-WØ.<¸kÐ-Jð"Lð"LñMôMØRSð TøøøøðTøøøð!×&Ò&Ñ(Ô(ð1ð1‰ ˆˆUØ×Ò #Ð/Ð/¨Ð/Ð/Ñ0Ô0Ð0Ð0ðTÝ �; Ñ $Ô $ð 5¨Ø �LŠL˜Ÿš ?Ñ3Ô3Ñ 4Ô 4Ð 4ð 5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5øøå •WÐ ðTðTðTÝ Ð-MÕPSÐTUÑPVÔPVÑ-VØ.<¸kÐ-Jð"Lð"LñMôMØRSð TøøøøðTøøøõ „NÐ@ب+¸UðDñDôDðDðDðDs¸Ä;AFÆ F$Æ#F$Æ(AG*Ç*H*Ç;*H%È%H*ÊAKË K,Ë+K,Í AO3ÎN(Î'O3Î( OÎ2 OÏOÏO3Ï3P.Ð%P)Ð)P.Ñ&R7Ñ6)R+Ò R7Ò+R/Ò/R7Ò2R/Ò3R7Ò7S2Ó%S-Ó-S2)r)F)r#rºÚclcommon.utilsrrbrÚclconfig_utilsrrrr r r r r rrrr<rmrnror.rBr]rZrÂrGr/r-úrÅsxðð € € € ØÐÐÐà'Ð'Ð'Ð'Ð'Ð'àÐÐÐÐÐðððððððððððððððððððcÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbà+¨oÑ=Ðð(8Ø+FØ"3ððÐð#-Ø",ððÐð !+Ø *ððÐð6ð6ð6ð6ðððð0ððð05<ð5<ð5<ð5<ðpMDðMDðMDðMDðMDr/