Uname:Linux ip-10-0-5-176 6.8.0-1057-aws #60~22.04.1-Ubuntu SMP Wed May 27 08:16:59 UTC 2026 x86_64

403WebShell
403Webshell
Server IP : 3.111.61.48  /  Your IP : 216.73.216.67
Web Server : Apache
System : Linux ip-10-0-5-176 6.8.0-1057-aws #60~22.04.1-Ubuntu SMP Wed May 27 08:16:59 UTC 2026 x86_64
User : ubuntu ( 1000)
PHP Version : 8.2.31
Disable Function : exec,passthru,shell_exec,system
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/vhost/itmtrsrv.arukustech.com/api/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/vhost/itmtrsrv.arukustech.com/api/__pycache__/main.cpython-312.pyc
�

�=j�\���ddlmZmZmZmZmZddlmZddlm	Z	m
Z
ddlmZddl
Z
ddlZddlmZmZmZddlZddlmZddlZddlmZdd	lmZdd
lmZddlmZed�
�ZddlmZddlmZddlmZddl m!Z!ddl"m#Z#ee��Z$e$ejJ_$ejMe!�ejOe�dedefd��Z(dddde
jRjTd�Z+d�Z,ddlmZed�fde-fd�Z.dZ/d Z0d!Z1ed"gd#�$�Z2ed%�&�Z3d'�Z4d^d(e5d)efd*�Z6ee3�fd+e-fd,�Z7d-Z8d-Z9d.Z:d/Z;ejyd0�d1��Z=ej}d2�e$jd3�ded(e5fd4���Z@ee7�fd5e5fd6�ZAejyd7�eeA�fd8��ZBej}d9�eeA�fd(e5fd:��ZCej�d;�eeA�fd<eEfd=��ZFej}d>�e$jd?�ee.�fded@e5fdA���ZGej}dB�ee7�fd(e5dCe5fdD��ZHej�dE�ee7�fdFeEdCe5fdG��ZIejydH�ee7�fdCe5fdI��ZJej}dJ�e$jdK�ded(e5fdL���ZKej}dM�d(e5fdN��ZLejydO�ee7�fdFeEdPe-dCe5fdQ��ZMejydR�dSee7�fdFeEdTe-dUe-dVe-dCe5f
dW��ZNejydX�dSee7�fdFeEdTe-dUe-dYe-dCe5f
dZ��ZOejyd[�eeA�fd\e5fd]��ZPy)_�)�FastAPI�Request�Header�
HTTPException�Depends)�OAuth2PasswordBearer)�JWTError�jwt)�CryptContextN)�datetime�timezone�	timedelta)�send_server_alert)�send_password_reset_email)�
monthrange)r)rzServer Monitor API)�title)�Limiter)�get_remote_address)�RateLimitExceeded)�SlowAPIMiddleware��JSONResponse)�key_func�request�excc� �tdddi��S)Ni��detailz*Too many requests. Please try again later.)�status_code�contentr)rrs  �4/var/www/html/servermonitor.tsdemo.co.in/api/main.py�rate_limit_handlerr!"s�����G�H����	localhost�
servermonitor�server_monitor)�host�user�password�database�cursorclassc�4�tjdit��S)N�)�pymysql�connect�	DB_CONFIGr,r"r �get_dbr03s���?�?�'�Y�'�'r")r�
authorizationc�F�|r|jd�s
tdd���|jd�d}t�}|j	�}|jd|f�|j
�}|j�|j�|s
tdd���|S)	NzBearer �zMissing API key�rr� �z4SELECT id, server_name FROM servers WHERE api_key=%szInvalid API key)�
startswithr�splitr0�cursor�execute�fetchone�close)r1�api_key�conn�cur�servers     r �verify_api_keyrA:s����
� 8� 8�� C���4E�F�F��!�!�#�&�q�)�G��8�D�
�+�+�-�C��K�K�>�	�
���\�\�^�F��I�I�K��J�J�L����4E�F�F��Mr"�CHANGE_THIS_TO_RANDOM_SECRET�HS256�<�bcrypt�auto)�schemes�
deprecatedz
/api/v1/login)�tokenUrlc�.�tj||�S�N)�pwd_context�verify)�plain_password�hashed_passwords  r �verify_passwordrP[s�����n�o�>�>r"�data�
expires_deltac���|j�}tjtj�|xstd��z}|j
d|i�tj|tt��S)NrD��minutes�exp)�	algorithm)�copyr�nowr
�utcr�updater
�encode�
SECRET_KEY�	ALGORITHM)rQrR�	to_encode�expires    r �create_access_tokenra^sS���	�	��I�
�\�\�(�,�,�
'�=�+Q�I�b�<Q�
R�F�
���e�V�_�%��:�:�i��y�A�Ar"�tokenc��	tj|ttg��}|j	d�}|�
tdd���t
�}|j�}|jd|f�|j�}|j�|j�|�
tdd���|S#t$rtdd���wxYw)N)�
algorithms�subr3z
Invalid tokenr4z0SELECT id, email, role FROM users WHERE email=%szUser not found)r
�decoder]r^�getrr0r9r:r;r<r	)rb�payload�email�
connectionr9r's      r �get_current_userrkes���E��*�*�U�J�I�;�G���[�[��'���=��C��H�H��X�
��"�"�$�����I�E�8�T���� �����������<��C�8H�I�I�����E���O�D�D�E�s�B.B1�1C�P�Z�z/healthc�
�ddiS)N�status�okr,r,r"r �healthrr�s
���d��r"z	/v1/loginz5/minutec��|jd�}|jd�}t�}|j�}|jd|f�|j	�}|j�|j�|rt
||d�s
tdd���t|d|dd	�tt�
���}|dd
�S)Nrir(z"SELECT * FROM users WHERE email=%s�
password_hashr3zInvalid credentialsr4�role)rerurT)rQrR�bearer)�access_token�
token_type)rgr0r9r:r;r<rPrrar�ACCESS_TOKEN_EXPIRE_MINUTES)rrQrir(rjr9r'rws        r �loginrz�s���
�H�H�W��E��x�x�
�#�H���J�
�
�
�
 �F��N�N�7�%��B��?�?��D�
�L�L�N�������x��o�1F�G���4I�J�J�&���=���L�� �(C�D��L�)��A�Ar"�current_userc�H�|jd�dk7r
tdd���|S)Nru�Admini�zOnly Admins can manage usersr4)rgr)r{s r �check_admin_roler~�s)�������7�*���4R�S�S��r"z/v1/admin/usersc��t�}|j�}|jd�|j�}|j	�|j	�|S)Nz-SELECT id, email, role, created_at FROM users�r0r9r:�fetchallr<)�adminrjr9�userss    r �
list_usersr��sJ����J�
�
�
�
 �F�
