Esempio n. 1
0
 public async Task <IActionResult> Get(Guid id)
 {
     return(Ok(await metaDB.GetBackup(id)));
 }
Esempio n. 2
0
        public async Task Run(Guid serverId, string[] items, CancellationToken ctoken = default)
        {
            if (backup != null)
            {
                return;
            }

            this.ctoken = ctoken;

            var server = await metaDB.GetWindowsServer(serverId, withcreds : true);

            agentProxy = new WindowsProxy(server.Ip, server.Username, server.Password)
            {
                BackupServiceCallback = this
            };

            backup = new DBBackup {
                Server = serverId, StartDate = DateTime.Now.ToUniversalTime(), Status = Status.Running, Log = new List <string>()
            };
            backup.Id = await metaDB.AddBackup(backup);

            backupStatus = Status.Successful;

            IObserver <CancellationTokenSource> observer = default;

            Observable.Interval(TimeSpan.FromSeconds(5)).TakeUntil(
                Observable.Create <CancellationTokenSource>(o =>
            {
                observer = o;
                return(() => { });
            }))
            .Subscribe(_ =>
            {
                var b = metaDB.GetBackup(backup.Id).GetAwaiter().GetResult();
                if (b.Status == Status.Cancelled)
                {
                    ctokenCancelBackup.Cancel();
                    observer.OnNext(ctokenCancelBackup);
                }
            });

            try
            {
                await agentProxy.Backup(items, backup.Id);

                foreach (var item in itemsQueue.GetConsumingEnumerable(ctoken))
                {
                    switch (item.Type)
                    {
                    case BackupItemType.File:
                    {
                        await BackupFile(item);
                    }
                    break;

                    case BackupItemType.Folder:
                    {
                        await BackupFolder(item);
                    }
                    break;
                    }
                }
            }
            catch (EndpointNotFoundException)
            {
                backup.AppendLog($"Cannot connect to server {server.Name} [{server.Ip}]");
                backupStatus = Status.Failed;
            }
            catch (OperationCanceledException)
            {
                backupStatus = Status.Cancelled;
            }
            catch (Exception e)
            {
                backup.AppendLog($"General Error: {e.Message}");
                backupStatus = Status.Failed;
            }
            finally
            {
                try
                {
                    await agentProxy.BackupComplete(backup.Id);
                }
                catch (Exception) { }

                backup.Status  = backupStatus;
                backup.EndDate = DateTime.Now.ToUniversalTime();
                await metaDB.AddBackup(backup);
            }

            Console.WriteLine($"{DateTime.Now} - Backup ended");
            Console.WriteLine($"{DateTime.Now} - Status: {backup.Status}");

            backup = null;
        }