using System; using System.Collections.Generic; using System.IO; using LCU.API.Collections.RepoApi.Configuration; using Serilog; using WinSCP; using SessionOptions = WinSCP.SessionOptions; using TransferMode = WinSCP.TransferMode; namespace LCU.API.Collections.RepoApi.Services.AutoIms { public class AuctionFtpClientService : IAuctionFtpClientService { private readonly SessionOptions _sessionOptions; private readonly RepoApiConfiguration _configuration; public AuctionFtpClientService(RepoApiConfiguration configuration) { _configuration = configuration; _sessionOptions = new SessionOptions() { Protocol = Protocol.Sftp, HostName = configuration.FtpConfiguration.HostName, UserName = configuration.FtpConfiguration.UserName, PortNumber = configuration.FtpConfiguration.Port, SshHostKeyFingerprint = configuration.FtpConfiguration.SshHostKeyFingerprint, SshPrivateKeyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, configuration.FtpConfiguration.SshPrivateKeyPath) }; } public Dictionary Download() { var fileResults = new Dictionary(); using (Session session = new Session()) { TransferOperationResult transferResult = null; try { session.ExecutablePath = _configuration.FtpConfiguration.ExecutablePath; session.Open(_sessionOptions); } catch (WinSCP.SessionLocalException wsle) { Log.Error(wsle, "Failed to open FTP session, WINSCP likely missing"); return fileResults; } catch (Exception ex) { Log.Error(ex,"Failed to open FTP session"); return fileResults; } TransferOptions transferOptions = new TransferOptions(); transferOptions.TransferMode = TransferMode.Automatic; transferOptions.PreserveTimestamp = true; RemoteDirectoryInfo directory = session.ListDirectory(_configuration.RemoteFilePath); foreach (RemoteFileInfo fileInfo in directory.Files) { string localFileName = Path.Combine(_configuration.LocalDirectoryPath, fileInfo.Name); var remoteFileName = Path.Combine(_configuration.RemoteFilePath, fileInfo.Name); FileInfo thisFileInfo = null; try { if (!fileInfo.IsDirectory && !File.Exists(localFileName)) { thisFileInfo = new FileInfo(localFileName); fileResults.Add(thisFileInfo, "success"); transferResult = session.GetFiles(remoteFileName, localFileName, true, transferOptions); // Throw on any error transferResult.Check(); } } catch (Exception ex) { Log.Error(ex, "Exception while FTP'ing files "); if (thisFileInfo != null) { fileResults[thisFileInfo] = ex.Message; } } } } return fileResults; } } }