�N�N�B�C��O�O��E�
�L�L�N������Lr"z/v1/admin/add-userc�&�|jd�}|jd�}|jdd�}|r|s
tdd���tj|�}t	�}|j�}	|j
d|||f�|j�	|j�|j�d
diS#t$r"}|j�tdd	���d}~wwxYw#|j�|j�wxYw)Nrir(ru�viewer�zMissing datar4zBINSERT INTO users (email, password_hash, role) VALUES (%s, %s, %s)zUser already exists�messagezUser created successfully)rgrrL�hashr0r9r:�commit�	Exception�rollbackr<)	rQr�rir(rurOrjr9�es	         r �add_userr��s����H�H�W��E��x�x�
�#�H��8�8�F�H�%�D�����N�C�C�!�&�&�x�0�O���J�
�
�
�
 �F�����P�
�O�T�*�	
�	����
	���������2�3�3��
�K�������4I�J�J��K��	��������s$�6%C�	C+�	C&�&C+�+C.�."Dz/v1/admin/delete-user/{user_id}�user_idc���t�}|j�}|jd|f�|j�|j	�|j	�ddiS)NzDELETE FROM users WHERE id = %sr�zUser deleted�r0r9r:r�r<)r�r�rjr9s    r �delete_userr��sT����J�
�
�
�
 �F�
