core.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. demeter core
  5. name:demeter.py
  6. author:rabin
  7. """
  8. import time
  9. import os
  10. import re
  11. import sys
  12. import getopt
  13. import json
  14. import ConfigParser
  15. import subprocess
  16. class Demeter(object):
  17. path = ''
  18. config = {}
  19. serviceObj = {}
  20. modelObj = {}
  21. web = ''
  22. def __new__(self, *args, **kwargs):
  23. print 'error'
  24. sys.exit()
  25. def __init__(self):
  26. pass
  27. @staticmethod
  28. def isset(v):
  29. try :
  30. type (eval(v))
  31. except :
  32. return 0
  33. else :
  34. return 1
  35. @classmethod
  36. def initConfig(self):
  37. self.path = File.path()
  38. if self.config == {}:
  39. name = 'dev'
  40. if 'DEMETER_CONF' in os.environ:
  41. name = os.environ['DEMETER_CONF']
  42. filename = self.path + 'conf/'+name+'.conf'
  43. if File.exists(filename):
  44. config = ConfigParser.ConfigParser()
  45. config.read(filename)
  46. for item in config.sections():
  47. self.config[item] = self.readConfig(config, item)
  48. return True
  49. else:
  50. print filename + ' is not exists'
  51. sys.exit()
  52. @staticmethod
  53. def readConfig(config, type):
  54. value = config.options(type)
  55. result = {}
  56. for item in value:
  57. result[item] = config.get(type, item)
  58. return result
  59. @classmethod
  60. def temp(self, key='', name='', value=''):
  61. temp = Demeter.path + 'conf/temp.conf'
  62. if File.exists(temp):
  63. config = ConfigParser.ConfigParser()
  64. config.read(temp)
  65. if key and name:
  66. config.set(key, name, value)
  67. config.write(open(temp, 'w'))
  68. else:
  69. result = {}
  70. for item in config.sections():
  71. result[item] = self.readConfig(config, item)
  72. return result
  73. @classmethod
  74. def echo(self, args):
  75. module = self.getObject('pprint')
  76. module.pprint(args)
  77. @classmethod
  78. def record(self, key, value):
  79. # 记录日志
  80. # self.log(key, value)
  81. service = self.service('record')
  82. service.push(key, value)
  83. @classmethod
  84. def service(self, name):
  85. if name not in self.serviceObj:
  86. path = 'service.'
  87. if name == 'common':
  88. path = 'demeter.'
  89. name = 'service'
  90. service = self.getClass(name, path)
  91. self.serviceObj[name] = service()
  92. return self.serviceObj[name]
  93. @classmethod
  94. def model(self, table, name='rdb'):
  95. if table not in self.modelObj:
  96. name = self.config['db'][name]
  97. config = self.config[name]
  98. obj = self.getObject('db', 'demeter.')
  99. db = getattr(obj, name.capitalize())
  100. connect = db(config).get()
  101. model = self.getClass(table, 'model.')
  102. self.modelObj[table] = model(name, connect, config)
  103. return self.modelObj[table]
  104. @classmethod
  105. def getClass(self, name, path=''):
  106. obj = self.getObject(name, path)
  107. return getattr(obj, name.capitalize())
  108. @staticmethod
  109. def getObject(name, path = ''):
  110. module = __import__(path + name)
  111. return getattr(module, name)
  112. @staticmethod
  113. def bool(value):
  114. return value == str(True)
  115. @classmethod
  116. def runtime(self, path, file, content=''):
  117. path = self.path + 'runtime/' + path + '/'
  118. File.mkdir(path)
  119. file = path + file
  120. if File.exists(file):
  121. return False
  122. else:
  123. File.write(file, content)
  124. return True
  125. @classmethod
  126. def webstart(self, name):
  127. self.web = name
  128. self.webPath = self.path + self.web + '/'
  129. self.getObject('main', name + '.')
  130. @classmethod
  131. def md5(self, value, salt=False):
  132. module = __import__('md5')
  133. md5 = getattr(module, 'new')
  134. md5_obj = md5()
  135. if salt:
  136. if salt == True:
  137. salt = self.rand()
  138. md5_obj.update(value + salt)
  139. return md5_obj.hexdigest() + '_' + salt
  140. else:
  141. md5_obj.update(value)
  142. return md5_obj.hexdigest()
  143. @staticmethod
  144. def rand(length = 4):
  145. module = __import__('random')
  146. rand = getattr(module, 'randint')
  147. salt = ''
  148. chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
  149. len_chars = len(chars) - 1
  150. for i in xrange(length):
  151. salt += chars[rand(0, len_chars)]
  152. return salt
  153. @staticmethod
  154. def hour(value):
  155. if value < 10:
  156. return '0' + str(value)
  157. return value
  158. @staticmethod
  159. def time():
  160. return int(time.time())
  161. @staticmethod
  162. def mktime(value, string='%Y-%m-%d %H:%M:%S'):
  163. if ' ' in string and ' ' not in value:
  164. value = value + ' 00:00:00'
  165. return int(time.mktime(time.strptime(value,string)))
  166. @staticmethod
  167. def date(value, string='%Y-%m-%d %H:%M:%S'):
  168. module = __import__('datetime')
  169. datetime = getattr(module, 'datetime')
  170. fromtimestamp = getattr(datetime, 'fromtimestamp')
  171. return str(fromtimestamp(value).strftime(string))
  172. @staticmethod
  173. def isJson(value):
  174. result = False
  175. try:
  176. result = json.loads(value)
  177. except ValueError:
  178. return result
  179. return result
  180. @staticmethod
  181. def compressUuid(value):
  182. row = value.replace('-', '')
  183. code = ''
  184. hash = [x for x in "0123456789-abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
  185. for i in xrange(10):
  186. enbin = "%012d" % int(bin(int(row[i * 3] + row[i * 3 + 1] + row[i * 3 + 2], 16))[2:], 10)
  187. code += (hash[int(enbin[0:6], 2)] + hash[int(enbin[6:12], 2)])
  188. return code
  189. @staticmethod
  190. def checkMobile(request):
  191. userAgent = request.headers['User-Agent']
  192. # userAgent = env.get('HTTP_USER_AGENT')
  193. _long_matches = r'googlebot-mobile|android|avantgo|blackberry|blazer|elaine|hiptop|ip(hone|od)|kindle|midp|mmp|mobile|o2|opera mini|palm( os)?|pda|plucker|pocket|psp|smartphone|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce; (iemobile|ppc)|xiino|maemo|fennec'
  194. _long_matches = re.compile(_long_matches, re.IGNORECASE)
  195. _short_matches = r'1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-'
  196. _short_matches = re.compile(_short_matches, re.IGNORECASE)
  197. if _long_matches.search(userAgent) != None:
  198. return True
  199. user_agent = userAgent[0:4]
  200. if _short_matches.search(user_agent) != None:
  201. return True
  202. return False
  203. @staticmethod
  204. def error(string):
  205. print string
  206. os._exit(0)
  207. class File(object):
  208. @staticmethod
  209. def write(file, content):
  210. handle = open(file, 'w')
  211. handle.write(content)
  212. handle.close()
  213. Shell.popen('chmod +x ' + file)
  214. @staticmethod
  215. def read(path, name):
  216. handle = open(path + name, 'r')
  217. content = handle.read()
  218. handle.close()
  219. return content
  220. @staticmethod
  221. def cur_path():
  222. return os.path.split(os.path.realpath(__file__))[0] + '/'
  223. @staticmethod
  224. def path():
  225. return os.sys.path[0] + '/'
  226. @staticmethod
  227. def exists(name):
  228. return os.path.exists(name)
  229. @staticmethod
  230. def rename(old, new):
  231. return os.rename(old, new)
  232. @staticmethod
  233. def remove(file):
  234. return os.remove(file)
  235. @staticmethod
  236. def mkdir(path):
  237. if File.exists(path) == False:
  238. os.mkdir(path)
  239. return path
  240. @staticmethod
  241. def mkdirs(path):
  242. if File.exists(path) == False:
  243. os.makedirs(path)
  244. return path
  245. class Shell(object):
  246. @staticmethod
  247. def popen(command, sub=False, bg=False):
  248. string = command
  249. if bg == True:
  250. command = command + ' 1>/dev/null 2>&1 &'
  251. if sub == False:
  252. process = os.popen(command)
  253. output = process.read()
  254. process.close()
  255. return output
  256. else:
  257. popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
  258. output = ''
  259. print string
  260. while True:
  261. output = popen.stdout.readline()
  262. print output
  263. if popen.poll() is not None:
  264. break
  265. return output
  266. Demeter.initConfig()