def doReportExisting(self, event, *args, **kwargs): """ Action method. """ if event == 'skip-check': return existing_domains = [] results = args[0]['epp']['response']['resData']['chkData']['cd'] if not results: self.outputs.append(rpc_error.EPPResponseEmpty()) return if not isinstance(results, list): results = [results, ] for result in results: name = result.get('name', {}).get('#text') if not name: logger.error('unexpected EPP response, unknown domain name: %s', args[0]) continue if result.get('name', {}).get('@avail') == '0': if result.get('reason').lower().count('the domain exists'): existing_domains.append(name) self.check_results[name] = True else: self.check_results[name] = rpc_error.exception_from_response(response=args[0]) else: self.check_results[name] = False self.outputs.append(existing_domains) self.outputs.append(args[0])
def doReportFailed(self, event, *args, **kwargs): """ Action method. """ if event == 'error': self.outputs.append(args[0]) else: self.outputs.append(rpc_error.exception_from_response(response=args[0]))
def _do_find_errors_in_response(self, response): results = None resData = response['epp']['response'].get('resData') if resData: results = resData['chkData']['cd'] if not results: logger.error('unexpected EPP response, no results') return [rpc_error.EPPResponseEmpty(), ] if not isinstance(results, list): results = [results, ] for result in results: if not result.get('name', {}).get('#text'): logger.error('unexpected EPP response, unknown domain name: %s', response) return [rpc_error.EPPResponseEmpty(), ] if result.get('name', {}).get('@avail') == '0': reason = result.get('reason').lower() if reason.count('non-supported zone'): return [zerrors.NonSupportedZone(), ] if not reason.count('the domain exists'): return [rpc_error.exception_from_response(response=response), ] return []
def run(json_request, raise_for_result=True, logs=True, **args): try: json.dumps(json_request) except Exception as exc: logger.error('epp request failed, invalid json input') raise rpc_error.EPPBadResponse('epp request failed, invalid json input') if logs: if DEBUG: logger.debug(' >>> EPP: %s', json_request) else: logger.info(' >>> EPP: %s', json_request.get('cmd', 'unknown')) try: rpc_response = do_rpc_request(json_request, **args) except rpc_error.EPPError as exc: logger.error('epp request failed with known error: %s', exc) raise exc except Exception as exc: logger.error('epp request failed, unexpected error: %s', traceback.format_exc()) raise rpc_error.EPPBadResponse(exc) if not rpc_response: logger.error('empty response from epp_gate, connection error') raise rpc_error.EPPBadResponse('empty response, connection error') try: json_output = json.loads(rpc_response) except Exception as exc: logger.exception('epp request failed, response is not readable') raise rpc_error.EPPBadResponse(exc) output_error = json_output.get('error') if output_error: raise rpc_error.EPPBadResponse(output_error) if raise_for_result: try: code = json_output['epp']['response']['result']['@code'] msg = json_output['epp']['response']['result']['msg'].replace('Command failed;', '') except: if logs: logger.error('bad formatted response: %r', rpc_response) raise rpc_error.EPPBadResponse('bad formatted response, response code not found') good_response_codes = ['1000', ] if True: # just to be able to debug poll script packets good_response_codes.extend(['1300', '1301', ]) if code not in good_response_codes: if logs: logger.error('response code failed: %r', json.dumps(json_output, indent=2)) epp_exc = rpc_error.exception_from_response(response=json_output, message=msg, code=code) raise epp_exc if logs: if DEBUG: logger.debug(' <<< EPP: %s', json_output) else: try: code = json_output['epp']['response']['result']['@code'] except: code = 'unknown' logger.info(' <<< EPP: %s', code) return json_output