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 __future__ import absolute_import from __future__ import print_function from __future__ import division import os import pwd import re from collections import namedtuple import logging import traceback import cldetectlib as detect from typing import List # NOQA from future.utils import iteritems from . import clpassenger from clcommon.cpapi import cpusers, getCPName from clcommon.clpwd import drop_privileges, ClPwd from clcommon.cpapi.plugins.cpanel import is_no_php_binaries_on_cpanel from .clselectexcept import ClSelectExcept from .clselectnodejs.node_manager import NodeManager from .clselectpython.python_manager import PythonManager from .utils import get_abs_rel from typing import Optional, List # NOQA DISABLED_DIRECTORY_NAMES = ['public_html', 'rubyvenv', 'virtualenv', '.cl.selector', '.cagefs', 'www', 'nodevenv'] ApplicationSummary = namedtuple('ApplicationSummary', ('user', 'version', 'doc_root', 'interpreter', 'app_status')) InterpreterSummary = namedtuple('InterpreterSummary', ('version', 'version_full', 'enabled', 'installed')) def check_directory(directory): if ' ' in directory: raise ValueError('Directory should not contain spaces') if os.path.isabs(directory): raise ValueError('Directory should be relative to user\'s home') if directory[-1] == '/': raise ValueError('Directory should not contain a trailing slash') if directory in DISABLED_DIRECTORY_NAMES: raise ValueError('Directory "%s" not allowed' % directory) all_valid = re.match(r'[-\.\w\/]+$', directory) if all_valid is None: raise ValueError('Directory name contains invalid characters') def get_alias(alias): for c in ('#', '?', './'): if c in alias: raise ValueError('Alias is not valid') # root aliases if alias in ('.', ''): alias = '/' return alias.strip('/') def get_directory(prefix): return prefix.replace('_', '/').replace('//', '_') def get_prefix(directory): return directory.replace('_', '__').replace('/', '_') def get_user(user): if not user: current_euid = os.geteuid() user = pwd.getpwuid(current_euid).pw_name if user == 'root': raise ValueError('User parameter must be specified if current user is root') return user def _verify_application(interpreter, app_root, binary_path=None): """ Application is valid only if binary and app_root exists :param binary_path: path to binary in virtual environment :param app_root: path to root directory of application :return: result of checking :rtype: bool """ if interpreter in ('nodejs', 'python'): return os.path.isdir(app_root) return os.path.isfile(binary_path) and os.path.isdir(app_root) def server_applications_summary(interpreter): # type: (str) -> List[ApplicationSummary] """Find and return all apps for given interpreter on server""" domains_data = None applications = [] # LVEMAN-1408 euid = os.geteuid() for user in cpusers(): try: if detect.is_da(): # NB: python will import this only 1 time from clcommon.cpapi.plugins.directadmin import userdomains domains_list = userdomains(user, as_root=True), # called as root to save time on right's escalated call domains_data = list( filter( None, map( lambda x: x[0] if x else None, # take only domain from (domain, docroot) tuples domains_list, ) ) ) # drop permissions in order not to with drop_privileges(user): # LVEMAN-1408: Force check user existence after drop user rights pwd.getpwnam(user) applications.extend( _user_applications_short_summary(user, interpreter, domains_data)) except ClPwd.NoSuchUserException: continue except KeyError: # LVEMAN-1408: this may be thrown by pwd.getpwnam in clpassenger.py module. # It uses python pwd library instead ClPwd # Send debug message to sentry logger = logging.getLogger(__name__) logger.error("DEBUG: user %s present in panel but doesn't exist in system. Process euid=%d. Trace: %s at %s" % (user, euid, traceback.format_exc(), str(traceback.extract_stack()))) return applications def _user_applications_short_summary(user, interpreter, domains_docroots_data=None): """ Return generator with all applications for given user and interpreter. To increase performance, only a small part of the information about the applications is given. :param user: name of panel user :param interpreter: name of interpreter (python, ruby, etc) :param domains_docroots_data: total data about users domains :return: Generator[ApplicationSummary] """ userdomains_data = domains_docroots_data if interpreter in ('nodejs', 'python'): try: if interpreter == 'nodejs': from .clselectnodejs.apps_manager import ApplicationsManager else: from .clselectpython.apps_manager import ApplicationsManager config_data = ApplicationsManager().get_user_config_data(user) except ClSelectExcept.WrongData: return for app, data in iteritems(config_data): try: app_root, _ = get_abs_rel(user, app) except ClSelectExcept.WrongData: continue if _verify_application(interpreter, app_root): yield ApplicationSummary( user=user, version=data['%s_version' % interpreter], doc_root=data['domain'], interpreter=interpreter, app_status=data['app_status'] ) else: for dummy, data in iteritems(clpassenger.summary(user, userdomains_data=userdomains_data)): if data['interpreter'] != interpreter: continue # return only really existing applications binary, app_root = data['binary'], data['directory'] if _verify_application(interpreter, app_root, binary): it_version = os.path.basename(os.path.dirname(os.path.dirname(binary))) yield ApplicationSummary(user=user, version=it_version, doc_root=data['docroot'], interpreter=data['interpreter'], app_status='started') def get_default_version(interpreter): """Return default version for given interpreter """ if interpreter == 'nodejs': return NodeManager().default_version if interpreter == 'python': return PythonManager().default_version return None def _iter_interpreters(interpreter): """Return generator for interpreters all versions""" if interpreter == 'nodejs': interpreters = NodeManager().get_summary(installed_interpreters_only=True) elif interpreter == 'python': interpreters = PythonManager().get_summary(installed_interpreters_only=True) else: raise NotImplementedError() for version, version_info in iteritems(interpreters['available_versions']): enabled = version_info['status'] == 'enabled' if interpreter == 'nodejs': # for nodejs 6.16.0 -> 6 major_version = str(int(version.split('.')[0])) else: # for python 2.7.16 -> 2.7 major_version = '.'.join(version.split('.')[:2]) yield InterpreterSummary(version=major_version, version_full=version, enabled=enabled, installed=True) def _iter_php_interpreters(): """ Return generator with all PHP versions on server. :return: Generator[InterpreterSummary] """ from .clselect import ClSelect php = ClSelect() versions = php.list_alternatives() for version, full_version, _ in versions: yield InterpreterSummary( version, full_version, installed=True, enabled=php.is_version_enabled(version)) def interpreter_versions_short_summary(interpreter): # type: (str) -> List[InterpreterSummary] """Find and return all versions for given interpreter on server""" if interpreter == 'php': # if there is no installed php - no sense to collect statistics if getCPName() == 'cPanel' and is_no_php_binaries_on_cpanel(): return [] return list(_iter_php_interpreters()) elif interpreter == 'ruby': from .clselectruby.interpreters import interpreters elif interpreter in ('python', 'nodejs'): return list(_iter_interpreters(interpreter)) else: raise NotImplementedError it_list = [] for it in interpreters(): # for now, both python and ruby interpreters cannot be disabled it_list.append(InterpreterSummary(it.version, it.version_full, installed=True, enabled=True)) return it_list