paramiko / paramiko/paramiko

paramiko sftp issue

Open
#1,847 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
9.9k
Forks
2.1k
PR merge metrics
No merged PRs in 30d

Description

Hello everyone,

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.
-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")

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with fetchFilesFromSftpLocation in ipndProxyApp.py and inspect the failure path around lines 119, 782, and 787. Reproduce the SFTP pull using the supplied logs and review errorHandling, then determine a focused, testable failure case and confirm the resulting behavior with a regression test or documented reproduction.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend, networking
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
18/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.