public HttpResponseMessage WriteLog(string ClientName, string LogData) { //log to database using (Models.SQL.tasktserverContext dbContext = new tasktserverContext()) { try { ApplicationLogs log = new ApplicationLogs(); log.LoggedBy = ClientName; log.Message = LogData; log.Type = "WORKER LOG"; log.LoggedOn = DateTime.Now; dbContext.ApplicationLogs.Add(log); dbContext.SaveChanges(); } catch (Exception) { return(new HttpResponseMessage(HttpStatusCode.InternalServerError)); } } // Save Code will be here return(new HttpResponseMessage(HttpStatusCode.OK)); }
public IActionResult UpdateRobot(string id, string approvalAction) { #warning change to try parse! var intID = int.Parse(id); tasktserverContext dbContext = new tasktserverContext(); var requiredWorker = dbContext.Workers.Where(f => f.Id == intID).FirstOrDefault(); //var client = Models.ApprovalStatus.WorkForceManagement.FindClientByID(id); switch (approvalAction) { case "approve": requiredWorker.AccountStatus = (int)Models.ApprovalStatus.Enabled; break; case "disable": requiredWorker.AccountStatus = (int)Models.ApprovalStatus.Disabled; break; case "enable": requiredWorker.AccountStatus = (int)Models.ApprovalStatus.Enabled; break; default: break; } //write back to database dbContext.SaveChanges(); return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", dbContext.Workers.ToList())); }
public IActionResult RetrieveWorkforce() { tasktserverContext dbContext = new tasktserverContext(); var workers = dbContext.Workers.ToList(); return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", workers)); }
public ActionResult GetLogs(string ClientName) { //var appData = AppDomain.CurrentDomain.GetData("AppData") as string; //var filePath = System.IO.Path.Combine(appData, "EngineLogs", ClientName + ".txt"); //var logs = System.IO.File.ReadAllLines(filePath); Models.SQL.tasktserverContext dbContext = new tasktserverContext(); var logs = dbContext.ApplicationLogs.Where(f => f.LoggedBy == ClientName).OrderBy(f => f.LoggedOn).ToList(); return(new OkObjectResult(logs)); }
public IActionResult RetrieveWorkforce() { //database context tasktserverContext dbContext = new tasktserverContext(); //get workers var workers = dbContext.Workers.ToList(); //return view return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", workers)); }
public IActionResult DeleteWorkerEntry(string key) { tasktserverContext dbContext = new tasktserverContext(); var workersDeleted = dbContext.Workers.Where(f => f.PublicKey == key); dbContext.Workers.RemoveRange(workersDeleted); dbContext.SaveChanges(); var workers = dbContext.Workers.ToList(); return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", workers)); }
private void LogEvent(ApplicationLogs log) { using (Models.SQL.tasktserverContext dbContext = new tasktserverContext()) { try { log.LoggedOn = DateTime.Now; dbContext.ApplicationLogs.Add(log); dbContext.SaveChanges(); } catch (Exception ex) { throw; } } }
public IActionResult DeleteWorkerEntry(string key) { //database context tasktserverContext dbContext = new tasktserverContext(); //get selected worker var workersDeleted = dbContext.Workers.Where(f => f.PublicKey == key); //remove worker dbContext.Workers.RemoveRange(workersDeleted); //save dbContext.SaveChanges(); //return view return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", dbContext.Workers)); }
/// <summary> /// Processes incoming socket messages from taskt clients /// </summary> /// <param name="context"></param> /// <param name="webSocket"></param> /// <returns></returns> public async Task ProcessIncomingSocketMessage(HttpContext context, WebSocket webSocket) { //create dbcontext Models.SQL.tasktserverContext dbContext = new tasktserverContext(); //generate GUID for this connection Guid guid; guid = Guid.NewGuid(); string connectionGUID = guid.ToString(); var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { //get connection information string connectionID = context.Connection.Id; string ipAddress = context.Connection.RemoteIpAddress.ToString(); //retrieve value var arraySegment = new ArraySegment <byte>(buffer, 0, result.Count); var incomingMessage = System.Text.Encoding.Default.GetString(arraySegment.Array); incomingMessage = incomingMessage.Substring(0, result.Count); //convert client data var clientData = Newtonsoft.Json.JsonConvert.DeserializeObject <SocketPackage>(incomingMessage); var clientInfo = string.Join(", ", "MACHINE: " + clientData.MACHINE_NAME, "USER: "******"MESSAGE: " + clientData.MESSAGE, "IP: " + ipAddress); if (clientData.MESSAGE.StartsWith("CLIENT_STATUS=")) { var clientUpdate = clientData.MESSAGE.Replace("CLIENT_STATUS=", ""); var socketClient = ActiveSocketClients.GetClient(clientData.PUBLIC_KEY); if (socketClient.PingRequest.AwaitingPingReply) { socketClient.PingRequest.AwaitingPingReply = false; socketClient.PingRequest.ClientStatus = clientUpdate; socketClient.PingRequest.ReadyForUIReporting = true; } LogEvent(new ApplicationLogs() { Type = "WORKER UPDATE", Guid = connectionGUID, Message = clientUpdate, LoggedBy = clientData.PUBLIC_KEY }); var worker = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault(); if (worker != null) { worker.LastCommunicationReceived = DateTime.Now; worker.LastExecutionStatus = clientUpdate; dbContext.SaveChanges(); } await SendMessageAsync(webSocket, "ACK", CancellationToken.None); } LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "ROBOT CONNECTED FROM '" + ipAddress + "'", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "CLIENT INFO: " + clientInfo + "", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); //if public key is null or empty we automatically assign if ((string.IsNullOrEmpty(clientData.PUBLIC_KEY)) || (dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault() == null)) { LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "ROBOT NOT REGISTERED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); var generatedKeys = tasktServer.Cryptography.CreateKeyPair(); var worker = new Workers() { MachineName = clientData.MACHINE_NAME, UserName = clientData.USER_NAME, AccountStatus = (int)ApprovalStatus.RequiresApproval, LastCommunicationReceived = DateTime.Now, PublicKey = generatedKeys.Item2, PrivateKey = generatedKeys.Item1 }; dbContext.Workers.Add(worker); dbContext.SaveChanges(); ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket); LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "ROBOT GIVEN NEW PUBLIC KEY AND AWAITING AUTHORIZATION", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); await SendMessageAsync(webSocket, "ACCEPT_KEY=" + worker.PublicKey, CancellationToken.None); } else { var knownClient = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault(); knownClient.LastCommunicationReceived = DateTime.Now; dbContext.SaveChanges(); ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket); switch (knownClient.AccountStatus) { case (int)ApprovalStatus.RequiresApproval: LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_AWAITING_APPROVAL", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); await SendMessageAsync(webSocket, "WORKER_AWAITING_APPROVAL", CancellationToken.None); break; case (int)ApprovalStatus.Disabled: LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_DISABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); await SendMessageAsync(webSocket, "WORKER_DISABLED", CancellationToken.None); break; case (int)ApprovalStatus.Enabled: LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_ENABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); await SendMessageAsync(webSocket, "WORKER_ENABLED", CancellationToken.None); break; default: break; } } result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }
/// <summary> /// Processes incoming socket messages from taskt clients /// </summary> /// <param name="context"></param> /// <param name="webSocket"></param> /// <returns></returns> public async Task ProcessIncomingSocketMessage(HttpContext context, WebSocket webSocket) { //create dbcontext Models.SQL.tasktserverContext dbContext = new tasktserverContext(); //generate GUID for this connection Guid guid; guid = Guid.NewGuid(); string connectionGUID = guid.ToString(); var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { //get connection information string connectionID = context.Connection.Id; string ipAddress = context.Connection.RemoteIpAddress.ToString(); //retrieve value var arraySegment = new ArraySegment <byte>(buffer, 0, result.Count); var incomingMessage = System.Text.Encoding.Default.GetString(arraySegment.Array); incomingMessage = incomingMessage.Substring(0, result.Count); System.Console.WriteLine(incomingMessage); //convert client data var clientData = Newtonsoft.Json.JsonConvert.DeserializeObject <SocketPackage>(incomingMessage); var clientInfo = string.Join(", ", "MACHINE: " + clientData.MACHINE_NAME, "USER: "******"MESSAGE: " + clientData.MESSAGE, "IP: " + ipAddress); //determine if we were pinging this client for availability if (clientData.MESSAGE.StartsWith("CLIENT_STATUS=")) { //get client update var clientUpdate = clientData.MESSAGE.Replace("CLIENT_STATUS=", ""); //find client socket connection var socketClient = ActiveSocketClients.GetClient(clientData.PUBLIC_KEY); //check if we are awaiting a ping reply from this client if (socketClient.PingRequest.AwaitingPingReply) { //update client object accordingly socketClient.PingRequest.AwaitingPingReply = false; socketClient.PingRequest.ClientStatus = clientUpdate; socketClient.PingRequest.ReadyForUIReporting = true; } //log update from worker LogEvent(new ApplicationLogs() { Type = "WORKER UPDATE", Guid = connectionGUID, Message = clientUpdate, LoggedBy = clientData.PUBLIC_KEY }); //get reference to the client var worker = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault(); //update communication worker.LastCommunicationReceived = DateTime.Now; dbContext.SaveChanges(); //send acknowledge to client await SendMessageAsync(webSocket, "ACK", CancellationToken.None); } //log client connection LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "ROBOT CONNECTED FROM '" + ipAddress + "'", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "CLIENT INFO: " + clientInfo + "", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); //determine if this client is known if ((string.IsNullOrEmpty(clientData.PUBLIC_KEY)) || (dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault() == null)) { //client is new or not yet configured //create log LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "ROBOT NOT REGISTERED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); //generate key pair - public key sent to client and private key stored locally var generatedKeys = tasktServer.Cryptography.CreateKeyPair(); //add as a new worker to the database var worker = new Workers() { MachineName = clientData.MACHINE_NAME, UserName = clientData.USER_NAME, AccountStatus = (int)ApprovalStatus.RequiresApproval, LastCommunicationReceived = DateTime.Now, PublicKey = generatedKeys.Item2, PrivateKey = generatedKeys.Item1 }; dbContext.Workers.Add(worker); //save changes dbContext.SaveChanges(); //set client as an active socket client which enables the ability to execute scripts ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket); //create log LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "ROBOT GIVEN NEW PUBLIC KEY AND AUTHENTICATED AUTOMATICALLY (DANGEROUS!)", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); //send key back to client await SendMessageAsync(webSocket, "ACCEPT_KEY=" + worker.PublicKey, CancellationToken.None); } else { //find client info var knownClient = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault(); //update last communication received knownClient.LastCommunicationReceived = DateTime.Now; //save changes dbContext.SaveChanges(); //set client as active and available ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket); //send message back to client await SendMessageAsync(webSocket, "WORKER_ENABLED", CancellationToken.None); //APPROVAL PROCESS, FUTURE ENHANCEMENT! //switch (worker.ApprovalStatus) //{ // case ApprovalStatus.RequiresApproval: // LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_AWAITING_APPROVAL", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); // await SendMessageAsync(webSocket, "WORKER_AWAITING_APPROVAL", CancellationToken.None); // break; // case ApprovalStatus.Disabled: // LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_DISABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); // await SendMessageAsync(webSocket, "WORKER_DISABLED", CancellationToken.None); // break; // case ApprovalStatus.Enabled: // LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_ENABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" }); // await SendMessageAsync(webSocket, "WORKER_ENABLED", CancellationToken.None); // break; // default: // break; //} } result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }