core.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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 signal
  11. import re
  12. import sys
  13. import getopt
  14. import json
  15. import ConfigParser
  16. import subprocess
  17. from tornado.web import Finish
  18. class Demeter(object):
  19. path = ''
  20. config = {}
  21. serviceObj = {}
  22. modelObj = {}
  23. web = ''
  24. request = False
  25. def __new__(self, *args, **kwargs):
  26. print 'error'
  27. sys.exit()
  28. def __init__(self):
  29. pass
  30. @staticmethod
  31. def isset(v):
  32. try :
  33. type (eval(v))
  34. except :
  35. return 0
  36. else :
  37. return 1
  38. @classmethod
  39. def initConfig(self):
  40. self.path = File.path()
  41. if self.config == {}:
  42. name = 'dev'
  43. if 'DEMETER_CONF' in os.environ:
  44. name = os.environ['DEMETER_CONF']
  45. filename = self.path + 'conf/'+name+'.conf'
  46. if File.exists(filename):
  47. config = ConfigParser.ConfigParser()
  48. config.read(filename)
  49. for item in config.sections():
  50. self.config[item] = self.readConfig(config, item)
  51. return True
  52. else:
  53. print filename + ' is not exists'
  54. sys.exit()
  55. @staticmethod
  56. def readConfig(config, type):
  57. value = config.options(type)
  58. result = {}
  59. for item in value:
  60. result[item] = config.get(type, item)
  61. return result
  62. @classmethod
  63. def temp(self, key='', name='', value=''):
  64. temp = Demeter.path + 'conf/temp.conf'
  65. if File.exists(temp):
  66. config = ConfigParser.ConfigParser()
  67. config.read(temp)
  68. if key and name:
  69. config.set(key, name, value)
  70. config.write(open(temp, 'w'))
  71. else:
  72. result = {}
  73. for item in config.sections():
  74. result[item] = self.readConfig(config, item)
  75. return result
  76. @classmethod
  77. def echo(self, args):
  78. module = self.getObject('pprint')
  79. module.pprint(args)
  80. @classmethod
  81. def record(self, key, value):
  82. # 记录日志
  83. # self.log(key, value)
  84. service = self.service('record')
  85. service.push(key, value)
  86. @classmethod
  87. def service(self, name):
  88. if name not in self.serviceObj:
  89. path = 'service.'
  90. if name == 'common':
  91. path = 'demeter.'
  92. name = 'service'
  93. service = self.getClass(name, path)
  94. self.serviceObj[name] = service()
  95. return self.serviceObj[name]
  96. @classmethod
  97. def model(self, table, name='rdb'):
  98. if table not in self.modelObj:
  99. name = self.config['db'][name]
  100. config = self.config[name]
  101. obj = self.getObject('db', 'demeter.')
  102. db = getattr(obj, name.capitalize())
  103. connect = db(config).get()
  104. model = self.getClass(table, 'model.')
  105. self.modelObj[table] = model(name, connect, config)
  106. return self.modelObj[table]
  107. @classmethod
  108. def getClass(self, name, path=''):
  109. obj = self.getObject(name, path)
  110. return getattr(obj, name.capitalize())
  111. @staticmethod
  112. def getObject(name, path = ''):
  113. module = __import__(path + name)
  114. return getattr(module, name)
  115. @staticmethod
  116. def bool(value):
  117. return value == str(True)
  118. @classmethod
  119. def runtime(self, path, file, content=''):
  120. path = self.path + 'runtime/' + path + '/'
  121. File.mkdir(path)
  122. file = path + file
  123. if File.exists(file):
  124. return False
  125. else:
  126. File.write(file, content)
  127. return True
  128. @classmethod
  129. def webstart(self, name):
  130. self.web = name
  131. self.webPath = self.path + self.web + '/'
  132. self.getObject('main', name + '.')
  133. @classmethod
  134. def md5(self, value, salt=False):
  135. module = __import__('md5')
  136. md5 = getattr(module, 'new')
  137. md5_obj = md5()
  138. if salt:
  139. if salt == True:
  140. salt = self.rand()
  141. md5_obj.update(value + salt)
  142. return md5_obj.hexdigest() + '_' + salt
  143. else:
  144. md5_obj.update(value)
  145. return md5_obj.hexdigest()
  146. @staticmethod
  147. def rand(length = 4):
  148. module = __import__('random')
  149. rand = getattr(module, 'randint')
  150. salt = ''
  151. chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
  152. len_chars = len(chars) - 1
  153. for i in xrange(length):
  154. salt += chars[rand(0, len_chars)]
  155. return salt
  156. @staticmethod
  157. def hour(value):
  158. if value < 10:
  159. return '0' + str(value)
  160. return value
  161. @staticmethod
  162. def time():
  163. return int(time.time())
  164. @staticmethod
  165. def mktime(value, string='%Y-%m-%d %H:%M:%S'):
  166. if ' ' in string and ' ' not in value:
  167. value = value + ' 00:00:00'
  168. return int(time.mktime(time.strptime(value,string)))
  169. @staticmethod
  170. def date(value, string='%Y-%m-%d %H:%M:%S'):
  171. module = __import__('datetime')
  172. datetime = getattr(module, 'datetime')
  173. fromtimestamp = getattr(datetime, 'fromtimestamp')
  174. return str(fromtimestamp(value).strftime(string))
  175. @staticmethod
  176. def isJson(value):
  177. result = False
  178. try:
  179. result = json.loads(value)
  180. except ValueError:
  181. return result
  182. return result
  183. @staticmethod
  184. def compressUuid(value):
  185. row = value.replace('-', '')
  186. code = ''
  187. hash = [x for x in "0123456789-abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
  188. for i in xrange(10):
  189. enbin = "%012d" % int(bin(int(row[i * 3] + row[i * 3 + 1] + row[i * 3 + 2], 16))[2:], 10)
  190. code += (hash[int(enbin[0:6], 2)] + hash[int(enbin[6:12], 2)])
  191. return code
  192. @staticmethod
  193. def checkMobile(request):
  194. if 'Demeter-Mobile' in request.headers:
  195. return True
  196. userAgent = request.headers['User-Agent']
  197. # userAgent = env.get('HTTP_USER_AGENT')
  198. _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'
  199. _long_matches = re.compile(_long_matches, re.IGNORECASE)
  200. _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\-'
  201. _short_matches = re.compile(_short_matches, re.IGNORECASE)
  202. if _long_matches.search(userAgent) != None:
  203. return True
  204. user_agent = userAgent[0:4]
  205. if _short_matches.search(user_agent) != None:
  206. return True
  207. return False
  208. @staticmethod
  209. def exp(exp, value):
  210. if exp:
  211. exp = exp.replace('{n}', value)
  212. value = str(eval(exp))
  213. return value
  214. @classmethod
  215. def curl(self, url):
  216. module = __import__('tornado')
  217. http = getattr(module, 'httpclient')
  218. http_client = http.HTTPClient()
  219. response = http_client.fetch(url)
  220. return response
  221. @classmethod
  222. def error(self, string):
  223. if self.request:
  224. self.request.out(string)
  225. #self.request.finish()
  226. raise Finish()
  227. else:
  228. print string
  229. #os._exit(0)
  230. class File(object):
  231. @staticmethod
  232. def write(file, content):
  233. handle = open(file, 'w')
  234. handle.write(content)
  235. handle.close()
  236. Shell.popen('chmod +x ' + file)
  237. @staticmethod
  238. def read(path, name):
  239. handle = open(path + name, 'r')
  240. content = handle.read()
  241. handle.close()
  242. return content
  243. @staticmethod
  244. def cur_path():
  245. return os.path.split(os.path.realpath(__file__))[0] + '/'
  246. @staticmethod
  247. def path():
  248. return os.sys.path[0] + '/'
  249. @staticmethod
  250. def exists(name):
  251. return os.path.exists(name)
  252. @staticmethod
  253. def rename(old, new):
  254. return os.rename(old, new)
  255. @staticmethod
  256. def remove(file):
  257. return os.remove(file)
  258. @staticmethod
  259. def mkdir(path):
  260. if File.exists(path) == False:
  261. os.mkdir(path)
  262. return path
  263. @staticmethod
  264. def mkdirs(path):
  265. if File.exists(path) == False:
  266. os.makedirs(path)
  267. return path
  268. class Shell(object):
  269. @staticmethod
  270. def popen(command, sub=False, bg=False, timeout=0):
  271. string = command
  272. if bg == True:
  273. command = command + ' 1>/dev/null 2>&1 &'
  274. if timeout > 0:
  275. proc = subprocess.Popen(command,bufsize=0,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True, close_fds=True, preexec_fn = os.setsid)
  276. poll_seconds = .250
  277. deadline = time.time() + timeout
  278. while time.time() < deadline and proc.poll() == None:
  279. time.sleep(poll_seconds)
  280. if proc.poll() == None:
  281. os.killpg(proc.pid, signal.SIGTERM)
  282. return 'timeout'
  283. stdout,stderr = proc.communicate()
  284. return stdout
  285. elif sub == False:
  286. process = os.popen(command)
  287. output = process.read()
  288. process.close()
  289. return output
  290. else:
  291. popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
  292. output = ''
  293. print string
  294. while True:
  295. output = popen.stdout.readline()
  296. print output
  297. if popen.poll() is not None:
  298. break
  299. return output
  300. class Check(object):
  301. @staticmethod
  302. def match(rule, value):
  303. if not rule.match(value):
  304. return False
  305. return True
  306. @staticmethod
  307. def mobile(value):
  308. rule = re.compile(r'1\d{10}')
  309. return Check.match(rule, value)
  310. @staticmethod
  311. def number(value):
  312. try:
  313. int(value)
  314. return True
  315. except ValueError:
  316. return False
  317. Demeter.initConfig()