--- /dev/null
+import json
+import requests
+import os
+
+from configparser import RawConfigParser, NoSectionError, NoOptionError
+
+class AuthenticationException(Exception):
+ pass
+
+class RateLimitExceeded(Exception):
+ pass
+
+class InternalServer(Exception):
+ pass
+
+class HetznerConfig:
+ def __init__(self):
+ config = RawConfigParser()
+ config.read([os.path.expanduser('~/.hetzner.conf')])
+
+ self.api_key = config.get("default", "api_key")
+
+config = HetznerConfig()
+
+def call(endpoint, url_params=None, body=None, method="GET"):
+ api = "https://api.hetzner.cloud/v1/{}".format(endpoint)
+ headers = {"Authorization": "Bearer {}".format(config.api_key)}
+ data = json.dumps(body) if body is not None else None
+
+ if method == "GET":
+ request = requests.get(api, headers=headers, params=url_params)
+ elif method == "POST" or (method == "GET" and body is not None):
+ request = requests.post(api, data=data, headers=headers, params=url_params)
+ elif method == "DELETE":
+ request = requests.delete(api, headers=headers)
+ elif method == "PUT":
+ request = requests.put(api, headers=headers, data=data)
+
+ if request.status_code == 401 or request.status_code == 403:
+ raise AuthenticationException()
+
+ if request.status_code == 429:
+ raise RateLimitExceeded()
+
+ if request.status_code == 500:
+ raise InternalServer(request.text)
+
+ if not request.text:
+ return request.status_code, ""
+
+ js = request.json()
+
+ return request.status_code, js
+
+def get(*args, **kwargs):
+ return call(*args, method="GET", **kwargs)
+
+def post(*args, **kwargs):
+ return call(*args, method="POST", **kwargs)