private static TryGetOrUpdateFileFromFtp GetOrUpdateFileFromFtpMd5(string fileName, string fileMD5FromSql) { //Создаем папку для библиотек операций if (!Directory.Exists(MainSettings.Constants.PluginOperationDllDirectoryPath)) { Directory.CreateDirectory(MainSettings.Constants.PluginOperationDllDirectoryPath); } if (!string.IsNullOrEmpty(fileName)) { //Если файл существует, но его MD5 не совпадает с тем что в базе - удаляем его (он устаревший) if (File.Exists(Path.Combine(MainSettings.Constants.PluginOperationDllDirectoryPath, fileName)) && !MD5Works.CompareHahes(MD5Works.GetFileHash(Path.Combine(MainSettings.Constants.PluginOperationDllDirectoryPath, fileName)), fileMD5FromSql)) { File.Delete(Path.Combine(MainSettings.Constants.PluginOperationDllDirectoryPath, fileName)); } //Если файла не существует - закачиваем его if (!File.Exists(Path.Combine(MainSettings.Constants.PluginOperationDllDirectoryPath, fileName))) { var res = FtpWorks.DownloadFileFromFtp(MainSettings.Constants.PluginOperationDllDirectoryPath , MainSettings.GlobalSettings.SelfUpdateFtpServer , MainSettings.GlobalSettings.SelfUpdateFtpUser , MainSettings.GlobalSettings.SelfUpdateFtpPassword , Path.Combine(MainSettings.GlobalSettings.SelfUpdateFtpPath, MainSettings.Constants.OPERATION_PLUGIN_DIRECTORY_NAME) , fileName); if (!res.IsComplete) { return(new TryGetOrUpdateFileFromFtp(false, res.Message)); } } if (!File.Exists(Path.Combine(MainSettings.Constants.PluginOperationDllDirectoryPath, fileName))) { return(new Helpers.TryGetOrUpdateFileFromFtp(false, $"Ошибка закачки файла плагин-операции {fileName} по ftp")); } return(new TryGetOrUpdateFileFromFtp()); } else { return(new TryGetOrUpdateFileFromFtp(false, "Ошибка вызова функции (GetOrUpdateFileFromFtp), неверные входные параметры")); } }
public static TryGetFtpFileMd5 GetFtpFileMd5(string server, string login, string password, string ftpFolder, string fileName) { try { if (!server.Contains(FTP_PREFIX)) { server = $"{FTP_PREFIX}{server}"; } string ftpFilePath = Path.Combine(server, ftpFolder, fileName); ftpFilePath = ftpFilePath.Replace("\\", "/"); string md5 = ""; using (WebClient request = new WebClient()) { request.Credentials = new NetworkCredential(login, password); byte[] fileData = request.DownloadData(ftpFilePath); string filePath = Path.Combine(Path.GetTempPath(), fileName); using (FileStream file = File.Create(filePath)) { file.Write(fileData, 0, fileData.Length); file.Close(); } md5 = MD5Works.GetFileHash(filePath); File.Delete(filePath); } return(new TryGetFtpFileMd5(true, md5)); } catch (Exception ex) { return(new TryGetFtpFileMd5(false, "", ex.Message.ToString())); } }
public static TryRegisterPlugin RegisterOrUpdatePluginLastModifiedDate(string fileName) { string dllLocalFullPath = Path.Combine(MainSettings.Constants.PluginOperationDllDirectoryPath, fileName); string dllFtpFullPath = Path.Combine(MainSettings.GlobalSettings.SelfUpdateFtpPath , MainSettings.Constants.OPERATION_PLUGIN_DIRECTORY_NAME , fileName); DateTime?ftpFileLastModifiedDate = FtpWorks.GetFileLastModifiedDate(MainSettings.GlobalSettings.SelfUpdateFtpServer , MainSettings.GlobalSettings.SelfUpdateFtpUser , MainSettings.GlobalSettings.SelfUpdateFtpPassword , Path.Combine(MainSettings.GlobalSettings.SelfUpdateFtpPath, MainSettings.Constants.OPERATION_PLUGIN_DIRECTORY_NAME) , fileName); if (ftpFileLastModifiedDate.HasValue) { try { DataSet ds = SqlWorks.ExecProc("GetOperationTypeByFileName", fileName); if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0) { //Регистрируем //Актуализируем файл из фтп, если нужно var res = GetOrUpdateFileFromFtpLastModifiedDate(fileName, null); if (!res.IsComplete) { return(new TryRegisterPlugin(false, $"Ошибка скачивания файла ({fileName}) с ftp в директорию ({MainSettings.Constants.PluginOperationDllDirectoryPath})")); } else { /* * @Name nvarchar(512) * ,@NameRus nvarchar(512) * ,@GroupId int * ,@FileName nvarchar(510) * ,@FileMD5 nvarchar(64) * ,@Description nvarchar(MAX) */ //Пробуем получить имя типа операции var dllResult = GetFromDll(dllLocalFullPath); if (!dllResult.IsComplete) { return(new TryRegisterPlugin(false, $"Ошибка получения типа операции из файла ({dllLocalFullPath})")); } var addDs = SqlWorks.ExecProc("AddOperationType" , dllResult.PluginOperationInstance.SqlName , "" , 1 , fileName , ftpFileLastModifiedDate , MD5Works.GetFileHash(dllLocalFullPath).ToUpper() , ""); if (addDs != null && addDs.Tables.Count > 0 && addDs.Tables[0].Rows.Count > 0) { int id = ConvertSafe.ToInt32(addDs.Tables[0].Rows[0]["Id"]); foreach (var param in dllResult.PluginOperationInstance.RegistrationParams) { var resDs = SqlWorks.ExecProc("UpdateOperationTypesFieldsById" , id , param.Key , param.Value); if (resDs != null && resDs.Tables.Count > 0 && resDs.Tables[0].Rows.Count > 0) { if (Convert.ToInt32(resDs.Tables[0].Rows[0]["ResultId"]) == -1) { return(new TryRegisterPlugin(false, $"Ошибка записи параметров SQL из файла ({dllLocalFullPath}). SQL Error: {Convert.ToString(resDs.Tables[0].Rows[0]["Message"])}")); } } else { return(new TryRegisterPlugin(false, $"Ошибка записи параметров SQL из файла ({dllLocalFullPath})")); } } } return(new TryRegisterPlugin()); } } else { DataRow dr = ds.Tables[0].Rows[0]; DateTime?sqlDateTime = null; try { sqlDateTime = (DateTime?)dr["LastModifiedDate"]; } catch { sqlDateTime = null; } //Обновляем, если нужно if (!Extensions.IsNullableDateTimeIdentical(ftpFileLastModifiedDate, sqlDateTime)) { //Актуализируем файл из фтп, если нужно var res = GetOrUpdateFileFromFtpLastModifiedDate(fileName, sqlDateTime); if (!res.IsComplete) { return(new TryRegisterPlugin(false, $"Ошибка скачивания файла ({fileName}) с ftp в директорию ({MainSettings.Constants.PluginOperationDllDirectoryPath})")); } else { var dllResult = GetFromDll(dllLocalFullPath); if (!dllResult.IsComplete) { return(new TryRegisterPlugin(false, $"Ошибка получения типа операции из файла ({dllLocalFullPath})")); } SqlWorks.ExecProc("UpdateOperationTypeById" , Convert.ToInt32(dr["Id"]) , dllResult.PluginOperationInstance.SqlName , "" , 1 , fileName , ftpFileLastModifiedDate , MD5Works.GetFileHash(dllLocalFullPath).ToUpper() , ""); foreach (var param in dllResult.PluginOperationInstance.RegistrationParams) { var resDs = SqlWorks.ExecProc("UpdateOperationTypesFieldsById" , Convert.ToInt32(dr["Id"]) , param.Key , param.Value); if (resDs != null && resDs.Tables.Count > 0 && resDs.Tables[0].Rows.Count > 0) { if (Convert.ToInt32(resDs.Tables[0].Rows[0]["ResultId"]) == -1) { return(new TryRegisterPlugin(false, $"Ошибка записи параметров SQL из файла ({dllLocalFullPath}). SQL Error: {Convert.ToString(resDs.Tables[0].Rows[0]["Message"])}")); } } else { return(new TryRegisterPlugin(false, $"Ошибка записи параметров SQL из файла ({dllLocalFullPath})")); } } return(new TryRegisterPlugin()); } } return(new TryRegisterPlugin()); } } catch (Exception ex) { return(new TryRegisterPlugin(false, ex.ToString())); } } else { return(new TryRegisterPlugin(false, $"Не удалось получить дату последнего изменения файла ({fileName}) по ftp")); } }