public byte[] RequestResult(bool[] key1, uint count1, bool[] key2, uint count2) { string request = "crack " + ByteUtil.BitsToString(key1) + " " + count1 + " " + ByteUtil.BitsToString(key2) + " " + count2; object signal = new object(); StringBuilder result = new StringBuilder(); KrakenJobStatus = KrakenJobStatus.Submitted; QueueCommand(request, signal, result, int.MaxValue); lock (signal) { if (Monitor.Wait(signal)) { string ret = result.ToString(); int code = -1; int id = -1; string msg = ""; ParseResponseString(ret, out code, out id, out msg); switch (code) { case 200: CurrentRequestId = -1; KrakenJobStatus = KrakenJobStatus.Found; /* split into literals */ string[] fields = ret.Split(' '); if (fields.Length < 3) { return(null); } /* the 3rd literal is the found key */ string keystring = fields[2]; byte[] key = new byte[8]; for (int pos = 0; pos < 8; pos++) { string byteStr = keystring.Substring(pos * 2, 2); if (!byte.TryParse(byteStr, System.Globalization.NumberStyles.HexNumber, null, out key[pos])) { key = null; break; } } ParseSearchDuration(ret); return(key); case 404: /* key not found */ CurrentRequestId = -1; KrakenJobStatus = KrakenJobStatus.NotFound; ParseSearchDuration(ret); return(null); case 405: /* job was cancelled */ CurrentRequestId = -1; KrakenJobStatus = KrakenJobStatus.Cancelled; return(null); default: Log.AddMessage(Remote, "Last message unhandled"); break; } } } return(null); }
public void HandleMessage(string msg) { if (Logging) { Log.AddMessage(Remote, "< " + msg); } LastResponse = DateTime.Now; bool handled = true; int code = -1; int id = -1; string message = ""; ParseResponseString(msg, out code, out id, out message); /* asynchronously handle different responses here */ switch (code) { case 100: /* request is getting queued */ KrakenJobStatus = KrakenJobStatus.Accepted; break; case 101: /* request was queued, get the ID */ KrakenJobStatus = KrakenJobStatus.Queued; CurrentRequestId = id; break; case 102: /* request is being processed */ if (CurrentRequestId == id) { KrakenJobStatus = KrakenJobStatus.Processing; } break; case 103: /* match found, kraken is now calculating back */ break; case 211: /* response to idle command */ break; case 401: if (State == eConnState.Ready) { /* not authorized. happens when kraken was restarted. how to retry? */ Log.AddMessage(Remote, "Kraken access denied while being already authorized. Was kraken restarted?"); CloseConnection(); } break; case 200: case 404: case 405: /* check if these are from an earlier request that is still being processed */ if (CurrentRequestId == id) { /* thats from our current request. do not ignore this message. */ handled = false; } else { Log.AddMessage(Remote, "Received answer for an old request. Ignoring."); } break; default: handled = false; break; } /* if not already handled, let forward to current processing thread */ if (!handled) { lock (ProcessAnswerSignal) { ProcessAnswerString = msg; Monitor.Pulse(ProcessAnswerSignal); } } }
private byte[] GetResult() { RequestId = -1; if (!Connected) { KrakenJobStatus = KrakenJobStatus.Error; return(null); } try { while (true) { /* wait until data arrives */ string ret = Read(DataStream, DataTimeout); /* receive failed */ if (ret == null) { KrakenJobStatus = KrakenJobStatus.Error; Log.AddMessage("KrakenClient", "Kraken not responding anymore or got disconnected."); return(null); } /* valid result */ if (ret.StartsWith("200 ")) { /* split into literals */ KrakenJobStatus = KrakenJobStatus.Found; string[] fields = ret.Split(' '); if (fields.Length < 3) { return(null); } /* the 3rd literal is the found key */ string keystring = fields[2]; byte[] key = new byte[8]; for (int pos = 0; pos < 8; pos++) { string byteStr = keystring.Substring(pos * 2, 2); if (!byte.TryParse(byteStr, System.Globalization.NumberStyles.HexNumber, null, out key[pos])) { key = null; break; } } ParseSearchDuration(ret); return(key); } else if (ret.StartsWith("100 ")) { /* request is getting queued */ KrakenJobStatus = KrakenJobStatus.Accepted; } else if (ret.StartsWith("101 ")) { /* request was queued, get the ID */ KrakenJobStatus = KrakenJobStatus.Queued; /* split into literals */ string[] fields = ret.Split(' '); if (fields.Length >= 2) { int.TryParse(fields[1], out RequestId); } } else if (ret.StartsWith("102 ")) { /* request is being processed */ KrakenJobStatus = KrakenJobStatus.Processing; } else if (ret.StartsWith("103 ")) { /* match found, kraken is now calculating back */ } else if (ret.StartsWith("404 ")) { /* key not found */ KrakenJobStatus = KrakenJobStatus.NotFound; ParseSearchDuration(ret); return(null); } else if (ret.StartsWith("405 ")) { /* job was cancelled */ KrakenJobStatus = KrakenJobStatus.Cancelled; return(null); } else { /* unexpected response */ KrakenJobStatus = KrakenJobStatus.Error; Log.AddMessage("KrakenClient", "Unexpected 'crack' answer: '" + ret + "'"); return(null); } } } catch (ThreadAbortException ex) { /* try to cancel the crack request */ if (RequestId != -1) { KrakenJobStatus = KrakenJobStatus.Cancelled; Write("cancel " + RequestId); } throw ex; } }
public virtual double GetJobProgress(int jobId) { /* just return -1 if not connected to a kraken server */ if (!Connected) { return(-1.0f); } try { lock (ControlStreamLock) { Write("progress " + jobId, ControlStream); string ret = Read(ControlStream, ControlTimeout); /* receive failed */ if (ret == null) { Log.AddMessage("KrakenClient", "Control stream not responding anymore or we got disconnected. Reconnecting."); Reconnect(); return(-1.0f); } if (ret.StartsWith("221 ")) { /* split into literals */ string[] fields = ret.Split(' '); if (fields.Length < 2) { return(-1.0f); } if (fields[fields.Length - 1] != "%") { return(-1.0f); } double progress = -1.0f; double.TryParse(fields[fields.Length - 2], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out progress); return(progress); } else if (ret.StartsWith("400 ")) { /* job not existing anymore, update state if this is our current job */ if (RequestId == jobId) { KrakenJobStatus = KrakenJobStatus.Cancelled; RequestId = -1; } return(-1.0f); } Log.AddMessage("KrakenClient", "Unexpected 'progress' answer: '" + ret + "'"); /* unexpected response */ return(-1.0f); } } catch (ThreadAbortException e) { throw e; } catch (Exception ex) { Log.AddMessage("KrakenClient", "Control stream error. Reconnecting."); Reconnect(); return(-1.0f); } }
public virtual byte[] RequestResult(bool[] key1, uint count1, bool[] key2, uint count2) { if (!Connected) { Reconnect(); } lock (this) { string request = "crack " + ByteUtil.BitsToString(key1) + " " + count1 + " " + ByteUtil.BitsToString(key2) + " " + count2; byte[] result = new byte[8]; RequestId = -1; Log.AddMessage("Kraken: > '" + request.Substring(0, 35) + "...'"); /* do we have data for this request already in cache? */ if (CheckScanResult(request, ref result)) { return(result); } try { /* try a few times to get the key cracked */ for (int tries = 0; tries < 3; tries++) { DataStream.Flush(); Write(request); KrakenJobStatus = KrakenJobStatus.Submitted; result = GetResult(); if (result != null) { /* found valid key, add result and jump out of loop */ AddScanResult(request, result); break; } else if (KrakenJobStatus == KrakenJobStatus.NotFound) { /* found no valid key, add result and jump out of loop */ AddScanResult(request, result); break; } else { /* there went something wrong */ KrakenJobStatus = KrakenJobStatus.Unknown; Log.AddMessage("KrakenClient", "Failed to crack. Reconnecting"); Reconnect(); /* cancel old job with the new connection */ if (RequestId != -1) { Log.AddMessage("KrakenClient", " + cancel job " + RequestId); Write("cancel " + RequestId); RequestId = -1; } } } } catch (ThreadAbortException ex) { /* try to cancel job with new connection */ if (RequestId != -1) { Log.AddMessage("KrakenClient", "Aborting. Reconnecting to cancel job" + RequestId); Reconnect(); Write("cancel " + RequestId); Disconnect(); Log.AddMessage("KrakenClient", "Aborting finished"); RequestId = -1; } } RequestId = -1; return(result); } }
private void UpdateControls() { double progress = -1.0f; int jobId = -1; int jobNumber = -1; /* number ob job being processed for current burst */ int jobcount = -1; /* total number of jobs to process for current burst */ bool connected = false; KrakenJobStatus status = KrakenJobStatus.Unknown; try { if (Kraken != null && Kraken.Kraken != null) { connected = Kraken.Available; if (connected) { int jobs = 0; foreach (KrakenClient k in Kraken.Kraken) { status = k.KrakenJobStatus; jobId = k.RequestId; if (jobId != -1) { jobs++; progress += k.GetJobProgress(); //Kraken.GetJobInfo(out jobNumber, out jobcount); } } progress /= jobs; jobcount = jobs; jobNumber = -1; } } } catch (Exception e) { progress = -1.0f; } SafeInvoke(new Action(() => { if (connected) { if (progress >= 0) { lblStatus.Text = jobNumber + "/" + jobcount + " " + "(Job ID " + jobId + ")"; progressBar1.Value = (int)progress; lblProgress.Text = (int)progress + " % (" + status + ")"; } else { lblStatus.Text = "No Jobs"; progressBar1.Value = 0; lblProgress.Text = "0 %"; } } else { lblStatus.Text = "Not connected"; progressBar1.Value = 0; lblProgress.Text = "0 %"; } })); }