�N�N�4�w�j�A�����
�L�L�N������~�&�&r"z/v1/metricsz	60/minuter@c
������
K�|j��d{���}|d�
t�}|j��d}|jd�r9t	t|dj
��d�}|r|jd�}�jd�
|jd�|jdi�jd�|jdi�jd	�|jdi�jd�||jd
�tjtj�f��jdtjtj��
f��jd�
tf��j��t��tk(rtd
��D��}td��D��}td��D��}���
fd�}	|r	|	dd�|r	|	dd�|r	|	dd���
fd�}
|
d|�|
d|�|
d|�|j!��j#�|j#�ddiS7��H�w)zC
    Receives metrics from agent using API key authentication.
    N�id�disk�percentz�
        INSERT INTO metrics
        (server_id, cpu_usage, ram_used_mb, ram_total_mb, ram_percent,
         disk_used_percent, uptime_seconds, created_at)
        VALUES (%s,%s,%s,%s,%s,%s,%s,%s)
    �	cpu_usage�ram�used_mb�total_mb�uptime_secondsz+UPDATE servers SET last_seen=%s WHERE id=%sz�
        SELECT cpu_usage, ram_percent, disk_used_percent
        FROM metrics
        WHERE server_id=%s
        ORDER BY created_at DESC
        LIMIT %s
    c3�FK�|]}|dduxr|dtkD���y�w)r�N)�
CPU_THRESHOLD��.0�ms  r �	<genexpr>z"receive_metrics.<locals>.<genexpr>$s2����
��
�k�N�$�&�I�1�[�>�M�+I�I�
���!c3�FK�|]}|dduxr|dtkD���y�w)�ram_percentN)�
RAM_THRESHOLDr�s  r r�z"receive_metrics.<locals>.<genexpr>)s4����
��
�m��D�(�M�Q�}�-=�
�-M�M�
�r�c3�FK�|]}|dduxr|dtkD���y�w)�disk_used_percentN)�DISK_THRESHOLDr�s  r r�z"receive_metrics.<locals>.<genexpr>.s6����
��
�!�"�$�.�Z�1�5H�3I�N�3Z�Z�
�r�c���tj|�}�	dd}�	dd}�	dd}�jd�
|f��j�}|sn�jd�
|||||t	j
tj�f��jd�
f��j�d}t|||�y|d	d
z}�jd|t	j
tj�|df�|tzdk(rq�jd
�
|||||t	j
tj�f��jd�
f��j�d}t|||�d��yy)Nrr�r�r�z�
                SELECT *
                FROM alerts
                WHERE server_id=%s AND alert_type=%s AND is_active=TRUE
                LIMIT 1
            a
                    INSERT INTO alerts
           (
            server_id,
            alert_type,
    message,
    cpu_usage,
    ram_usage,
    disk_usage,
    notification_count,
    last_notified_at,
    is_active
)
VALUES (%s,%s,%s,%s,%s,%s,1,%s,TRUE)
                z+SELECT server_name FROM servers WHERE id=%s�server_name�notification_countr6z�
                    UPDATE alerts
                    SET notification_count=%s,
                        last_notified_at=%s
                    WHERE id=%s
                r�a 
                        INSERT INTO alerts
                        (
                            server_id,
                            alert_type,
                            message,
                            cpu_usage,
                            ram_usage,
                            disk_usage,
                            notification_count,
                            last_notified_at,
                            is_active
                        )
                        VALUES (%s,%s,%s,%s,%s,%s,1,%s,FALSE)
                    z/ usage above threshold for 3 consecutive checks)
�html�escaper:r;rrYr
rZr�CONSECUTIVE_CHECKS)�
alert_typer��
latest_cpu�
latest_ram�latest_disk�existingr��	new_countr9�last_metrics�	server_ids        ���r �create_alertz%receive_metrics.<locals>.create_alert3s�����k�k�'�*�G�%�a���5�J�%�a���7�J�&�q�/�*=�>�K��N�N��
�Z�(�
*����(�H����� ��������L�L�������0���A��L��%�o�o�/�
�>��!�+�z�7�C�%�%9�:�Q�>�	���� ���L�L����.��T�N��	��1�1�Q�6��N�N�$�"�"��"�"�#� ���X�\�\�2���0�N�N�E�"���
#)�/�/�"3�M�"B�K�%�#�"�%�,�&U�V��C7r"�CPUz,CPU usage above 80% for 3 consecutive checks�RAMz,RAM usage above 80% for 3 consecutive checks�DISKz-Disk usage above 90% for 3 consecutive checksc�x��|s7�jdtjtj��|f�yy)Nz�
                    UPDATE alerts
                    SET is_active=FALSE, resolved_at=%s
                    WHERE server_id=%s AND alert_type=%s AND is_active=TRUE
                )r:rrYr
rZ)r��is_alertr9r�s  ��r �
resolve_alertz&receive_metrics.<locals>.resolve_alert�s6������� ��l�l�8�<�<�0�)�Z�H�	J�r"rp�success)�jsonr0r9rg�next�iter�valuesr:rrYr
rZr�r��len�allr�r<)rr@rQrj�disk_percent�
first_disk�	cpu_alert�	ram_alert�
disk_alertr�r�r9r�r�s           @@@r �receive_metricsr��sA����������D��t��I���J�
�
�
�
 �F�
