B °¤ï`­Kã@s|ddlmZddlZddlZddlZddlZddlZddlZddlZddl Tddl Tddl m Z dd„Z Gdd „d eƒZdS) é)ÚdatetimeNé)Ú*)Ú __version__cCs2|}i}dt ¡i|d<|dddkr:t ¡|dd<nN|dddkrˆtjjdkrftjdd…}ntj}d d d „|Dƒ¡|dd<tj d ¡r¶t ¡d r¶d t ¡d dœ|d<t  ¡rÒt  ¡|  di¡d<t  ¡rît  ¡|  di¡d<t  ¡rt  ¡|d<|r||d<|r ||d<t j t |¡¡S)NÚnameÚimplementation)ÚCPythonÚJythonÚ IronPythonÚversionÚPyPyÚfinaléÚ.cSsg|] }t|ƒ‘qS©)Ústr)Ú.0Úxrrún/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/meraki/rest_session.pyú "sz'user_agent_extended..ÚdarwinrÚmacOS)rr ÚdistroÚsystemÚreleaseÚcpuÚ be_geo_idÚcaller)ÚplatformÚpython_implementationÚpython_versionÚsysÚpypy_version_infoÚ releaselevelÚjoinÚ startswithÚmac_verrÚ setdefaultrÚmachineÚurllibÚparseÚquoteÚjsonÚdumps)rrÚuser_agent_extendedr"rrrr.s0   r.cs eZdZeeeeeee e e e e eedf‡fdd„ Zedd„ƒZejdd„ƒZdd„Zdd d „Zddd„Zddd„Zddd„Zddd„Zddd„Zdd„Z‡ZS) Ú RestSessionFcsptt|ƒ ¡t|_t|ƒ|_t|ƒ|_||_||_ ||_ ||_ ||_ | |_ | |_| |_| |_| |_||_||_||_t ¡|_d|j_d|jkr¨t d|j›d¡n|jddkrÆ|jdd…|_d|jdd |j›d t|j|jƒd œ|j_||_d |ji|_|j t ƒ¡|j !d ¡|j !d¡|j !d¡d|jdd…|jd<|jrl|j "d|j›¡dS)Nzutf-8Zv0z5If you want to use the Python library with v0 paths (zˆ was configured as the base URL), then install the v0 library. See the "Setup" section @ https://github.com/meraki/dashboard-api-python/éÿÿÿÿú/zBearer zapplication/jsonzpython-meraki/ú )Ú Authorizationz Content-Typez User-Agentr ÚselfÚloggerÚ __class__z$************************************éüÿÿÿÚapi_keyz@Meraki dashboard API session initialized with these parameters: )#Úsuperr/Ú__init__rÚ_versionrZ_api_keyÚ _base_urlÚ_single_request_timeoutÚ_certificate_pathÚ_requests_proxyZ_wait_on_rate_limitÚ_nginx_429_retry_wait_timeÚ_action_batch_retry_wait_timeÚ_retry_4xx_errorÚ_retry_4xx_error_wait_timeÚ_maximum_retriesÚ _simulateZ _be_geo_idZ_callerÚuse_iterator_for_get_pagesÚrequestsÚsessionÚ _req_sessionÚencodingr!Úexitr.ÚheadersÚ_loggerÚ _parametersÚupdateÚlocalsÚpopÚinfo)r4r5r8Úbase_urlZsingle_request_timeoutZcertificate_pathZrequests_proxyZwait_on_rate_limitZnginx_429_retry_wait_timeZaction_batch_retry_wait_timeZretry_4xx_errorZretry_4xx_error_wait_timeZmaximum_retriesZsimulaterrrF)r6rrr:<sF    $    zRestSession.__init__cCs|jS)N)Ú_use_iterator_for_get_pages)r4rrrrFsz&RestSession.use_iterator_for_get_pagescCs |r|j|_n|j|_||_dS)N)Ú_get_pages_iteratorÚ get_pagesÚ_get_pages_legacyrT)r4ÚvaluerrrrF…s c KsH|dd}|d}|jr(| d|j¡|jr@| dd|ji¡| d|j¡d|ks^d |krd|}n |j|}|j}|jr†|j |¡|jr¶|d kr¶|jr²|j  |›d |›d ¡dSd} x†|dkrBy^| rÖ|   ¡|jrò|j  |›d |›¡|j j ||fddi|—Ž} | j r| j nd} | j} Wnxtjjk rž} zT|jrd|j |›d |›d| ›d¡t d¡|d8}|dkrŒt|| ƒ‚nw¾Wdd} ~ XYnXt| ƒddkrð| jd}d} | |krÎd} |d| | ¡t| ƒd…|_q¾| jrd|kr<|d}|jrf|j  |›d |›d|›d| ›d | › ¡n*|jrf|j  |›d |›d| ›d | ›¡y"|d kr†| j ¡r†|  ¡| Stjjk r} zT|jrÆ|j |›d |›d| ›d¡t d¡|d8}|dkrît|| ƒ‚nw¾Wdd} ~ XYnXq¾| dkr’d| jkr*t | jdƒ}nt! "d|j#¡}|jrj|j |›d |›d| ›d | ›d|›d ¡t |¡|d8}|dkr@t|| ƒ‚q¾| dkrð|jrÈ|j |›d |›d| ›d | ›d¡t d¡|d8}|dkr@t|| ƒ‚q¾y |  ¡}Wn$t$k r | jdd…}YnXd d!gi}||kr–|j%}|jrn|j |›d |›d| ›d | ›d|›d ¡t |¡|d8}|dkr@t|| ƒ‚q¾|j&rt! "d|j'¡}|jrÞ|j |›d |›d| ›d | ›d|›d ¡t |¡|d8}|dkr@t|| ƒ‚q¾|jr6|j (|›d |›d| ›d | ›d |› ¡t|| ƒ‚q¾WdS)"NÚtagsrÚ operationÚverifyÚproxiesÚhttpsÚtimeoutz meraki.comz meraki.cnÚGETz, z - SIMULATEDr2Úallow_redirectsFÚz - z, retrying in 1 secondrÚ3ZLocationzmeraki.com/api/vzmeraki.cn/api/vÚpagez; page i­z Retry-Afterz, retrying in z secondsiôédÚerrorsz]Too many concurrently executing batches. Maximum is 5 confirmed but not yet executed batches.))r>r'r?r=r<rDrMÚdebugrErRÚcloserIÚrequestÚreasonÚ status_coderGÚ exceptionsÚRequestExceptionÚwarningÚtimeÚsleepZAPIErrorrrLÚfindÚlenÚokÚcontentÚstripr,ÚdecoderÚJSONDecodeErrorÚintÚrandomÚrandintr@Ú ValueErrorrArBrCÚerror)r4ÚmetadataÚmethodÚurlÚkwargsÚtagrZZabs_urlÚretriesÚresponseriÚstatusÚeZ substringÚcounterÚwaitÚmessageZaction_batch_concurrency_errorrrrrhŽsÌ         " *"     *    $     *   *   (zRestSession.requestNcCsPd|d<||d<||d<|j|d||d}d}|rL|j ¡rD| ¡}| ¡|S)Nr_r}r~Úparams)rˆ)rhrsrtr,rg)r4r|r~rˆr‚ÚretrrrÚgets zRestSession.getr0ÚnextcCsdS)Nr)r4r|r~rˆÚ total_pagesÚ directionÚevent_log_end_timerrrrV$szRestSession.get_pagesccst|ƒtkr| ¡dkrd}nt|ƒtkr:| ¡r:t|ƒ}d|d<|j|d||d}x¬|dkr| ¡}|j} |dkrd| kr|d d krêtj   t| dd ƒ  d ¡d¡} t   ¡t  | dd…¡} |  ¡d krÜPn|rê| |krêP|dd7<| dd } np|dkrvd| krv|d d krXtj   t| dd ƒ  d¡d¡} | dkrXP|dd7<| dd } nP| ¡g}t|ƒtkr˜|}n4t|ƒtkrÌ|dkrÄ|dddd…}n|d}x|D] }|VqÒW|d}|dkrX| |d| ¡}qXWdS)NÚallr0rrcr_)rˆrr‹rZÚgetNetworkEventsr~zstartingAfter=i,Úprevz endingBefore=z 2014-01-01Úevents)ÚtyperÚlowerÚ isnumericrwrhr,Úlinksr)r*ÚunquoteÚsplitrÚutcnowÚ fromisoformatÚ total_secondsrgÚlistÚdict)r4r|r~rˆrŒrrŽr‚Úresultsr–Ústarting_afterÚdeltaZnextlinkÚ ending_beforeZ return_itemsÚitemrrrrU'sV         zRestSession._get_pages_iteratorcCsŽt|ƒtkr| ¡dkrd}nt|ƒtkr:| ¡r:t|ƒ}d|d<|j|d||d}| ¡}t|ƒtkr’|ddkr’|d kr’|d ddd…|d <xæ|dkrz|j} |  ¡d}|d krXd | krX|ddkr0t j   | d d   d ¡d¡} t ¡t | dd…¡} |  ¡d krPn|r0| |kr0P|dd7<| |d| d d ¡}nv|dkrÌd| krÌ|ddkr¤t j   | dd   d¡d¡} | dkr¤P|dd7<| |d| dd ¡}nPt|ƒtkrì| | ¡¡n„t|ƒtkrp| ¡d} | ¡d}| ¡d }|d kr6|ddd…}| |dkrL| |d<||dkrb||d<|d  |¡|d8}q–W|rŠ|  ¡|S)Nrr0rrcr_)rˆrZrr‹r’r~zstartingAfter=i,r‘z endingBefore=z 2014-01-01Z pageStartAtZ pageEndAt)r“rr”r•rwrhr,rr–rgr)r*r—r˜rr™ršr›rœÚextend)r4r|r~rˆrŒrrŽr‚ržr–rŸr r¡ÚstartÚendr’rrrrWts`       zRestSession._get_pages_legacycCsPd|d<||d<||d<|j|d||d}d}|rL|j ¡rD| ¡}| ¡|S)NÚPOSTr}r~r,)r,)rhrsrtr,rg)r4r|r~r,r‚r‰rrrÚpost»s zRestSession.postcCsPd|d<||d<||d<|j|d||d}d}|rL|j ¡rD| ¡}| ¡|S)NÚPUTr}r~r,)r,)rhrsrtr,rg)r4r|r~r,r‚r‰rrrÚputÇs zRestSession.putcCs.d|d<||d<| |d|¡}|r*| ¡dS)NÚDELETEr}r~)rhrg)r4r|r~r‚rrrÚdeleteÓs zRestSession.delete)N)Nr0r‹N)Nr0r‹N)Nr0r‹N)N)N)Ú__name__Ú __module__Ú __qualname__ZDEFAULT_BASE_URLZSINGLE_REQUEST_TIMEOUTZCERTIFICATE_PATHZREQUESTS_PROXYZWAIT_ON_RATE_LIMITZNGINX_429_RETRY_WAIT_TIMEZACTION_BATCH_RETRY_WAIT_TIMEZRETRY_4XX_ERRORZRETRY_4XX_ERROR_WAIT_TIMEZMAXIMUM_RETRIESZSIMULATE_API_CALLSZ BE_GEO_IDZMERAKI_PYTHON_SDK_CALLERr:ÚpropertyrFÚsetterrhrŠrVrUrWr§r©r«Ú __classcell__rr)r6rr/;s84    F G r/)rr,rrxr!rnÚ urllib.parser)rGÚconfigrkr:rr.Úobjectr/rrrrÚs  +