public void RefreshMyTreeView(MyBackup backup)
        {
            //foreach (var backup in MyBackup.MyBackups.OrderBy(x => x.MyIndex))
            {
                TreeNode node;
                if (MyTreeView.Nodes.ContainsKey(backup.MyIndex.ToString()))
                {
                    node = MyTreeView.Nodes[backup.MyIndex.ToString()];
                }
                else
                {
                    node = new TreeNode()
                    {
                        //BackColor = Color.LightSkyBlue,
                        Tag        = backup,
                        Name       = backup.MyIndex.ToString(),
                        ImageIndex = 0,
                    }
                };

                var rem      = ToReadableString(GetRemainingTime(backup, out long At));
                var RebeatAt = new DateTime(At);

                node.Text = backup.BackupName + Environment.NewLine +
                            RebeatAt.ToString("dd MMM yy hh:mm tt") + Environment.NewLine +
                            rem;

                if (!MyTreeView.Nodes.Contains(node))
                {
                    MyTreeView.Nodes.Add(node);
                }
            }
        }
        private async Task RestoreBackup(MyBackup backup)
        {
            var rnd           = new Random();
            var restoreDbName =
                $"Restored_{new string(Enumerable.Repeat(_chars, rnd.Next(5, 10)).Select(x => x[rnd.Next(x.Length)]).ToArray())}";

            var restoreConfig = new RestoreBackupConfiguration
            {
                DatabaseName   = restoreDbName,
                BackupLocation = backup.BackupPath
            };
            var restoreBackupTask = new RestoreBackupOperation(restoreConfig);

            using (var session = DocumentStore.OpenAsyncSession())
            {
                var succeeded = true;
                try
                {
                    ReportInfo($"Starting to restore DB: {restoreDbName}");
                    var re = DocumentStore.GetRequestExecutor(DocumentStore.Database);
                    var restoreBackupTaskCommand = restoreBackupTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context);
                    await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag == backup.BackupStatus.NodeTag),
                                          null, session.Advanced.Context, restoreBackupTaskCommand, shouldRetry : false);

                    var getOperationStateTask        = new GetOperationStateOperation(restoreBackupTaskCommand.Result.OperationId);
                    var getOperationStateTaskCommand = getOperationStateTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context);

                    await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag == backup.BackupStatus.NodeTag),
                                          null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false);

                    while (getOperationStateTaskCommand.Result.Status == OperationStatus.InProgress)
                    {
                        await Task.Delay(2000);

                        await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag == backup.BackupStatus.NodeTag),
                                              null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false);
                    }
                }
                catch (Exception e)
                {
                    ReportFailure($"Restoring DB: {restoreDbName} Failed", e);
                    succeeded = false;
                }

                for (var i = 0; i < MyBackupsList.Count; i++)
                {
                    if (MyBackupsList[i].BackupTaskId == backup.BackupTaskId)
                    {
                        MyBackupsList[i].RestoreResult = succeeded ? RestoreResult.Succeeded : RestoreResult.Failed;
                        break;
                    }
                }
            }
        }
        private void DeleteBackup_Click(object sender, EventArgs e)
        {
            var backup = (MyBackup)MyParentPanel.Tag;

            if (backup.MyIndex > 0)
            {
                if (MessageBox.Show("Are you sure? You want to delete the backup permanently?", "Delete Backup", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes)
                {
                    return;
                }

                MyTreeView.Nodes.RemoveByKey(backup.MyIndex.ToString());
                //MyBackup.MyBackups.Remove(backup);
                MyBackup.DeleteBackup(backup);
            }

            CloseBackup.PerformClick();
        }
        public static TimeSpan GetRemainingTime(MyBackup backup, out long RebeatAt)
        {
            if (backup == null)
            {
                RebeatAt = 0;
                return(new TimeSpan());
            }

            var LastBackup = new DateTime(backup.LastBackup);

            if (backup.Repeat)
            {
                int Days       = 0;
                var RepeatTime = backup.RepeatTime;
                //if (!backup.RepeatDay(DateTime.Now.DayOfWeek) || (backup.RepeatDay(DateTime.Now.DayOfWeek) && new TimeSpan(LastBackup.Hour, LastBackup.Minute, 0) > RepeatTime))
                if (!backup.RepeatDay(LastBackup.DayOfWeek) || (backup.RepeatDay(LastBackup.DayOfWeek) && LastBackup >= DateTime.Today.Add(RepeatTime)))
                {
                    for (int i = 1; i < 7; i++)
                    {
                        var backdate = LastBackup.AddDays(i);
                        if (backup.RepeatDay(backdate.DayOfWeek))
                        {
                            Days = i;
                            break;
                        }
                    }
                }
                var RepeatAfter = DateTime.Now.Date.Add(RepeatTime).AddDays(Days); //TimeSpan(Days, RepeatTime.Hours, );//NextBackup
                RebeatAt = RepeatAfter.Ticks;                                      //RepeatAfter.Ticks + LastBackup.Ticks;
            }
            else //backup.Specific
            {
                RebeatAt = backup.SpecificAfter.Ticks + LastBackup.Ticks;
            }

            return(TimeSpan.FromTicks(RebeatAt - DateTime.Now.Ticks));
        }
Exemple #5
0
        private async Task RestoreBackup(MyBackup backup)
        {
            var rnd           = new Random();
            var restoreDbName =
                $"Restored_{new string(Enumerable.Repeat(_chars, rnd.Next(5, 10)).Select(x => x[rnd.Next(x.Length)]).ToArray())}";

            var restoreConfig = new RestoreBackupConfiguration
            {
                DatabaseName   = restoreDbName,
                BackupLocation = backup.BackupPath
            };
            var restoreBackupTask = new RestoreBackupOperation(restoreConfig);

            using (var session = DocumentStore.OpenAsyncSession())
            {
                var reasonableTimeForBackup = Stopwatch.StartNew();
                var succeeded = true;
                try
                {
                    ReportInfo($"Starting to restore DB: {restoreDbName}");
                    var re = DocumentStore.GetRequestExecutor(DocumentStore.Database);
                    var restoreBackupTaskCommand =
                        restoreBackupTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context);
                    await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag.Equals(backup.BackupStatus.NodeTag)),
                                          null, session.Advanced.Context, restoreBackupTaskCommand, shouldRetry : false)
                    .ConfigureAwait(false);

                    var getOperationStateTask =
                        new GetOperationStateOperation(restoreBackupTaskCommand.Result.OperationId);
                    var getOperationStateTaskCommand =
                        getOperationStateTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context);

                    await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag.Equals(backup.BackupStatus.NodeTag)),
                                          null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false)
                    .ConfigureAwait(false);

                    while (getOperationStateTaskCommand.Result == null || getOperationStateTaskCommand.Result.Status == OperationStatus.InProgress)
                    {
                        await Task.Delay(2000).ConfigureAwait(false);

                        await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag.Equals(backup.BackupStatus.NodeTag)),
                                              null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false)
                        .ConfigureAwait(false);

                        if (reasonableTimeForBackup.Elapsed > TimeSpan.FromMinutes(5))
                        {
                            ReportFailure($"Restoring DB: {restoreDbName} Failed, taskID {backup.BackupTaskId} - Waited {reasonableTimeForBackup.Elapsed} and task didn't finished", null);
                            succeeded = true; // marking as success in order to delete
                            // TODO : RavenDB-13684
                            break;
                        }
                    }
                }
                catch (RavenException re)
                {
                    if (re.InnerException is ArgumentException ae)
                    {
                        ReportInfo($"Probably somebody deleted the backup files, taskID {backup.BackupTaskId}, exception: {ae}");
                    }
                    else
                    {
                        ReportFailure($"Restoring DB: {restoreDbName} Failed, taskID {backup.BackupTaskId}", re);
                    }
                }
                catch (Exception e)
                {
                    ReportFailure($"Restoring DB: {restoreDbName} Failed, taskID {backup.BackupTaskId}", e);
                    succeeded = false;
                }

                if (succeeded)
                {
                    MyRestoreDbsList.Add(restoreDbName);
                }

                for (var i = 0; i < MyBackupsList.Count; i++)
                {
                    if (MyBackupsList[i].BackupTaskId == backup.BackupTaskId)
                    {
                        MyBackupsList[i].RestoreResult = succeeded ? RestoreResult.Succeeded : RestoreResult.Failed;
                        break;
                    }
                }
            }
        }
 static void Worker_DoWork(object sender, DoWorkEventArgs e)
 {
     MyBackup.LoadBackups(mainMenu);
 }