�L��x�x����$�t�F�|�2�2�4�5�t�<�
��%�>�>�)�4�L��N�N��	��������������	�*���������
�+���������	�*�����!�"����X�\�\�"�	
�� �N�N�5�	���h�l�l�	#�Y�/���N�N���'�	(�
*��?�?�$�L�
�<��.�.��
�!�
�
�	�
�
�!�
�
�	�
�
�!�
�
�
�
g	�R��� N�O���� N�O����!P�Q�	J�	�e�Y�'��e�Y�'��f�j�)�����
�L�L�N������i� � �S �s�I$�I!�II$z/v1/admin/add-serverr'c�|�t�}|j�}|jd�}|jd�}|jd�}|s
tdd���t	j
d�}|j
d||||f�|j�|j�|j�d	||d
�S)Nr��project�environmentr�zServer name requiredr4� zn
        INSERT INTO servers (server_name, api_key, project, environment)
        VALUES (%s, %s, %s, %s)
    r�)rpr�r=)	r0r9rgr�secrets�	token_hexr:r�r<)rQr'rjr9r�r�r�r=s        r �
add_serverr��s�����J�
�
�
�
 �F��(�(�=�)�K��h�h�y�!�G��(�(�=�)�K����4J�K�K�����#�G�
�N�N���w���	5�7�
����
�L�L�N������"���r"z#/v1/admin/delete-server/{server_id}r�c���t�}|j�}|jd|f�|j�|j	�|j	�ddiS)NzDELETE FROM servers WHERE id=%srp�deletedr�)r�r'rjr9s    r �
delete_serverr��sV����J�
�
�
�
 �F�
�N�N�4�y�l�C�����
�L�L�N������i� � r"z/v1/serversc��t�}|j�}|jd�|j�}|j	�|j	�|S)Na�
        SELECT
            s.id,
            s.server_name,
            s.project,
            s.environment,
            s.last_seen,

            m.cpu_usage,
            m.ram_percent,
            m.disk_used_percent,
            m.created_at,

            -- Alert info
            COUNT(a.id) AS active_alerts_count,
            MAX(CASE WHEN a.is_active = TRUE THEN 1 ELSE 0 END) AS has_active_alert,
            GROUP_CONCAT(DISTINCT a.alert_type) AS alert_types

        FROM servers s

        LEFT JOIN metrics m ON m.id = (
            SELECT id FROM metrics
            WHERE server_id = s.id
            ORDER BY created_at DESC
            LIMIT 1
        )

        LEFT JOIN alerts a
            ON a.server_id = s.id
           AND a.is_active = TRUE

        GROUP BY s.id

        ORDER BY
            has_active_alert DESC,        -- ?? Problem servers first
            m.created_at DESC             -- Latest activity next
    r�)r'rjr9�serverss    r �get_serversr��sS����J�
�
�
�
 �F�
�N�N�$�$	�L�o�o��G�
�L�L�N������Nr"z/v1/forgot-passwordz3/minutec��|jd�}|s
tdd���t�}|j�}|j	d|f�|j�}|r�t
tj��}tjtj�td��z}|j	d|d	||f�|j�d
|��}t||�|j!�|j!�ddiS)
Nrir�zEmail requiredr4z#SELECT id FROM users WHERE email=%s�rTzw
            INSERT INTO password_resets (user_id, token, expires_at, used)
            VALUES (%s, %s, %s, 0)
        r�z4https://servermonitor.tsdemo.co.in/reset.html?token=rpz If email exists, reset link sent)rgrr0r9r:r;�str�uuid�uuid4rrYr
