Beispiel #1
0
        private async Task deleteAllPreviousData(CTUClient client)
        {
            List <Client.Json.CtuWirelessUnit> toRemove = await client.GetMyStationsAsync();

            List <string> alreadyRemoved = new List <string>();

            foreach (var item in toRemove)
            {
                if (!alreadyRemoved.Contains(item.Id))
                {
                    await client.DeleteConnectionAsync(item.Id);

                    alreadyRemoved.Add(item.IdStationPair);
                }
            }
        }
Beispiel #2
0
        private async Task DoWork(CancellationToken cancellationToken)
        {
            logger.LogInformation($"Launching CTU60G, current version: {Assembly.GetExecutingAssembly().GetName().Version}");
            SourceDataType sourceDataType = default;

            mailing = CheckEmailOptionValues();
            if (await CheckWorkerOptionValues(cancellationToken, sourceDataType))
            {
                logger.LogInformation($"Synchronization type set to: {workerOptions.Synchronization }");
                string msg = $"Run type set to: {workerOptions.Run}";
                msg += (workerOptions.Run == RunTypeEnum.InSpecifedTime.ToString()) ? $", app will run every day in {workerOptions.RunTimeSpecification.Hours}:{workerOptions.RunTimeSpecification.Minutes}":"";
                msg += (workerOptions.Run == RunTypeEnum.AfterSpecifedTime.ToString()) ? $", app will run always after {workerOptions.RunTimeSpecification}":"";
                logger.LogInformation(msg);
                do
                {
                    //Loading source data from file or url
                    logger.LogInformation("Loading data");
                    string loadedData = default;
                    try
                    {
                        loadedData = await LoadData(sourceDataType);
                    }
                    catch (Exception e)
                    {
                        logger.LogError("Could not obtain source data, exception message:\n {0}.", e.Message);
                        TaskCompletionSource.SetResult(false);
                        appLifetime.StopApplication();
                        return;
                    }

                    //parsing loaded source data
                    logger.LogInformation("parsing loaded data");
                    List <WirelessSite> parsedSites = await ParseData(cancellationToken, loadedData);

                    cancellationToken.ThrowIfCancellationRequested();
                    try
                    {
                        logger.LogInformation("LoggingIn");
                        using (CTUClient client = new CTUClient(workerOptions.CTULogin, workerOptions.CTUPass, workerOptions.SignalIsolationConsentIfMyOwn))
                        {
                            logger.LogInformation("LoggedIn");
                            OnSiteData ctuMetaData = new OnSiteData(await client.GetMyStationsAsync());

                            foreach (var site in parsedSites)
                            {
                                cancellationToken.ThrowIfCancellationRequested();
                                if ((DateTime.Now - ctuMetaData.LasTimeRefreshed).TotalSeconds > 10)
                                {
                                    ctuMetaData.Refresh(await client.GetMyStationsAsync());
                                }

                                if (site.Infos.SiteType == "ptp")
                                {
                                    List <P2PSite> pairs = (ProcessWUnitCreation(site) as List <P2PSite>);
                                    if (pairs != null)
                                    {
                                        foreach (var pair in pairs)
                                        {
                                            RegistrationJournal regJournal = default;
                                            if (pair.StationB.CTUId > 0) // update already existing site
                                            {
                                                ProcessRegistrationJournal(regJournal = await client.UpdatePTPConnectionAsync(pair), site);
                                            }
                                            else // create new site
                                            {
                                                ProcessRegistrationJournal(regJournal = await client.AddPTPSiteAsync(pair), site);
                                                if (regJournal.Phase == RegistrationJournalPhaseEnum.Published && !string.IsNullOrEmpty(workerOptions.ResponseWithCTUID))
                                                {
                                                    HttpClient          cl = new HttpClient();
                                                    HttpResponseMessage rm = await cl.GetAsync(workerOptions.ResponseWithCTUID + $"&id={pair.StationA.OwnerId}&ctuId={regJournal.RegistrationId}");

                                                    HttpResponseMessage rm2 = await cl.GetAsync(workerOptions.ResponseWithCTUID + $"&id={pair.StationB.OwnerId}&ctuId={regJournal.RegistrationId}");
                                                }
                                            }
                                        }
                                    }
                                }
                                else if (site.Infos.SiteType == "ptmp")
                                {
                                    WigigPTMPUnitInfo wigig = (ProcessWUnitCreation(site) as WigigPTMPUnitInfo);
                                    if (wigig != null)
                                    {
                                        ProcessRegistrationJournal(await client.AddWIGIG_PTP_PTMPConnectionAsync(wigig), site);
                                    }
                                }
                                else if (site.Infos.SiteType == "delete" && workerOptions.Synchronization == SynchronizationTypeEnum.Manual.ToString())
                                {
                                    ProcessDeletion(site, client);
                                }
                                else
                                {
                                    logger.LogWarning($"{site.Infos.Ssid} site type is missing or has unrecognizable value, dont know where to publish:\n" +
                                                      $"original source:\n" +
                                                      JsonConvert.SerializeObject(site, Formatting.Indented));
                                }
                            }
                        }
                    }
                    catch (InvalidMailOrPasswordException)
                    {
                        logger.LogError("Invalid login credentials");
                        TaskCompletionSource.SetResult(false);
                        appLifetime.StopApplication();
                        return;
                    }
                    catch (WebServerException e)
                    {
                        logger.LogError($"Web server exception occured during comunication with ctu\n{e.Message} {e.Status.ToString()}\n {e.StackTrace}");
                        TaskCompletionSource.SetResult(false);
                        appLifetime.StopApplication();
                        return;
                    }
                    catch (OperationCanceledException e)
                    {
                        logger.LogError($"Task was stopped as respond to system signal\n{e.Message}");
                        TaskCompletionSource.SetResult(false);
                        appLifetime.StopApplication();
                        return;
                    }
                    catch (Exception e)
                    {
                        logger.LogError($"unknown exception occured during login\n{e.Message}\n {e.StackTrace}");
                        logger.LogInformation(e.Message);
                        logger.LogWarning("Shuting service down");
                        TaskCompletionSource.SetResult(false);
                        appLifetime.StopApplication();
                        return;
                    }

                    if (workerOptions.Run == RunTypeEnum.AfterSpecifedTime.ToString())
                    {
                        Log.Information($"task goes to sleep, will resume at {DateTime.Now + workerOptions.RunTimeSpecification}");
                        await Task.Delay(workerOptions.RunTimeSpecification, cancellationToken);
                    }
                    if (workerOptions.Run == RunTypeEnum.InSpecifedTime.ToString())
                    {
                        TimeSpan timeToWait = DateTime.Today + workerOptions.RunTimeSpecification - DateTime.Now;
                        if (timeToWait < TimeSpan.Zero)
                        {
                            timeToWait += new TimeSpan(1, 0, 0, 0);
                        }
                        Log.Information($"task goes to sleep, will resume at {DateTime.Now + timeToWait}");
                        await Task.Delay(timeToWait, cancellationToken);
                    }
                }while (!cancellationToken.IsCancellationRequested && (RunTypeEnum)Enum.Parse(typeof(RunTypeEnum), workerOptions.Run) != RunTypeEnum.Once);
                logger.LogInformation("allDone");
            }



            void ProcessRegistrationJournal(RegistrationJournal regJournal, WirelessSite site)
            {
                using (LogContext.PushProperty("phase", regJournal.Phase.ToString()))
                    using (LogContext.PushProperty("type", regJournal.Type.ToString()))
                        using (LogContext.PushProperty("id", regJournal.RegistrationId))
                        {
                            switch (regJournal.Phase)
                            {
                            case RegistrationJournalPhaseEnum.InputValidation:
                            {
                                logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to Invalid values\n" +
                                                  "No records were created/updated");
                            }
                            break;

                            case RegistrationJournalPhaseEnum.Localization:
                            {
                                if (regJournal.ThrownException.GetType() == typeof(WebServerException))
                                {
                                    logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to unexpected web behaviour\n" +
                                                      $"No record were created");
                                }
                                else
                                {
                                    logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to unexpected behaviour\n" +
                                                      $"No record were created");
                                }
                            }
                            break;

                            case RegistrationJournalPhaseEnum.TechnicalSpecification:
                            {
                                using (LogContext.PushProperty("record", "Draft"))
                                {
                                    if (regJournal.ThrownException.GetType() == typeof(WebServerException))
                                    {
                                        logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to unexpected web behaviour\n" +
                                                          "Record is now in state {record}");
                                    }
                                    else
                                    {
                                        logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to unexpected behaviour\n" +
                                                          "Record is now in state {record}");
                                    }
                                }
                            }
                            break;

                            case RegistrationJournalPhaseEnum.CollissionSummary:
                            {
                                using (LogContext.PushProperty("record", "WAITING"))
                                {
                                    if (regJournal.ThrownException.GetType() == typeof(WebServerException))
                                    {
                                        logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to unexpected web behaviour\n" +
                                                          "Record is now in state {record}");
                                    }
                                    else if (regJournal.ThrownException.GetType() == typeof(CollisionDetectedException))
                                    {
                                        logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to possible collision with another connection\n" +
                                                          "Record is now in state {record}");
                                        NotifyViaMail(regJournal);
                                    }
                                    else
                                    {
                                        logger.LogWarning("{phase}\nid:{id}\n{type}\nwas not possible due to unexpected behaviour\n" +
                                                          "Record is now in state {record}");
                                    }
                                }
                            }
                            break;

                            case RegistrationJournalPhaseEnum.Published:
                            {
                                using (LogContext.PushProperty("record", "PUBLISHED"))
                                {
                                    logger.LogInformation("{phase}\nid:{id}\n{type}\nwas successfully published\n" +
                                                          "Record is now in state {record}");
                                }
                            }
                            break;

                            default:
                                break;
                            }
                        }
            }

            async Task ZeroDatabase(List <WirelessSite> sites)
            {
                foreach (var site in sites)
                {
                    HttpClient cl = new HttpClient();
                    if (site.Ap != null)
                    {
                        foreach (var item in site?.Ap)
                        {
                            if (!string.IsNullOrEmpty(workerOptions.ResponseOnDelete))
                            {
                                HttpResponseMessage rm2 = await cl.GetAsync(workerOptions.ResponseOnDelete + $"&id={item.Id}");

                                if (await rm2.Content.ReadAsStringAsync() != "ok")
                                {
                                }
                            }
                        }
                    }
                    if (site.Stations != null)
                    {
                        foreach (var item in site?.Stations)
                        {
                            if (!string.IsNullOrEmpty(workerOptions.ResponseOnDelete))
                            {
                                HttpResponseMessage rm2 = await cl.GetAsync(workerOptions.ResponseOnDelete + $"&id={item.Id}");

                                if (await rm2.Content.ReadAsStringAsync() != "ok")
                                {
                                }
                            }
                        }
                    }
                }
            }

            object ProcessWUnitCreation(WirelessSite site)
            {
                try
                {
                    if (site.Infos.SiteType == "ptp")
                    {
                        return(WirellesUnitFactory.CreatePTP(site));
                    }
                    else if (site.Infos.SiteType == "ptmp")
                    {
                        return(WirellesUnitFactory.CreateWigigPTMP(site));
                    }
                }
                catch (MissingParameterException e)
                {
                    using (LogContext.PushProperty("ci", "missing critical information"))
                    {
                        logger.LogWarning($"{site.Infos.Ssid} will not be possible to publish, because of" + "{ci}:\n" +
                                          $"{e.Message}\n" +
                                          $"original source:\n" +
                                          JsonConvert.SerializeObject(site, Formatting.Indented));
                    }
                }
                catch (InvalidPropertyValueException e)
                {
                    using (LogContext.PushProperty("ci", "invalid critical information"))
                    {
                        logger.LogWarning($"{site.Infos.Ssid} will not be possible to publish, because of" + "{ci} :\n" +
                                          $"Expected value: {e.ExpectedVauleInfo}\n" +
                                          $"Current value: {e.CurrentValue}\n" +
                                          $"original source:\n" +
                                          JsonConvert.SerializeObject(site, Formatting.Indented));
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }

                return(null);
            }

            void ProcessDeletion(WirelessSite site, CTUClient client)
            {
                try
                {
                    if (site.Stations.Count > 0)
                    {
                        foreach (var item in site.Stations)
                        {
                            List <CtuWirelessUnit> stations = default;
                            stations = client.GetStationByIdAsync(item.CtuReported).Result;
                        }
                    }
                    else
                    {
                        List <CtuWirelessUnit> stations = default;
                        stations = client.GetStationByIdAsync(site.Ap.FirstOrDefault()?.CtuReported).Result;
                        if (stations.Count > 0)
                        {
                            client.DeleteConnectionAsync(site.Ap.FirstOrDefault()?.CtuReported);
                        }
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }
            }

            TaskCompletionSource.SetResult(true);
            appLifetime.StopApplication();
            return;
        }