Exemple #7
0
 public BackupStatus(MyBackup myBackup)
 {
     this.myBackup = myBackup;
     InitializeComponent();
 }
        private void MyBackupTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (this.TimerInUse)
            {
                return;
            }
            this.TimerInUse = true;

            for (int i = 0; i < MyBackup.MyBackups.Count; i++)
            {
                var backup = MyBackup.MyBackups[i];

                if (backup.IsEnabled)
                {
                    var Remaining = GetRemainingTime(backup, out long At);
                    if (Remaining.TotalSeconds <= 0)
                    {
                        string FileName = backup.BackupName +
                                          "_" +
                                          backup.Database +
                                          "_" +
                                          DateTime.Now.ToString() + ".bak";

                        Vars.GiveEveryoneAccessControl(backup.BackupPath);

                        FileName = Vars.RemoveInvalidFileNameChars(FileName);
                        var path = Path.Combine(backup.BackupPath, FileName);

                        var ConnectionString = SQLFunctions.GetConnectionString(backup.Host, backup.Database, backup.Authentication, backup.Username, backup.Password);

                        var backupResult = SQLFunctions.BackupNow(path, ConnectionString);
                        var backupState  = new BackupState()
                        {
                            backup                = backup,
                            BackupDateTime        = DateTime.Now.Ticks,
                            DefaultBackupDateTime = At,
                            FullPath              = path,
                            Warning               = backupResult != null,
                        };

                        if (backupResult != null)
                        {
                            backupState.WarningMessage = backupResult.Message;
                            backupState.FullWarning    = backupResult.ToString();
                        }
                        MyBackup.SaveBackupState(backupState);
                        backup.LastBackup = DateTime.Now.Ticks;
                        MyBackup.SaveBackup(backup);
                    }
                }

                if (this.MyTreeView.InvokeRequired)
                {
                    this.MyTreeView.BeginInvoke((MethodInvoker) delegate()
                    {
                        this.RefreshMyTreeView(backup);
                    });
                }
                else
                {
                    this.RefreshMyTreeView(backup);
                }
            }

            this.TimerInUse = false;
        }
        public void ShowBackup(MyBackup backup, bool Clone = false)
        {
            if (MyParentPanel.Visible)
            {
                //MessageBox.Show("");
            }

            MyParentPanel.Visible = false;

            if (backup == null)
            {
                MyTreeView.SelectedNode = null;
                CloneBackup.Visible     = BackupStatusBtn.Visible = false;
                backup = new MyBackup();
            }
            else
            {
                CloneBackup.Visible = BackupStatusBtn.Visible = true;
            }

            if (!Clone)
            {
                //Backup Options
                IsEnabledBox.Checked = backup.IsEnabled;
                BackupNameTxt.Text   = backup.BackupName;


                //SQL Connection
                if (backup.Host.Length > 0 && !HostCoBox.Items.Contains(backup.Host))
                {
                    HostCoBox.Items.Add(backup.Host);
                }

                if (backup.Host.Length > 0)
                {
                    HostCoBox.SelectedItem = backup.Host;
                }
                else
                {
                    HostCoBox.SelectedIndex = -1;
                }


                if (backup.Database.Length > 0 && !DBCoBox.Items.Contains(backup.Database))
                {
                    DBCoBox.Items.Add(backup.Database);
                }

                if (backup.Database.Length > 0)
                {
                    DBCoBox.SelectedItem = backup.Database;
                }
                else
                {
                    DBCoBox.SelectedIndex = -1;
                }


                if (backup.Authentication)
                {
                    AuthCoBox.SelectedIndex = 1;
                }
                else
                {
                    AuthCoBox.SelectedIndex = 0;
                }

                UsernameTxt.Text  = backup.Username;
                PassTxt.Text      = backup.Password;
                SaveCkBox.Checked = backup.SavePassword;

                //Backup Path
                BackupPathTxt.Text = backup.BackupPath;


                //Backup Repeat Datetime
                RepeatRadio.Checked = backup.Repeat;
                var time = new DateTime(backup.Time);
                TimePicker.Value = new DateTime(1753, 1, 1, time.Hour, time.Minute, 0);
                SatBox.Checked   = backup.Sat;
                SunBox.Checked   = backup.Sun;
                MonBox.Checked   = backup.Mon;
                TueBox.Checked   = backup.Tue;
                WedBox.Checked   = backup.Wed;
                ThuBox.Checked   = backup.Thu;
                FriBox.Checked   = backup.Fri;


                //Backup Specific Datetime
                SpecificRadio.Checked = backup.Specific;
                SpecificNum.Value     = backup.Every;
                MinutesRadio.Checked  = backup.SpecificType == MyBackup.SpecificTypes.Minutes;
                HoursRadio.Checked    = backup.SpecificType == MyBackup.SpecificTypes.Hours;
                DaysRadio.Checked     = backup.SpecificType == MyBackup.SpecificTypes.Days;
                WeeksRadio.Checked    = backup.SpecificType == MyBackup.SpecificTypes.Weeks;
                MonthsRadio.Checked   = backup.SpecificType == MyBackup.SpecificTypes.Months;
                //YearsRadio.Checked = backup.SpecificType == MyBackup.SpecificTypes.Years;
            }
            MyParentPanel.Tag     = backup;
            MyParentPanel.Visible = true;
        }
        private void SaveBackup_Click(object sender, EventArgs e)
        {
            var BackupName = BackupNameTxt.Text.Trim();

            #region Save Validation
            int index = ((MyBackup)MyParentPanel.Tag).MyIndex;
            if (BackupName.Length == 0)
            {
                MessageBox.Show("Please write a valid Backup Name!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                BackupNameTxt.Focus();
                return;
            }
            else if (MyBackup.MyBackups.Exists(x => x.BackupName.ToLower() == BackupName.ToLower() && x.MyIndex != index))
            {
                MessageBox.Show("Backup Name is already exists!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                BackupNameTxt.Focus();
                return;
            }
            else if (!SQLFunctions.TestConnection(false, HostCoBox.Text, DBCoBox.Text, AuthCoBox.SelectedIndex == 1, AuthCoBox.SelectedIndex == 0 ? UsernameTxt.Text : string.Empty, AuthCoBox.SelectedIndex == 0 ? PassTxt.Text : string.Empty, out _, out string ExcMessage))
            {
                MessageBox.Show(ExcMessage, "SQL ConnectionString Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                HostCoBox.Focus();
                return;
            }
            else if (BackupPathTxt.Text.Length == 0 || !Directory.Exists(BackupPathTxt.Text))
            {
                MessageBox.Show("Please select a valid Backup Path!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                BackupPathTxt.Focus();
                return;
            }
            else if (!RepeatRadio.Checked && !SpecificRadio.Checked)
            {
                MessageBox.Show("Please select a valid Backup Schedule!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                RepeatRadio.Focus();
                return;
            }
            else if (RepeatRadio.Checked)
            {
                if (!SatBox.Checked && !SunBox.Checked && !MonBox.Checked && !TueBox.Checked && !WedBox.Checked && !ThuBox.Checked && !FriBox.Checked)
                {
                    MessageBox.Show("Please select one day schedule at least!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    SatBox.Focus();
                    return;
                }
            }
            else if (SpecificRadio.Checked)
            {
                if (!MinutesRadio.Checked && !HoursRadio.Checked && !DaysRadio.Checked && !WeeksRadio.Checked && !MonthsRadio.Checked)//YearsRadio
                {
                    MessageBox.Show("Please select a schedule type!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    MinutesRadio.Focus();
                    return;
                }
            }
            #endregion

            var backup = (MyBackup)MyParentPanel.Tag;

            //Backup Options
            backup.IsEnabled  = IsEnabledBox.Checked;
            backup.BackupName = BackupName;

            //SQL Connection
            string host;
            if (HostCoBox.SelectedItem != null)
            {
                host = HostCoBox.SelectedItem.ToString();
            }
            else
            {
                host = HostCoBox.SelectedText;
            }
            backup.Host = host;

            string db;
            if (DBCoBox.SelectedItem != null)
            {
                db = DBCoBox.SelectedItem.ToString();
            }
            else
            {
                db = DBCoBox.SelectedText;
            }
            backup.Database = db;

            backup.Authentication = AuthCoBox.SelectedIndex == 1;
            backup.Username       = UsernameTxt.Text;
            backup.Password       = PassTxt.Text;
            backup.SavePassword   = SaveCkBox.Checked;

            //Backup Path
            backup.BackupPath = BackupPathTxt.Text;

            //Backup Repeat Datetime
            backup.Repeat = RepeatRadio.Checked;
            backup.Time   = new TimeSpan(TimePicker.Value.Hour, TimePicker.Value.Minute, 0).Ticks;//new TimeSpan(TimePicker.Value.Hour == 0 ? 1 : 0, TimePicker.Value.Hour, TimePicker.Value.Minute, 0).Ticks;
            backup.Sat    = SatBox.Checked;
            backup.Sun    = SunBox.Checked;
            backup.Mon    = MonBox.Checked;
            backup.Tue    = TueBox.Checked;
            backup.Wed    = WedBox.Checked;
            backup.Thu    = ThuBox.Checked;
            backup.Fri    = FriBox.Checked;

            //Backup Specific Datetime
            backup.Specific = SpecificRadio.Checked;
            backup.Every    = SpecificNum.Value;
            if (MinutesRadio.Checked)
            {
                backup.SpecificType = SpecificTypes.Minutes;
            }
            else if (HoursRadio.Checked)
            {
                backup.SpecificType = SpecificTypes.Hours;
            }
            else if (DaysRadio.Checked)
            {
                backup.SpecificType = SpecificTypes.Days;
            }
            else if (WeeksRadio.Checked)
            {
                backup.SpecificType = SpecificTypes.Weeks;
            }
            else if (MonthsRadio.Checked)
            {
                backup.SpecificType = SpecificTypes.Months;
            }
            //Years

            if (index == 0 || backup.LastBackup < 1)
            {
                backup.LastBackup = DateTime.Now.Ticks;
            }

            MyBackup.SaveBackup(backup);
            RefreshMyTreeView(backup);
            MessageBox.Show("Backup settings have been saved successfully.", "Backup settings", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }