def crun(self, csocket):
        """Authenticates client and handles its jobs"""
        mysocket = pptransport.CSocketTransport(csocket, self.socket_timeout)
        #send PP version
        mysocket.send(version)
        #generate a random string
        srandom = "".join(
            [random.choice(string.ascii_letters) for i in range(16)])
        mysocket.send(srandom)
        answer = sha_new(ppc.b_(srandom + self.secret)).hexdigest()
        clientanswer = ppc.str_(mysocket.receive())
        if answer != clientanswer:
            self.logger.warning(
                "Authentication failed, client host=%s, port=%i" %
                csocket.getpeername())
            mysocket.send("FAILED")
            csocket.close()
            return
        else:
            mysocket.send("OK")

        ctype = ppc.str_(mysocket.receive())
        self.logger.debug("Control message received: " + ctype)
        self.ncon_add(1)
        try:
            if ctype == "STAT":
                #reset time at each new connection
                self.get_stats()["local"].time = 0.0
                #open('/tmp/pp.debug', 'a+').write('STAT: \n')
                mysocket.send(str(self.get_ncpus()))
                #open('/tmp/pp.debug', 'a+').write('STAT: get_ncpus\n')
                while 1:
                    mysocket.receive()
                    #open('/tmp/pp.debug', 'a+').write('STAT: recvd\n')
                    mysocket.send(str(self.get_stats()["local"].time))
                #open('/tmp/pp.debug', 'a+').write('STAT: _\n')
            elif ctype == "EXEC":
                while 1:
                    #open('/tmp/pp.debug', 'a+').write('EXEC: \n')
                    sfunc = mysocket.creceive()
                    #open('/tmp/pp.debug', 'a+').write('EXEC: '+repr((sfunc,))+'\n')
                    sargs = mysocket.receive()
                    #open('/tmp/pp.debug', 'a+').write('EXEC: '+repr((sargs,))+'\n')
                    fun = self.insert(sfunc, sargs)
                    sresult = fun(True)
                    #open('/tmp/pp.debug', 'a+').write('EXEC: '+repr((sresult,))+'\n')
                    mysocket.send(sresult)
                #open('/tmp/pp.debug', 'a+').write('EXEC: _\n')
        except:
            if self._exiting:
                return
            if pp.SHOW_EXPECTED_EXCEPTIONS:
                self.logger.debug(
                    "Exception in crun method (possibly expected)",
                    exc_info=True)
            self.logger.debug("Closing client socket")
            csocket.close()
            self.ncon_add(-1)
Exemple #2
0
    def crun(self, csocket):
        """
        Authenticates client and handles its jobs.
        """
        mysocket = pptransport.CSocketTransport(csocket)
        # send PP version
        mysocket.send(version)
        # generate a random string
        srandom = "".join(
            [random.choice(string.ascii_letters) for i in xrange(16)])
        mysocket.send(srandom)
        answer = sha_new(srandom + self.secret).hexdigest()
        cleintanswer = mysocket.receive()
        if answer != cleintanswer:
            logging.warning(
                "Authentification failed, client host=%s, port=%i" %
                csocket.getpeername())
            mysocket.send("FAILED")
            csocket.close()
            return
        else:
            mysocket.send("OK")

        ctype = mysocket.receive()
        logging.debug("Control message received: " + ctype)
        self.ncon_add(1)
        try:
            if ctype == "STAT":
                # reset time at each new connection
                self.get_stats()["local"].time = 0.0
                mysocket.send(str(self.get_ncpus()))
                while True:
                    mysocket.receive()
                    mysocket.send(str(self.get_stats()["local"].time))
            elif ctype == "EXEC":
                while True:
                    sfunc = mysocket.creceive()
                    sargs = mysocket.receive()
                    fun = self.insert(sfunc, sargs)
                    sresult = fun(True)
                    mysocket.send(sresult)
        except:
            # print sys.excepthook(*sys.exc_info())
            logging.debug("Closing client socket")
            csocket.close()
            self.ncon_add(-1)