Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
        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;
            }
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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 %";
                }
            }));
        }