/// <summary> /// Downloads the configuration database. /// </summary> private void DownloadBase() { transferControl.ThrowIfCancellationRequested(); transferControl.WriteLine(); transferControl.WriteMessage(AdminPhrases.DownloadBase); GetTempFileName(out string tempFileName, out string extractDir); agentClient.DownloadConfig(tempFileName, TopFolder.Base); ExtractArchive(tempFileName, extractDir, false); foreach (IBaseTable baseTable in project.ConfigDatabase.AllTables) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(string.Format(ExtensionPhrases.ImportTable, baseTable.Name)); string datFileName = Path.Combine(extractDir, "BaseDAT", baseTable.FileNameDat); if (File.Exists(datFileName)) { BaseTableAdapter baseAdapter = new() { FileName = datFileName }; IBaseTable srcTable = BaseTableFactory.GetBaseTable(baseTable); baseAdapter.Fill(srcTable); baseTable.Modified = true; foreach (object item in srcTable.EnumerateItems()) { baseTable.AddObject(item); } } } progressTracker.TaskIndex++; }
/// <summary> /// Sends the command to the service. /// </summary> private void ControlService(ServiceApp serviceApp, ServiceCommand cmd) { string cmdFormat = cmd switch { ServiceCommand.Start => AdminPhrases.StartNamedService, ServiceCommand.Stop => AdminPhrases.StopNamedService, ServiceCommand.Restart => AdminPhrases.RestartNamedService, _ => throw new ScadaException("Unknown service control command.") }; transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(string.Format(cmdFormat, ScadaUtils.GetAppName(serviceApp))); if (agentClient.ControlService(serviceApp, cmd, ProcessTimeout)) { transferControl.WriteMessage(AdminPhrases.ServiceCommandCompleted); } else { transferControl.WriteError(AdminPhrases.ServiceCommandFailed); } }
/// <summary> /// Downloads the configuration database. /// </summary> private void DownloadBase() { transferControl.ThrowIfCancellationRequested(); transferControl.WriteLine(); transferControl.WriteMessage(AdminPhrases.DownloadBase); progressTracker.SubtaskCount = project.ConfigDatabase.AllTables.Length; foreach (IBaseTable baseTable in project.ConfigDatabase.AllTables) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(string.Format(ExtensionPhrases.DownloadTable, baseTable.Name)); ReadBaseTable(baseTable, conn); progressTracker.SubtaskIndex++; } progressTracker.TaskIndex++; }
/// <summary> /// Creates a database schema. /// </summary> private void CreateSchema() { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(ExtensionPhrases.CreateSchema); string sql = "CREATE SCHEMA IF NOT EXISTS " + Schema; new NpgsqlCommand(sql, conn).ExecuteNonQuery(); progressTracker.TaskIndex++; }
/// <summary> /// Compresses the configuration into the specified file. /// </summary> private void CompressConfig(string destFileName) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteLine(); transferControl.WriteMessage(ExtensionPhrases.CompressConfig); // archive path separator is '/' FileStream fileStream = null; ZipArchive zipArchive = null; try { fileStream = new FileStream(destFileName, FileMode.Create, FileAccess.Write, FileShare.Read); zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create); bool ignoreRegKeys = uploadOptions.IgnoreRegKeys; bool filterByObj = uploadOptions.ObjectFilter.Count > 0; // archive the configuration database if (uploadOptions.IncludeBase) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(ExtensionPhrases.CompressBase); foreach (IBaseTable srcTable in project.ConfigDatabase.AllTables) { transferControl.ThrowIfCancellationRequested(); // filter source table by objects if needed IBaseTable baseTable = srcTable; if (filterByObj) { if (srcTable.ItemType == typeof(Cnl)) { baseTable = GetFilteredTable <Cnl>(srcTable, uploadOptions.ObjectFilter); } else if (srcTable.ItemType == typeof(View)) { baseTable = GetFilteredTable <View>(srcTable, uploadOptions.ObjectFilter); } } // convert table to DAT format using Stream entryStream = zipArchive.CreateEntry("BaseDAT/" + srcTable.FileNameDat, CompressionLevel.Fastest).Open(); BaseTableAdapter baseAdapter = new() { Stream = entryStream }; baseAdapter.Update(baseTable); } } // archive views if (uploadOptions.IncludeView) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(ExtensionPhrases.CompressViews); if (filterByObj) { PackFiles(zipArchive, project.Views.ViewDir, GetFilteredViews(project.ConfigDatabase.ViewTable, project.Views.ViewDir, uploadOptions.ObjectFilter), "Views/"); } else { PackDirectory(zipArchive, project.Views.ViewDir, "Views/", ignoreRegKeys); } } // archive Server configuration if (uploadOptions.IncludeServer && instance.ServerApp.Enabled) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(string.Format(ExtensionPhrases.CompressAppConfig, CommonPhrases.ServerAppName)); PackDirectory(zipArchive, instance.ServerApp.AppDir, "ScadaServer/", ignoreRegKeys); } // archive Communicator configuration if (uploadOptions.IncludeComm && instance.CommApp.Enabled) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(string.Format(ExtensionPhrases.CompressAppConfig, CommonPhrases.CommAppName)); PackDirectory(zipArchive, instance.CommApp.AppDir, "ScadaComm/", ignoreRegKeys); } // archive Webstation configuration if (uploadOptions.IncludeWeb && instance.WebApp.Enabled) { transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(string.Format(ExtensionPhrases.CompressAppConfig, CommonPhrases.WebAppName)); PackDirectory(zipArchive, instance.WebApp.AppDir, "ScadaWeb/", ignoreRegKeys); } // add project information transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(ExtensionPhrases.AddProjectInfo); using (Stream entryStream = zipArchive.CreateEntry(AgentConst.ProjectInfoEntry, CompressionLevel.Fastest).Open()) { using StreamWriter writer = new(entryStream, Encoding.UTF8); writer.Write(project.GetInfo()); } // add transfer options transferControl.ThrowIfCancellationRequested(); transferControl.WriteMessage(ExtensionPhrases.AddTransferOptions); using (Stream entryStream = zipArchive.CreateEntry(AgentConst.UploadOptionsEntry, CompressionLevel.Fastest).Open()) { uploadOptions.Save(entryStream); } progressTracker.TaskIndex++; } finally { zipArchive?.Dispose(); fileStream?.Dispose(); } }