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
a sgq@sBddlZddlZddlZddlZddlZddlZddlZddlmZmZddl m Z dZ e e ZdZdZdZdZdZe eZdZdZd Zd Zd Zd Zd ZdZdZdZedededefedefeddeddfedededededi ZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*e!d&e"d'e#d(d)eddfe$d*d)eddfe%d+e&d,e'd-e(d.e)d/e*d0i Z+dZ,d1Z-d2Z.d3Z/d4Z0d5Z1d6Z2d7Z3d8Z4d9Z5d:Z6e,d;e-de0d?e1d@e2dAe3dBe4dCe5dDe6dEi Z7iZ8e89ee89e+dFdGe8:DZ;dHdGe8:DZdLdMZ?GdNdOdOe@ZAGdPdQdQe@ZBGdRdSdSe@ZCdZDdZEdZFd ZGd ZHd ZId ZJd ZKdZLdZMdZNdZOdTdUZPdZQdZRdZSd ZTd ZUd ZVd ZWd ZXdVdWZYdZZdZ[dZ\d Z]d Z^d Z_d Z`d ZadZbdZcdXdYZdGdZd[d[ZeGd\d]d]ZfGd^d_d_efZgdgd`daZhdbdcZidddeZjekdfkr>ejZlemeldS)hN)EventLock) ip_addressz>BBHLz>HBBz >HBBIILHH )ZREGISTER_OPAQUETYPEBBxx)ZUNREGISTER_OPAQUETYPErZREGISTER_EVENTZ SYNC_LSDBZORIGINATE_REQUEST>II)ZDELETE_REQUESTz>IBBxBL)MSG_SYNC_REACHABLE) MSG_SYNC_ISMr) MSG_SYNC_NSMr)MSG_SYNC_ROUTER_IDr )ZREPLYZbxxx)Z READY_NOTIFYz>BBxxIZLSA_UPDATE_NOTIFY>IIBxxxZLSA_DELETE_NOTIFY)ZNEW_IFr)ZDEL_IF>I)Z ISM_CHANGEr )Z NSM_CHANGEz>IIIBxxx)ZREACHABLE_CHANGEz>HH)ZROUTER_ID_CHANGEr!iiiii OSPF_API_OKOSPF_API_NOSUCHINTERFACEOSPF_API_NOSUCHAREAOSPF_API_NOSUCHLSAOSPF_API_ILLEGALLSATYPEOSPF_API_OPAQUETYPEINUSE OSPF_API_OPAQUETYPENOTREGISTEREDOSPF_API_NOTREADYOSPF_API_NOMEMORYOSPF_API_ERROROSPF_API_UNDEFcCsi|]\}}||dqS)r.0kvr2r2/usr/lib/frr/ospfclient.py r8cCsi|]\}}||dqS)rr2r3r2r2r7r8r9cCsi|]\}}|t|qSr2)structcalcsizer3r2r2r7r8r9cCst|t|SN)msg_namegetstr)mtr2r2r7 api_msgnamesrAcCst|t|Sr<) msg_errnamer>r?)ecoder2r2r7 api_errnamesrDc@s eZdZdS)APIErrorN__name__ __module__ __qualname__r2r2r2r7rEsrEc@s eZdZdS) MsgTypeErrorNrFr2r2r2r7rJsrJc@s eZdZdS) SeqNumErrorNrFr2r2r2r7rKsrKcCs@tdtdtdtdtdtdtdtdtd t d t d i }| |t |S) Nz LSA:ROUTERz LSA:NETWORKz LSA:SUMMARYzLSA:ASBR_SUMMARYzLSA:AS_EXTERNALzLSA:GROUP_MEMBERz LSA:AS_NSSAzLSA:EXTERNAL_ATTRIBUTESzLSA:OPAQUE_LINKzLSA:OPAQUE_AREAz LSA:OPAQUE_AS) LSA_TYPE_ROUTERLSA_TYPE_NETWORKLSA_TYPE_SUMMARYLSA_TYPE_ASBR_SUMMARYLSA_TYPE_AS_EXTERNALLSA_TYPE_GROUP_MEMBERLSA_TYPE_AS_NSSALSA_TYPE_EXTERNAL_ATTRIBUTESLSA_TYPE_OPAQUE_LINKLSA_TYPE_OPAQUE_AREALSA_TYPE_OPAQUE_ASr>r?)lsa_typenamesr2r2r7 lsa_typenames rYcCs4tdtdtdtdtdtdtdtdi}||t |S) NISM_DEPENDUPONISM_DOWN ISM_LOOPBACK ISM_WAITINGISM_POINTTOPOINT ISM_DROTHER ISM_BACKUPISM_DR) rZr[r\r]r^r_r`rar>r?staterXr2r2r7ism_names rdcCs<tdtdtdtdtdtdtdtdtd t d i }| |t |S) NNSM_DEPENDUPON NSM_DELETEDNSM_DOWN NSM_ATTEMPTNSM_INIT NSM_TWOWAY NSM_EXSTART NSM_EXCHANGE NSM_LOADINGNSM_FULL) rerfrgrhrirjrkrlrmrnr>r?rbr2r2r7nsm_names roc@s eZdZdZddZddZdS) WithNothingz0YdSr<)rrrqr2r2r7connectlszOspfApiClient.connectcCs |jdkS)z!True if the connection is closed.r)rrqr2r2r7closedpszOspfApiClient.closedcstd||jrP|jr:|j|jIdHd|_n |jd|_d|_|jrl|jd|_d|_|j r|j d|_ d|_ dS)Nz %s: closingr) rrrrr~Z wait_closedrrrrrrqr2r2r7rus"     zOspfApiClient._close_lockedc sL|j4IdH$|IdHWdIdHqH1IdHs>0YdSr<)rrrqr2r2r7r~szOspfApiClient.closer"csz|tIdH}tt|\}}}}|dkrO}q|S)z.Return a 16 bit mask for each LSA type passed.irrr2) lsa_typesmasktr2r2r7 lsa_type_masks zOspfApiClient.lsa_type_maskcCs@tj|}t|}t|r"d|nd}tj||||g|RS)zReturn an LSA filter. Return the filter message bytes based on `origin` the `areas` list and the LSAs types in the `lsa_types` list. z{}Ir)rxrrFMT_LSA_FILTERryr:r)originZareasrrZnarearr2r2r7 lsa_filters zOspfApiClient.lsa_filtercsNtd|ttgg}|t|IdHtd||t|IdHdS)zHRegister for all LSA notifications and request an LSDB synchronoization.zSEND: %s: request LSDB eventsNzSEND: %s: request LSDB sync)rrrxrLSAF_ORIGIN_ANYrMSG_REGISTER_EVENT MSG_SYNC_LSDB)rrrr2r2r7 req_lsdb_syncs   zOspfApiClient.req_lsdb_synccs td||tIdHdS)z(Request a dump of all reachable routers.z#SEND: %s: request reachable changesN)rrrrrqr2r2r7req_reachable_routerss z#OspfApiClient.req_reachable_routerscs td||tIdHdS)z;Request a dump of the current ISM states of all interfaces.zSEND: %s: request ISM changesN)rrrrrqr2r2r7req_ism_states"s zOspfApiClient.req_ism_statescs td||tIdHdS):Request a dump of the current NSM states of all neighbors.zSEND: %s: request NSM changesN)rrrrrqr2r2r7req_nsm_states's zOspfApiClient.req_nsm_statescs td||tIdHdS)rz SEND: %s: request router ID syncN)rrrrrqr2r2r7req_router_id_sync,s z OspfApiClient.req_router_id_sync)rN)r")r)rGrHrIr{ staticmethodrrrrpropertyrrr~rrrrrrrrrrrrr2r2r2r7rxs2  .  &    rxcseZdZdZd6fdd ZddZdd Zed d Zed d Z ddZ ddZ ddZ ddZ ddZddZddZddZd7dd Zd!d"Zd8d$d%Zd&d'Zd9d(d)Zd*d+Zd:d,d-Zd;d.d/Zdd4d5ZZS)?OspfOpaqueClientaPA client connection to OSPF Daemon for manipulating Opaque LSA data. The client object is not created in a connected state. To connect to the server the `connect` method should be called. If an error is encountered when sending messages to the server an exception will be raised and the connection will be closed. When this happens `connect` may be called again to restore the connection. Args: server: hostname or IP address of server default is "localhost" wait_ready: if True then wait for OSPF to signal ready, in newer versions FRR ospfd is always ready so this overhead can be skipped. default is False. Raises: Will raise exceptions for failures with various `socket` modules functions such as `socket.socket`, `socket.setsockopt`, `socket.bind`. rFcst|jt|jt|jt|jt|jt|j t |j t |j i}|rB|j|t<t||||_|r`tnt|_tititii|_td|_d|_i|_d|_i|_t |_!d|_"i|_#i|_$d|_%i|_&d|_'dS)Nr)(MSG_LSA_UPDATE_NOTIFY_lsa_change_msgMSG_LSA_DELETE_NOTIFY MSG_NEW_IF_if_msg MSG_DEL_IFMSG_ISM_CHANGE_if_change_msgMSG_NSM_CHANGE_nbr_change_msgMSG_REACHABLE_CHANGE_reachable_msgMSG_ROUTER_ID_CHANGE_router_id_msg _ready_msgMSG_READY_NOTIFYsuperr wait_readyrrp ready_lockrTrUrV ready_condip router_idrouter_id_change_cbZ lsid_seq_num lsa_change_cbopaque_change_cbsetreachable_routersreachable_change_cbif_area ism_states ism_change_cb nsm_states nsm_change_cb)rrrzrr __class__r2r7rFs<   zOspfOpaqueClient.__init__c s|j4IdHt|j||}tdt||t}tt |||}| ||IdH|j snd|j||<WdIdHq1IdHs0YdS)Nzregister %s opaque-type %sT) rrr>rrrYMSG_REGISTER_OPAQUETYPEr:rrrr)rrrWotypecondr@rr2r2r7_register_opaque_dataosz&OspfOpaqueClient._register_opaque_datacs|zXtd|IdH\}}|tvr:|||IdHq t|}td|t|q Wntyvt dYdS0dS)Nz entering async msg handling loopz#ignoring unexpected msg: %s len: %s3Got EOF from OSPF API server on async notify socketr) rrr amsg_inforrArrrinfo)rrr@rZmtsr2r2r7_handle_msg_loops    z!OspfOpaqueClient._handle_msg_loopc Cs(|d>|B}dd||dddtt|fS)Nr)FMT_LSA_HEADER_SIZEr)rWroidrZlsidr2r2r7 _opaque_argss zOspfOpaqueClient._opaque_argscCs*tjtgt||||R}||7}|Sr<)r:rFMT_LSA_HEADERrr)rWrrrlsar2r2r7_make_opaque_lsasz!OspfOpaqueClient._make_opaque_lsac s|tkrdt|}n|tkr0dt|}nd}td|t||||j4IdH4|j| |}d|j||<WdIdHq1IdHs0Y|durt dt||n|r|D] } | qdS)Nz ifaddr {}zarea {}rz-RECV: %s ready notify for %s opaque-type %s%sTz.RECV: dup ready received for %s opaque-type %s) rTryrrUrrrYrrr>rr) rrr@rrrWraddrerevtr2r2r7rs0 8zOspfOpaqueClient._ready_msgcs@|tkr|\}}n|dd}}tdt|t|t|dS)NrzRECV: %s ifaddr %s areaid %s)rrrrAr)rrr@rrrtifaddraidr2r2r7rs  zOspfOpaqueClient._if_msgcsVt|}t|}tdt|||t|||j|<||j|<|jrR||||dS)Nz%RECV: %s ifaddr %s areaid %s state %s)rrrrArdrrr)rrr@rrrrrcr2r2r7rs  zOspfOpaqueClient._if_change_msgc stt|}t|}t|}tdt||||t|||jvrHi|j|<||j|||f<|jrp|||||dS)Nz3RECV: %s ifaddr %s nbraddr %s router_id %s state %s)rrrrArorr)rrr@rrrZnbraddrrrcr2r2r7rs   z OspfOpaqueClient._nbr_change_msgc s|\}} } } } } } } | d?d@}|tkr.d}nd}td|t| t|| | || |f}t|t}||d}||jvr|j||||||||jr|||||||dS)Nrupdatedeletez=RECV: LSA %s msg for LSA %s in area %s seq 0x%x len %s age %s)rrrrrrrr)rrr@rrrrZis_selfZ ls_headerZlsa_agerrWZls_idZls_seqZls_lenrtsidxZ pre_lsa_sizerr2r2r7rs<      z OspfOpaqueClient._lsa_change_msgcstd|||}dd|D}tdt||d|||d|jt|d|O_|jt||d8_tdt||j|jrtdt|||d|||dIdHdS)Nz>{}IcSsg|] }t|qSr2)r)r4xr2r2r7 r9z3OspfOpaqueClient._reachable_msg..zRECV: %s added %s removed %szRECV: %s new set %sRECV: %s calling callback) r:rryrrrArrr)rrr@rrZnaddZnremoveZ router_idsr2r2r7rs  zOspfOpaqueClient._reachable_msgcsrt|}tdt|||j}||kr,dS||_tdt||||jrntdt||||IdHdS)NzRECV: %s router ID %sz,RECV: %s new router ID %s older router ID %sr )rrrrArr)rrr@rrrZ old_router_idr2r2r7r(szOspfOpaqueClient._router_id_msgc s|tkrt|d}}n |tkr0dt|}}nd\}}t}tjt|||gt||||R} | |7} | || IdHdS)aAdd an instance of opaque data. Add an instance of opaque data. This call will register for the given LSA and opaque type if not already done. Args: addr: depends on lsa_type, LINK => ifaddr, AREA => area ID, AS => ignored lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS} otype: (octet) opaque type oid: (3 octets) ID of this opaque data data: the opaque data Raises: See `msg_send_raises` r)rrN) rTintrUMSG_ORIGINATE_REQUESTr:rrrrr) rrrrWrrdatarrr@rr2r2r7add_opaque_data;sz OspfOpaqueClient.add_opaque_datarcs6t}tt|t|||||}|||IdHdS)a7Delete an instance of opaque data. Delete an instance of opaque data. This call will register for the given LSA and opaque type if not already done. Args: addr: depends on lsa_type, LINK => ifaddr, AREA => area ID, AS => ignored lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS} otype: (octet) opaque type. oid: (3 octets) ID of this opaque data flags: (octet) optional flags (e.g., OSPF_API_DEL_ZERO_LEN_LSA, defaults to no flags) Raises: See `msg_send_raises` N)MSG_DELETE_REQUESTr:rrr r)rrrrWrrflagsr@rr2r2r7delete_opaque_data^sz#OspfOpaqueClient.delete_opaque_datac sV|j4IdH.|j|i|duWdIdHS1IdHsH0YdS)aXDetermine if an (lsa_type, otype) tuple has been registered with FRR This determines if the type has been registered, but not necessarily if it is ready, if that is required use the `wait_opaque_ready` metheod. Args: lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS} otype: (octet) opaque type. N)rrr>)rrrWrr2r2r7 is_registeredss zOspfOpaqueClient.is_registeredNcsV|r||j||f<n,||f|jvr@tdt|||j||f=|||IdHdS)aRegister intent to advertise opaque data. The application should wait for the async notificaiton that the server is ready to advertise the given opaque data type. The API currently only allows a single "owner" of each unique (lsa_type,otype). To wait call `wait_opaque_ready` Args: lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS} otype: (octet) opaque type. callback: if given, callback will be called when changes are received for LSA of the given (lsa_type, otype). The callbacks signature is: `callback(msg_type, ifaddr, area_id, lsa_header, data, lsa)` Args: msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY ifaddr: integer identifying an interface (by IP address) area_id: integer identifying an area lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH") data: the opaque data that follows the LSA header lsa: the octets of the full lsa Raises: See `msg_send_raises` z=OSPFCLIENT: register: removing callback for %s opaque-type %sN)rrrrYrrrrWrcallbackr2r2r7register_opaque_datas z%OspfOpaqueClient.register_opaque_datac s|j4IdH||j||}|dur>WdIdHdStdt|||sfg}|j||<t}||WdIdHq1IdHs0Y|IdHtdt||dS)NTz#waiting for ready %s opaque-type %szREADY for %s opaque-type %s) rrr>rrrYrappendwait)rrrWrrrr2r2r7wait_opaque_readys 4z"OspfOpaqueClient.wait_opaque_readycs*||||IdH|||IdHdS)aRegister intent to advertise opaque data and wait for ready. The API currently only allows a single "owner" of each unique (lsa_type,otype). Args: lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS} otype: (octet) opaque type. callback: if given, callback will be called when changes are received for LSA of the given (lsa_type, otype). The callbacks signature is: `callback(msg_type, ifaddr, area_id, lsa_header, data, lsa)` Args: msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY ifaddr: integer identifying an interface (by IP address) area_id: integer identifying an area lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH") data: the opaque data that follows the LSA header lsa: the octets of the full lsa Raises: See `msg_send_raises` N)rrrr2r2r7register_opaque_data_waitsz*OspfOpaqueClient.register_opaque_data_waitcsF||f|jvr|j||f=t}tt|||}|||IdHdS)aBUnregister intent to advertise opaque data. This will also cause the server to flush/delete all opaque data of the given (lsa_type,otype). Args: lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS} otype: (octet) opaque type. Raises: See `msg_send_raises` N)rMSG_UNREGISTER_OPAQUETYPEr:rrr)rrrWrr@rr2r2r7unregister_opaque_datas  z'OspfOpaqueClient.unregister_opaque_datacs||_|IdHdS)aMonitor changes to LSAs. Args: callback: if given, callback will be called when changes are received for any LSA. The callback signature is: `callback(msg_type, ifaddr, area_id, lsa_header, extra, lsa)` Args: msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY ifaddr: integer identifying an interface (by IP address) area_id: integer identifying an area lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH") extra: the octets that follow the LSA header lsa: the octets of the full lsa N)rrrrrr2r2r7 monitor_lsaszOspfOpaqueClient.monitor_lsacs||_|IdHdS)a*Monitor the set of reachable routers. The property `reachable_routers` contains the set() of reachable router IDs as integers. This set is updated prior to calling the `callback` Args: callback: callback will be called when the set of reachable routers changes. The callback signature is: `callback(added, removed)` Args: added: list of integer router IDs being added removed: list of integer router IDs being removed N)rrrr2r2r7monitor_reachablesz"OspfOpaqueClient.monitor_reachablecs||_|IdHdS)aMonitor the state of OSPF enabled interfaces. Args: callback: callback will be called when an interface changes state. The callback signature is: `callback(ifaddr, area_id, state)` Args: ifaddr: integer identifying an interface (by IP address) area_id: integer identifying an area state: ISM_* N)rrrr2r2r7 monitor_ismszOspfOpaqueClient.monitor_ismcs||_|IdHdS)aMonitor the state of OSPF neighbors. Args: callback: callback will be called when a neighbor changes state. The callback signature is: `callback(ifaddr, nbr_addr, router_id, state)` Args: ifaddr: integer identifying an interface (by IP address) nbr_addr: integer identifying neighbor by IP address router_id: integer identifying neighbor router ID state: NSM_* N)rrrr2r2r7 monitor_nsm(szOspfOpaqueClient.monitor_nsmcs||_|IdHdS)aMonitor the OSPF router ID. The property `router_id` contains the OSPF urouter ID. This value is updated prior to calling the `callback` Args: callback: callback will be called when the router ID changes. The callback signature is: `callback(new_router_id, old_router_id)` Args: new_router_id: the new router ID old_router_id: the old router ID N)rrrr2r2r7monitor_router_id:sz"OspfOpaqueClient.monitor_router_id)rF)r)N)N)N)N)N)N)N)rGrHrIrwrrrrrrrrrrrrrr rrrrrrrrrrr  __classcell__r2r2rr7r2s6)    (#  )     rccs4|r|D] }|Vqntd}|s$q0|VqdS)z"Get next action from list or STDINrN)inputstrip)Z action_listactionr2r2r7 next_actionQs r%c s*t|j}|IdHztjddkr:t|nt|| IdH| IdH| IdH| IdHt |jD]}|d}|d}|dkrt|d}td|t|IdHtd|qt|d}|dkrtd }n8|d}ztt|}WntyDt|}Yn0||t|dt|dg} || d| d IdHs|| d| d IdH|d kr6zt|d} Wntyd } Yn0td t| t| d} | r| dd| 7} tdt| |jg| | RIdHqd } t|dkrtzt|d} Wntyrd } Yn0|jg| | RIdHq|jr|j rWd SWn8t!y} ztj"d| ddWYd} ~ d Sd} ~ 00z"tdtdIdHqWn t#y$tdYd S0dS)Nrr ,Frzwaiting %s secondszwait complete: %s secondsrrraddr9zopaque data is %s octetsrzopaque padding to %s octetsz async_main: unexpected error: %sTexc_infozSleeping foreverxr)$rrzrsys version_inforZ create_taskrrrrrrr%actionssplitpopcasefoldr rrsleepr ValueErrorrrbytesfromhex IndexErrorrr rexitr}rr)rtcr$rZwhatZstimeZltyperZavalZoargsbmodfrr2r2r7 async_main^sv                r<c GsLt|}|jdddd|jdddd|jd d d d|jd d ddd|jdddd|}|jrptjntj}tj|d |j dt dd}zPt j ddkrtt|}n.t}z|t|}W|n |0WnRtyt dYn@ty<}ztj d|ddWYd}~nd}~00t d|S)Nz--logtagZCLIENTztag to identify log messages)defaulthelpz--exit store_truezExit after commands)r$r>z--serverrzOSPF API serverz-vz --verbosez be verboser.*z?WAIT,SEC|(ADD|DEL),LSATYPE,[ADDR,],OTYPE,OID,[HEXDATA|DEL_FLAG])nargsr>z3%(asctime)s %(levelname)s: {}: %(name)s %(message)s)levelryzospfclient: startingrrr z+Exiting, received KeyboardInterrupt in mainz Exiting, unexpected exception %sTr)zospfclient: clean exit)argparseArgumentParser add_argument parse_argsverboserDEBUGINFOZ basicConfigryZlogtagrr,r-rrunr<rZrun_until_completer~KeyboardInterruptr})rtZaprBstatusrrr2r2r7mainsB  & rM__main__)N)nrCrrrr|r:r,rr ipaddressrrrr;rrZLSAF_ORIGIN_NON_SELFZLSAF_ORIGIN_SELFrrrrrrrr rrrrrZ smsg_infoZOSPF_API_DEL_ZERO_LEN_LSArrrrrrrrrrrr'r(r)r*r+r,r-r.r/r0r1rBZmsg_inforitemsr=rrrArDr}rErJrKZLSA_TYPE_UNKNOWNrLrMrNrOrPrQrRrSrTrUrVrYrZr[r\r]r^r_r`rardrerfrgrhrirjrkrlrmrnrorprxrr%r<rMrG exit_statusr7r2r2r2r7s       ## L,