static void Backup() { using (Archive archive = new Archive(GetStore())) { BackupEngine engine = new BackupEngine(archive); engine.Origins.Add(new FileSystemOrigin(originPath)); engine.Progress += delegate(object sender, OriginProgressEventArgs arg) { switch (arg.State) { case State.BeginItem: Console.WriteLine("{0}...", arg.OriginItem.Path); break; case State.Block: if (arg.Total > 0) { Console.WriteLine( " {0} {1}%", arg.Done, arg.Done * 100 / arg.Total ); } else { Console.WriteLine(" {0}", arg.Done); } Console.CursorTop -= 1; break; } }; engine.Run(); } }
public void BackupEngineConstructorDoesNotThrowWhenValidArgumentsAreProvided() { var logger = new MockLogger(); var db = new SQLServerClientDatabase(TestConnectionString, new MockLogger(), SharedMockedCoreSettings); var engine = new BackupEngine(db, logger, 0, SharedMockedCoreSettings); Assert.IsNotNull(engine); }
public void BackupEngineCanStartAndStop() { var logger = new MockLogger(); var db = new SQLServerClientDatabase(TestConnectionString, new MockLogger(), SharedMockedCoreSettings); var engine = new BackupEngine(db, logger, 0, SharedMockedCoreSettings); engine.BeginStart(); engine.BeginStop(); }
/// <summary> /// Starts the backup engines. /// </summary> /// <returns>True if successful, otherwise false.</returns> private async Task <bool> StartBackupEnginesAsync() { // each backup engine instance shares the same logger. // this means a single log file for all engine instances- and each engine will prepend its log messages with a context tag. try { BackupEngineInstances = new List <BackupEngine>(); var instanceCountSettingName = ArchivialLibrary.Constants.RuntimeSettingNames.BackupEngineInstancesCount; var instanceCount = Convert.ToInt32(await ClientDatabase.GetApplicationOptionAsync(instanceCountSettingName).ConfigureAwait(false)); var startupDelaySettingName = ArchivialLibrary.Constants.RuntimeSettingNames.BackupEngineStartupDelayInSeconds; var startupDelaySeconds = Convert.ToInt32(await ClientDatabase.GetApplicationOptionAsync(startupDelaySettingName).ConfigureAwait(false)); for (int i = 0; i < instanceCount; i++) { CoreLog.WriteSystemEvent( string.Format("Waiting {0} seconds between Backup Engine starts to reduce sudden filesystem load.", startupDelaySeconds), EventLogEntryType.Information, ArchivialLibrary.Constants.EventIDs.BackupEngineWaitingForNextStart, true); await Task.Delay(TimeSpan.FromSeconds(startupDelaySeconds)).ConfigureAwait(false); var engineLog = new Logger(string.Format("{0}-{1}", ArchivialLibrary.Constants.Logging.BackupComponentName, i)); engineLog.Start( CoreSettings.GetEventlogName(), CoreSettings.GetEventlogName(), CoreSettings.GetLogFilesDirectory()); var instance = new BackupEngine(ClientDatabase, engineLog, i, CoreSettings); instance.Stopped += Backup_Stopped; instance.BeginStart(); BackupEngineInstances.Add(instance); CoreLog.WriteSystemEvent( string.Format("Backup Engine instance {0} has started.", i), EventLogEntryType.Information, ArchivialLibrary.Constants.EventIDs.StartedBackupEngine, true); } return(true); } catch (Exception ex) { var message = "Failed to start the backup engine."; var context = CoreLog.GenerateFullContextStackTrace(); CoreLog.WriteSystemEvent(message, ex, context, ArchivialLibrary.Constants.EventIDs.FailedBackupEngine, true); return(false); } }
public void BackupEngineTriggersStoppedEventWhenEngineHasStopped() { var logger = new MockLogger(); var db = new SQLServerClientDatabase(TestConnectionString, new MockLogger(), SharedMockedCoreSettings); var engine = new BackupEngine(db, logger, 0, SharedMockedCoreSettings); var signalStoppedEvent = new AutoResetEvent(false); engine.Stopped += (s, e) => { signalStoppedEvent.Set(); }; engine.BeginStart(); engine.BeginStop(); var engineStoppedSignaled = signalStoppedEvent.WaitOne(TimeSpan.FromSeconds(5)); Assert.IsTrue(engineStoppedSignaled); }
protected override async void Execute() { string message; var path = this.OutputDirectory; DirectoryInfo directory; // 出力先ディレクトリのディレクトリ名の検証 try { directory = System.IO.Directory.CreateDirectory(path); } catch (Exception) { await this._DialogService.ShowMessage(MessageBoxButton.OK, Resources.Msg_BackupFailed, null); return; } // 空かどうか検証 if (!this.IsOutputDirectoryEmpty(directory.FullName)) { var result = await this._DialogService.ShowMessage(MessageBoxButton.YesNo, Resources.Msg_DirectoryIsNotEmpty, null); if (result == MessageBoxResult.No) { return; } } var configuration = new BackupConfiguration { Database = this.Database, Files = this.Files, Plugins = this.Plugins, Themes = this.Themes }; try { var progressDialogService = new ProgressDialogService { IsAutoClose = true }; var engine = new BackupEngine(this._BitnamiRedmineService, this._BackupService, this._DispatcherService, this._LogService, configuration, this.Stack, this._OutputDirectory); var report = engine.PrepareBackup(); progressDialogService.Action = () => { engine.ExecuteBackup(); }; progressDialogService.Report = report; await progressDialogService.ShowMessage(null, null); if (progressDialogService.Result == MessageBoxResult.Cancel) { message = Resources.Msg_BackupCancel; await this._DialogService.ShowMessage(MessageBoxButton.OK, message, null); return; } else { message = Resources.Msg_BackupComplete; } } catch (Exception ex) { message = $"Exception is thown. Reason is {ex.Message}"; this._LogService.Error(message); message = $"StackTrace is {ex.StackTrace}"; this._LogService.Error(message); message = Resources.Msg_BackupFailed; await this._DialogService.ShowMessage(MessageBoxButton.OK, message, null); return; } // Update Setting RedmineSetting redmineSetting; var applicationSetting = this.GetApplicationSetting(out redmineSetting); redmineSetting.Backup.Database = configuration.Database; redmineSetting.Backup.Files = configuration.Files; redmineSetting.Backup.Plugins = configuration.Plugins; redmineSetting.Backup.Themes = configuration.Themes; redmineSetting.Backup.BaseDirectory = this.Directory; redmineSetting.Backup.DirectoryName = this.DirectoryName; var history = new BackupHistorySetting { DisplayVersion = this.Stack.DisplayVersion, DateTime = DateTime.UtcNow, OutputDirectory = path }; this._ApplicationSettingService.BackupHistories.Add(history); applicationSetting.BackupHistories.Add(history); this._ApplicationSettingService.UpdateApplicationSetting(applicationSetting); await this._DialogService.ShowMessage(MessageBoxButton.OK, message, null); }
public void BackupEngineConstructorThrowsExceptionWhenNoCoreSettingsProvided() { var db = new SQLServerClientDatabase(TestConnectionString, new MockLogger(), SharedMockedCoreSettings); var engine = new BackupEngine(db, new MockLogger(), 0, null); }
public void BackupEngineConstructorThrowsExceptionWhenNoDatabaseIsProvided() { var engine = new BackupEngine(null, new MockLogger(), 0, SharedMockedCoreSettings); }
private int ExecuteCommandLine(string mode, string version, BackupConfiguration configuration, string output, string name) { // インスタンス生成時点で IoC コンテナを生成し、必要なインジェクションが // 終了している var locator = new ViewModelLocator(); var bitnamiRedmineService = SimpleIoc.Default.GetInstance <IBitnamiRedmineService>(); try { // 自プロセスを親プロセスのコンソールにアタッチ // とりあえず失敗しない前提 SafeNativeMethods.AttachConsole(uint.MaxValue); // stdoutのストリームを取得 var defaultStdout = new IntPtr(7); var currentStdout = SafeNativeMethods.GetStdHandle(SafeNativeMethods.STD_OUTPUT_HANDLE); // リセット if (currentStdout != defaultStdout) { SafeNativeMethods.SetStdHandle(SafeNativeMethods.STD_OUTPUT_HANDLE, defaultStdout); } // これ以降は、普通に Console.WriteLine 等が使える var writer = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true }; Console.SetOut(writer); var redmineStack = bitnamiRedmineService.GetBitnamiRedmineStacks(). FirstOrDefault(stack => stack.DisplayVersion.Equals(version)); // 指定した引数のバージョンの Redmine が見つからなかった if (redmineStack == null) { Console.WriteLine($"Specified Redmine version '{version}' is not found."); return(ArgumentError); } switch (mode.ToLowerInvariant()) { case "backup": { // フォルダが存在しない場合もあるので作成 output = Utility.GetSanitizedDirectoryPath(redmineStack, Path.Combine(output, name)); if (!Directory.Exists(output)) { Directory.CreateDirectory(output); } Console.WriteLine($"Start backup to '{output}'..."); var engine = new BackupEngine(bitnamiRedmineService, SimpleIoc.Default.GetInstance <IBackupService>(), null, SimpleIoc.Default.GetInstance <ILogService>(), configuration, redmineStack, output); var report = engine.PrepareBackup(); engine.ExecuteBackup(); // プログレスの変更のイベントをサブスクライブしてコンソールに進捗状況を表示する? //progressDialogService.Action = () => //{ //}; } return(Success); case "restore": { Console.WriteLine($"Start restore from '{output}'..."); var engine = new RestoreEngine(SimpleIoc.Default.GetInstance <IBitnamiRedmineService>(), SimpleIoc.Default.GetInstance <IBackupService>(), null, SimpleIoc.Default.GetInstance <ILogService>(), configuration, redmineStack, output); var report = engine.PrepareRestore(); engine.ExecuteRestore(); // プログレスの変更のイベントをサブスクライブしてコンソールに進捗状況を表示する? //progressDialogService.Action = () => //{ //}; } return(Success); default: Console.WriteLine($"Argument '{mode}' is invalid."); return(ArgumentError); } } finally { SafeNativeMethods.FreeConsole(); } }