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(); } } } } } } }
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"); }
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); } } } } }
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); } } }
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); }
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(); } }
internal ScanWorks(IKamajiContext db) { this.Db = db; }
public AuthController(IKamajiContext db) : base(db) { }
private static async Task OnAssingFailed(IKamajiContext db, IScanModel scan) { scan.State = ScanState.AssignFailed; await db.Scans.Edit(scan); }
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.
public NodeController(IKamajiContext db) : base(db) { }
public TestController(IKamajiContext db) : base(db) { }
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. }
public ScanController(IKamajiContext db) : base(db) { }
protected ApiControllerBase(IKamajiContext db) { this.Db = db ?? throw new ArgumentNullException(nameof(db)); }