11-24 784 views
http://docs.peewee-orm.com/en/latest/peewee/quickstart.html
https://github.com/coleifer/peewee
https://github.com/coleifer/peewee/blob/master/docs/peewee/querying.rst#query-operators
model
import os
import re
import sys
import peewee
import logging
import datetime
from protocol import typhoon_pb2
from utility import utils
from utility.utils import logger
from playhouse.sqlite_ext import PrimaryKeyAutoIncrementField
dbinstance = peewee.SqliteDatabase(os.path.abspath( os.path.join( utils.curdirWithDecode() , "config/manager.db") ) )
########################################################################
class User(peewee.Model):
id = PrimaryKeyAutoIncrementField(primary_key=True)
account = peewee.CharField(null=False)
password = peewee.CharField(null=False)
home = peewee.CharField(null=True, default='')
permission = peewee.IntegerField(null=False, default=255)
name = peewee.CharField(null=True)
email = peewee.CharField(null=True)
phone = peewee.CharField(null=True)
company = peewee.CharField(null=True)
address = peewee.CharField(null=True)
remark = peewee.CharField(null=True)
status = peewee.IntegerField(null=False, default=0)
created = peewee.DateTimeField(null=False, default=datetime.datetime.now)
class Meta:
database = dbinstance
db_table = 't_user'
def toProtobuf(self, pbuser):
pbuser.id = self.id
if self.account != None: pbuser.account = self.account
if self.password != None: pbuser.password = self.password
if self.home != None: pbuser.home = self.home
if self.permission != None: pbuser.permission = self.permission
if self.name != None: pbuser.name = self.name
if self.email != None: pbuser.email = self.email
if self.phone != None: pbuser.phone = self.phone
if self.company != None: pbuser.company = self.company
if self.address != None: pbuser.address = self.address
if self.remark != None: pbuser.remark = self.remark
if self.status != None: pbuser.status = self.status
if self.created != None: pbuser.created = 1 #TODO self.created.timestamp()
def fromProtobuf(self, pbuser):
self.id = pbuser.id
if pbuser.account != None: self.account = pbuser.account
if pbuser.password != None: self.password = pbuser.password
if pbuser.home != None: self.home = pbuser.home
if pbuser.permission != None: self.permission = pbuser.permission
if pbuser.name != None: self.name = pbuser.name
if pbuser.email != None: self.email = pbuser.email
if pbuser.phone != None: self.phone = pbuser.phone
if pbuser.company != None: self.company = pbuser.company
if pbuser.address != None: self.address = pbuser.address
if pbuser.remark != None: self.remark = pbuser.remark
if pbuser.status != None: self.status = pbuser.status
# if pbuser.created != None:
# self.created = 1 #TODO self.created.timestamp()
########################################################################
userPatternName = '^.{1,50}$'
userPatternAccount = '^\w{3,50}$'
userPatternEmail = '^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$'
userPatternPassword = '^[a-zA-Z0-9_~!@#%\$\.\^\&\-\+\*\(\)\{\}\?\\]{6,20}$'
userPatternPhone = '^\+?\d{7,13}$'
notAllowedAccount = ["user", "test", "admin", "download", "upload", "home", "ftp", "ftps", "server", "client", "service", "root"]
def verifyUserFormat(user, checkPassword):
if not re.match(userPatternAccount, user.account) :
return typhoon_pb2.WS_IncorrectAccountFormat
if checkPassword and not re.match(userPatternPassword, user.password) :
return typhoon_pb2.WS_IncorrectPasswordFormat
if user.email != "" :
if len(user.email) > 50 and not re.match(userPatternEmail, user.email):
return typhoon_pb2.WS_IncorrectEmailFormat
if user.name != "" and not re.match(userPatternName, user.name) :
return typhoon_pb2.WS_IncorrectNameFormat
if user.phone != "" and not re.match(userPatternPhone, user.phone) :
return typhoon_pb2.WS_IncorrectPhoneFormat
if user.home != "" and not os.path.exists( os.path.abspath(user.home) ) :
return typhoon_pb2.WS_DirNotExist
return typhoon_pb2.OK
########################################################################
class Server(peewee.Model):
id = PrimaryKeyAutoIncrementField(primary_key=True)
name = peewee.CharField(null=True, default='New Server')
version = peewee.CharField(null=False)
device = peewee.CharField(null=False)
host = peewee.CharField(null=True, default='0.0.0.0')
port = peewee.IntegerField(null=False, default=2121)
os = peewee.CharField(null=True)
status = peewee.IntegerField(null=False, default=0)
loglevel = peewee.IntegerField(null=False, default=1)
directory = peewee.CharField(null=True)
apiport = peewee.IntegerField(null=False, default=8090)
remark = peewee.CharField(null=True)
created = peewee.DateTimeField(null=False, default=datetime.datetime.now)
maxUserCount = peewee.IntegerField(null=False, default=0)
connTimeout = peewee.IntegerField(null=False, default=120)
noTransferTimeout = peewee.IntegerField(null=False, default=600)
loginTimeout = peewee.IntegerField(null=False, default=60)
threadNums = peewee.IntegerField(null=False, default=0)
ipBind = peewee.CharField(null=True, default='*')
ipFilter = peewee.CharField(null=True)
ipFilterExclude = peewee.CharField(null=True)
portBegin = peewee.IntegerField(null=False, default=1)
portEnd = peewee.IntegerField(null=False, default=65535)
socketBufSize = peewee.IntegerField(null=False, default=262144)
downloadOccupied = peewee.IntegerField(null=False, default=1)
speedLimitType = peewee.IntegerField(null=False, default=0)
uploadSpeed = peewee.IntegerField(null=False, default=0)
downloadSpeed = peewee.IntegerField(null=False, default=0)
enableFTPS = peewee.IntegerField(null=False, default=0)
privateKeyFile = peewee.CharField(null=True)
certificateFile = peewee.CharField(null=True)
keyPassword = peewee.CharField(null=True)
# for proxy
packageSize = peewee.IntegerField(null=False, default=1442)
enableProxy = peewee.IntegerField(null=False, default=1)
proxyHost = peewee.CharField(null=True, default='0.0.0.0')
proxyPort = peewee.IntegerField(null=False, default=8388)
license = peewee.CharField(null=True, default='')
compression = peewee.IntegerField(null=False, default=1)
outbound = peewee.IntegerField(null=False, default=0)
inbound = peewee.IntegerField(null=False, default=0)
class Meta:
database = dbinstance
db_table = 't_server'
def toProtobuf(self, pbserver):
pbserver.id = self.id
if self.name != None: pbserver.name = self.name
if self.version != None: pbserver.version = self.version
if self.device != None: pbserver.device = self.device
if self.host != None: pbserver.host = self.host
if self.port != None: pbserver.port = self.port
if self.os != None: pbserver.os = self.os
if self.status != None: pbserver.status = self.status
if self.loglevel != None: pbserver.loglevel = self.loglevel
if self.directory != None: pbserver.directory = self.directory
if self.apiport != None: pbserver.apiport = self.apiport
if self.remark != None: pbserver.remark = self.remark
# if self.created != None: pbserver.created = self.created
if self.maxUserCount != None: pbserver.maxUserCount = self.maxUserCount
if self.connTimeout != None: pbserver.connTimeout = self.connTimeout
if self.noTransferTimeout != None: pbserver.noTransferTimeout = self.noTransferTimeout
if self.loginTimeout != None: pbserver.loginTimeout = self.loginTimeout
if self.threadNums != None: pbserver.threadNums = self.threadNums
if self.ipBind != None: pbserver.ipBind = self.ipBind
if self.ipFilter != None: pbserver.ipFilter = self.ipFilter
if self.ipFilterExclude != None: pbserver.ipFilterExclude = self.ipFilterExclude
if self.portBegin != None: pbserver.portBegin = self.portBegin
if self.portEnd != None: pbserver.portEnd = self.portEnd
if self.socketBufSize != None: pbserver.socketBufSize = self.socketBufSize
if self.downloadOccupied != None: pbserver.downloadOccupied = self.downloadOccupied
if self.speedLimitType != None: pbserver.speedLimitType = self.speedLimitType
if self.uploadSpeed != None: pbserver.uploadSpeed = self.uploadSpeed
if self.downloadSpeed != None: pbserver.downloadSpeed = self.downloadSpeed
if self.enableFTPS != None: pbserver.enableFTPS = self.enableFTPS
if self.privateKeyFile != None: pbserver.privateKeyFile = self.privateKeyFile
if self.certificateFile != None: pbserver.certificateFile = self.certificateFile
if self.keyPassword != None: pbserver.keyPassword = self.keyPassword
if self.packageSize != None: pbserver.packageSize = self.packageSize
if self.enableProxy != None: pbserver.enableProxy = self.enableProxy
if self.proxyHost != None: pbserver.proxyHost = self.proxyHost
if self.proxyPort != None: pbserver.proxyPort = self.proxyPort
if self.license != None: pbserver.license = self.license
if self.compression != None: pbserver.compression = self.compression
if self.outbound != None: pbserver.outbound = self.outbound
if self.inbound != None: pbserver.inbound = self.inbound
def fromProtobuf(self, pbserver):
self.id = pbserver.id
if pbserver.name != None: self.name = pbserver.name
if pbserver.version != None: self.version = pbserver.version
if pbserver.device != None: self.device = pbserver.device
if pbserver.host != None: self.host = pbserver.host
if pbserver.port != None: self.port = pbserver.port
if pbserver.os != None: self.os = pbserver.os
if pbserver.status != None: self.status = pbserver.status
if pbserver.loglevel != None: self.loglevel = pbserver.loglevel
if pbserver.directory != None: self.directory = pbserver.directory
if pbserver.apiport != None: self.apiport = pbserver.apiport
if pbserver.remark != None: self.remark = pbserver.remark
if pbserver.maxUserCount != None: self.maxUserCount = pbserver.maxUserCount
if pbserver.connTimeout != None: self.connTimeout = pbserver.connTimeout
if pbserver.noTransferTimeout != None: self.noTransferTimeout = pbserver.noTransferTimeout
if pbserver.loginTimeout != None: self.loginTimeout = pbserver.loginTimeout
if pbserver.threadNums != None: self.threadNums = pbserver.threadNums
if pbserver.ipBind != None: self.ipBind = pbserver.ipBind
if pbserver.ipFilter != None: self.ipFilter = pbserver.ipFilter
if pbserver.ipFilterExclude != None: self.ipFilterExclude = pbserver.ipFilterExclude
if pbserver.portBegin != None: self.portBegin = pbserver.portBegin
if pbserver.portEnd != None: self.portEnd = pbserver.portEnd
if pbserver.socketBufSize != None: self.socketBufSize = pbserver.socketBufSize
if pbserver.downloadOccupied != None: self.downloadOccupied = pbserver.downloadOccupied
if pbserver.speedLimitType != None: self.speedLimitType = pbserver.speedLimitType
if pbserver.uploadSpeed != None: self.uploadSpeed = pbserver.uploadSpeed
if pbserver.downloadSpeed != None: self.downloadSpeed = pbserver.downloadSpeed
if pbserver.enableFTPS != None: self.enableFTPS = pbserver.enableFTPS
if pbserver.privateKeyFile != None: self.privateKeyFile = pbserver.privateKeyFile
if pbserver.certificateFile != None: self.certificateFile = pbserver.certificateFile
if pbserver.keyPassword != None: self.keyPassword = pbserver.keyPassword
if pbserver.packageSize != None: self.packageSize = pbserver.packageSize
if pbserver.enableProxy != None: self.enableProxy = pbserver.enableProxy
if pbserver.proxyHost != None: self.proxyHost = pbserver.proxyHost
if pbserver.proxyPort != None: self.proxyPort = pbserver.proxyPort
if pbserver.license != None: self.license = pbserver.license
if pbserver.compression != None: self.compression = pbserver.compression
if pbserver.outbound != None: self.outbound = pbserver.outbound
if pbserver.inbound != None: self.inbound = pbserver.inbound
# if pbserver.created != None: self.created = pbserver.created
########################################################################
serverPatternName = '^.{1,50}$'
serverPatternIP = '^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d)(\.((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d)){3}$'
serverPatternDomain = '^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62}){0,3}(\.[a-zA-Z][-a-zA-Z]{0,62}){1}$'
def verifyServerFormat(server):
if server.name != "" and not re.match(serverPatternName, server.name):
return typhoon_pb2.WS_IncorrectNameFormat
b1 = re.match(serverPatternIP, server.host)
b2 = re.match(serverPatternDomain, server.host)
if not b1 and not b2 :
return typhoon_pb2.WS_IncorrectHostFormat
if server.port < 1 or server.port > 65535 :
return typhoon_pb2.WS_InvalidTCPPort
if server.proxyPort < 1 or server.proxyPort > 65535 :
return typhoon_pb2.WS_InvalidUDPPort
if server.packageSize < 600 or server.packageSize > 1442 :
return typhoon_pb2.WS_InvalidPackageSize
if server.outbound < 0 or server.inbound < 0 :
return typhoon_pb2.WS_InvalidBandwidth
if server.directory != "" and not os.path.exists(os.path.abspath(server.directory)):
return typhoon_pb2.WS_DirNotExist
return typhoon_pb2.OK
########################################################################
# only one server
def GetServer():
s = None
try:
s = Server.get(Server.id == 1000)
except peewee.DoesNotExist as e:
try:
s = Server.create(
id = 1000,
name = 'RaySync Server',
version = '1.2.3',
device = utils.macaddr(),
host = utils.externalIP(),
port = 2121,
os = utils.osversion(),
enableProxy = 1,
proxyHost = utils.externalIP(),
proxyPort = 8388,
license = '',
compression = 1,
outbound = 104857600,
inbound = 104857600)
except peewee.OperationalError as e:
logger.error(e)
logger.error('Get Server Info Error by get and create')
sys.exit(2)
return s
def InitDatabase():
peeweeLogger = logging.getLogger('peewee')
peeweeLogger.setLevel(logging.WARN)
# peeweeLogger.addHandler(logging.StreamHandler())
try:
User.create_table()
Server.create_table()
User.create(
id=1000,
account='test',
password='123456',
permission=255,
name='Experience Account',
email='test@raysync.io')
# TODO version
Server.create(
id = 1000,
name = 'RaySync Server',
version = '1.2.3',
device = utils.macaddr(),
host = utils.externalIP(),
port = 2121,
os = utils.osversion(),
enableProxy = 1,
proxyHost = utils.externalIP(),
proxyPort = 8388,
license = '',
compression = 1,
directory = '',
outbound = 104857600,
inbound = 104857600)
logger.info('Create database successed')
except peewee.OperationalError as e:
logger.error(str(sys._getframe().f_code.co_name) + ':' + str(sys._getframe().f_lineno) + str(e))
logger.info('Database is already exists')
return
except Exception as e:
logger.error(str(sys._getframe().f_code.co_name) + ':' + str(sys._getframe().f_lineno) + str(e))
sys.exit(2)
return
########################################################################
'''
admin is in config.ini
'''
test
import peewee
from handler.models import User
from handler.models import Server
if __name__ == "__main__":
try:
# print db.dbinstance
User.create_table()
Server.create_table()
except peewee.OperationalError:
print "Artist table already exists!"
User.create(account='鸟', password='123456')
User.create(account='山明', password='123456')
Server.create(version='1.2.2', device='ff:00:ff:00:ff:00')