/// <summary> /// Inicia o processo de atualização /// </summary> public Atualizar(TelaPrincipal telaPrincipal) { TelaPrincipal = telaPrincipal; AtualizarModel = TelaPrincipal.AbaAtualizacao.AtualizarModel; ConfiguracaoModel = TelaPrincipal.AbaConfiguracoes.ConfiguracaoModel; Ftp = new Ftp(); TimerProximaAtualizacao = new System.Timers.Timer(); TimerProximaAtualizacao.AutoReset = false; TimerProximaAtualizacao.Elapsed += Execute; }
/// <summary> /// Atualização de arquivos /// </summary> private async Task <bool> AtualizarExe() { return(await Task.Run(() => { try { TelaPrincipal.AbaAtualizacao.IsIndeterminateBarra1 = false; var FileLastModified = Ftp.GetFileLasModified(PathExe); if (!FileLastModified.ToString().Equals(ConfiguracaoModel.VersaoArquivo)) { TelaPrincipal.AbaAtualizacao.LabelContent = "Baixando arquivos da atualizaçãos..."; var arquivos = Ftp.Download(PathExe, TelaPrincipal); using (MemoryStream mem = new MemoryStream(arquivos)) using (ZipArchive zipStream = new ZipArchive(mem)) { var filesCount = 1; foreach (ZipArchiveEntry file in zipStream.Entries) { string completeFileName = Path.Combine($@"{ConfiguracaoModel.DiretorioSistema}\Update", file.FullName); string directory = Path.GetDirectoryName(completeFileName); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } if (file.Name != "") { file.ExtractToFile(completeFileName, true); } TelaPrincipal.AbaAtualizacao.LabelContent = "Extraindo arquivo (" + filesCount + "/" + zipStream.Entries.Count.ToString() + ")"; TelaPrincipal.AbaAtualizacao.ProgressoBarra1 = Math.Min((int)((double)filesCount / zipStream.Entries.Count) * 100, 100); //file.ExtractToFile(completeFileName, true); filesCount++; } } } ConfiguracaoModel.VersaoArquivo = FileLastModified.ToString().Trim(); ConfiguracaoModel.ToModel().GravarConfiguracao(); TelaPrincipal.Indicadores.AtualizouExe = true; return true; } catch (Exception e) { log.Error(e.Message); TelaPrincipal.AbaAtualizacao.LabelContent = "Problemas ao atualizar programas."; return false; } })); }
/// <summary> /// Busca as versões para atualização de acordo com a versão do cliente /// </summary> private async Task <bool> BuscaVersoes() { return(await Task.Run(() => { try { ListaSql = new List <Atualizacao>(); RetornoFtp = Ftp.GetFileList(PathSql); //-- Faz a formatação da string e adiciona na lista de SQLs para rodar ListaSql = RetornoFtp.Where(row => row.EndsWith(".sql", StringComparison.OrdinalIgnoreCase)) .Select((row) => new Atualizacao { Versao = Convert.ToInt32(Regex.Replace(row, "[^0-9]+", "")), Arquivo = row, }) .Where(row => row.Versao > AtualizarModel.Versao) .OrderBy(row => row.Versao) .ToList(); //-- Primeira versão Rmenu disponível PrimeiraVersao = ListaSql.OrderBy(x => x.Versao) .Select(x => x.Versao) .FirstOrDefault(); //-- Última versão Rmnu disponível UltimaVersao = ListaSql.OrderByDescending(x => x.Versao) .Select(x => x.Versao) .FirstOrDefault(); return true; } catch (Exception e) { log.Error(e.Message); TelaPrincipal.AbaAtualizacao.LabelContent = "Problemas ao buscar versões."; return false; } })); }
/// <summary> /// Roda Rmenu todos de uma vez e retorna a ultima versão /// </summary> private async Task <bool> AtualizarSql(PostoContext context, bool backup) { return(await Task.Run(async() => { try { await BuscaVersoes(); Rmenu = ""; TelaPrincipal.AbaAtualizacao.LabelContent = "Baixando o Rmenu..."; ListaSql.ForEach(row => { Rmenu += Encoding.ASCII.GetString(Ftp.Download((PathSql + row.Arquivo), TelaPrincipal)); }); if (backup) { TelaPrincipal.AbaAtualizacao.ProgressoBarra2 = 17; if (Rmenu != "") { if (ConfiguracaoModel.DiretorioPostgreSql == "") { throw new Exception("Não definido o diretório para do postgres para a rotina de backup do banco."); } else { TelaPrincipal.AbaAtualizacao.LabelContent = "Gerando backup do banco de dados"; if (!await ExecutaBackup()) { throw new Exception("Ocorreu um erro ao tentar gerar backup antes de atualizar o sistema."); } } } } TelaPrincipal.AbaAtualizacao.ProgressoBarra2 = 25; TelaPrincipal.AbaAtualizacao.IsIndeterminateBarra1 = true; TelaPrincipal.AbaAtualizacao.LabelContent = "Executando Rmenu de v." + AtualizarModel.Versao.ToString() + " até v." + UltimaVersao.ToString() + ""; context.Query(Rmenu).ExecuteNonQuery(); TelaPrincipal.Indicadores.AtualizouBanco = true; TelaPrincipal.AbaAtualizacao.IsIndeterminateBarra1 = false; } catch (Exception e) { context.RollBack(); log.Error(e.Message); TelaPrincipal.AbaAtualizacao.LabelContent = "Problemas ao rodar o Rmenu."; return false; } finally { context.Commit(); if (UltimaVersao <= 0) { UltimaVersao = AtualizarModel.Versao.GetValueOrDefault(); } } return true; })); }