rZrr�rr<)	rrQrir>r?r'rb�expiry�
reset_links	         r �forgot_passwordr�#s���
�H�H�W��E����4D�E�E��8�D�
�+�+�-�C��K�K�5��x�@��<�<�>�D���D�J�J�L�!�����h�l�l�+�i��.C�C��	�����4�j�%��
(�	*�
	
���
�K�E�7�S�
�!�%��4��I�I�K��J�J�L�
�8�9�9r"z/v1/reset-passwordc�0�|jd�}|jd�}|r|s
tdd���t�}|j�}|j	d|tjtj�f�|j�}|s
tdd���tj|�}|j	d||d	f�|j	d
|df�|j�|j�|j�dd
iS)Nrbr(r�zInvalid requestr4z�
        SELECT pr.id, pr.user_id
        FROM password_resets pr
        WHERE pr.token=%s
          AND pr.used=0
          AND pr.expires_at > %s
    zInvalid or expired tokenzK
        UPDATE users
        SET password_hash=%s
        WHERE id=%s
    r�zK
        UPDATE password_resets
        SET used=1
        WHERE id=%s
    r�rpzPassword reset successful)rgrr0r9r:rrYr
rZr;rLr�r�r<)rQrb�new_passwordr>r?�reset�hasheds       r �reset_passwordr�Is���H�H�W��E��8�8�J�'�L�����4E�F�F��8�D�
�+�+�-�C��K�K������h�l�l�+�	,�
.�
�L�L�N�E����4N�O�O�
�
�
�l�
+�F��K�K���%�	�"�	#�	%��K�K����+��	�	�K�K�M��I�I�K��J�J�L��1�2�2r"z/v1/reports/monthly�monthc	�b�	tt|jd��\}}t||dtj��}t||�d}t|||dddtj��}t�}|j�}	|	jd	|||f�|	j�}
|	j�|j�g}|
D]?}|j|d
jd�|dxsd
|dxsd
|dxsd
d���A|S#t$rt	dd���wxYw)zO
    Returns per-day AVG CPU/RAM/DISK usage for a server for a given month
    �-r�zInvalid month formatr4r6)�tzinfo��;ak
        SELECT
            DATE(created_at) AS day,
            ROUND(AVG(cpu_usage), 2) AS cpu,
            ROUND(AVG(ram_percent), 2) AS ram,
            ROUND(AVG(disk_used_percent), 2) AS disk
        FROM metrics
        WHERE server_id = %s
          AND created_at BETWEEN %s AND %s
        GROUP BY DATE(created_at)
        ORDER BY DATE(created_at)
    �dayz%d�cpurr�r�)r�r�r�r�)�map�intr8r�rrr
rZrr0r9r:r�r<�append�strftime)
r�r�r'�year�mon�
start_date�end_day�end_dater>r?�rows�result�rs
             r �monthly_reportr�zs5��L���U�[�[��-�.�	��c��$��Q�x�|�|�<�J���s�#�A�&�G���c�7�B��B�x�|�|�L�H��8�D�
�+�+�-�C��K�K���Z��	*�,��<�<�>�D��I�I�K��J�J�L��F�
����
�
��U�8�$�$�T�*��U�8�=�q��U�8�=�q��f�I�N��	
�	���M��M�L���4J�K�K�L�s�"D�D.z/v1/reports/analytics�AVGr�r��	stat_typec���|dvr
tdd���	tj|�}tj|�}|}t�}|j	�}	|dk(r!d|�d|�d	|�d
�}
|	j|
||f�n!d|�d|�d	|�d�}
|	j|
|||f�|	j
�}|	j�|j�|S#tdd���xYw)zt
    Advanced analytics for date range
    stat_type: AVG | MAX | MIN
    server_id = 0 => all servers combined
    �r��MAX�MINr�zInvalid stat_typer4zInvalid date formatrzS
            SELECT
                DATE(created_at) AS day,
                ROUND(z.(cpu_usage), 2) AS cpu,
                ROUND(z0(ram_percent), 2) AS ram,
                ROUND(z�(disk_used_percent), 2) AS disk
            FROM metrics
            WHERE created_at BETWEEN %s AND %s
            GROUP BY DATE(created_at)
            ORDER BY day
        z�(disk_used_percent), 2) AS disk
            FROM metrics
            WHERE server_id = %s
              AND created_at BETWEEN %s AND %s
            GROUP BY DATE(created_at)
            ORDER BY day
        )rr�
