B `4L@sdZddlZddlZddlmZddlZddlZdZddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddÐdĐdŐdƐdǐdȐdɐdʐdːd̐d͐dΐdϐdАdѐdҐdӐdԐdՐd֐dאdؐdِdڐdېdܐdݐdސdߐdddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPgLZGdQdRdRe Z GdSdTdTe Z GdUdVdVe Z GdWdXdXe ZGdYdZdZe ZGd[d\d\e ZGd]d^d^eZGd_d`d`eZdadbZdcddZdedfZdgdhZdidjZdkdlZdmdnZdodpZdqdrZd;dtduZd<dvdwZd=dxdyZd>dzd{Z d?d}d~Z!d@ddZ"dAddZ#dBddZ$dCddZ%dDddZ&dEddZ'dFddZ(dGddZ)dHddZ*dIddZ+dJddZ,dKddZ-dLddZ.dMddZ/dNddZ0dOddZ1dPddZ2dQddZ3dRddZ4dSddZ5dTddZ6dUddZ7dVddZ8dWddZ9dXddZ:dYddZ;dZddZ<d[ddZ=d\ddZ>d]ddZ?d^ddZ@d_ddZAd`ddÄZBdadĐdńZCdbdǐdȄZDdcdɐdʄZEdddːd̄ZFded͐d΄ZGdfdϐdЄZHdgdѐd҄ZIdhdӐdԄZJdidՐdքZKdjdאd؄ZLdkdِdڄZMdldېd܄ZNdmdݐdބZOdndߐdZPdoddZQdpddZRdqddZSdrddZTdsddZUdtddZVduddZWdvddZXdwddZYdxddZZdyddZ[dzddZ\d{ddZ]d|ddZ^d}ddZ_d~ddZ`dddZadddZbdddZcdd d Zddd d Zedd dZfdddZgdddZhdddZidddZjdddZkdddZldddZmdddZnddd Zodd!d"Zpdd#d$Zqdd%d&Zrdd'd(Zsdd)d*Ztdd+d,Zudd-d.Zvdd/d0Zwdd1d2Zxdd3d4Zydd5d6Zzdd7d8Z{dd9d:Z|dS(a Cisco Meraki Dashboard API Python 3.6 Module Overview The purpose of this Python module is to provide a standard Python module to interact with the Meraki Provisioning API. Each method in this function interacts seamlessly with the API and either returns data from the method call or a status message indicating the result of the API call Dependencies - Python 3.6 - 'requests' module N) ip_addresszhttps://api.meraki.com/api/v0zAfrica/Abidjanz Africa/AccrazAfrica/Addis_AbabazAfrica/Algiersz Africa/Asmaraz Africa/Asmeraz Africa/Bamakoz Africa/Banguiz Africa/Banjulz Africa/BissauzAfrica/BlantyrezAfrica/BrazzavillezAfrica/Bujumburaz Africa/CairozAfrica/Casablancaz Africa/CeutazAfrica/Conakryz Africa/DakarzAfrica/Dar_es_SalaamzAfrica/Djiboutiz Africa/DoualazAfrica/El_AaiunzAfrica/FreetownzAfrica/Gaboronez Africa/HararezAfrica/Johannesburgz Africa/JubazAfrica/KampalazAfrica/Khartoumz Africa/KigalizAfrica/Kinshasaz Africa/LagoszAfrica/Librevillez Africa/Lomez Africa/LuandazAfrica/Lubumbashiz Africa/Lusakaz Africa/Malaboz Africa/Maputoz Africa/MaseruzAfrica/MbabanezAfrica/MogadishuzAfrica/MonroviazAfrica/NairobizAfrica/Ndjamenaz Africa/NiameyzAfrica/NouakchottzAfrica/OuagadougouzAfrica/Porto-NovozAfrica/Sao_TomezAfrica/TimbuktuzAfrica/Tripoliz Africa/TuniszAfrica/Windhoekz America/AdakzAmerica/AnchoragezAmerica/AnguillazAmerica/AntiguazAmerica/AraguainazAmerica/Argentina/Buenos_AireszAmerica/Argentina/Catamarcaz America/Argentina/ComodRivadaviazAmerica/Argentina/CordobazAmerica/Argentina/JujuyzAmerica/Argentina/La_RiojazAmerica/Argentina/MendozazAmerica/Argentina/Rio_GallegoszAmerica/Argentina/SaltazAmerica/Argentina/San_JuanzAmerica/Argentina/San_LuiszAmerica/Argentina/TucumanzAmerica/Argentina/Ushuaiaz America/ArubazAmerica/AsuncionzAmerica/Atikokanz America/Atkaz America/BahiazAmerica/Bahia_BanderaszAmerica/Barbadosz America/BelemzAmerica/BelizezAmerica/Blanc-SablonzAmerica/Boa_VistazAmerica/Bogotaz America/BoisezAmerica/Buenos_AireszAmerica/Cambridge_BayzAmerica/Campo_GrandezAmerica/CancunzAmerica/CaracaszAmerica/CatamarcazAmerica/CayennezAmerica/CaymanzAmerica/ChicagozAmerica/ChihuahuazAmerica/Coral_HarbourzAmerica/CordobazAmerica/Costa_RicazAmerica/CrestonzAmerica/CuiabazAmerica/CuracaozAmerica/DanmarkshavnzAmerica/DawsonzAmerica/Dawson_CreekzAmerica/DenverzAmerica/DetroitzAmerica/DominicazAmerica/EdmontonzAmerica/EirunepezAmerica/El_SalvadorzAmerica/EnsenadazAmerica/Fort_NelsonzAmerica/Fort_WaynezAmerica/FortalezazAmerica/Glace_BayzAmerica/GodthabzAmerica/Goose_BayzAmerica/Grand_TurkzAmerica/GrenadazAmerica/GuadeloupezAmerica/GuatemalazAmerica/GuayaquilzAmerica/GuyanazAmerica/HalifaxzAmerica/HavanazAmerica/HermosillozAmerica/Indiana/IndianapoliszAmerica/Indiana/KnoxzAmerica/Indiana/MarengozAmerica/Indiana/PetersburgzAmerica/Indiana/Tell_CityzAmerica/Indiana/VevayzAmerica/Indiana/VincenneszAmerica/Indiana/WinamaczAmerica/IndianapoliszAmerica/InuvikzAmerica/IqaluitzAmerica/Jamaicaz America/JujuyzAmerica/JuneauzAmerica/Kentucky/LouisvillezAmerica/Kentucky/MonticellozAmerica/Knox_INzAmerica/KralendijkzAmerica/La_Pazz America/LimazAmerica/Los_AngeleszAmerica/LouisvillezAmerica/Lower_PrinceszAmerica/MaceiozAmerica/ManaguazAmerica/ManauszAmerica/MarigotzAmerica/MartiniquezAmerica/MatamoroszAmerica/MazatlanzAmerica/MendozazAmerica/MenomineezAmerica/MeridazAmerica/MetlakatlazAmerica/Mexico_CityzAmerica/MiquelonzAmerica/MonctonzAmerica/MonterreyzAmerica/MontevideozAmerica/MontrealzAmerica/MontserratzAmerica/NassauzAmerica/New_YorkzAmerica/Nipigonz America/NomezAmerica/NoronhazAmerica/North_Dakota/BeulahzAmerica/North_Dakota/CenterzAmerica/North_Dakota/New_SalemzAmerica/OjinagazAmerica/PanamazAmerica/PangnirtungzAmerica/ParamaribozAmerica/PhoenixzAmerica/Port_of_SpainzAmerica/Port-au-PrincezAmerica/Porto_AcrezAmerica/Porto_VelhozAmerica/Puerto_RicozAmerica/Rainy_RiverzAmerica/Rankin_InletzAmerica/RecifezAmerica/ReginazAmerica/ResolutezAmerica/Rio_BrancozAmerica/RosariozAmerica/Santa_IsabelzAmerica/SantaremzAmerica/SantiagozAmerica/Santo_DomingozAmerica/Sao_PaulozAmerica/ScoresbysundzAmerica/Shiprockz America/SitkazAmerica/St_BarthelemyzAmerica/St_JohnszAmerica/St_KittszAmerica/St_LuciazAmerica/St_ThomaszAmerica/St_VincentzAmerica/Swift_CurrentzAmerica/Tegucigalpaz America/ThulezAmerica/Thunder_BayzAmerica/TijuanazAmerica/TorontozAmerica/TortolazAmerica/VancouverzAmerica/VirginzAmerica/WhitehorsezAmerica/WinnipegzAmerica/YakutatzAmerica/YellowknifezAntarctica/CaseyzAntarctica/DaviszAntarctica/DumontDUrvillezAntarctica/MacquariezAntarctica/MawsonzAntarctica/McMurdozAntarctica/PalmerzAntarctica/RotherazAntarctica/South_PolezAntarctica/SyowazAntarctica/TrollzAntarctica/VostokzArctic/Longyearbyenz Asia/Adenz Asia/Almatyz Asia/Ammanz Asia/Anadyrz Asia/Aqtauz Asia/Aqtobez Asia/AshgabatzAsia/Ashkhabadz Asia/Baghdadz Asia/Bahrainz Asia/Bakuz Asia/Bangkokz Asia/Barnaulz Asia/Beirutz Asia/Bishkekz Asia/Bruneiz Asia/Calcuttaz Asia/ChitazAsia/ChoibalsanzAsia/ChongqingzAsia/Chungkingz Asia/Colomboz Asia/Daccaz Asia/Damascusz Asia/Dhakaz Asia/Diliz Asia/Dubaiz Asia/Dushanbez Asia/Gazaz Asia/Harbinz Asia/HebronzAsia/Ho_Chi_MinhzAsia/Hong_Kongz Asia/Hovdz Asia/Irkutskz Asia/Istanbulz Asia/Jakartaz Asia/JayapurazAsia/Jerusalemz Asia/KabulzAsia/Kamchatkaz Asia/Karachiz Asia/KashgarzAsia/Kathmanduz Asia/Katmanduz Asia/Khandygaz Asia/KolkatazAsia/KrasnoyarskzAsia/Kuala_Lumpurz Asia/Kuchingz Asia/Kuwaitz Asia/Macaoz Asia/Macauz Asia/Magadanz Asia/Makassarz Asia/Manilaz Asia/Muscatz Asia/NicosiazAsia/NovokuznetskzAsia/Novosibirskz Asia/Omskz Asia/OralzAsia/Phnom_PenhzAsia/PontianakzAsia/Pyongyangz Asia/QatarzAsia/Qyzylordaz Asia/Rangoonz Asia/Riyadhz Asia/Saigonz Asia/SakhalinzAsia/Samarkandz Asia/Seoulz Asia/ShanghaizAsia/SingaporezAsia/Srednekolymskz Asia/Taipeiz Asia/Tashkentz Asia/Tbilisiz Asia/Tehranz Asia/Tel_Avivz Asia/Thimbuz Asia/Thimphuz Asia/Tokyoz Asia/TomskzAsia/Ujung_PandangzAsia/UlaanbaatarzAsia/Ulan_Batorz Asia/Urumqiz Asia/Ust-NerazAsia/VientianezAsia/Vladivostokz Asia/YakutskzAsia/Yekaterinburgz Asia/YerevanzAtlantic/AzoreszAtlantic/BermudazAtlantic/CanaryzAtlantic/Cape_VerdezAtlantic/FaeroezAtlantic/FaroezAtlantic/Jan_MayenzAtlantic/MadeirazAtlantic/ReykjavikzAtlantic/South_GeorgiazAtlantic/St_HelenazAtlantic/Stanleyz Australia/ACTzAustralia/AdelaidezAustralia/BrisbanezAustralia/Broken_HillzAustralia/CanberrazAustralia/CurriezAustralia/DarwinzAustralia/EuclazAustralia/Hobartz Australia/LHIzAustralia/LindemanzAustralia/Lord_HowezAustralia/MelbournezAustralia/Northz Australia/NSWzAustralia/PerthzAustralia/QueenslandzAustralia/SouthzAustralia/SydneyzAustralia/TasmaniazAustralia/VictoriazAustralia/WestzAustralia/Yancowinnaz Brazil/AcrezBrazil/DeNoronhaz Brazil/Eastz Brazil/WestzCanada/AtlanticzCanada/CentralzCanada/EasternzCanada/East-SaskatchewanzCanada/MountainzCanada/NewfoundlandzCanada/PacificzCanada/Saskatchewanz Canada/YukonZCETzChile/ContinentalzChile/EasterIslandZCST6CDTZCubaZEETZEgyptZEireESTZEST5EDTzEtc/GMTz Etc/GMT+0z Etc/GMT+1z Etc/GMT+10z Etc/GMT+11z Etc/GMT+12z Etc/GMT+2z Etc/GMT+3z Etc/GMT+4z Etc/GMT+5z Etc/GMT+6z Etc/GMT+7z Etc/GMT+8z Etc/GMT+9zEtc/GMT0z Etc/GMT-0z Etc/GMT-1z Etc/GMT-10z Etc/GMT-11z Etc/GMT-12z Etc/GMT-13z Etc/GMT-14z Etc/GMT-2z Etc/GMT-3z Etc/GMT-4z Etc/GMT-5z Etc/GMT-6z Etc/GMT-7z Etc/GMT-8z Etc/GMT-9z Etc/GreenwichzEtc/UCTz Etc/UniversalzEtc/UTCzEtc/ZuluzEurope/AmsterdamzEurope/AndorrazEurope/Astrakhanz Europe/AthenszEurope/BelfastzEurope/Belgradez Europe/BerlinzEurope/BratislavazEurope/BrusselszEurope/BucharestzEurope/BudapestzEurope/BusingenzEurope/ChisinauzEurope/Copenhagenz Europe/DublinzEurope/GibraltarzEurope/GuernseyzEurope/HelsinkizEurope/Isle_of_ManzEurope/Istanbulz Europe/JerseyzEurope/Kaliningradz Europe/Kievz Europe/Kirovz Europe/LisbonzEurope/Ljubljanaz Europe/LondonzEurope/Luxembourgz Europe/Madridz Europe/MaltazEurope/Mariehamnz Europe/Minskz Europe/Monacoz Europe/MoscowzEurope/Nicosiaz Europe/Osloz Europe/PariszEurope/Podgoricaz Europe/Praguez Europe/Rigaz Europe/Romez Europe/SamarazEurope/San_MarinozEurope/SarajevozEurope/Simferopolz Europe/Skopjez Europe/SofiazEurope/StockholmzEurope/Tallinnz Europe/TiranezEurope/TiraspolzEurope/UlyanovskzEurope/Uzhgorodz Europe/VaduzzEurope/Vaticanz Europe/ViennazEurope/VilniuszEurope/Volgogradz Europe/Warsawz Europe/ZagrebzEurope/Zaporozhyez Europe/ZurichZGBzGB-EireGMTzGMT+0ZGMT0zGMT-0Z GreenwichZHongkongZHSTZIcelandzIndian/Antananarivoz Indian/ChagoszIndian/Christmasz Indian/Cocosz Indian/ComorozIndian/Kerguelenz Indian/MahezIndian/MaldiveszIndian/MauritiuszIndian/MayottezIndian/ReunionZIranZIsraelZJamaicaZJapanZ KwajaleinZLibyaZMETzMexico/BajaNortezMexico/BajaSurzMexico/GeneralMSTZMST7MDTZNavajoZNZzNZ-CHATz Pacific/ApiazPacific/AucklandzPacific/BougainvillezPacific/Chathamz Pacific/ChuukzPacific/Easterz Pacific/EfatezPacific/EnderburyzPacific/Fakaofoz Pacific/FijizPacific/FunafutizPacific/GalapagoszPacific/GambierzPacific/Guadalcanalz Pacific/GuamzPacific/HonoluluzPacific/JohnstonzPacific/KiritimatizPacific/KosraezPacific/KwajaleinzPacific/MajurozPacific/MarquesaszPacific/Midwayz Pacific/Nauruz Pacific/NiuezPacific/NorfolkzPacific/NoumeazPacific/Pago_Pagoz Pacific/PalauzPacific/PitcairnzPacific/PohnpeizPacific/PonapezPacific/Port_MoresbyzPacific/RarotongazPacific/Saipanz Pacific/SamoazPacific/TahitizPacific/TarawazPacific/Tongatapuz Pacific/Trukz Pacific/WakezPacific/Wallisz Pacific/YapZPolandZPortugalZPRCZPST8PDTZROCZROKZ SingaporeZTurkeyZUCTZ Universalz US/Alaskaz US/Aleutianz US/Arizonaz US/Centralz US/EasternzUS/East-Indianaz US/HawaiizUS/Indiana-Starkez US/Michiganz US/Mountainz US/PacificzUS/Pacific-NewzUS/SamoaUTCZWETzW-SUZZuluc@seZdZdZdS)Errorz! Base module exception N)__name__ __module__ __qualname____doc__r r k/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/meraki_v0/legacy.pyrjsrc@seZdZdZdS)ListLengthWarnz1 Thrown when list lengths do not match N)rr r r r r r r rssrc@seZdZdZdS)IgnoredArgumentz0 Thrown when argument will be ignored N)rr r r r r r r r|src@s eZdZdZddZddZdS)OrgPermissionErrorzT Thrown when the API Key does not have access to supplied Organization ID cCs d|_dS)NzSInvalid Organization ID - Current API Key does not have access to this Organization)default)selfr r r __init__szOrgPermissionError.__init__cCs t|jS)N)reprr)rr r r __str__szOrgPermissionError.__str__N)rr r r rrr r r r rsrc@s eZdZdZddZddZdS)EmailFormatErrorz? Thrown when incorrect email format has been entered cCs d|_dS)NzOIncorrect E-mail Address Format Entered - Must be in the format name@domain.dom)r)rr r r rszEmailFormatError.__init__cCs t|jS)N)rr)rr r r rszEmailFormatError.__str__N)rr r r rrr r r r rsrc@seZdZdZddZdS) ListErrorz: Raised when empty list is passed when required cCs ||_dS)N)message)rrr r r rszListError.__init__N)rr r r rr r r r rsrc@seZdZdZdS)DashboardObjectz! Base Dashboard object N)rr r r r r r r rsrc@sTeZdZdZdddddddd d d d d ddddddddddddddgZdZddZdS) SSIDa SSID Object Class Refer to https://api.meraki.com/manage/support/api_docs#ssids for details on accepted parameters Provides a simplified object for downloading and manipulating SSID Attributes from Dashboard test1 = meraki.SSID(0, name='Demo Kit WiFi', enabled=True, splashPage=None, ssidAdminAccessible=False, authMode='psk', psk= 'testtest', encryptionMode='wpa', wpaEncryptionMode='WPA2 only', ipAssignmentMode='NAT mode', minBitrate=11, bandSelection='Dual band operation', perClientBandwidthLimitUp=0, perClientBandwidthLimitDown=0) test2 = meraki.SSID(0, name='Demo Kit WiFi', enabled=True, splashPage=None, ssidAdminAccessible=False, authMode='open-with-radius', radiusServers=[{'host': '10.9.1.99', 'port': 1812, 'secret': 'testtest'}], radiusAccountingEnabled=False, radiusCoaEnabled=True, radiusAttributeForGroupPolicies='Filter-Id', ipAssignmentMode='VPN', concentratorNetworkId='NET_ID', vlanId=0, radiusOverride=False, walledGardenEnabled=True, walledGardenRanges= '10.140.0.22/32 10.140.0.23/32 10.9.1.183/32 10.9.1.184/32', minBitrate=11, bandSelection='Dual band operation', perClientBandwidthLimitUp=0, perClientBandwidthLimitDown=0) nameenabledauthModeencryptionModepskZwpaEncryptionModeZ splashPageZ radiusServersZradiusCoaEnabledZradiusAccountingEnabledZradiusAccountingServersZipAssignmentModeZuseVlanTaggingZconcentratorNetworkIdZvlanIdZ defaultVlanIdZapTagsAndVlanIdsZwalledGardenEnabledZwalledGardenRangesZ minBitrateZ bandSelectionZperClientBandwidthLimitUpZperClientBandwidthLimitDownZradiusOverrideZradiusAttributeForGroupPoliciesZssidAdminAccessiblessidcKsP|d|x>|D]2}||jkr6||||qtdt|qWdS)NssidnumzaInvalid parameter {0}, please refer to https://api.meraki.com/api_docs#ssids for valid parameters) __setattr__keys validparams ValueErrorformatstr)rr!paramspr r r rs   z SSID.__init__N)rr r r r$typerr r r r rs rcCs(yt|Wntk r"dSXdS)zb Args: myjson: String variable to be validated if it is JSON Returns: None FT)jsonloadsr%)Zmyjsonr r r __isjsons r-cCsJd}x0tD](}|dkr.tt||kr.d}Pq d}q W|dkrFtddS)zs Args: tz: String value containing timezone to be validated against TZ format Returns: None FTz_Please enter a valid tz value from https://en.wikipedia.org/wiki/List_of_tz_database_time_zonesN)tzlistr&r'r%)tzZvalidtzzoner r r __isvalidtzs  r1csTt|dtdd|Dr&tdtfdd|DrLtdtdSdSdS) z Args: *args: Multiple list type variables can be passed to compare length Returns: 2 when lists are different lengths, 0 when list lengths are equal rcss|]}|dkVqdS)Nr ).0lstr r r sz __comparelist..zEmpty list passed to functionc3s|]}t|kVqdS)N)len)r2r3)lengthr r r4"sz!All lists are not of equal lengthN)r5anyrwarningswarnr)argsr )r6r __comparelists  r<c Csdtt}tt|dd}tj||d}t|j}g}t|j}|dkrx2|D]*}t |dt |krV| |ddSqVWt dS)a Args: apikey: Meraki API Key to test access to the organization targetorg: Target organization to test access to for provided API Key Returns: None, raises OrgPermissionError if API Key does not have access to the specified Meraki Organization z{0}/organizationszapplication/json)zx-cisco-meraki-api-keyz Content-Type)headersTidN) r&r'base_urlrequestsgetr+r,textr-intappendr) apikeyZ targetorggeturlr= dashboardZ currentorgsZorgsZ validjsonorgr r r __hasorgaccess)s     rIcCstd|stdS)z Args: emailaddress: Email address in string format to be validated Returns: None, raises EmailFormatError exception if email is incorrectly formatted z[^@]+@[^@]+\.[^@]+N)rematchr)Z emailaddressr r r __validemailIs rLcCs.y t|Wntk r(tdYnXdS)z Args: ip: IP Address to be tested Returns: None, raises ValueError on invalid formating for IP address zInvalid IP AddressN)rr%)ipr r r __validipYs  rNcCstd|s tdt|nt|d\}}t|dksHt|dkrZtdt|y t|Wn&tk rtdt|YnXdS) z Args: subnetip: Subnet IP address to be tested Returns: None, raises ValueError if provided subnet address has an invalid IP or incorrect CIDR mask length z.^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[/]\d{1,2}$zFInvalid Subnet IP Address {0} - Address must be formatted as #.#.#.#/#/z9Invalid Subnet Mask Length {0} - Must be between 1 and 30zInvalid Subnet IP Address {0}N)rJrKr%r&r'splitrCr)ZsubnetiprMnetmaskr r r __validsubnetiphs   rTcCsHd}t|tr|}x|D]}||d}qW|dt|d}|S)z Args: taglist: Space separated list of tags in a single string Returns: Space delimited string type variable containing all tags  NrP) isinstancer'rRr5)taglistZliststrtr r r __listtotags   rZcCst|}d}d}|rZt|}y |d}Wn.tk rBd}Yntk rXd}YnXt|dkr|r|dkrtdt||St|dkr|dkrtdt|dSt|d kr|r|dkrtd t||St|d kr|dkr td t|dSt|d krB|rB|dkr>td t||St|d krp|dkrltdt|dSt|dkr|r|dkr|dkrtd|St|dkr|r|r|dkrtd|St|dkr|dkrtdn"t|dkr,|r,|dkr,|dkr(td|St|dkrV|rV|dkrRtd|St|dkr|r|dkr|dkrtd|St|dkr|r|dkrtd|St|dkr|dkrtd|S|r|dkr|dkrtdt||Stdt|dS)a Args: statuscode: HTTP Status Code returntext: JSON String objtype: Type of object that operation was performed on (i.e. SSID, Network, Org, etc) suppressprint: Suppress any print output when function is called Returns: errmsg: If returntext JSON contains {'errors'} element returntext: If no error element, returns returntext FrUerrorsTZ200z9{0} Operation Successful - See returned data for results z{0} Operation Successful NZ201z7{0} Added Successfully - See returned data for results z{0} Added Successfully Z204z9{0} Deleted Successfully - See returned data for results z{0} Deleted Successfully Z400z2Bad Request - See returned data for error details z,Bad Request - See returned data for details z1Bad Request - No additional error data available Z401z:Unauthorized Access - See returned data for error details zUnauthorized AccessZ404z9Resource Not Found - See returned data for error details zResource Not Found500zHTTP 500 - Server Errorzrj) orgAccessemailr)rrlrktags)rrlrknetworks)rrlrkrmrn)datar=)rIr&r'r?r_r5rDr@postr+dumpsrarcrB)rErdrlr orgaccessrm tagaccessrn netaccessr`reposturlr=posttagsxpostnetspostdatarGrfr r r addadmins           rzc Cst||d} dttt|t|} tt|dd} g}|dkrj|dkrj|dkrj|dkrjtddS|dk r|dkrtddS|dk r|dkrtddS|dkr|dkrnrt|t|krtdtd dS|dk r&|dk r&d }x4|t|kr"|||||d |d 7}qWng}|dk rJ| dkrJtd dS| dk rj|dkrjtddS| dkr|dkrnvt|t| krtdtddS|dk r| dk rd }x6|t|kr|||| |d|d 7}qWng}|dk rt|d kr>t|d kr>|tt|tt|d}nt|d krzt|d krztt|tt|||d}nxt|d krt|d krtt|tt|||d}nrj)rkrlr)rrlrkrm)rrlrkrn)rrlrkrmrn)rlrkrm)rlrkrn)rlrkrmrn)ror=)rIr&r'r?r_r5rDr@putr+rqrarcrB)rErdadminidrlrrrrmrsrnrtr`reputurlr=puttagsrwputnetsputdatarGrfr r r updateadmins                   rc Cs^t||d}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nrhz {0}/organizations/{1}/admins/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@deleterarcrB) rErdr|r`redelurlr=rGrfr r r deladmin's    rQc Cs`d}|dkrd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzDevice Clientsi'z${0}/devices/{1}/clients?timespan={2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rE serialnum timestampr`rerFr=rGrfr r r getclientsFs   rc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzDevice Clientsz{0}/networks/{1}/clients/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rE networkid identifierr`rerFr=rGrfr r r getclient^s   rc Csfd}|dkrd}dttt|t|t|}tt|dd}tj||d}t|j|j||} | S)NzDevice Clientsi'z0{0}/networks/{1}/clients/{2}/policy?timespan={3}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rEr clientmacrr`rerFr=rGrfr r r getclientpolicyrs  rc Csd}dttt|t|}tt|dd}|dkr@td|dkrX|dkrXtd||d} tj|t| |d } t| j | j ||} | S) NzDevice Clientsz4{0}/networks/{1}/clients/{2}/policy?timespan=2592000zapplication/json)zx-cisco-meraki-api-keyz Content-Type)Z whitelistedZblockednormalgroupzXParameter policy must be either whitelisted, blocked, normal, or group with ID specifiedr)Z devicePolicyZ groupPolicyId)ror=) r&r'r?r%r@r{r+rqrarcrB) rErrpolicyZpolicyidr`rer}r=rrGrfr r r updateclientpolicys  rc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzDevice Clientsz6{0}/networks/{1}/clients/{2}/splashAuthorizationStatuszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErrr`rerFr=rGrfr r r getclientsplashs rc Cs`d}dttt|t|}tt|dd}|}tj|t||d} t| j| j ||} | S)NzDevice Clientsz6{0}/networks/{1}/clients/{2}/splashAuthorizationStatuszapplication/json)zx-cisco-meraki-api-keyz Content-Type)ror=) r&r'r?r@r{r+rqrarcrB) rErrZssid_authorizationr`rer}r=rrGrfr r r updateclientsplashs rcCsXt||d}dttt|}tt|dd}tj||d}t|j|j||}|S)NZ Templatesz%{0}/organizations/{1}/configTemplateszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rArarcrB)rErdr`rerFr=rGrfr r r gettemplatess  rc Cs^t||d}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NTemplatez){0}/organizations/{1}/configTemplates/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rrarcrB) rErd templateidr`rerr=rGrfr r r deltemplates  rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)z Args: apikey: User's Meraki API Key networkid: ID field of target network to list devices from suppressprint: Returns: Networkz{0}/networks/{1}/deviceszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getnetworkdevicess  rc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nz Device Detailz{0}/networks/{1}/devices/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rEr serialnumberr`rerFr=rGrfr r r getdevicedetails rc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nz Device Uplinkz#{0}/networks/{1}/devices/{2}/uplinkzapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErrr`rerFr=rGrfr r r getdeviceuplink*s rc Csd} dttt|t|} tt|dd} i} |dk rD|| d<|dk rXt|| d<|rj|sjtdn"|r||s|tdn|| d <|| d <|dk r|| d <|r|| d <tj| t| | d }t |j |j | | }|S)NDevicez{0}/networks/{1}/devices/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Typerrmz=If latitude is entered a longitude value must also be enteredz=If longitude is entered a latitude value must also be enteredlatlngaddressZ moveMapMarker)ror=) r&r'r?rZr%r@r{r+rqrarcrB)rErserialrrmrrrmover`rerur=rrGrfr r r updatedevice>s2    rc Csfd}dttt|}tt|dd}dtt|i}tj|t||d}t|j|j ||} | S)Nrz{0}/networks/{1}/devices/claimzapplication/json)zx-cisco-meraki-api-keyz Content-Typer)ror=) r&r'r?r@rpr+rqrarcrB) rErrr`rerur=ryrGrfr r r adddevtonetks rc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nrz#{0}/networks/{1}/devices/{2}/removezapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rprarcrB) rErrr`rerur=rGrfr r r removedevfromnets r0*c CsV|dkr d}d}dt|||}tt|dd}tj||d}t|j|j||} | S)a8 The timespan for which LLDP and CDP information will be fetched. Must be in seconds and less than or equal to a month (2592000 seconds). LLDP and CDP information is sent to the Meraki dashboard every 10 minutes. In instances where this LLDP and CDP information matches an existing entry in the Meraki dashboard, the data is updated once every two hours. Meraki recommends querying LLDP and CDP information at an interval slightly greater than two hours, to ensure that unchanged CDP / LLDP information can be queried consistently. i'ZDevicesz2{0}/networks/{1}/devices/{2}/lldp_cdp?timespan={3}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r?r'r@rArarcrB) rErrtimespanr`rerFr=rGrfr r r getlldpcdps   rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzMX cellular Firewallz&{0}/networks/{1}/cellularFirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getmxcellularfwruless rc Cs^d}dttt|}tt|dd}d|i}tj|t||d}t|j|j ||} | S)NzMX cellular Firewallz&{0}/networks/{1}/cellularFirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-Typerules)ror=) r&r'r?r@r{r+rqrarcrB) rErZ cellularrulesr`rer}r=rrGrfr r r updatemxcellularfwruless rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzMX L3 Firewallz {0}/networks/{1}/l3FirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getmxl3fwruless rc Csld}dttt|}tt|dd}t}||d<||d<tj|t||d} t| j | j ||} | S)NzMX L3 Firewallz {0}/networks/{1}/l3FirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-TypersyslogDefaultRule)ror=) r&r'r?dictr@r{r+rqrarcrB) rErfwrulessyslog_default_ruler`rer}r=rrGrfr r r updatemxl3fwruless rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzMX VPN Firewallz&{0}/organizations/{1}/vpnFirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErdr`rerFr=rGrfr r r getmxvpnfwruless rc Csld}dttt|}tt|dd}t}||d<||d<tj|t||d} t| j | j ||} | S)NzMX VPN Firewallz&{0}/organizations/{1}/vpnFirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-Typerr)ror=) r&r'r?rr@r{r+rqrarcrB) rErdZvpnrulesrr`rer}r=rrGrfr r r updatemxvpnfwrules#s  rc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzMR L3 Firewallz*{0}/networks/{1}/ssids/{2}/l3FirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErr!r`rerFr=rGrfr r r getssidl3fwrulesEs rc Csd}dttt|t|}tt|dd}d|i} |dkrBn"|dk r\|dk r\tdn|| d <tj|t| |d } t| j | j ||} | S) NzMR L3 Firewallz*{0}/networks/{1}/ssids/{2}/l3FirewallRuleszapplication/json)zx-cisco-meraki-api-keyz Content-TyperFTz#Allowlan must be a boolean variableZallowLanAccess)ror=) r&r'r?r%r@r{r+rqrarcrB) rErr!rZallowlanr`rer}r=rrGrfr r r updatessidl3fwrulesUs  rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzGroup Policiesz{0}/networks/{1}/groupPolicieszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getgrouppoliciesws rc Cslt||d}dttt|}|dk r6|d|7}tt|dd}tj||d}t|j|j||}|S)Nrz{0}/organizations/{1}/networksz?configTemplateId=zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rArarcrB) rErdrr`rerFr=rGrfr r r getnetworklists   rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzNetwork Detailz{0}/networks/{1}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getnetworkdetails rc Csd}dttt|}tt|dd}i} |r:|| d<|rVt|tt|| d<|rft|| d<tj|t| |d} t | j | j ||} | S) Nrz{0}/networks/{1}zapplication/json)zx-cisco-meraki-api-keyz Content-TypertimeZonerm)ror=) r&r'r?r1rZr@r{r+rqrarcrB) rErrr/rmr`rer}r=rrGrfr r r updatenetworks   rcCst||d}dttt|} tt|dd} t|tt|tt|t|tt|d} |rztt|| d<t| } tj | | | d} t | j | j ||} | S)z Action: Adds new network to Meraki Dashboard with passed parameters Call to: https://api.meraki.com/api/v0 Input: User API Key, Target Organization, New Network Parameters Otput: JSON string returned from Dashboard API Call rz{0}/organizations/{1}/networkszapplication/json)zx-cisco-meraki-api-keyz Content-Type)rr*rmrZcopyFromNetworkId)ror=) rIr&r'r?r1rZr+rqr@rprarcrB)rErdrZnettypermr/Zcloneidr`rerur=ryrGrfr r r addnetworks$     rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)Nrz{0}/networks/{1}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rrarcrB)rErr`rerr=rGrfr r r delnetworks rc Csvd}dttt|}i}tt|dd}tt||d<|rJ||d<tj|t||d} t| j| j ||} | S)Nz Template Bindz{0}/networks/{1}/bindzapplication/json)zx-cisco-meraki-api-keyz Content-TypeZconfigTemplateIdZautoBind)ror=) r&r'r?r@rpr+rqrarcrB) rErrZautobindr`reruryr=rGrfr r r bindtotemplate s rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzNetwork Unbindz{0}/networks/{1}/unbindzapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rprarcrB)rErr`rerur=rGrfr r r unbindfromtemplate's rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NAutoVPNz{0}/networks/{1}/siteToSiteVpnzapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getvpnsettings9s rnonecCsd}dttt|} tt|dd} t|||dk rP|dk rPt||} ng} t||tt||} g} x | D]\}}| ||dqvWg}x(| D] \}}t||||dqW|| |d}t|t |}t j | || d}t |j|j||}|S) Nrz{0}/networks/{1}/siteToSiteVpnzapplication/json)zx-cisco-meraki-api-keyz Content-Type)ZhubIdZuseDefaultRoute)Z localSubnetZuseVpn)modehubssubnets)ror=)r&r'r?r<ziplistrDrTr_r+rqr@r{rarcrB)rErrrZusevpnZ hubnetworksZ defaultrouter`rer}r=ZhubmodesZ vpnsubnetsrhdsirrGrfr r r updatevpnsettingsMs2      rcombinedc CsZd}dttt|t|t|}tt|dd}tj||d}t|j|j||} | S)NzNetwork Detailz4{0}/networks/{1}/traffic?timespan={2}&deviceType={3}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErrZ devicetyper`rerFr=rGrfr r r getnetworktrafficstatsys rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzNetwork Detailz{0}/networks/{1}/accessPolicieszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getaccesspoliciess rc Csd|dkrtdd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Ni'z.Timespan must be at most one month in seconds.zNetwork Detailz({0}/networks/{1}/airMarshal?timespan={2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) r%r&r'r?r@rArarcrB) rErrr`rerFr=rGrfr r r getairmarshals rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzNetwork Detailz"{0}/networks/{1}/bluetoothSettingszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getbluetooths rc Cs&d} dttt|} tt|dd} ||d} t| |r|rN|| d<ntd|r|r|rd| d <t|tkr|d ks|d krtd q|| d <n t|| d <t|tkr|d ks|d krtd q|| d<qt|| d<n|rtdnd| d <tj| t | | d} t | j | j | |}|S)NzNetwork Detailz"{0}/networks/{1}/bluetoothSettingszapplication/json)zx-cisco-meraki-api-keyz Content-Type)ZscanningEnabledZadvertisingEnableduuidz7Parameter uuid must be specified if advertising is truez Non-uniqueZmajorMinorAssignmentModerizAParameters major and minor must be between 0 and 65535, inclusivemajorminorzAParameters major and minor must be specified if nonunique is TrueZUnique)ror=)r&r'r?r_r%r*rCr@r{r+rqrarcrB)rErZscanningZ advertisingrZ nonuniquerrr`rer}r=rrGrfr r r updatebluetooths<            rcCsHd}dtt}tt|dd}tj||d}t|j|j||}|S)z Args: apikey: User's Meraki API Key suppressprint: Suppress any print output from function (Default: False) Returns: JSON formatted string of all organizations that provided API Key has access to rbz{0}/organizationszapplication/json)zX-Cisco-Meraki-API-Keyz Content-Type)r=)r&r'r?r@rArarcrB)rEr`rerFr=rGrfr r r myorgaccesss  rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)a Args: apikey: User's Meraki API Key orgid: OrganizationId for operation to be performed against suppressprint: Suppress any print output from function (Default: False) Returns: JSON formatted string of organization details rbz{0}/organizations/{1}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErdr`rerFr=rGrfr r r getorg s  rc Cspt||d}dttt|}tt|dd}dtt|i}tj|t||d}t|j |j ||} | S)NzOrganization Renamez{0}/organizations/{1}zapplication/json)zx-cisco-meraki-api-keyz Content-Typer)ror=) rIr&r'r?r@r{r+rqrarcrB) rErd neworgnamer`rer}r=rrGrfr r r renameorg1 s  rc Cs`d}dtt}tt|dd}dtt|i}tj|t||d}t|j|j ||}|S)Nrbz{0}/organizations/zapplication/json)zx-cisco-meraki-api-keyz Content-Typer)ror=) r&r'r?r@rpr+rqrarcrB) rErr`rerur=ryrGrfr r r addorgG s rc Cspt||d}dttt|}tt|dd}dtt|i}tj|t||d}t|j |j ||} | S)NzOrganization Clonez{0}/organizations/{1}/clonezapplication/json)zx-cisco-meraki-api-keyz Content-Typer)ror=) rIr&r'r?r@rpr+rqrarcrB) rErdrr`rerur=ryrGrfr r r cloneorg] s  rcCsd}dttt|}tt|dd} d} i} x$|||gD]} | dkrLq>| d7} q>W| dkrhtd|dkrx|dk s|dkr|dk rtd|dk r|| d <n2|dk r|dk r|| d <|| d <n|dk r|| d <tj|t| | d } t| j | j ||}|S)NZClaimz{0}/organizations/{1}/claimzapplication/json)zx-cisco-meraki-api-keyz Content-TyperrPzbMutiple identifiers passed, please pass only one of either serial number, license key, or order IDzPif claiming a license key both license and licensemode attributes must be passedrZ licenseKeyZ licenseModeorder)ror=) r&r'r?AttributeErrorr@rpr+rqrarcrB)rErdrZ licensekeyZ licensemodeZorderidr`rerur=rwryyrGrfr r r claimx s6    rcCsXt||d}dttt|}tt|dd}tj||d}t|j|j||}|S)NZLicensez"{0}/organizations/{1}/licenseStatezapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rArarcrB)rErdr`rerFr=rGrfr r r getlicensestate s  rcCsXt||d}dttt|}tt|dd}tj||d}t|j|j||}|S)a  Args: apikey: User's Meraki API Key orgid: OrganizationId for operation to be performed against suppressprint: Suppress any print output from function (Default: False) Returns: JSON formatted string of organization inventory Z Inventoryz{0}/organizations/{1}/inventoryzapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rArarcrB)rErdr`rerFr=rGrfr r r getorginventory s  rcCsXt||d}dttt|}tt|dd}tj||d}t|j|j||}|S)NzDevice Statusesz${0}/organizations/{1}/deviceStatuseszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rArarcrB)Zapi_keyZorg_idZsuppress_printZ call_typeget_urlr=rGrfr r r get_device_statuses s  rcCsXt||d}dttt|}tt|dd}tj||d}t|j|j||}|S)Nz SNMP Settingsz{0}/organizations/{1}/snmpzapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rArarcrB)rErdr`rerFr=rGrfr r r getsnmpsettings s  rSHAAES128c Cst||d} dttt|} tt|dd} i} |dkrHtd|dkrXtd|rv|dksl|dkrvtd nJ|rt|d kst|d krtd n$|r|| d <|| d <|| d<|| d<|| d<|| d<|dk rXt|tr:t|d}t|t|dkrNxD|ddD]}tt||d|}qWntt|t|}|| d<nd| d<t | } t j | | | d}t |j|j| | }|S)NZSNMPz{0}/organizations/{1}/snmpzapplication/json)zx-cisco-meraki-api-keyz Content-Type)rMD5z-Valid authentication modes are "SHA" or "MD5")ZDESrz*Valid privacy modes are "DES" and "AES128"zKIf SNMPv3 is enabled a authentication and privacy password must be providedzFAuthentication and privacy passwords must be a minimum of 8 charactersZ v3AuthModeZ v3AuthPassZ v3PrivModeZ v3PrivPassZ v2cEnabledZ v3EnabledrrP:ZpeerIps)ror=)rIr&r'r?r%r5rWrrNr+rqr@r{rarcrB)rErdZv2cZv3Z v3authmodeZv3authpwZ v3privmodeZv3privpwZ allowedipsr`rer}r=rZ allowiplistrrGrfr r r updatesnmpsettings sL           rcCsXt||d}dttt|}tt|dd}tj||d}t|j|j||}|S)NzNon-Meraki VPNz({0}/organizations/{1}/thirdPartyVPNPeerszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rArarcrB)rErdr`rerFr=rGrfr r r getnonmerakivpnpeersC s  rcCst||d}dttt|} tt|dd} t|trt|trt|trt|tr|dksxt|trt|t|t|t|dt|krtdt |dkrg}x|D]} | dgqWx8|D]0} t| trx| D] } t | qWqt | qWtt |||||}g}i}x`|D]N\} }}}}| |d<||d <||d <||d <||d <| | |q2Wntd t|}tj| || d}t|j|j||}|S)NzNon-Meraki VPNz({0}/organizations/{1}/thirdPartyVPNPeerszapplication/json)zx-cisco-meraki-api-keyz Content-Typez@Peers will be added up to the length of the shortest list passedallrpublicIpprivateSubnetssecretrmzIAll peer arguments must be passed as lists, tags argument may be excluded)ror=)rIr&r'r?rWrr5r9r:rrDrTrcopyclearr^r+rqr@r{rarcrB)rErdnamesipssecrets remotenetsrmr`rer}r=_nsnpeerlistrpeerrrrrYrGrfr r r updatenonmerakivpn[ sN        rcCs|t||d}dttt|} dttt|} tt|dd} ttj| | dj} t dd|Ddkr|g}t d t t |trDt |trDt |trDt |trD|dkst |trDt|t|t|t|d t|krt d t |dkr.g}x|D]} |d gqWx<|D]4}t |tr^x |D]}t|qJWnt|q4Wtt|||||}g}i}xV|D]N\}}}}}||d <||d<||d<||d<||d<|||qWxj| D]X}|d |d <|d|d<|d|d<|d|d<|d|d<|||qWntdt|}tj| || d}t|j|j||}|S)NzNon-Meraki VPNz({0}/organizations/{1}/thirdPartyVPNPeerszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=css|]}t|tVqdS)N)rWr)r2elr r r r4 sz%appendnonmerakivpn..FzJVariable remotenets was not passed as list of lists, it has been convertedrz@Peers will be added up to the length of the shortest list passedrrrrrrmzIAll peer arguments must be passed as lists, tags argument may be excluded)ror=)rIr&r'r?r+r,r@rArBr8r9r:rrWrr5rDrTrrrr^rqr{rarc)rErdrrrrrmr`rer}rFr=Z currentpeersrrrrrrrrrrYrwrGrfr r r appendnonmerakivpn sl              rcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NzPhone Assignmentsz!{0}/networks/{1}/phoneAssignmentszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getphones s rc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzPhone Assignment Detailz%{0}/networks/{1}/phoneAssignments/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErrr`rerFr=rGrfr r r getphonedetails s rcCsd}dttt|t|} tt|dd} |dkr@tdt|tk rTtdt|dkslt|d krttd ||||d } tj| t | | d } t | j | j ||} | S) NzPhone Assignmentz%{0}/networks/{1}/phoneAssignments/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)Z DashboardZGooglezrjrolerkrmrn )sep)ror=)rIr&r'r?r%rr<r9r:rrrDr_r@r{r+rqrarcrB)rErdrrolenamerrrmrsrnrtr`rer}r=r~rX tagcomparetagziprYtarnetlist netcomparenetziprnaZroledatarrGrfr r r updatesamlrole st                     rc Csnt||d} dttt|} tt|dd} |sH|sH|sHtd|r\|dkr\tdg} d} |rl|rt|r~|s~td n |r|rd } | d krt||}|d krtt d t ||}xX|D]\}}| ||d qWn6|dkrt ||}x |D]\}}| ||d qWg}d}|r,|r8|rB|sBtdn|rR|rRd }|d krt||}|d krtt dt ||}x\|D]\}}| ||dqWn8|dkrt ||}x"|D]\}}| ||dqWi}|t krtdn t||d<|rt||d<| d kr0| |d<|d krB||d<t j| t|| d}t|j|j| |}|S)Nz SAML Rolez{0}/organizations/{1}/samlRoleszapplication/json)zx-cisco-meraki-api-keyz Content-Typez^At least one of organization access, tag based access, or network based access must be defined)z read-onlyrrzBOrganization access must be either 'read-only' or 'full' or 'none'FzRBoth tags and tag access lists must be passed if tag based permissions are definedTr7zbTags and tag access list are not the same length, lists will be joined to the shortest length list)rirjrz]Both network and network access lists must be passed if network based permissions are definedzfNetworks and tag access list are not the same length, lists will be joined to the shortest length list)r>rjz*Role name must be passed for role creationrrkrmrn)ror=)rIr&r'r?rr%r<r9r:rrrDlocalsr@rpr+rqrarcrB)rErdrrrrmrsrnrtr`rerur=rvrXrrrYrrxrrrrrryrGrfr r r addsamlroleK sv                        rc Cs^t||d}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nz SAML Rolez#{0}/organizations/{1}/samlRoles/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=) rIr&r'r?r@rrarcrB) rErdrr`rerr=rGrfr r r delsamlrole s  rc (Csddddddddd g } d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1g(} d2} d3ttt|} tt|d4d5} |dk r| d6|7} n|dk rt|t| t| r| d7d8|d97} ntd:|dk r| d;|d97} |dk r"| d<|d97} |dk r<| d=|d97} |dk rn|d8d>d?krbtd@| dA|7} t j | | dB}t |j |j | |}|S)CNr>rrmr wifiMacZosNameZ systemModelrZ serialNumberrMZ systemTypeZavailableDeviceCapacityZ kioskAppNameZ biosVersionZ lastConnectedZmissingAppsCountZuserSuppliedAddresslocationZlastUserrZ phoneNumberZ diskInfoJsonZdeviceCapacityZ isManagedZhadMdmZ isSupervisedZmeidZimeiZiccidZsimCarrierNetworkZcellularDataUsedZisHotspotEnabledZ createdAtZbatteryEstChargeZ quarantinedZavNameZ avRunningZasNameZfwNameZisRootedZ loginRequiredZscreenLockEnabledZscreenLockDelayZautoLoginDisabledZhasMdmZhasDesktopAgentZdiskEncryptionEnabledZhardwareEncryptionCapsZ passCodeLockzSystems Managerz{0}/networks/{1}/sm/devices?zapplication/json)zx-cisco-meraki-api-keyz Content-Typez batchToken=zfields=,&zInvalid fields specifiedz wifiMacs=zserials=zids=r)rrwithAnywithAll withoutAny withoutAllzWScope (one of all, none, withAny, withAll, withoutAny, or withoutAll) must be specifiedzscope=)r=)r&r'r?setissubsetunionjoinr%rRr@rArarcrB)rErfieldswifimacsserialsidsscopetokenr`Z defaultfieldsZpossiblefieldsrerFr=rGrfr r r getsmdevices sR         r2c Csd} dttt|} tt|dd} ||d} |dkr\|dkr\|dkr\|dkr\td|dk rl|| d<|dk r||| d<|dk r|| d <|dk r|d d d krtd || d<tj| t| | d} t | j | j | |}|S)NzSystems Managerz {0}/networks/{1}/sm/devices/tagszapplication/json)zx-cisco-meraki-api-keyz Content-Type)rmZ updateActionz=Parameters wifiMacs, ids, serials, or scope must be specifiedwifiMacsr/r.r"r)rrr$r%r&r'zaParameter scope (one of all, none, withAny, withAll, withoutAny, or withoutAll) must be specifiedr0)ror=) r&r'r?r%rRr@r{r+rqrarcrB)rErrmactionr-r/r.r0r`rer}r=rrGrfr r r updatesmtags s.  r5cCsd}dttt|} tt|dd} dii} |dkrR|dkrR|dkrRtd|dk rb|| d<|dk rr|| d<|dk r|| d <|dk r|| dd <|dk r|| dd <tj| t| | d } t| j | j ||} | S) NzSystems Managerz!{0}/networks/{1}/sm/device/fieldszapplication/json)zx-cisco-meraki-api-keyz Content-TypeZ deviceFieldsz3Parameters wifiMac, id, or serial must be specifiedr r>rrnotes)ror=) r&r'r?r%r@r{r+rqrarcrB)rErZwifimacZdeviceidrrr6r`rer}r=rrGrfr r r updatesmfields. s,   r7cCsd}dttt|} tt|dd} i} |dkrV|dkrV|dkrV|dkrVtd|dk rf|| d<|dk rv|| d<|dk r|| d<|dk r|d d d krtd || d <|dk rt|dkrtd|| d<tj| t | | d} t | j | j ||} | S)NzSystems Managerz {0}/networks/{1}/sm/devices/lockzapplication/json)zx-cisco-meraki-api-keyz Content-Typez=Parameters wifiMacs, ids, serials, or scope must be specifiedr3r/r.r"r)rrr$r%r&r'zaParameter scope (one of all, none, withAny, withAll, withoutAny, or withoutAll) must be specifiedr0rzKParameter pin is a six digit number required only for locking macOS devicespin)ror=) r&r'r?r%rRr5r@r{r+rqrarcrB)rErr-r/r.r0r8r`rer}r=rrGrfr r r lockdevicesO s4   r9cCsd}dttt|} tt|dd} i} |dkrV|dkrV|dkrV|dkrVtd|dk rf|| d<|dk rv|| d<|dk r|| d<|dk r|d d d krtd || d <|dk rt|dkrtd|| d<tj| t | | d} t | j | j ||} | S)NzSystems Managerz {0}/networks/{1}/sm/devices/wipezapplication/json)zx-cisco-meraki-api-keyz Content-Typez=Parameters wifiMacs, ids, serials, or scope must be specifiedr3r/r.r"r)rrr$r%r&r'zaParameter scope (one of all, none, withAny, withAll, withoutAny, or withoutAll) must be specifiedr0rzJParameter pin is a six digit number required only for wiping macOS devicesr8)ror=) r&r'r?r%rRr5r@r{r+rqrarcrB)rErr-r/r.r0r8r`rer}r=rrGrfr r r wipedevicesx s4   r:c Csd}dttt|}tt|dd} i} |dkrV|dkrV|dkrV|dkrVtd|dk rf|| d<|dk rv|| d<|dk r|| d<|dk r|d d d krtd || d <tj|t| | d} t | j | j ||} | S)NzSystems Managerz#{0}/networks/{1}/sm/devices/checkinzapplication/json)zx-cisco-meraki-api-keyz Content-Typez=Parameters wifiMacs, ids, serials, or scope must be specifiedr3r/r.r"r)rrr$r%r&r'zaParameter scope (one of all, none, withAny, withAll, withoutAny, or withoutAll) must be specifiedr0)ror=) r&r'r?r%rRr@r{r+rqrarcrB) rErr-r/r.r0r`rer}r=rrGrfr r r checkindevices s,  r;cCsd}dttt|} tt|dd} d|i} |dkrZ|dkrZ|dkrZ|dkrZtd|dk rj|| d<|dk rz|| d<|dk r|| d <|dk r|d d d krtd || d<tj| t| | d} t | j | j ||} | S)NzSystems Managerz {0}/networks/{1}/sm/devices/movezapplication/json)zx-cisco-meraki-api-keyz Content-TypeZ newNetworkz=Parameters wifiMacs, ids, serials, or scope must be specifiedr3r/r.r"r)rrr$r%r&r'zaParameter scope (one of all, none, withAny, withAll, withoutAny, or withoutAll) must be specifiedr0)ror=) r&r'r?r%rRr@r{r+rqrarcrB)rErZnewnetidr-r/r.r0r`rer}r=rrGrfr r r movedevices s,  r<cCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)Nrz{0}/networks/{1}/ssidszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getssids s r=c CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nz SSID Detailz{0}/networks/{1}/ssids/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErr!r`rerFr=rGrfr r r getssiddetail s r>c Csd} dttt|t|} tt|dd} i} |rDt|| d<t|tkrX|}|dkrjtdn|dkr|d | d <nd | d <|d krtd nJ|dkr|r|stdn0|dkr|s|rttdn|rt|| d<|r|dks|r|stdn|rt|| d<|r6|dks,|r,|s6tdn4t |dkrX|dkrXtdn|rjt|| d<t j | t | | d} t| j| j| |}|S)Nrz{0}/networks/{1}/ssids/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Typer)TFtruefalsez"Enabled must be a boolean variable)Tr?TrF)ropenz'Authentication mode must be psk or openrzQIf authentication mode is set to psk, encryption mode and psk must also be passedrAzGIf authentication mode is open, encryption mode and psk will be ignoredrzYIf encryption mode is passed, authentication mode must be psk and psk must also be passedrzMIf psk is passed, authentication mode and encryption mode must also be passedrZwpazDIf encryption mode is wpa, the psk must be a minimum of 8 characters)ror=)r&r'r?r*lowerr%r9r:rr5r@r{r+rqrarcrB)rErr!rrZauthmodeZencryptionmoderr`rer}r=rrGrfr r r updatessidsJ             rCc Cstt|dd}d}|jdkr8dttt||j}|j}|dt|}t j |||d}t |j |j t|j|} | S)aM Args: apikey: User's Meraki API Key networkid: NetworkId for operation to be performed against newssid: SSID object with new SSID attributes suppressprint: Suppress any print output from function (Default: False) Returns: result: Error message or details of newly created SSID zapplication/json)zx-cisco-meraki-api-keyz Content-TyperUr z{0}/networks/{1}/ssids/{2}r!)ror=)r&r'r*r?r!__dict__popr+rqr@r{rarcrBupper) rErZnewssidr`r=r}r(rrGrfr r r updatessidobjectPs    rGcCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)Nz Static Routesz{0}/networks/{1}/staticRouteszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getstaticrouteszs rHc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzStatic Route Detailz!{0}/networks/{1}/staticRoutes/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErrouteidr`rerFr=rGrfr r r getstaticroutedetails rJc Csd} dttt|t|} tt|dd} i} |dk rLtt|| d<|dk rdtt|| d<|dk r|tt|| d<|dk rtt|| d<|dk rtt|| d <|dk rtt|| d <t| } tj| | | d }t|j|j | | }|S) Nz Static Routez!{0}/networks/{1}/staticRoutes/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Typersubnet gatewayIprfixedIpAssignmentsreservedIpRanges)ror=) r&r'r?r+rqr@r{rarcrB)rErrIrrKZ gatewayiprfixedipassignmentsreservediprangesr`rer}r=rrGrfr r r updatestaticroutes.  rQc Cszd}dttt|}tt|dd}tt|tt|tt|d} tj|t| |d} t| j| j ||} | S)Nz Static Routez{0}/networks/{1}/staticRouteszapplication/json)zx-cisco-meraki-api-keyz Content-Type)rrKrL)ror=) r&r'r?r@rpr+rqrarcrB) rErrrKrMr`rerur=ryrGrfr r r addstaticroutes   rRc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nz Static Routez!{0}/networks/{1}/staticRoutes/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rrarcrB) rErrIr`rerr=rGrfr r r delstaticroutes rScCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)Nz Switch Portz{0}/devices/{1}/switchPortszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getswitchportss rTc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzSwitch Port Detailz{0}/devices/{1}/switchPorts/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErportnumr`rerFr=rGrfr r r getswitchportdetails rVcCsd}dttt|t|}tt|dd}i}|dk rHt||d<|dk r\t||d<|dkrfnt|trz||d<ntd|dkrn|d krt||d <ntd |dk rt||d <|dk r||d <| dk r| |d<| dkrnt| tr| |d<ntd| dkrnt| tr&| |d<ntd| dkr:nt| trP| |d<ntd| dkrdn | dkr|| |d<ntd|dk r||d<tj |t ||d}t |j |j||}|S)Nz Switch Portz{0}/devices/{1}/switchPorts/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Typerrmrz"Enabled must be a boolean variable)rjZtrunkr*z'Type must be either "access" or "trunk"vlanZ voiceVlanZ allowedVlansZ poeEnabledz&PoE enabled must be a boolean variable isolationz)Port isolation must be a boolean variableZ rstpEnabledz'RSTP enabled must be a boolean variable)disabledz root guardz bpdu guardz loop guardZstpGuardzVValid values for STP Guard are "disabled", "Root guard", "BPDU guard", or "Loop guard"ZaccessPolicyNumber)ror=)r&r'r?rZrWboolr%rBr@r{r+rqrarcrB)rErrUrrmrZporttyperWZ voicevlanZ allowedvlansZpoerXZrstpZstpguardZaccesspolicynumr`rer}r=rrGrfr r r updateswitchport sh                 r[cCsNd}dttt|}tt|dd}tj||d}t|j|j||}|S)NZVLANsz{0}/networks/{1}/vlanszapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB)rErr`rerFr=rGrfr r r getvlansgs r\c CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nz VLAN Detailz{0}/networks/{1}/vlans/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErvlanidr`rerFr=rGrfr r r getvlandetailys r^c Csd} dttt|t|} tt|dd} i}|dk rLtt||d<|dk rdtt||d<|dk r|tt||d<|dk r||d<|dk r||d <|dk rtt||d <| dk rtt| |d <t|}tj| || d }t|j|j | | }|S) NVLANz{0}/networks/{1}/vlans/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-TyperrK applianceIprMrNZ vpnNatSubnetZdnsNameservers)ror=) r&r'r?r+rqr@r{rarcrB)rErr]rrKmxiprOrPZ vpnnatsubnetZdnsnameserversr`rer}r=rrGrfr r r updatevlans2  rbc Csd}dttt|}tt|dd} t|dksBt|dkrJtdtt|tt|tt|tt|d} t| } tj|| | d } t | j | j ||} | S) Nr_z{0}/networks/{1}/vlanszapplication/json)zx-cisco-meraki-api-keyz Content-TyperPiz>Parameter VLAN ID of the new VLAN (must be between 1 and 4094))r>rrKr`)ror=) r&r'r?rCr%r+rqr@rprarcrB) rErr]rrKrar`rerur=ryrGrfr r r addvlans      rcc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)Nr_z{0}/networks/{1}/vlans/{2}zapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rrarcrB) rErr]r`rerr=rGrfr r r delvlans rdc CsTd}dttt|t|}tt|dd}tj||d}t|j|j||}|S)NzMX Performance Detailz({0}/networks/{1}/devices/{2}/performancezapplication/json)zx-cisco-meraki-api-keyz Content-Type)r=)r&r'r?r@rArarcrB) rErrr`rerFr=rGrfr r r getmxperfs re)F)NNNNNF)NNNNNNF)F)rF)F)rF)NF)F)F)F)F)F)F)F)NNNNNNF)F)F)rF)F)F)F)FF)F)FF)F)NF)F)NF)F)F)NF)F)FF)F)F)rNNNNF)rrF)F)rF)F)FFNFNNF)F)F)F)F)F)NNNNF)F)F)F)F)FFrNrNNF)F)NF)NF)F)F)NNF)F)F)F)F)F)F)F)F)F)F)F)F)NNNNNNF)NNNNF)NNNNNF)NNNNNF)NNNNNF)NNNNF)NNNNF)F)F)F)F)F)F)NNNNNNF)F)F)F)F) NNNNNNNNNNNNF)F)F)NNNNNNNF)F)F)F)}r r@r+ ipaddressrrJr9r?r. ExceptionrWarningrrrrrobjectrrr-r1r<rIrLrNrTrZrargrzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r r rrrrr2r5r7r9r:r;r<r=r>rCrGrHrJrQrRrSrTrVr[r\r^rbrcrdrer r r r s       6        gt,#!! #*3)<CVdf8' ((#%?*W(