Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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();
        }
Example #4
0
        /// <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);
            }
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        public void BackupEngineConstructorThrowsExceptionWhenNoCoreSettingsProvided()
        {
            var db = new SQLServerClientDatabase(TestConnectionString, new MockLogger(), SharedMockedCoreSettings);

            var engine = new BackupEngine(db, new MockLogger(), 0, null);
        }
Example #8
0
 public void BackupEngineConstructorThrowsExceptionWhenNoDatabaseIsProvided()
 {
     var engine = new BackupEngine(null, new MockLogger(), 0, SharedMockedCoreSettings);
 }
Example #9
0
        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();
            }
        }