forked from ISPsystem/isp-maintenance
		
	Create: api handlers
This commit is contained in:
		
							parent
							
								
									f9a213fe3e
								
							
						
					
					
						commit
						1d72b8d015
					
				
							
								
								
									
										0
									
								
								isp_maintenance/core/api/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								isp_maintenance/core/api/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										157
									
								
								isp_maintenance/core/api/base.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								isp_maintenance/core/api/base.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,157 @@ | ||||
| import sys | ||||
| import json | ||||
| import urllib | ||||
| import requests | ||||
| 
 | ||||
| from settings.api import INPUT_HOSTNAME, INPUT_PORT, HEADERS | ||||
| 
 | ||||
| 
 | ||||
| class BaseAPI(object): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         """Announces required parameters""" | ||||
|         internal_api_url = f'http://{INPUT_HOSTNAME}:{INPUT_PORT}' | ||||
|         self.API_URL = api_url if api_url else internal_api_url | ||||
|         self.API_VERSION = 'v3' | ||||
|         self.API_DEFINITION = 'api' | ||||
|         self.HEADERS = HEADERS | ||||
|         self.VERIFY_SSL = verify_ssl | ||||
| 
 | ||||
|     def _gen_request_url(self, url): | ||||
|         return f'{self.API_URL}/{self.API_DEFINITION}/{self.API_VERSION}{url}' | ||||
| 
 | ||||
|     def call_api(self, url, method='GET', headers={}, data={}): | ||||
|         # Open session | ||||
|         with requests.Session() as session: | ||||
|             try: | ||||
|                 url = self._gen_request_url(url) | ||||
|                 headers = self.HEADERS if not headers else headers | ||||
|                 params_str = urllib.parse.urlencode(data, safe="+'()") | ||||
|                 if method == 'POST': | ||||
|                     api_request = session.post( | ||||
|                         url=url, | ||||
|                         json=data, | ||||
|                         headers=headers, | ||||
|                         verify=self.VERIFY_SSL | ||||
|                     ) | ||||
|                 if method == 'GET': | ||||
|                     url = f'{url}?{params_str}' if params_str else url | ||||
|                     api_request = session.get( | ||||
|                         url=url, | ||||
|                         headers=headers, | ||||
|                         verify=self.VERIFY_SSL | ||||
|                     ) | ||||
|             except Exception as error: | ||||
|                 api_request = { | ||||
|                     'result': False, | ||||
|                     'error': type(error).__name__ | ||||
|                 } | ||||
|                 return api_request | ||||
|             finally: | ||||
|                 session.close() | ||||
| 
 | ||||
|         # Get response | ||||
|         try: | ||||
|             response = json.loads(api_request.text) | ||||
|             if 'error' in response and response['error']: | ||||
|                 print(response['error']) | ||||
|                 raise sys.exit() | ||||
|             return response | ||||
|         except json.decoder.JSONDecodeError: | ||||
|             response = {'error': 'Can not parse response'} | ||||
|             print(response) | ||||
|             raise sys.exit() | ||||
| 
 | ||||
| 
 | ||||
| class BaseAuthAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         """ | ||||
|         Init class for /auth/v4 requests | ||||
| 
 | ||||
|         Args: | ||||
|             api_url (str, optional): url api host. Defaults to None. | ||||
|             If None will use from settings.api.INPUT_HOSTNAME:INPUT_PORT | ||||
| 
 | ||||
|             verify_ssl (bool, optional): Isn't recommended. Defaults to True. | ||||
|             Use only for testing if you don't have root sign SSL cert. | ||||
|         """ | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_VERSION = 'v4' | ||||
|         self.API_DEFINITION = 'auth' | ||||
| 
 | ||||
|     def get_auth_token(self, email: str, password: str) -> dict: | ||||
|         """ | ||||
|         Get auth token for authentication | ||||
| 
 | ||||
|         Arg: | ||||
|             email (str): user email | ||||
|             password (str): user password | ||||
| 
 | ||||
|         Returns: | ||||
|             response (dict): { | ||||
|                 "confirmed": true, | ||||
|                 "expires_at": "date time", | ||||
|                 "id": "int", | ||||
|                 "token": "str" | ||||
|             } | ||||
|         """ | ||||
|         return self.call_api( | ||||
|             url='/public/token', | ||||
|             method='POST', | ||||
|             data={'email': email, 'password': password} | ||||
|         ) | ||||
| 
 | ||||
