protected override async Task Execute(IObserver observer, CancellationToken cancellationToken)
        {
            using (IKamajiContext db = DI.Provider.GetService <IKamajiContext>())
            {
                IEnumerable <INodeModel> brokenNodes = await db.Nodes.GetAll();//eğer 5000 node bağlanırsa bunu değiştir.

                if (!brokenNodes.IsEmptyList())
                {
                    DateTime dbDate = await db.GetDbDateTime();

                    brokenNodes = brokenNodes.Where(p => p.LastConnectionTime.AddSeconds(nodeTimeout) < dbDate);//get all nodes that lives. Bu 10 saniyeyi config' e taşı.
                    if (brokenNodes.Any())
                    {
                        foreach (INodeModel node in brokenNodes)
                        {
                            IEnumerable <IScanModel> scans = await db.Scans.GetListByLastAssignedNodeId(true, node.NodeId, ScanState.Running);

                            if (!scans.IsEmptyList())
                            {
                                foreach (IScanModel scan in scans)
                                {
                                    scan.State = ScanState.NodeShutdown;
                                    await db.Scans.Edit(scan);

                                    string msg = $"Warning!!!.A scan({scan.Asset}) has been assigned to Shutdown due to it's assigned node has been broken.";
                                    observer?.Notify($"{nameof(BrokenNodeService)}Execute", msg, null);
                                    _ = Utility.CreateLogger(nameof(BrokenNodeService), nameof(Execute)).Code(648).Warning(msg).SaveAsync();
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #2
0
        public async Task Invoke(HttpContext context, IKamajiContext db)
        {
            if (context.Request.Path.HasValue)
            {
                string[] arr = context.Request.Path.Value.Split('/');// ie "/api/Node/Register"
                if (arr.Length > 2)
                {
                    string controllerTypeName = new StringBuilder().Append(nameof(Kamaji)).Append('.').Append(nameof(Kamaji.Controllers)).Append('.').Append(arr[2]).Append("Controller").ToString();
                    Type   controllerType     = Type.GetType(controllerTypeName);
                    if (null != controllerType)
                    {
                        bool isValid = controllerType.GetCustomAttribute <DoNotAuthorizeAttribute>() != null;// doesn't matter if header exist or not.

                        if (!isValid && context.Request.Headers is Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestHeaders headers)
                        {
                            StringValues values = headers.HeaderAuthorization;
                            string       token  = values.FirstOrDefault();
                            if (!String.IsNullOrEmpty(token))
                            {
                                arr = token.Split(' ');
                                if (arr.Length == 2 || arr[0] == "Token")//you can later optimize the codes below using cache machanics.
                                {
                                    string tokenValue = Serializer.FromBase64(arr[1]);
                                    Guid   guid;
                                    if (Guid.TryParse(tokenValue, out guid))
                                    {
                                        isValid = await db.Authes.GetBy(guid) != null;
                                    }
                                }
                            }
                        }

                        if (isValid)
                        {
                            await _next.Invoke(context);

                            return;
                        }
                    }
                }
            }



            // context.Request.Headers[""]

            // Do something with context near the beginning of request processing.

            //Bunlara bitirince node belli aralıklarla
            //public virtual float CpuUsage { get; set; }
            //public virtual float MemoryUsage { get; set; }
            //public virtual DateTime LastConnectionTime { get; set; }
            //bu alnları doldursun. Ayrıca burada IObserver ile ekranda da gerçek zamanlı gösterecek alt yapı sağlansın. (Yani web uygulamasıyla kendisini observer ile köprü kursun)

            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            await context.Response.WriteAsync("Access Denied 401");
        }
Exemple #3
0
        protected sealed override async Task Execute(IObserver observer, CancellationToken cancellationToken)
        {
            using (IKamajiContext db = DI.Provider.GetService <IKamajiContext>())
            {
                IEnumerable <IScanModel> scanList = await this.GetScanList(db);

                if (null != scanList && scanList.Any())
                {
                    scanList = scanList.OrderBy(p => p.CreatedDate);
                    foreach (IScanModel scan in scanList)
                    {
                        INodeModel node = await ChoseNode(db, scan);

                        if (null != node)//eğer node bağlandıysa.
                        {
                            IScanResourceModel scanResource = await db.ScanResources.GetBy(scan.ScanResourceId);

                            if (null != scanResource)
                            {
                                string prerequisiteName = await db.ScanPrerequisites.GetNameBy(scanResource.ScanPrerequisiteId);

                                bool result = (await NodesClient.Instance.AssignScan(node, prerequisiteName, scanResource.Name, scan)) == 1;

                                if (result)
                                {
                                    scan.State = ScanState.Assigned;
                                    scan.LastAssignedNodeId = node.NodeId;
                                    await db.Scans.Edit(scan);

                                    observer.Notify("ScanQueueService.Execute", $"a {scan.Asset} of {scanResource.Name} job has been assign to a node which name  is '{node.Address}'.", null);
                                }
                                else
                                {
                                    scan.State = ScanState.AssignFailed;
                                    await OnAssingFailed(db, scan);

                                    observer.Notify("ScanQueueService.Execute", $"Warning!!!!. A {scan.Asset} of {scanResource.Name} job couldn't assign to a node which name  is '{node.Address}'.", null);
                                }
                            }
                        }
                        else
                        {
                            // scan.Enabled = false;//Burası biraz sıkıntılı
                            scan.State = ScanState.AssignFailed;
                            await OnAssingFailed(db, scan);

                            observer.Notify("ScanQueueService.Execute", $"Warning!!!!... Assigning has been failed. The scan asset: {scan.Asset}.", null);
                        }
                    }
                }
            }
        }
Exemple #4
0
        private async Task FixRunningScans()
        {
            IKamajiContext db = DI.Provider.GetService <IKamajiContext>();
            var            fakeRunningScanList = await db.Scans.GetListBy(true, ScanState.Running);

            if (null != fakeRunningScanList)
            {
                foreach (var scan in fakeRunningScanList)
                {
                    scan.State = ScanState.NotStarted;
                    await db.Scans.Edit(scan);
                }
            }
        }
Exemple #5
0
        private static async Task <INodeModel> GetOptimumNode(IKamajiContext db)
        {
            IEnumerable <INodeModel> nodes = await db.Nodes.GetAll();//eğer 5000 node bağlanırsa bunu değiştir.

            if (null != nodes && nodes.Any())
            {
                double CalculateAvailabilityScore(INodeModel node)
                {
                    double availableMem = 1.0 - node.MemoryUsage;
                    double availebleCpu = 1.0 - node.CpuUsage;
                    double threatCount  = node.ThreadCount;

                    return(availebleCpu * threatCount * availableMem / Math.Max(node.TotalExecutingJobCount + node.TotalQueuedJobCount, 1.0));
                }

                DateTime dbDate = await db.GetDbDateTime();

                nodes = nodes.Where(p => p.LastConnectionTime.AddSeconds(nodeTimeout) > dbDate);//get all nodes that lives. Bu 10 saniyeyi config' e taşı.
                //direk node' lara söylememiz lazım kaç adet task ları olduğunu. hem böylece multi-task scan' leri de daha iyi yakalayabiliriz.
                if (nodes.Any())
                {
                    double     maxScore = double.MinValue;
                    INodeModel selected = null;
                    nodes.ForEach(node =>
                    {
                        double score = CalculateAvailabilityScore(node);
                        if (maxScore < score)
                        {
                            selected = node;
                            maxScore = score;
                        }
                    });
                    return(selected);
                }
            }

            return(null);
        }
Exemple #6
0
        private static async Task <INodeModel> ChoseNode(IKamajiContext db, IScanModel scan)
        {
            await _semaphoreSlim.WaitAsync();

            try
            {
                INodeModel ret = null;
                if (scan.SelectedNodeId != null)
                {
                    ret = await db.Nodes.GetBy(scan.SelectedNodeId);
                }
                else
                {
                    ret = await GetOptimumNode(db);
                }

                return(ret);
            }
            finally
            {
                _semaphoreSlim.Release();
            }
        }
Exemple #7
0
 internal ScanWorks(IKamajiContext db)
 {
     this.Db = db;
 }
Exemple #8
0
 public AuthController(IKamajiContext db)
     : base(db)
 {
 }
Exemple #9
0
 private static async Task OnAssingFailed(IKamajiContext db, IScanModel scan)
 {
     scan.State = ScanState.AssignFailed;
     await db.Scans.Edit(scan);
 }
Exemple #10
0
 protected abstract Task <IEnumerable <IScanModel> > GetScanList(IKamajiContext db);
 protected override Task <IEnumerable <IScanModel> > GetScanList(IKamajiContext db)
 => db.Scans.GetOnDemandListBy(true, ScanState.NotStarted, ScanState.NodeShutdown, ScanState.AssignFailed);    //Buraya parantid null olan da eklenebilir child lar otomatik başlıyorsa.
Exemple #12
0
 public NodeController(IKamajiContext db)
     : base(db)
 {
 }
Exemple #13
0
 public TestController(IKamajiContext db)
     : base(db)
 {
 }
Exemple #14
0
        protected async override Task <IEnumerable <IScanModel> > GetScanList(IKamajiContext db)
        {
            DateTime dbDateTimeNow = await db.GetDbDateTime();

            return(await db.Scans.GetScheduledListBy(true, dbDateTimeNow, ScanState.NotStarted, ScanState.NodeShutdown, ScanState.AssignFailed));//Buraya parantid null olan da eklenebilir child lar otomatik başlıyorsa.
        }
Exemple #15
0
 public ScanController(IKamajiContext db)
     : base(db)
 {
 }
 protected ApiControllerBase(IKamajiContext db)
 {
     this.Db = db ?? throw new ArgumentNullException(nameof(db));
 }