shell bypass 403
3 �k�` � � @ s� d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlm Z d dlm Z d dlmZ d dlm Z d dlmZ d dlmZ d d lmZ d d lmZ d dlmZ d dlmZ d d lmZmZ d dlmZ d dlmZ d dlmZ d dlm Z ej!G dd� de"��Z#G dd� de#�Z$ej!G dd� de"��Z%G dd� de%�Z&G dd� de&�Z'G dd� de%�Z(G dd� de"�Z)e)� Z)d d!� Z*dS )"� N)�maxint)�as_bytes)� as_string)�PY2)�asyncore_25)� ProcessStates)�SupervisorStates)�getProcessStateDescription)�STOPPED_STATES)�decode_wait_status)�signame)�ProcessException� BadCommand)�EventListenerStates)�events)�RestartUnconditionally)� SocketManagerc @ sn e Zd ZdZdZdZdZdZdZdZ dZ dZdZdZ dZdZdZdZdZdZdZdZdd� Zdd� Zd d � Zdd� Zd d� Zdd� Zejejej ej!ej"ej#ej$ej%ej&ej'ej(ej)ej*ej+ej,ej-iZ.d:dd�Z/dd� Z0dd� Z1dd� Z2dd� Z3dd� Z4dd� Z5d d!� Z6d"d#� Z7d$d%� Z8d&d'� Z9d(d)� Z:d*d+� Z;d,d-� Z<d.d/� Z=d0d1� Z>d2d3� Z?d4d5� Z@d6d7� ZAd8d9� ZBdS );� SubprocesszA class to manage a subprocess.r NFc C s || _ i | _i | _tj| _dS )zDConstructor. Argument is a ProcessConfig instance. N)�config�dispatchers�pipesr �STOPPED�state)�selfr � r �/usr/lib/python3.6/process.py�__init__; s zSubprocess.__init__c C s* x$| j j� D ]}t|d�r|j� qW d S )N� removelogs)r �values�hasattrr )r � dispatcherr r r r E s zSubprocess.removelogsc C s* x$| j j� D ]}t|d�r|j� qW d S )N� reopenlogs)r r r r! )r r r r r r! J s zSubprocess.reopenlogsc C s8 x2| j j� D ]$}|j� r |j� |j� r|j� qW d S )N)r r �readableZhandle_read_event�writableZhandle_write_event)r r r r r �drainO s zSubprocess.drainc C sn | j s| jrttjd��| jd }|d kr8ttjd��| j| }|jrTttjd��| j|7 _|j � d S )NzProcess already closed�stdinzProcess has no stdin channelz Process' stdin channel is closed) �pid�killing�OSError�errno�EPIPEr r �closedZinput_buffer�flush)r �charsZstdin_fdr r r r �writeZ s zSubprocess.writec C s$ yt j| jj�}W n: tk rL } ztd| jjt|�f ��W Y dd}~X nX |r\|d }ntd��d|kr�|}y| jjj|�}W n t k r� d}Y nX nl| jj � }d}d}xD|D ]<}tjj ||�}y| jjj|�}W n t k r� Y q�X P q�W |dk�r|}n|}| jjj|||� ||fS )z�Internal: turn a program name into a file name, using $PATH, make sure it exists / is executable, raising a ProcessException if not zcan't parse command %r: %sNr zcommand is empty�/)�shlex�splitr Zcommand� ValueErrorr �str�options�statr( �get_path�os�path�joinZcheck_execv_args) r Zcommandargs�eZprogram�filename�str8 �found�dirr r r �get_execv_argsi s: & zSubprocess.get_execv_argsTc C sr | j }||krdS | jj|�}|d k r<|| ||�}tj|� |tjkrhtj� }| jd7 _|| j | _ || _ d S )NF� ) r � event_map�getr �notifyr �BACKOFF�time�backoff�delay)r Z new_state�expectedZ old_stateZevent_class�event�nowr r r �change_state� s zSubprocess.change_statec G sF | j |krBt| j �}djtt|��}t| jj�}td|||f ��d S )N� z%Assertion failed for %s: %s not in %s)r r r9 �mapr r �name�AssertionError)r ZstatesZ current_stateZallowable_states�processnamer r r �_assertInState� s zSubprocess._assertInStatec C s || _ | jjjjd| � d S )Nzspawnerr: %s)�spawnerrr r4 �logger�info)r �msgr r r �record_spawnerr� s zSubprocess.record_spawnerrc - C s4 | j j}t| j j�}| jr2d| }|jj|� dS d| _d| _d| _ d| _ d| _tj� | _ | jtjtjtjtj� | jtj� y| j� \}}W nH tk r� } z,| j|jd � | jtj� | jtj� dS d}~X nX y| j j| �\| _| _W n~ ttfk �rn } z\|jd }|tj k�r(d| }nd|tj!j"||�f }| j|� | jtj� | jtj� dS d}~X nX y|j#� } W n� tk �r } zt|jd }|tj$k�r�d| }nd|tj!j"||�f }| j|� | jtj� | jtj� |j%| j� |j&| j� dS d}~X nX | dk�r$| j'| �S | j(||�S dS ) z�Start the subprocess. It must not be running already. Return the process id. If the fork() call fails, return None. zprocess '%s' already runningNFr z!too many open files to spawn '%s'z-unknown error making dispatchers for '%s': %sz1Too many processes in process table to spawn '%s'z&unknown error during fork for '%s': %s))r r4 r rN r&