|     def get_auth_key(self, token: str, user, auth_type='Internal') -> dict: | ||||
|         """ | ||||
|         Key authentication | ||||
| 
 | ||||
|         Args: | ||||
|             token (str): auth token | ||||
|             user (str or int): user id or email | ||||
|             auth_type (str, optional): May be Public for public auth. | ||||
|             Defaults to 'Internal'. | ||||
| 
 | ||||
|         Returns: | ||||
|             response (dict): { | ||||
|                 "id": "int", | ||||
|                 "key": "str" | ||||
|             } | ||||
|         """ | ||||
|         headers = {} | ||||
|         if auth_type == 'Public': | ||||
|             headers = self.make_auth_header(token) | ||||
|         return self.call_api( | ||||
|             url=f'/user/{user}/key', | ||||
|             method='POST', | ||||
|             headers=headers | ||||
|         ) | ||||
| 
 | ||||
|     def make_auth_header(self, token: str) -> dict: | ||||
|         """ | ||||
|         Generate dict for auth header | ||||
| 
 | ||||
|         Args: | ||||
|             token (str): auth token | ||||
| 
 | ||||
|         Returns: | ||||
|             dict: {'x-xsrf-token': token} use it for request headers | ||||
|         """ | ||||
|         return {'x-xsrf-token': token} | ||||
| 
 | ||||
|     def whoami(self, token: str) -> dict: | ||||
|         return self.call_api( | ||||
|             url='/whoami', | ||||
|             method='GET', | ||||
|             headers=self.make_auth_header(token) | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
| class BaseIpAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_DEFINITION = 'ip' | ||||
| 
 | ||||
| 
 | ||||
| class BaseDnsProxyAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_DEFINITION = 'dnsproxy' | ||||
							
								
								
									
										51
									
								
								isp_maintenance/core/api/dci6.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								isp_maintenance/core/api/dci6.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| from core.api.base import BaseAPI, BaseAuthAPI, BaseDnsProxyAPI, BaseIpAPI | ||||
| 
 | ||||
| 
 | ||||
| class AuthAPI(BaseAuthAPI): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class BackupAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_VERSION = 'v4' | ||||
|         self.API_DEFINITION = 'backup' | ||||
| 
 | ||||
| 
 | ||||
| class DnsProxyAPI(BaseDnsProxyAPI): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class EserviceAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_DEFINITION = 'eservice' | ||||
| 
 | ||||
| 
 | ||||
| class IsoAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_DEFINITION = 'iso' | ||||
| 
 | ||||
| 
 | ||||
| class IpmiAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_DEFINITION = 'ipmiproxy' | ||||
| 
 | ||||
| 
 | ||||
| class IpAPI(BaseIpAPI): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class ReportAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_VERSION = 'v4' | ||||
|         self.API_DEFINITION = 'report' | ||||
| 
 | ||||
| 
 | ||||
| class UpdaterAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_DEFINITION = 'updater' | ||||
							
								
								
									
										19
									
								
								isp_maintenance/core/api/vm6.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								isp_maintenance/core/api/vm6.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| from core.api.base import BaseAPI, BaseAuthAPI, BaseDnsProxyAPI, BaseIpAPI | ||||
| 
 | ||||
| 
 | ||||
| class AuthAPI(BaseAuthAPI): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class DnsProxyAPI(BaseDnsProxyAPI): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class IpAPI(BaseIpAPI): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class VmAPI(BaseAPI): | ||||
|     def __init__(self, api_url=None, verify_ssl=True): | ||||
|         super().__init__(api_url, verify_ssl) | ||||
|         self.API_DEFINITION = 'vm' | ||||
							
								
								
									
										10
									
								
								isp_maintenance/settings/api.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								isp_maintenance/settings/api.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| from settings.platform import PLATFORM_TYPE | ||||
| 
 | ||||
| # Name of nginx container: | ||||
| INPUT_HOSTNAME = 'input' if PLATFORM_TYPE == 'vm' else 'dci_input_1' | ||||
| 
 | ||||
| # Port that nginx container is listening: | ||||
| INPUT_PORT = '1500' | ||||
| 
 | ||||
| # Headers for internal auth: | ||||
| HEADERS = {"Internal-Auth": "on", "Accept": "application/json"} | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user