3 h>`@s8ddlmZddlmZddlZddlZddlZddlZddlZddl m Z m Z ddl Z ddl ZddlZddlZddlTddlmZddlTddlmZmZddlTdd d d d d ddddddddgZejdZejdZejdZeddZdAdd ZddZ ddZ!ddZ"dd Z#d!d"Z$d#d$Z%d%d&Z&d'd(Z'Gd)dde j Z(e j)e(Gd*d+d+e*Z+e+d,e,e+d-e-e+d.e,gZ.Gd/d0d0e*Z/Gd1d2d2e*Z0e0Z1d3dZ2d4d Z3d5d Z4d6d Z5Gd7dde*Z6Gd8d9d9e*Z7Gd:dde7Z8Gd;d<d<Z9Gd=dde*Z:Gd>dde7e:Z;Gd?d@d@e*Zq4|j|}|r|jdj}|jd}tj|} | dkrtd||fq4n t j } |}t| ||} |j | q4Wtd|| f|S)Nz\s*{(unix|inet)}(.+)z%parse_socket_address_list: input='%s'z[\s,]+z(unknown socket family - %s in address %sz$parse_socket_address_list: %s --> %s) recompile log_debugsplitsearchgrouplowerr map_familySocketAF_INETappend) addr_string default_portsocket_addressesZ family_reZaddrsZcfg_addrmatchZ family_tagaddressfamilysocket_addressr-/usr/lib/python3.6/rpc.pyrEs.        cCstddt}|S)NZ connectionr')rint)r'r-r-r.rds cCst|d}t|}|S)NZ address_list)rr)Z cfg_sectionr&r(r-r-r.ris cCs td}t|dkrdS|dS)NZclient_connect_tor)rlen)Z addr_listr-r-r.ros cCsg}|tj@r|jd|tj@r,|jd|tj@r@|jd|tj@rT|jd|tj@rh|jd|tj@r||jdd|dj|fS) NINZOUTZPRIZERRHUPZNVALz(%d)[%s],) rIO_INr%ZIO_OUTZIO_PRIIO_ERRIO_HUPIO_NVALjoin) io_conditionnamesr-r-r.io_condition_to_stringvs            r;cKsBdt|}x(t|jD]\}}|d||f7}qW|d7}|S)Nzcontent-length: %d z%s: %s z )r0listitems)bodykwdshdrkeyvaluer-r-r. rpc_headers  rCcCst|||d}||S)N)rpc_idtype)rC)rDrEr>r@r-r-r. rpc_messagesrFc Csd}}}}ztj|}|j}|jd}|jd}tj||}t|d}tt|}xv|D]n}|jd}|jd} t |jd} |j | } | j dk r| dkr| j ||d} q| j |j } n|j } | || <q`WWd|dk r|j X|||fS) N interfacemethodargnamerEpositionxml)Zobj_name)libxml2ZparseDocZgetRootElementZpropr get_rpc_defr preextend_listr0r/positional_argsobj_typeZcontentfreeDoc) cmdrGrHargsdocrpc_defZ arg_nodesarg_nodearg_nameZarg_typeZ arg_positionrpc_arg arg_valuer-r-r.convert_rpc_xml_to_argss.           r[c GsJd}}z&|j}|j}tjd}tjd}|jd||jd||j|d}x|jD]} | j} ||} tjd} |j | | jd| | jdt |t | tj r| jd d | j | nDt | d r| jd d | j | j|| n| jd d | jt | |d 7}qZW|jdt ||jtd d}Wd|dk rD|jX|S)Nz1.0rSrGrHrrIrJrKrErL get_xml_nodesstringrZ arg_count)encodingformat)rGrHrMZnewDocZnewNodeZsetPropZsetRootElementrPrJZaddChildstr isinstanceZxmlNodehasattrr\Z addContentZ serializerrR) rDrVrTZtext_docrUrGrHrootrKrYrXrZrWr-r-r.convert_rpc_to_xmls>                  rdc@seZdZd#Zd$Zd%Zd&Zd'Zd(Zd)Z eeBeBeBeBeBe BZ eeBZ eeBeBe BZ eded ed ed ed ed e diZ eeeeeee gZdejjdejejejffiZddZddZddZddZddZddZddZd*d!d"ZdS)+rrr CONNECTINGOPEN AUTHENTICATEDr2ERRORTIMEOUTRETRYchangedNcCs*tjj|d|_d|_d|_|jdS)Nr)r__init__flags result_code result_msg clear_result)selfr-r-r.rqs  zConnectionState.__init__cCsd|j|j|j|jfS)Nz'flags=%s, result_code=%d, result_msg=%s)flags_to_stringrrrsrt)rvr-r-r.__str__ szConnectionState.__str__cCs|jd|jdS)Nr)update ALL_FLAGS)rvr-r-r.clearszConnectionState.clearcCsB|dkr d}g}x&tjD]}||@r|jtj|qWdj|S)Nrr3)rconnection_statesr%map_connection_enum_to_stringr8)rvvalr:stater-r-r.rws zConnectionState.flags_to_stringcCsd|_d|_dS)Nr)rsrt)rvr-r-r.ruszConnectionState.clear_resultcCs||_||_dS)N)rsrt)rvrsrtr-r-r. set_result!szConnectionState.set_resultcCs |j|jfS)N)rsrt)rvr-r-r. get_result%szConnectionState.get_resultrrc Csf|j}|j|O_|j|M_||_||_||jA}|j|@}||@}|rb|jd|j||dS)Nrp)rrrsrtemit) rv add_flags remove_flagsrsrtZprevious_flags differenceZ flags_addedZ flags_removedr-r-r.ry(s  zConnectionState.updaterrf @)rrrr)__name__ __module__ __qualname__rjrkrlr2rmrnrorz GOOD_FLAGS PROBLEM_FLAGSr}r|rZ SignalFlagsZRUN_LASTZTYPE_INTZ __gsignals__rqrxr{rwrurrryr-r-r-r.rs8 c@seZdZdddZddZdS)RpcArgNcCs||_||_dS)N)rJrQ)rvrJrQr-r-r.rq@szRpcArg.__init__cCs6|jdkrd}n|j}|jdkr$|Sd||jfSdS)NZname_undefinedz%s:%s)rJrQ)rvrJr-r-r.rxDs   zRpcArg.__str__)NN)rrrrqrxr-r-r-r.r>s rrHerr_codeerr_msgc@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS) RpcDefinitioncCs2||_||_||_d|_|dkr(g|_n||_dS)N)rErGrHcallbackrP)rvrErGrHZrpc_argsr-r-r.rqUszRpcDefinition.__init__cCsg}|jdk rLx<|jD]2}|jdk r<|jd|j|jfq|j|jqWd|j|j|jdj|f}|jdkr|d|j7}|S)Nz%s:%sz[%s] %s:%s (%s)r3rHz callback=%s) rPrQr%rJrErGrHr8r)rvrTrYtextr-r-r.rx_s    zRpcDefinition.__str__cCs ||_dS)N)rE)rvrEr-r-r.set_typelszRpcDefinition.set_typecCs(|jdk rtj|j}||j=||_dS)N)rr get_interfacerG)rvrinterface_dictr-r-r. set_callbackos  zRpcDefinition.set_callbackcCsf|jdkrtd|j|jdkrVd|j}td|j|d}tj|j||||_|Stj|j|jS)NrHz"%s rpc types do not have callbacksz%s_default_callback method_return) rE ValueErrorrrHrrGrregister_rpc_defrN)rvZ callback_nameZ callback_defr-r-r.get_callback_defus   zRpcDefinition.get_callback_defcCsJ|dk rFtt||jt|_d}x$|D]}|j|}||_|d7}q&WdS)Nrr)rOr0rPrrJ)rvZ arg_namesrKrXrYr-r-r.set_positional_argss  z!RpcDefinition.set_positional_argscGsJ|dk rFtt||jt|_d}x$|D]}|j|}||_|d7}q&WdS)Nrr)rOr0rPrrQ)rvZ obj_typesrKrQrYr-r-r.set_arg_obj_typess  zRpcDefinition.set_arg_obj_typescCsdd|jDS)NcSsg|] }|jqSr-)rJ).0rYr-r-r. sz:RpcDefinition.get_positional_arg_names..)rP)rvr-r-r.get_positional_arg_namessz&RpcDefinition.get_positional_arg_namesN) rrrrqrxrrrrrrr-r-r-r.rSs     rc@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)InterfaceRegistrycCs i|_dS)N) interfaces)rvr-r-r.rqszInterfaceRegistry.__init__cCstd|dt}d|iS)N error_return _error_return)rerror_positional_args)rvrGZerror_return_defr-r-r. new_interfaceszInterfaceRegistry.new_interfacecCs,|jj|}|dkr(|j|}||j|<|S)N)rgetr)rvinterface_namerGr-r-r.rs    zInterfaceRegistry.get_interfacecCsRddl}|j}|j|d}|ddkr.|d=|j||}|j||j||S)Nrrv)inspectrZ getargspecrNrr)rvrErG method_ptrrrHrPrVr-r-r. set_rpc_defs    zInterfaceRegistry.set_rpc_defcCsL|j|}t|tr|j}|j|}|dkrHtd||d}|j||||S)N)rra MethodTyperrrr)rvrGrHrrVr-r-r.rNs   zInterfaceRegistry.get_rpc_defcCs&|j|}t|tr|j}|||<dS)N)rrarr)rvrGrHrVrr-r-r.rs  z"InterfaceRegistry.register_rpc_defcCs|j|}|dS)Nr)r)rvrGrr-r-r.get_error_rpc_defs z#InterfaceRegistry.get_error_rpc_defcCsxt|jj}|jx\|D]T}|j|}td|t|j}|jx$|D]}||}tdt|qPWqWdS)Nz Interface: %sz %s)r<rkeyssortprintr`)rvZinterface_namesrrGZ method_namesZ method_namerHr-r-r.dump_interfacess     z!InterfaceRegistry.dump_interfacesN) rrrrqrrrrNrrrr-r-r-r.rs  rcsfdd}|S)Ncs,tjd|}|jfdd}d|_|S)NrHcs@|j}tj}t||}||j|<|j|d|f||S)NrH) new_rpc_idrrNAsyncRpcasync_rpc_cacheemit_rpc)rvrTrDrV async_rpc)rGrHr-r.rpc_funcs    z/rpc_method..decorator..rpc_funcT)rrr_rpc_definition)rrVr)rG)rHr. decorators zrpc_method..decoratorr-)rGrr-)rGr.r s csfdd}|S)Ncs |j}tj|}|j|S)N)rrrNr)rrHrV) arg_typesrGr-r.rs  zrpc_arg_type..decoratorr-)rGrrr-)rrGr.r scsfdd}|S)Ncs0tjd|}tj}|j|jd|_|S)NrT)rrrNrrHr)rrpc_callback_defrV)rGrHr-r.rs   zrpc_callback..decoratorr-)rGrHrr-)rGrHr.r scsfdd}|S)Ncs,tjd|}|jfdd}d|_|S)Nsignalcs,|j}tj}|j|d|f|dS)Nr)rrrNr)rvrTrDrV)rGrHr-r.rs z/rpc_signal..decorator..rpc_funcT)rrrr)rrVr)rG)rHr.rs zrpc_signal..decoratorr-)rGrr-)rGr.r s c@sdeZdZddedfddZddZddZdd Zd d Zd d Z e ddZ ddZ ddZ dS)rNcCsLtj||_||_||_||_tj|_d|_ ||_ |dk rH|j |j|dS)N) rr"r+r*portr'r#Z SOCK_STREAMrEsocket friendly_nameparse)rvr+r*r'rr-r-r.rqs zSocketAddress.__init__cCsbtjddt|j}|jdkr"dS|jtjkr$z\1Nonez{unix}%s socket=%sz{inet}%s:%s socket=%sunknown) rsubreprrr+r#AF_UNIXr*r$r)rvZ socket_reprr-r-r.rxs   zSocketAddress.__str__cCsL|jdkrdS|jtjkr$d|jS|jtjkr@d|j|jfStdSdS)Nrz%sz%s:%sZUnknown)r+r#rr*r$r_)rvr-r-r._get_default_friendly_name&s    z(SocketAddress._get_default_friendly_namecCs|jdkr|jS|jS)N)rr)rvr-r-r.get_friendly_name0s zSocketAddress.get_friendly_namecCsddl}|j|S)Nr)copy)rvrr-r-r.r5szSocketAddress.copycCs2|jtjkr|jS|jtjkr*|j|jfSdSdS)N)r+r#rr*r$r)rvr-r-r.get_py_address9s    zSocketAddress.get_py_addresscCs0t|tjr,|j}tjtjdj|}|S|S)N)ZunixZinet)rasixZ string_typesr!r#rr$r)r+r-r-r.r"As  zSocketAddress.map_familycCs6||_|tjkr||_d|_n|tjkr2|j|dS)N)r+r#rr*rr$parse_inet_addr)rvr+addrr-r-r.rIs   zSocketAddress.parsecCs^tjd|}|rN|jd}|jd}|dkr2|j}|dkr@t}||_||_n d|_d|_dS)Nz^\s*([^:\s]+)\s*(:\s*([^\s]+))?rreZhostname)rrr r'Z get_hostnamer*r)rvrr)rr-r-r.rQs   zSocketAddress.parse_inet_addr)rrrrrqrxrrrr staticmethodr"rrr-r-r-r.r s    c@sNeZdZejejBejBejBZdde fddZ ddZ ddZ dd Z dS) ConnectionIONcCs$t|_||_||_||_d|_dS)N)rconnection_stater, channel_type channel_name io_watch_id)rvrrr,r-r-r.rqhs zConnectionIO.__init__cCs&|jtj|jjtj|j||_dS)z-callback signature: (io_object, io_condition)N)io_watch_removerZ io_add_watchr,rZPRIORITY_DEFAULTio_input_conditionsr)rvrr-r-r. io_watch_addos zConnectionIO.io_watch_addcCs |jdk rtj|jd|_dS)N)rrZ source_remove)rvr-r-r.rvs  zConnectionIO.io_watch_removecCs|tjtjBtjB@r|tj@r>t}t|}|jtjd|||tj@rft }t|}|jtj d|||tj@rt }t|}|jtj d||dSdSdS)NrFT) rr6r5r7ERR_SOCKET_HUPZ get_strerrorclose_connectionrr2ZERR_SOCKET_ERRORrmZERR_IO_INVALID)rvr9errnostrerrorr-r-r.valid_io_condition{s   zConnectionIO.valid_io_condition)rrrrr4r6r5r7rrrqrrrr-r-r-r.res rc@s4eZdZdZdZddZddZddZd d Zd S) rFrgcCstj|dd|d||_dS)NZ listeningZserver_listening)rrr,)rrqclient_connection_handler_class)rvr,rr-r-r.rqszListeningServer.__init__cCs||_|jjtjkrXtjj|jjr4tj|jjn$tjj |j}tjj|sXtj |tj |jj|jj |j_ t j |jj jt jt j|jr|jj jtjtjd|jj j|jj|jjtjkrtj|jjd|jj j|j|jj S)Nri)r,r+r#rospathexistsr*removedirnamemakedirsrrEfcntlfilenoF_SETFD FD_CLOEXECallow_reuse_addressZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRZbindrchmodZlistenrequest_queue_size)rvr,rr-r-r.new_listening_sockets   z$ListeningServer.new_listening_socketcCs`y |j|j|j_|j|jWn:tk rZ}z|jjtj tj dt |dSd}~XnXdS)NrFT) rr,rrhandle_client_connect Exceptionrryrrmrkr`)rver-r-r.openszListeningServer.openc CsRy|j|sdS|tj@ryN|j\}}tj|jtjtj|j|j }|j |||j j dt jWnrtjk r}zTt|\}}tjtjd|j |f|tjkrt j} nt j} |j j | d||WYdd}~XnXWnntk rL}zPtjtjd|jjt|fddl} t| j|j j t jddt|WYdd}~XnXdS)NFrz5closing client connection due to socket error(%s): %szexception %s: %srTr)rrr4Zacceptrrrrrr,rrryrrr#errorget_error_from_socket_exceptionsyslogLOG_ERRErrnoEPIPEr2rmr __class__rr` traceback syslog_trace format_exc) rvrr9Z client_socketZclient_addressZclient_handlerrrrrrr-r-r.rs.       ( *z%ListeningServer.handle_client_connectN) rrrrrrqrrrr-r-r-r.rs  c@s4eZdZddZddZddZddZd d Zd S) RequestReceivercCs||_|jdS)N) dispatchFuncreset)rvrr-r-r.rqszRequestReceiver.__init__cCs"d|_d|_d|_d|_d|_dS)Nrrrr) headerLenbodyLenheaderr>feed_buf)rvr-r-r.rs zRequestReceiver.resetcCst|jdkrdSx|jdkrFtj|j}|rD|j|_|jqnPt|j|j|jkr|j}|j|j}|j|||_|j|d|_d|_d|_|j |j |jqPqWdS)Nrrrr) r0rr header_end_rerend parse_headerrr>rr)rvr)Z bodyBeginZbodyEndr-r-r.processs(    zRequestReceiver.processcCs|j|7_|jdS)N)rr)rvdatar-r-r.feedszRequestReceiver.feedcCsli|_d}xLtj|j||jd}|rR|jd}|jdj}||j|<|j}q Pq Wt|jd|_ dS)Nrrrzcontent-length) rheader_field_rerrrr striprr/r)rvZbeginr)rArBr-r-r.r s   zRequestReceiver.parse_headerN)rrrrqrrr rr-r-r-r.rs rc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)rcCsi|_i|_d|_dS)Nr)r rpc_handlersrD)rvr-r-r.rqszRpcManage.__init__cCs|jd7_t|jS)Nr)rDr`)rvr-r-r.r#szRpcManage.new_rpc_idcCsVtdt|j|jft|jj}|jx"|D]}td||j|fq4WdS)Nz*async_rpc_cache: %d entries, cur rpc_id=%sz%s: %s)rr0rrDr<rr)rvZrpc_idsrDr-r-r.dump_async_rpc_cache's  zRpcManage.dump_async_rpc_cachecCs|jjdS)N)rr{)rvr-r-r.flush_async_rpc_cache.szRpcManage.flush_async_rpc_cachecCstjtjd|||fdS)Nz [%s] %d %s)rr)rvrHrrr-r-r.default_errback1szRpcManage.default_errbackcCs|dkrtjtjdtdS|jdkrDxZ|jD]}||jq0Wn@|jdkrt|jdkrxx&|jD]}||jqdWn |j|jdS)Nz8process_async_return(): rpc_id=%s not in async_rpc_cacherrr) rrrD return_type callbacks return_argsr0errbacksr)rvrrr-r-r.process_async_return4s    zRpcManage.process_async_returncCs||j|<dS)N)r )rvrGZhandlerr-r-r.connect_rpc_interfaceBszRpcManage.connect_rpc_interfaceN) rrrrqrr rrrrr-r-r-r.rsc@seZdZeddeZeddeZd!ddZddZd d Z d d Z d dZ ddZ d"ddZ ddZddZddZddZddZdd ZdS)#rrZbuf_sizetimeoutNcCs6tj|||ddtj|tj|_t|j|_dS)N)rrr,) rrqr threadingZLock write_lockrdefault_request_handlerreceiver)rvrrr-r-r.rqLs  zRpcChannel.__init__cCsd|j|j|jfS)Nz channel: name=%s addr=%s type=%s)rr,r)rvr-r-r.rxRszRpcChannel.__str__cCs|jjdS)N)racquire)rvr-r-r.acquire_write_lockUszRpcChannel.acquire_write_lockcCs|jjdS)N)rrelease)rvr-r-r.release_write_lockXszRpcChannel.release_write_lockcCs ||_dS)N)r)rvrr-r-r.set_channel_type[szRpcChannel.set_channel_typecCs|jS)N)r)rvr-r-r.get_channel_type^szRpcChannel.get_channel_typerrcCstd|j|j|jjdkr&dS|jjdk ry(|jjjtj|jjjd|j_Wn,tjk r}zd|j_WYdd}~XnX|j j ||t j B|||j dS)Nzclose_connection: %s)rr,rrZshutdownr#Z SHUT_RDWRcloserrryrrr)rvrrrsrtrr-r-r.ras    zRpcChannel.close_connectioncCs*|jj|d}|dkrdSt||d}|S)N)r rgetattr)rvrGrHZ handler_objrr-r-r.get_method_implementationrs  z$RpcChannel.get_method_implementationcGsZt|jt|kr0tjtjdt||fdSt||f|}t|||}|j|dS)Nz3emit_rpc() arg length=%s does not match rpc_def(%s))r0rPrrrdrF send_data)rvrDrErVrTZrpc_xmlZrpc_datar-r-r.rys  zRpcChannel.emit_rpccCs\|jjtj@sdS|jy`d}xV|t|krv|jjjt ||dd}|dkrl|j tj t t |jd||}q"WWntjk r}z.tjtjd|j|j|jjtjdSd}~Xnztjk r>}zZt|\}}tjtjd|j|f|j|tjkrtj }ntj}|j |d||dSd}~XnX|jjdtj|jdS)NrzUTF-8)Zdetailzsocket timeout: (%s)z&could not send data on socket (%s): %s)rrrrrkrr0r,rsendbytesrr2 ProgramErrorrr#rrrrryrnrrrrrmr)rvrZ totalSentZsentrrrrr-r-r.r$s6   zRpcChannel.send_datac CsNy|j|sdS|tj@ry6|j|j}|jd}t|dkrN|jtj dSWnnt j k r}zPt |\}}t j t jd|j|f|tjkrtj }ntj}|j|d||dSd}~XnX|jjdtj|jj|Wnjtk rH}zLt j t jd|jjt|fddl}t|j|jtjddt|dSd}~XnXdS) NFzutf-8rzsocket error (%s): %szexception %s: %srTr)rrr4Zrecvsocket_buf_sizedecoder0rrr2r#rrrrr,rrrmrryrrr rrrr`rrr) rvrr9rrrrrrr-r-r.handle_client_ios6         zRpcChannel.handle_client_iocCsx|jj|d}|dkr,tjtjd|dStd|jj|||jj|jj |ft |\}}}||_ ||_ |j |dS)Nz1handle_return(): rpc_id=%s not in async_rpc_cachez/%s.handle_return: rpc_id=%s type=%s %s.%s, {%s})rpoprrrrrrVrGrHr[rrr)rvrErDr>rrGrHrTr-r-r. handle_returns$zRpcChannel.handle_returncCs|jdd}|jdd}td|jj|||f|dks@|dkrR|j|||n|dkrrDrErGrHrTrrZrpc_method_defrrZ rpc_error_defrrr-r-r.rsH      ,     z"RpcChannel.default_request_handler)NN)rrrr)rrrrr/r(Zsocket_timeoutrqrxrrrr rr#rr$r*r,rr-r-r-r.rHs    " c@s$eZdZddZddZddZdS)rcCs(||_||_d|_d|_g|_g|_dS)N)rVrDrrrr)rvrVrDr-r-r.rqs zAsyncRpc.__init__cCs|jj|dS)N)rr%)rvrr-r-r. add_callbackszAsyncRpc.add_callbackcCs|jj|dS)N)rr%)rvZerrbackr-r-r. add_errback szAsyncRpc.add_errbackN)rrrrqr-r.r-r-r-r.rsr)N)=Z __future__rrrrMrrrrZ gi.repositoryrrrrr#rrtypesZsetroubleshoot.configrZsetroubleshoot.errcodeZsetroubleshoot.xml_serializerr Zsetroubleshoot.util__all__rZcontent_length_rerr rrrrrr;rCrFr[rdrZ type_registerobjectrr`r/rrrrr r r r rrrrrrrr-r-r-r.s|        ))Q E<  X.I@,5