fromisoformatr0r9r:r�r<)r�r�r�r�r'�start�end�aggr>r?�queryr�s            r �analytics_reportr�s���-�-���4G�H�H�K��&�&�z�2���$�$�X�.���C��8�D�
�+�+�-�C��A�~���e���e���e�	�
��	���E�E�3�<�(���e���e���e�	���	���E�I�u�c�2�3��<�<�>�D��I�I�K��J�J�L��K��UK���4I�J�J�s�*C�C!z/api/v1/reports/range�statc	�`�t�}|j�}dddd�j|j�d�}d}||g}	|dk7rd}|	j	|�d|�d	|�d
|�d|�d�	}
|j|
|	�|j
�}|j�|j�|S)
Nr�r�r�r��rzAND server_id=%szA
        SELECT
            DATE(created_at) AS day,
            z (cpu_usage) AS cpu,
            z"(ram_percent) AS ram,
            zd(disk_used_percent) AS disk
        FROM metrics
        WHERE created_at BETWEEN %s AND %s
        z<
        GROUP BY DATE(created_at)
        ORDER BY day
    )r0r9rg�upperr�r:r�r<)r�r�r�rr'r>r?r�
server_filter�paramsrr�s            r �
reports_ranger�s����8�D�
�+�+�-�C���e�
4�
8�
8�����u�
M�C��M��(�
#�F��A�~�*�
��
�
�i� �
��E�
�
�E�
�
�E�	�
���
�E��K�K��v���<�<�>�D��I�I�K��J�J�L��Kr"z/v1/admin/alertsr�c��t�}|j�}d}|j|�|j�}|j	�|j	�|S)Na�

        SELECT

            a.id,

            s.server_name,

            a.alert_type,

            a.message,

            a.cpu_usage,

            a.ram_usage,

            a.disk_usage,

            a.notification_count,

            a.is_active,

            a.created_at,

            a.last_notified_at,

            a.resolved_at

        FROM alerts a

        INNER JOIN servers s
            ON s.id = a.server_id

        ORDER BY a.id DESC

        ##LIMIT 10000

    r�)r�rjr9r�alertss     r �get_alert_historyrsU����J�
�
�
�
 �F�%
�E�N�N�N�5��
�_�_�
�F�
�L�L�N������Mr"rK)Q�fastapirrrrr�fastapi.securityr�joser	r
�passlib.contextrr-r�rr
rr��
utils.emailerrr�r�calendarr�app�slowapir�slowapi.utilr�slowapi.errorsr�slowapi.middlewarer�fastapi.responsesr�limiter�state�add_middleware�exception_handlerr!�cursors�
DictCursorr/r0r�rAr]r^ryrL�
oauth2_schemerP�dictrarkr�r�r�r�rgrr�post�limitrzr~r�r��deleter�r�r�r�r�r�r�r�r�rrrr,r"r �<module>r's���D�D�1��(���2�2��+��3����
�(�)��
�+�,�0�*�
�-�
.����	�	�����$�%����(�)����.?��*��
��� ��?�?�-�-�
�	�(�
�(.�t���#��4,�
��	� ���H�:�&�A��$�o�>�
�?�B�d�B�9�B�#*�-�"8�E�C�E�.�
��
�����
�����������+�����z��B�7�B�$�B���B�<+2�2B�*C��4��
���	���-�.�������
��&�'7�8�4�4�4� �4�6���-�.�$+�,<�$=�'��'�/�'����-�����{���>�*�Q!�
�Q!��Q!���Q!�l���
 �!�(/�0@�(A��T����"��@���1�2�/6�7G�/H�!�S�!��!�3�!�"�����$�%5�6�0�d�0��0�h���
� ����z�� :�W� :�D� :��!� :�H���
��,3��,3� �,3�`���	���)�*�1��1��1��1� �1�j���	 �!�
��)�*�=��=��=��=��	=�
�=�"�=�F���	 �!�
��)�*�%��%��%��%��	%�
�%�"�%�T���	���*�+�9��9��9r"

Youez - 2016 - github.com/yon3zu
LinuXploit