# -*- coding: utf-8 -*- import requests import requests.exceptions import time import logging log = logging.getLogger(__name__) def __init__(opts): return True def __virtual__(): return True class TastypieAuth( requests.auth.AuthBase ): def __init__( self, api_username, api_key ): self.api_username = api_username self.api_key = api_key def __call__( self, r ): r.headers[ 'Authorization' ] = "ApiKey %s:%s" % ( self.api_username, self.api_key ) r.headers[ 'Content-Type' ] = "application/json" r.headers[ 'Accept-Encoding' ] = "application/json" return r class API( object ): def __init__( self, api_username, api_key, base = "https://fulcrm.org/api/v2/" ): self.api_username = api_username self.api_key = api_key self.base = base self.auth = TastypieAuth( self.api_username, self.api_key ) def make_request( self, url, data, method, _countdown = 3 ): if not url.startswith( self.base ): url = self.base + url method = { 'POST': requests.post, 'PATCH': requests.patch, 'GET': requests.get, 'DELETE': requests.delete }.get( method, requests.get ) try: if data: request = method( url, data = json.dumps( data ), auth = self.auth ) else: request = method( url, auth = self.auth ) except requests.exceptions.ConnectionError: if _countdown > 0: time.sleep( 5 ** ( 3 - _countdown ) ) return self.make_request( url, data, method, _countdown - 1 ) else: raise if request.ok: try: return request.json() except: return None else: raise IOError( request.text ) def get_many( self, url, no_d = False ): next = None if no_d: if "?" in url: url = url + "&count=10" else: url = url + "?count=10" else: if "?" in url: url = url + "&expand=d&count=10" else: url = url + "?expand=d&count=10" if not url.startswith( self.base ): url = self.base + url while True: result = self.make_request( url, None, 'GET' ) if result: if 'results' in result: for object in result[ 'results' ]: yield object if 'next' in result: next = result.get( 'next', None ) if next: url = next else: return else: return def ext_pillar( minion_id, p, **kw ): pillar = {} api = API( api_username = kw.get( 'username' ), api_key = kw.get( 'api_key' ) ) for t in api.get_many( 'thing/?name=' + minion_id ): pillar.update( t.get( 'd', {} ) ) for t in api.get_many( 'thing/?passport__system=dev.provisioning.faelix.net&passport__passport=' + minion_id ): pillar.update( t.get( 'd', {} ) ) for t in api.get_many( 'thing/?passport__system=salt.faelix.net&passport__passport=' + minion_id ): pillar.update( t.get( 'd', {} ) ) return { 'fulcrm_thing': pillar }