Skip to content

added basic mysql support #1

Description

@jermyk1

hello,
i added basic mysql support.
also changed some of the code that caused bugs,
working now fine but needs to be re-written to work better.

file: redisdeploy.py

#!/usr/bin/env python
from twisted.python import log
from twisted.internet.protocol import Protocol, ServerFactory
from twisted.internet import reactor
import redis_protocol
import sys
import fakeredis
import time
from redisconfig import rediscommands
from twisted.enterprise import adbapi
from random import randint

### Protocol Implementation of NoPo-Redis Server

global con_count
con_count = 0

global time_elapse,cmd_count
time_elapse = time.time()

cmd_count = 0

dbpool = adbapi.ConnectionPool("MySQLdb", db='redispot',host='localhost', user='root', passwd='12345')

class RedisServer(Protocol):

    connectionNb = 0

    def __init__(self):
        pass

    def connectionMade(self):
        self.connectionNb += 1
    #rndId = randint();
    ip = "%s"%format(self.transport.getPeer().host)
        print "New|%s|from|%s"%(format(self.connectionNb),self.transport.getPeer().host)
    str2 = "INSERT INTO `reports` (ip,details) VALUES('"+ip+"', 'new')";
    d = dbpool.runQuery(str2)

    #Handling of Client Requests , Data 
    def dataReceived(self, rcvdata):
        cmd_count = 0   
        r = fakeredis.FakeStrictRedis()
        cmd_count = cmd_count + 1
        print "out|"+str(rcvdata),

        #print "Data received:", str(redis_protocol.decode(rcvdata))
        ip = "%s"%format(self.transport.getPeer().host)
        str2 = "INSERT INTO `reports` (ip,details) VALUES('"+ip+"', '"+str(rcvdata)+"')";
    d = dbpool.runQuery(str2)



        try:
            data=redis_protocol.decode(rcvdata)
            command=" ".join(redis_protocol.decode(rcvdata))
            ip = "%s"%format(self.transport.getPeer().host)
        str2 = "INSERT INTO `reports` (ip,details) VALUES('"+ip+"','"+str(command)+"')";
            d = dbpool.runQuery(str2)

            print "out|"+str(command)
        except:
            command=rcvdata
        if command.lower == "quit":
            self.transport.loseConnection()

        else:
            if command.lower() == "ping" or rcvdata.find('PING') == 0:
                snddata = "+PONG\r\n"  
                #redis_protocol.encode("PONG crime")    
                #print redis_protocol.encode("PONG")
                self.transport.write(snddata) 
            elif command.lower() == "config get *" or rcvdata.find('config')==0:
                self.transport.write(rediscommands.parse_config())
            elif command.lower().startswith('set') and len(data) == 3:
                if r.set(data[1],data[2]):
                    self.transport.write("+OK\r\n")
            elif command.lower().startswith('get') and (len(data) == 2 or len(data) == 1):
                if r.get(data[1]):
                    s=r.get(data[1])
                    self.transport.write('+"%s"\r\n'%(s))
            elif command.lower().startswith('info'):
                diff = round(time.time() - time_elapse) % 60
                self.transport.write(rediscommands.parse_info(diff,self.connectionNb,cmd_count))
            elif command.lower().startswith('keys') and (len(data) == 2 or len(data) == 1):
                if r.keys() and (data[1] in r.keys() or data[1] == '*') :
                    keys=r.keys()
                    self.transport.write(rediscommands.encode_keys(keys))
                elif len(r.keys()) == 0:
                    self.transport.write("+(empty list or set)\r\n")
                else:
                    self.transport.write("-ERR wrong number of arguments for 'keys' command\r\n")
            else:
                self.transport.write("-ERR unknown command \r\n")
    def connectionLost(self, reason):
        self.connectionNb -= 1
        print "End|", reason.getErrorMessage()


class RedisServerFactory(ServerFactory):

    protocol = RedisServer

def reddeploy(port=6109,method='stdout'):
    if method != 'stdout':
    log.startLogging(open('redis.log', 'a'))  
    else:
    log.startLogging(sys.stdout)
    reactor.listenTCP(port, RedisServerFactory())
    reactor.run()

sql schema

create database redispot;
use redispot;
CREATE TABLE reports ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, ip VARCHAR(30) NOT NULL, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, details VARCHAR(500) );

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions