2021-04-28

paramiko.ssh_exception.BadAuthenticationType throwing Authentication error and SFTP pull is also failing

I am receiving the error- "ERROR_SFTP_PULL, AUTHENTICATION ERROR Server connection dropped": -Normal passwordless sftp (get) is working to the remote server from my local server, however SFTP PULL is failing through Python script. It was running normal 4 days ago. Surprisingly, file copied from remote server to local server with same size. However, because of error exception script is doing sys exit. Please guide to resolve the issue. Also it takes less than 1 sec to copy the file , however taking 15 minutes to copy and error out.

It looks bad at below code part:

1.  authReturnCode = "<class 'paramiko.ssh_exception.BadAuthenticationType'>", not sure please help
2.  errorKey = "INFO_SFTP_PULL, "+ eachFiles + " successfully copyied from SFX for " + custName

Failure log:
===========
2021-04-26 15:00:02,459 INFO::ipndProxyApp.py:787: Processing data for: eDCP
2021-04-26 15:00:02,851 INFO::transport.py:1746: Connected (version 2.0, client SSHD)
2021-04-26 15:00:03,860 INFO::transport.py:1746: Authentication (publickey) successful!
2021-04-26 15:00:03,922 INFO::sftp.py:158: [chan 0] Opened sftp connection (server version 3)
2021-04-26 15:15:15,376 INFO::sftp.py:158: [chan 0] sftp session closed.
2021-04-26 15:15:15,491 ERROR::ipndProxyApp.py:119: ERROR_SFTP_PULL, AUTHENTICATION ERROR Server connection dropped:

Normal log is:
=============
2021-04-22 15:00:02,138 INFO::ipndProxyApp.py:782: Processing data for: eDCP
2021-04-22 15:00:02,256 INFO::transport.py:1746: Connected (version 2.0, client SSHD)
2021-04-22 15:00:02,563 INFO::transport.py:1746: Authentication (publickey) successful!
2021-04-22 15:00:02,586 INFO::sftp.py:158: [chan 0] Opened sftp connection (server version 3)
2021-04-22 15:00:09,999 INFO::sftp.py:158: [chan 0] sftp session closed.
2021-04-22 15:00:10,003 INFO::ipndProxyApp.py:122: INFO_SFTP_PULL, FILE_2021-04-21-18-00-35.txt successfully copied from SFX for eDCP

Python Code:
===========


    import os, sys, logging, shutil
    import pysftp, mysql.connector
    import subprocess, csv, argparse
    from datetime import datetime, timedelta
    import time
    
    # Importing Configuration settings or other supporting scripts
    import settings
    import SQLqueries
    import fieldLengthVerification
    
    # Static Configuration settings, logging settings, global variables
    logging.basicConfig(filename='/var/log/ipnd.log', format='%(asctime)s %(levelname)s::%(filename)s:%(lineno)d: %(message)s', dateformat='%Y-%m-%d %I:%M:%S',level=logging.INFO)
    currentDateTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    currentDate = datetime.now().strftime("%Y-%m-%d")
    yesterdays_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
    twoDaysBack = (datetime.now() - timedelta(days=2)).strftime("%Y-%m-%d")
    cnopts = pysftp.CnOpts()
    cnopts.hostkeys = None
    
    
    # Handling Authentication errors for the SFT authentications only
    def errorHandling(errorFromProgram):
        """
        Function to handle authentication error for sftp only, it accepts exception errors and return string keyword.
    
        Parameters:
        errorFromProgram (class) : Error class generated by Exceptions
    
        Returns:
        str: str(errorFromProgram) or "Authentication Success" or "AUTHENTICATION ERROR " + str(errorFromProgram)
        """
    
        # This function to perform error handling and return string against the provided input  
        
        authReturnCode = "<class 'paramiko.ssh_exception.BadAuthenticationType'>"
    
        # Handling RHEL version of sftp (<class 'paramiko.ssh_exception.AuthenticationException'>)
        if str(errorFromProgram) == "Authentication failed.":
            errorKeyWord = str(errorFromProgram)
            return errorKeyWord
    
        # Handling SUSE version of sftp (<class 'paramiko.ssh_exception.BadAuthenticationType'>)
        elif str(type(errorFromProgram)) == authReturnCode:
            errorExcetption,a = errorFromProgram
            errorKeyWord = errorExcetption
            return errorKeyWord
    
        # Handling other situation then provious two
        elif (str(errorFromProgram) != "Authentication failed.") or (str(type(errorFromProgram)) != authReturnCode):    
            errorKeyWord = "AUTHENTICATION ERROR " + str(errorFromProgram)  
            return errorKeyWord
    
        # Handling other conditions if not handled in provious if and elif
        else:
                    infoKeyWord = "Authentication Success"
            return infoKeyWord
    
    
    # Fetch eDCP Data files from SFX sftp server
    
    def fetchFilesFromSftpLocation(custName, fileSrcHost, remoteFileLocation, fileSrcUser, fileSrcPassPhrase, dateToProcessFiles):
        """
        Function to fetch files from remove servers and store in location directory, return nothing and accept following parameters
    
        Parameters:
        custName (str): Customer Name.
        fileSrcHost (str): Hostname (FQDN) or IP address of the source server from where files would be fetched.
        fileLocation (str): Remote file location.
        fileSrcUser (str): User to connect remote server to fetch files.
        fileSrcPassPhrase (str): Password to connect remote server to fetch files.
        dateToProcessFiles (str): Date to fetch the files for   
        """
    
        # try to connect SFX server over sftp
        try:
            sftp = pysftp.Connection(fileSrcHost, username = fileSrcUser)
    
            # change to remote directory
            sftp.chdir(remoteFileLocation)
            listOfFilesAtSFX = sftp.listdir()
    
            for eachFiles in listOfFilesAtSFX:
                
                if eachFiles.startswith("IPNDUP" + custName.upper() +"_" + dateToProcessFiles):
                    
                    # Fetch files from SFTP
                    try:    
                        sftp.get(eachFiles)
                                            
                        **errorKey = "INFO_SFTP_PULL, "+ eachFiles + " successfully copyied from SFX for " + custName**
    
                    except Exception as e:
                        errorKey = "ERROR_SFTP_PULL, "+ errorHandling(e)
                        #print(errorKey)
    
            sftp.close()
    
        # Capture Exception
        except Exception as e:
            errorKey = errorHandling(e)
            errorKey = "ERROR_SFTP_PULL, "+ errorKey
    
    
            # Checking conditions to generate ERROR or INFO
            if len(errorKey) > 0:
                    listOfErrorKeys = errorKey.split('_')
                    if "ERROR" in listOfErrorKeys:
                            logging.error("%s" % errorKey)
                            sys.exit(1)
                    else:
                            logging.info("%s" % errorKey)
    
            else:
                    logging.error("%s" % "No Error keywords found")


from Recent Questions - Stack Overflow https://ift.tt/3sVMVJp
https://ift.tt/eA8V8J

No comments:

Post a Comment