diff options
Diffstat (limited to 'phpipam_api/backend.py')
-rwxr-xr-x | phpipam_api/backend.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/phpipam_api/backend.py b/phpipam_api/backend.py new file mode 100755 index 0000000..85079df --- /dev/null +++ b/phpipam_api/backend.py @@ -0,0 +1,61 @@ +# +# phpipam/backend.py +# (c) 2021 Jonas Gunz <himself@jonasgunz.de> +# License: MIT +# +import requests +import json +import datetime +from dateutil.parser import parse as datetime_parse + +class ApiConnectionException(Exception): + pass + +class ApiQueryException(Exception): + pass + +class ApiObjectNotFoundException(Exception): + pass + +class PhpipamBackend: + def __init__(self, api_url, app_id, api_user, api_password): + self.api_url = api_url.strip('/') + '/api/' + app_id + self.api_user = api_user + self.api_password = api_password + + # Check for static auth + if len(self.api_user) == 0: + self.api_token = self.api_password + self.api_token_expires = "" + else: + self._getApiToken() + + def _getApiToken(self): + data = requests.post(self.api_url + "/user", auth=(self.api_user,self.api_password)).json() + if not data['success']: + raise ApiConnectionException('Failed to authenticate: ' + str(data['code']) + ' ' + data['message']) + + self.api_token = data['data']['token'] + self.api_token_expires = data['data']['expires'] + + + def _isTokenExpired(self): + # static auth does not expire + if len(self.api_token_expires) == 0: + return False + + expiration = datetime_parse(self.api_token_expires) + + return expiration < datetime.datetime.now() + + def request ( self, method, url, data = {} ): + if self._isTokenExpired(): + self._getApiToken() + + data = requests.request(method, self.api_url + url, data=data, headers={'token':self.api_token}).json() + + if not 'success' in data or not data['success']: + raise ApiQueryException("Query failed with code " + str(data['code']) + ": " + str(data['message'])) + + return data['data'] + |