PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
# coding: utf-8 # # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2019 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT from typing import Dict, Optional, Tuple, Union # NOQA from cllimitslib_v2 import LimitsDataStorage, DEFAULTS # NOQA from cllimitslib_v2.lve_storage import ( Package, User, Reseller, OWN_SOURCE, RESELLER_SOURCE, # NOQA PACKAGE_SOURCE, GLOBAL_SOURCE ) from .base import BaseValidator, ENTITY_USER, ENTITY_PACKAGE, ENTITY_RESELLER, ENTITY_DEFAULTS class EpNprocValidator(BaseValidator): def __init__(self, _limits_data_storage=None): # type: (LimitsDataStorage) -> None super().__init__(_limits_data_storage=_limits_data_storage) # difference beetween nproc limit and ep for normal server work # see LU-919 self.diff_nproc_and_ep = 15 @property def message_dict(self): # type: () -> Dict common_msg = ( f'NPROC limit must be greater than EP + {self.diff_nproc_and_ep} limit, because ' 'number of processes and threads within LVE includes ' 'also Apache processes/threads, SSH sessions and etc, ' 'which enter into LVE.' ) message_dict = dict(self._message_dict) message_dict['common_msg'] = common_msg return message_dict def _ep_and_nproc_is_valid(self, ep, nproc): # type: (int, int) -> bool if nproc == 0 or ep == 0: result = True else: result = nproc >= ep + self.diff_nproc_and_ep return result def _validate_nproc_and_ep_for_user(self, user, ep, nproc, has_input_limits): # type: (User, Union[int, None], Union[int, None], bool) -> Tuple[bool, Dict] """ :param has_input_limits: User has input limits, which will be set to it """ message_dict = self.message_dict user_limits = self.limits_provider.get_user_limits(user) ep = int(ep or user_limits.ep.value) nproc = int(nproc or user_limits.nproc.value) result = self._ep_and_nproc_is_valid(ep, nproc) ep_source = user_limits.ep.source nproc_source = user_limits.nproc.source if has_input_limits: message_dict['affected_entity'] = ENTITY_USER message_dict['entity_id'] = user.id elif OWN_SOURCE in (nproc_source, ep_source): message_dict['affected_entity'] = ENTITY_USER message_dict['entity_id'] = user.id if ep_source != OWN_SOURCE: inheritance_limit = 'ep' elif nproc_source != OWN_SOURCE: inheritance_limit = 'nproc' else: inheritance_limit = None message_dict['specific_msg'] = None if inheritance_limit is None else ( f'{inheritance_limit.upper()} is inherited ' f'from {getattr(user_limits, inheritance_limit).source.capitalize()}' ) elif OWN_SOURCE not in (nproc_source, ep_source) and nproc_source == ep_source: message_dict['affected_entity'] = ep_source if ep_source == PACKAGE_SOURCE: message_dict['entity_id'] = user.package.name elif ep_source == RESELLER_SOURCE: message_dict['entity_id'] = user.reseller.name elif ep_source == GLOBAL_SOURCE: message_dict['entity_id'] = ENTITY_DEFAULTS elif OWN_SOURCE not in (nproc_source, ep_source) and nproc_source != ep_source: message_dict['affected_entity'] = ENTITY_USER message_dict['entity_id'] = user.id message_dict['specific_msg'] = ( 'Both validated limits (EP, NPROC) inheritance ' f'from different sources: {ep_source} and {nproc_source}' ) return result, message_dict def _validate_nproc_and_ep_for_package(self, package, ep, nproc, has_input_limits): # type: (Package, Union[int, None], Union[int, None], bool) -> Tuple[bool, Dict] """ :param has_input_limits: User has input limits, which will be set to it """ message_dict = self.message_dict package_limits = self.limits_provider.get_package_limits(package) ep = int(ep or package_limits.ep.value) nproc = int(nproc or package_limits.nproc.value) result = self._ep_and_nproc_is_valid(ep, nproc) ep_source = package_limits.ep.source nproc_source = package_limits.nproc.source if has_input_limits: message_dict['affected_entity'] = ENTITY_PACKAGE message_dict['entity_id'] = package.name elif OWN_SOURCE in (nproc_source, ep_source): message_dict['affected_entity'] = ENTITY_PACKAGE message_dict['entity_id'] = package.name if ep_source != OWN_SOURCE: inheritance_limit = 'ep' elif nproc_source != OWN_SOURCE: inheritance_limit = 'nproc' else: inheritance_limit = None message_dict['specific_msg'] = None if inheritance_limit is None else ( f'{inheritance_limit.upper()} is inherited ' f'from {getattr(package_limits, inheritance_limit).source.capitalize()}' ) elif OWN_SOURCE not in (nproc_source, ep_source) and nproc_source == ep_source: message_dict['affected_entity'] = ep_source if ep_source == RESELLER_SOURCE: message_dict['entity_id'] = package.provider.name elif ep_source == GLOBAL_SOURCE: message_dict['entity_id'] = ENTITY_DEFAULTS elif OWN_SOURCE not in (nproc_source, ep_source) and nproc_source != ep_source: message_dict['affected_entity'] = ENTITY_PACKAGE message_dict['entity_id'] = package.name message_dict['specific_msg'] = ( 'Both validated limits (EP, NPROC) inheritance ' f'from different sources: {ep_source} and {nproc_source}' ) return result, message_dict def _validate_nproc_and_ep_for_reseller(self, reseller, ep, nproc, has_input_limits): # type: (Reseller, Union[int, None], Union[int, None], bool) -> Tuple[bool, Dict] """ :param has_input_limits: User has input limits, which will be set to it """ message_dict = self.message_dict reseller_limits = self.limits_provider.get_reseller_limits(reseller) ep = int(ep or reseller_limits.ep.value) nproc = int(nproc or reseller_limits.nproc.value) result = self._ep_and_nproc_is_valid(ep, nproc) ep_source = reseller_limits.ep.source nproc_source = reseller_limits.nproc.source if has_input_limits: message_dict['affected_entity'] = ENTITY_RESELLER message_dict['entity_id'] = reseller.name elif OWN_SOURCE in (nproc_source, ep_source): message_dict['affected_entity'] = ENTITY_RESELLER message_dict['entity_id'] = reseller.name if ep_source != OWN_SOURCE: inheritance_limit = 'ep' elif nproc_source != OWN_SOURCE: inheritance_limit = 'nproc' else: inheritance_limit = None message_dict['specific_msg'] = None if inheritance_limit is None else ( f'{inheritance_limit.upper()} is inherited ' f'from {getattr(reseller_limits, inheritance_limit).source.capitalize()}' ) return result, message_dict def _validate_nproc_and_ep_for_defaults(self, reseller, ep, nproc, has_input_limits): # type: (Union[Reseller, DEFAULTS], Union[int, None], Union[int, None], bool) -> Tuple[bool, Dict] """ :param has_input_limits: User has input limits, which will be set to it """ message_dict = self.message_dict id_entity = reseller.name if isinstance(reseller, Reseller) else DEFAULTS default_limits = self.limits_provider.get_defaults_limits(reseller) ep = int(ep or default_limits.ep.value) nproc = int(nproc or default_limits.nproc.value) result = self._ep_and_nproc_is_valid(ep, nproc) ep_source = default_limits.ep.source nproc_source = default_limits.nproc.source if has_input_limits: message_dict['affected_entity'] = ENTITY_DEFAULTS message_dict['entity_id'] = id_entity elif OWN_SOURCE in (nproc_source, ep_source): message_dict['affected_entity'] = ENTITY_DEFAULTS message_dict['entity_id'] = id_entity if ep_source != OWN_SOURCE: inheritance_limit = 'ep' elif nproc_source != OWN_SOURCE: inheritance_limit = 'nproc' else: inheritance_limit = None message_dict['specific_msg'] = None if inheritance_limit is None else ( f'{inheritance_limit.upper()} is inherited ' f'from {getattr(default_limits, inheritance_limit).source.capitalize()}' ) return result, message_dict def _validate(self, validated_entity, ep, nproc, has_input_limits, check_reseller_defaults=False): # type: (Union[User, Reseller, Package, None], Optional[int], Optional[int], bool, bool) -> Tuple[bool, Dict] message_dict = self.message_dict result = True if isinstance(validated_entity, User): result, message_dict = self._validate_nproc_and_ep_for_user( validated_entity, ep, nproc, has_input_limits ) elif isinstance(validated_entity, Package): result, message_dict = self._validate_nproc_and_ep_for_package( validated_entity, ep, nproc, has_input_limits ) elif isinstance(validated_entity, Reseller) and not check_reseller_defaults: # we validate reseller limits result, message_dict = self._validate_nproc_and_ep_for_reseller( validated_entity, ep, nproc, has_input_limits ) elif isinstance(validated_entity, Reseller) and check_reseller_defaults or validated_entity == DEFAULTS: # we validate default limits (include reseller defaults) result, message_dict = self._validate_nproc_and_ep_for_defaults( validated_entity, ep, nproc, has_input_limits ) return result, message_dict def validate_existing_limits(self, validated_entity, check_reseller_defaults=False): # type: (Union[User, Reseller, Package, None], bool) -> Tuple[bool, Dict] """ Validate limits which already are recorded in ve.cfg """ result, message_dict = self._validate(validated_entity, None, None, False, check_reseller_defaults) return result, message_dict def validate_input_limits(self, validated_entity, input_limits, check_reseller_defaults=False): # type: (Union[User, Reseller, Package, None], Dict, bool) -> Tuple[bool, Dict] """ Validate limits which we want to set """ message_dict = self.message_dict nproc = input_limits.get('nproc', None) ep = input_limits.get('ep', None) # if input_limits has no ep and nproc we set has_settable_limits to None # It means nothing to validate has_input_limits = nproc is not None or ep is not None # We skip check if nproc is unlimited or input limits don't have ep and nproc values if nproc == 0 or not has_input_limits: result = True else: result, message_dict = self._validate(validated_entity, ep, nproc, has_input_limits, check_reseller_defaults) return result, message_dict