PageRenderTime 49ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/php_proxy/local/web_control.py

https://gitlab.com/xiaozefeng/XX-Net
Python | 260 lines | 250 code | 8 blank | 2 comment | 4 complexity | a61a5c8c63da5cc342ac9eee20e16a2d MD5 | raw file
  1. #!/usr/bin/env python
  2. # coding:utf-8
  3. import sys
  4. import os
  5. current_path = os.path.dirname(os.path.abspath(__file__))
  6. if __name__ == "__main__":
  7. python_path = os.path.abspath( os.path.join(current_path, os.pardir, os.pardir, 'python27', '1.0'))
  8. noarch_lib = os.path.abspath( os.path.join(python_path, 'lib', 'noarch'))
  9. sys.path.append(noarch_lib)
  10. if sys.platform == "win32":
  11. win32_lib = os.path.abspath( os.path.join(python_path, 'lib', 'win32'))
  12. sys.path.append(win32_lib)
  13. elif sys.platform == "linux" or sys.platform == "linux2":
  14. win32_lib = os.path.abspath( os.path.join(python_path, 'lib', 'linux'))
  15. sys.path.append(win32_lib)
  16. import platform
  17. import BaseHTTPServer
  18. import urlparse
  19. import json
  20. import os
  21. import re
  22. import subprocess
  23. import cgi
  24. import urllib2
  25. import sys
  26. import logging
  27. import ConfigParser
  28. os.environ['HTTPS_PROXY'] = ''
  29. current_path = os.path.dirname(os.path.abspath(__file__))
  30. root_path = os.path.abspath(os.path.join(current_path, os.pardir, os.pardir))
  31. class User_config(object):
  32. php_enable = '1'
  33. php_password = '123456'
  34. php_server = ''
  35. proxy_enable = "0"
  36. proxy_host = ""
  37. proxy_port = ""
  38. proxy_user = ""
  39. proxy_passwd = ""
  40. CONFIG_USER_FILENAME = os.path.abspath( os.path.join(root_path, 'data', 'php_proxy', 'config.ini'))
  41. def __init__(self):
  42. self.load()
  43. def load(self):
  44. ConfigParser.RawConfigParser.OPTCRE = re.compile(r'(?P<option>[^=\s][^=]*)\s*(?P<vi>[=])\s*(?P<value>.*)$')
  45. CONFIG = ConfigParser.ConfigParser()
  46. try:
  47. if os.path.isfile(self.CONFIG_USER_FILENAME):
  48. CONFIG.read(self.CONFIG_USER_FILENAME)
  49. else:
  50. return
  51. try:
  52. self.php_enable = CONFIG.get('php', 'enable')
  53. self.php_password = CONFIG.get('php', 'password')
  54. self.php_server = CONFIG.get('php', 'fetchserver')
  55. except:
  56. pass
  57. self.proxy_enable = CONFIG.get('proxy', 'enable')
  58. self.proxy_host = CONFIG.get('proxy', 'host')
  59. self.proxy_port = CONFIG.get('proxy', 'port')
  60. self.proxy_user = CONFIG.get('proxy', 'username')
  61. self.proxy_passwd = CONFIG.get('proxy', 'password')
  62. except Exception as e:
  63. logging.warn("User_config.load except:%s", e)
  64. def save(self):
  65. try:
  66. f = open(self.CONFIG_USER_FILENAME, 'w')
  67. f.write("[php]\n")
  68. f.write("enable = %s\n" % self.php_enable)
  69. f.write("password = %s\n" % self.php_password)
  70. f.write("fetchserver = %s\n\n" % self.php_server)
  71. f.write("[proxy]\n")
  72. f.write("enable = %s\n" % self.proxy_enable)
  73. f.write("host = %s\n" % self.proxy_host)
  74. f.write("port = %s\n" % self.proxy_port)
  75. f.write("username = %s\n" % self.proxy_user)
  76. f.write("password = %s\n" % self.proxy_passwd)
  77. f.close()
  78. except:
  79. logging.exception("PHP config save user config fail:%s", self.CONFIG_USER_FILENAME)
  80. user_config = User_config()
  81. def http_request(url, method="GET"):
  82. proxy_handler = urllib2.ProxyHandler({})
  83. opener = urllib2.build_opener(proxy_handler)
  84. try:
  85. req = opener.open(url)
  86. except Exception as e:
  87. logging.exception("web_control http_request:%s fail:%s", url, e)
  88. return
  89. class RemoteContralServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  90. deploy_proc = None
  91. def address_string(self):
  92. return '%s:%s' % self.client_address[:2]
  93. def do_CONNECT(self):
  94. self.wfile.write(b'HTTP/1.1 403\r\nConnection: close\r\n\r\n')
  95. def do_GET(self):
  96. try:
  97. refer = self.headers.getheader('Referer')
  98. netloc = urlparse.urlparse(refer).netloc
  99. if not netloc.startswith("127.0.0.1") and not netloc.startswitch("localhost"):
  100. logging.warn("web control ref:%s refuse", netloc)
  101. return
  102. except:
  103. pass
  104. path = urlparse.urlparse(self.path).path
  105. if path == "/log":
  106. return self.req_log_handler()
  107. elif path == "/config":
  108. return self.req_config_handler()
  109. elif path == "/is_ready":
  110. return self.req_is_ready_handler()
  111. elif path == "/quit":
  112. common.keep_run = False
  113. data = "Quit"
  114. self.wfile.write(('HTTP/1.1 200\r\nContent-Type: %s\r\nContent-Length: %s\r\n\r\n' % ('text/plain', len(data))).encode())
  115. self.wfile.write(data)
  116. sys.exit()
  117. return
  118. else:
  119. logging.debug('PHP Web_control %s %s %s ', self.address_string(), self.command, self.path)
  120. self.wfile.write(b'HTTP/1.1 404\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\n404 Not Found')
  121. logging.info('%s "%s %s HTTP/1.1" 404 -', self.address_string(), self.command, self.path)
  122. def do_POST(self):
  123. try:
  124. refer = self.headers.getheader('Referer')
  125. netloc = urlparse.urlparse(refer).netloc
  126. if not netloc.startswith("127.0.0.1") and not netloc.startswitch("localhost"):
  127. logging.warn("web control ref:%s refuse", netloc)
  128. return
  129. except:
  130. pass
  131. logging.debug ('PHP web_control %s %s %s ', self.address_string(), self.command, self.path)
  132. try:
  133. ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
  134. if ctype == 'multipart/form-data':
  135. self.postvars = cgi.parse_multipart(self.rfile, pdict)
  136. elif ctype == 'application/x-www-form-urlencoded':
  137. length = int(self.headers.getheader('content-length'))
  138. self.postvars = urlparse.parse_qs(self.rfile.read(length), keep_blank_values=1)
  139. else:
  140. self.postvars = {}
  141. except:
  142. self.postvars = {}
  143. path = urlparse.urlparse(self.path).path
  144. if path == "/config":
  145. return self.req_config_handler()
  146. else:
  147. self.wfile.write(b'HTTP/1.1 404\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\n404 Not Found')
  148. logging.info('%s "%s %s HTTP/1.1" 404 -', self.address_string(), self.command, self.path)
  149. def send_response(self, mimetype, data):
  150. self.wfile.write(('HTTP/1.1 200\r\nAccess-Control-Allow-Origin: *\r\nContent-Type: %s\r\nContent-Length: %s\r\n\r\n' % (mimetype, len(data))).encode())
  151. self.wfile.write(data)
  152. def send_file(self, filename, mimetype):
  153. # logging.info('%s "%s %s HTTP/1.1" 200 -', self.address_string(), self.command, self.path)
  154. data = ''
  155. with open(filename, 'rb') as fp:
  156. data = fp.read()
  157. if data:
  158. self.send_response(mimetype, data)
  159. def req_log_handler(self):
  160. req = urlparse.urlparse(self.path).query
  161. reqs = urlparse.parse_qs(req, keep_blank_values=True)
  162. data = ''
  163. cmd = "get_last"
  164. if reqs["cmd"]:
  165. cmd = reqs["cmd"][0]
  166. if cmd == "set_buffer_size" :
  167. if not reqs["buffer_size"]:
  168. data = '{"res":"fail", "reason":"size not set"}'
  169. mimetype = 'text/plain'
  170. self.send_response(mimetype, data)
  171. return
  172. buffer_size = reqs["buffer_size"][0]
  173. logging.set_buffer_size(buffer_size)
  174. elif cmd == "get_last":
  175. max_line = int(reqs["max_line"][0])
  176. data = logging.get_last_lines(max_line)
  177. elif cmd == "get_new":
  178. last_no = int(reqs["last_no"][0])
  179. data = logging.get_new_lines(last_no)
  180. else:
  181. logging.error('PAC %s %s %s ', self.address_string(), self.command, self.path)
  182. mimetype = 'text/plain'
  183. self.send_response(mimetype, data)
  184. def req_config_handler(self):
  185. req = urlparse.urlparse(self.path).query
  186. reqs = urlparse.parse_qs(req, keep_blank_values=True)
  187. data = ''
  188. try:
  189. if reqs['cmd'] == ['get_config']:
  190. data = json.dumps(user_config, default=lambda o: o.__dict__)
  191. elif reqs['cmd'] == ['set_config']:
  192. user_config.php_password = self.postvars['php_password'][0]
  193. user_config.php_server = self.postvars['php_server'][0]
  194. user_config.proxy_enable = self.postvars['proxy_enable'][0]
  195. user_config.proxy_host = self.postvars['proxy_host'][0]
  196. user_config.proxy_port = self.postvars['proxy_port'][0]
  197. user_config.proxy_username = self.postvars['proxy_username'][0]
  198. user_config.proxy_password = self.postvars['proxy_password'][0]
  199. user_config.save()
  200. data = '{"res":"success"}'
  201. self.send_response('text/html', data)
  202. http_request("http://127.0.0.1:8085/init_module?module=php_proxy&cmd=restart")
  203. return
  204. except Exception as e:
  205. logging.exception("req_config_handler except:%s", e)
  206. data = '{"res":"fail", "except":"%s"}' % e
  207. self.send_response('text/html', data)
  208. def req_is_ready_handler(self):
  209. data = "True"
  210. mimetype = 'text/plain'
  211. self.send_response(mimetype, data)
  212. if __name__ == "__main__":
  213. pass