1. Server code
1 # !/usr/bin/env python
2 # coding:utf-8
3 import multiprocessing
4 import socket
5 import sys
6 import json
7 import time
8
9 import app
10
11
12 class Server(object):
13 address_family = socket.AF_INET
14 socket_type = socket.SOCK_STREAM
15 request_queue_size = 5
16
17 def __init__(self, server_address):
18 try:
19 self.listen_socket = socket.socket(self.address_family, self.socket_type)
20 self.listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
21 self.listen_socket.bind(server_address)
22 self.listen_socket.listen(self.request_queue_size)
23 except socket.error as e:
24 print(e)
25 exit()
26
27 self.servr_name = "pythonserver"
28 self.server_port = server_address[1]
29 self.client_socket = None
30 self.application = None
31 self.recv_data = None
32 self.headers_set = None
33
34 def serve_forever(self):
35 while True:
36 print(time.time())
37 self.client_socket, client_address = self.listen_socket.accept()
38 new_client_process = multiprocessing.Process(target=self.handle_request)
39 # new_client_process.daemon = True
40 new_client_process.start()
41
42 # self.client_socket.close()
43 # print('close')
44
45 def set_app(self, application):
46
47 self.application = application
48
49 def handle_request(self):
50 self.recv_data = self.client_socket.recv(2014)
51 recv_str = str(self.recv_data, encoding='utf-8')
52 recv_json = json.loads(recv_str)
53 env = recv_json
54 body_content = self.application(env, self.start_response)
55 self.finish_response(body_content)
56
57 def start_response(self, status, response_headers):
58 self.headers_set = [status, response_headers]
59
60 def finish_response(self, body_content):
61 try:
62 status, response_headers = self.headers_set
63 self.client_socket.send(bytes(response_headers, encoding="utf8"))
64 except Exception as e:
65 print(str(e))
66 self.client_socket.send(bytes(str(e), encoding="utf8"))
67 finally:
68 self.client_socket.close()
69
70
71 server_addr = (HOST, PORT) = '', 8888
72 python_root = './wsgiPy'
73
74
75 def make_server(server_addr, application):
76 server = Server(server_addr)
77 server.set_app(application)
78 return server
79
80
81 def main():
82 module, application = ('app', 'app')
83 sys.path.insert(0, python_root)
84 module = __import__(module)
85 application = getattr(module, application)
86 httpd = make_server(server_addr, application)
87 print('listening on port %d …\n' % PORT)
88 httpd.serve_forever()
89
90
91 if __name__ == '__main__':
92 multiprocessing.freeze_support()
93 main()
2. Code App(application process)
# !/usr/bin/env python
import pandas as pd
import os
import os.path
import configparser
CONFIGPATH = './config.ini'
def app(environ, start_response):
try:
method = environ['method']
data = environ['data']
print('entry app')
if method == 'get_repository':
ret = get_repository(data)
print('get_repository')
elif method == 'authority_check':
ret = authority_check(data)
print('authority_check')
status = '200 OK'
response\_headers = ret
start\_response(status, response\_headers)
except Exception as e:
print(str(e))
start\_response('400', str(e))
def get_repository(data=None):
user_name = data['name']
prj_name = data['project']
conf = load_config()
data_excel = pd.read_excel(conf.user_info, sheet_name=None)
user = data\_excel\['user'\]
project = data\_excel\['project'\]
try:
df\_user = user\[user\['User name'\] == user\_name\]
group = df\_user\['Group name'\].values.tolist()\[0\]
df\_proj = project\[(project\['Project name'\] == prj\_name) & (project\['Group name'\] == group)\]
url = df\_proj\['Gitlab path'\].values.tolist()\[0\]
return url
except Exception as e:
print(str(e))
return ''
def authority_check(data=None):
user_name = data['name']
prj_name = data['project']
conf = load_config()
data_excel = pd.read_excel(conf.user_info, sheet_name=None)
user = data_excel['user']
project = data_excel['project']
try:
df_user = user[user['User name'] == user_name]
group1 = df_user['Group name'].values.tolist()[0]
df_proj = project[project['Project name'] == prj_name]
if df_proj.empty():
return 'N, no such a project:' + prj_name
group2 = df_proj['Group name'].values.tolist()[0]
if group1 == group2:
return 'Y'
else:
return 'N,you do not have authority of ' + group2
except Exception as e:
print(str(e))
return str(e)
def load_config(path='./config.ini'):
conf = ConfigHandle()
conf.load_config()
return conf
class ConfigHandle(object):
def __init__(self):
self.conf_path = CONFIGPATH
self.user_info = ''
self.user = ''
self.passw = ''
@staticmethod
def deal\_path(path\_name):
"""deal with windows file path"""
if path\_name:
path\_name = path\_name.strip()
if path\_name:
path\_name = r'%s' % path\_name
path\_name = path\_name.replace('/', '\\\\')
path\_name = os.path.abspath(path\_name)
if path\_name.find(":\\\\") == -1:
path\_name = os.path.join(os.getcwd(), path\_name)
return path\_name
def load\_config(self):
"""load configuration from config.ini file
:return:
"""
file = self.deal\_path(CONFIGPATH)
if not os.path.isfile(file):
print('Can not find the config.ini!')
return False
parser = configparser.ConfigParser()
parser.read(file, encoding='UTF-8')
self.user\_info = parser.get('pathconfig', 'user\_info').strip()
return self
3. Client Code
# !/usr/bin/env python
import socket
import json
ip_port = ('sinm1bappt55.ent.com', 8888)
sk = socket.socket()
sk.connect(ip_port)
req_dic = {
'method': 'get_repository',
'data': {'name': 'WANGZ94',
'project': 'TEST'}
}
send_json = json.dumps(req_dic)
sk.sendall(bytes(send_json, 'utf8'))
server_reply = sk.recv(1024)
print(str(server_reply, 'utf8'))
sk.close()
4. user
# !/usr/bin/env python
import socket
import json
import socket
import getpass
class AuthorityCheck(object):
def __init__(self, project, url, port):
self.project = project
self.user = self.get_user()
self.url = url
self.port = port
self.ret = self.authority_check()
def authority\_check(self):
# 链接服务端ip和端口
ip\_port = (self.url, self.port)
# 生成一个句柄
sk = socket.socket()
# 请求连接服务端
sk.connect(ip\_port)
req\_dic = {
'method': 'authority\_check',
'data': {'name': self.user,
'project': self.project}
}
send\_json = json.dumps(req\_dic)
# 发送数据
sk.sendall(bytes(send\_json, 'utf8'))
# 接受数据
server\_reply = sk.recv(1024)
# 关闭连接
sk.close()
# 打印接受的数据
return str(server\_reply, 'utf8')
def get\_user(self):
"""
:return:
"""
user\_name = getpass.getuser()
return user\_name.upper()
手机扫一扫
移动阅读更方便
你可能感兴趣的文章