diff --git a/update/consumers.py b/update/consumers.py index 1b17e1e..1fe251b 100644 --- a/update/consumers.py +++ b/update/consumers.py @@ -1,6 +1,7 @@ import json from update.views import get_cinema_update_status from channels.generic.websocket import WebsocketConsumer +from django_redis import get_redis_connection class UpdateConsumer(WebsocketConsumer): @@ -9,22 +10,29 @@ class UpdateConsumer(WebsocketConsumer): self.send('你已经连接成功') def receive(self, text_data=None, bytes_data=None): + + redis_conn = get_redis_connection() + + if text_data is None: self.send('你发了啥') else: data = json.loads(text_data) - cinema_update_status = get_cinema_update_status() + # cinema_update_status = get_cinema_update_status() if data.get('msg', False): if data['msg'] == 'ping': self.send(json.dumps({'msg': 'pong'})) if data.get('finish', False): ip = data['finish'] - if cinema_update_status.get(ip): - del cinema_update_status[ip] + redis_key = f'cinema_update_status_{ip}' + if redis_conn.exists(redis_key): + redis_conn.delete(redis_key) print(cinema_update_status.get(ip, None)) if data.get('ip', False): ip = data['ip'] - print('ws发送消息前', cinema_update_status) - self.send(json.dumps({'status': {'ip': ip, 'result': cinema_update_status.get(ip, None)}})) + redis_key = f'cinema_update_status_{ip}' + # print('ws发送消息前', cinema_update_status) + data = json.loads(redis_conn.get(redis_key)) + self.send(json.dumps({'status': {'ip': ip, 'result': data}})) else: self.send(text_data) diff --git a/update/views.py b/update/views.py index 87e22c1..2e345df 100644 --- a/update/views.py +++ b/update/views.py @@ -26,7 +26,7 @@ from update.utils.client_util import ClientUtil # from consumers import UpdateConsumer -cinema_update_status = dict() +# cinema_update_status = dict() # CacheResponseMixin 一定要放第一位 @@ -114,9 +114,6 @@ def update_cine(request): cmd_dict[cmd['process']] = [cmd['id']] print(cmd_dict) - # 初始化redis - redis_conn = get_redis_connection() - # 增加状态 update_status = { 'git': {'result': '', 'msg': ''}, @@ -127,10 +124,23 @@ def update_cine(request): 'client': {'result': '', 'msg': ''}, } - cinema_update_status[cinema_ip] = copy.deepcopy(update_status) + # cinema_update_status[cinema_ip] = copy.deepcopy(update_status) + + # 初始化redis + redis_conn = get_redis_connection() + redis_key = f'cinema_update_status_{cinema_ip}' + + if redis_conn.exists(redis_key): + # update_status = copy.deepcopy(json.loads(redis_conn.get(redis_key))) + print('redis存在key', redis_key) + return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': '该影院正在升级中,请稍后再试!'}) + else: + redis_conn.set(redis_key, json.dumps(update_status), 10*60) + + print('update_status', update_status) # redis_conn.set(f'cinema_update_status_{cinema_ip}', json.dumps(update_status), 10*60) - print("ws调试", cinema_update_status) + # print("ws调试", cinema_update_status) short_release = req.get('version') cmd_list = json.loads(req.get('cmd')) @@ -143,32 +153,36 @@ def update_cine(request): # 获取并写入cine.sql print('获取并写入cine.sql') try: - cinema_update_status[cinema_ip]['git']['result'] = 'running' + update_status['git']['result'] = 'running' git_util = GitUtil(short_release) git_output = git_util.handle_create_cine() - cinema_update_status[cinema_ip]['git']['result'] = 'success' - cinema_update_status[cinema_ip]['git']['msg'] = git_output + update_status['git']['result'] = 'success' + update_status['git']['msg'] = git_output + redis_conn.set(redis_key, json.dumps(update_status), 5*60) except Exception as e: print('git', e) - cinema_update_status[cinema_ip]['git']['result'] = 'fail' - cinema_update_status[cinema_ip]['git']['msg'] = str(e) + update_status['git']['result'] = 'fail' + update_status['git']['msg'] = str(e) + # redis_conn.delete(redis_key) return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': str(e)}) # 执行setup print('执行setup') try: - cinema_update_status[cinema_ip]['setup']['result'] = 'running' + update_status['setup']['result'] = 'running' setup_list = list(set(cmd_list) & set(cmd_dict['setup'])) update_cmd = UpdateCommandUtil() result, setup_output = update_cmd.exec_cmd_by_type(cinema_ip, 'setup', setup_list, short_release) if result is False: raise Exception(setup_output) - cinema_update_status[cinema_ip]['setup']['result'] = 'success' - cinema_update_status[cinema_ip]['setup']['msg'] = setup_output + update_status['setup']['result'] = 'success' + update_status['setup']['msg'] = setup_output + redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) except Exception as e: print('setup', e) - cinema_update_status[cinema_ip]['setup']['result'] = 'fail' - cinema_update_status[cinema_ip]['setup']['msg'] = str(e) + update_status['setup']['result'] = 'fail' + update_status['setup']['msg'] = str(e) + # redis_conn.delete(redis_key) return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': str(e)}) # 数据库对比 @@ -176,30 +190,34 @@ def update_cine(request): if len(sql_list) > 0: print('数据库对比') try: - cinema_update_status[cinema_ip]['sql']['result'] = 'running' + update_status['sql']['result'] = 'running' db_compare = DbCompare(cinema_ip, short_release) sql_output = db_compare.exec_diff_sql() - cinema_update_status[cinema_ip]['sql']['result'] = 'success' - cinema_update_status[cinema_ip]['sql']['msg'] = sql_output + update_status['sql']['result'] = 'success' + update_status['sql']['msg'] = sql_output + redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) except Exception as e: print('sql', e) - cinema_update_status[cinema_ip]['sql']['result'] = 'fail' - cinema_update_status[cinema_ip]['sql']['msg'] = str(e) + update_status['sql']['result'] = 'fail' + update_status['sql']['msg'] = str(e) + # redis_conn.delete(redis_key) return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': str(e)}) # 修改设置 print('执行config(teardown前)') try: - cinema_update_status[cinema_ip]['config']['result'] = 'running' + update_status['config']['result'] = 'running' config_list = list(set(cmd_list) & set(cmd_dict['config'])) update_config = UpdateConfigUtil(cinema_ip, config_list, True) config_before_output = update_config.exec_config() - cinema_update_status[cinema_ip]['config']['result'] = 'success' - cinema_update_status[cinema_ip]['config']['msg'] = config_before_output + update_status['config']['result'] = 'success' + update_status['config']['msg'] = config_before_output + redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) except Exception as e: print('config', e) - cinema_update_status[cinema_ip]['config']['result'] = 'fail' - cinema_update_status[cinema_ip]['config']['msg'] = str(e) + update_status['config']['result'] = 'fail' + update_status['config']['msg'] = str(e) + # redis_conn.delete(redis_key) return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': str(e)}) # 执行teardown @@ -207,35 +225,38 @@ def update_cine(request): if len(teardown_list) > 0: print('执行teardown') try: - cinema_update_status[cinema_ip]['teardown']['result'] = 'running' + update_status['teardown']['result'] = 'running' update_cmd = UpdateCommandUtil() result, teardown_output = update_cmd.exec_cmd_by_type(cinema_ip, 'teardown', teardown_list, short_release) if result is False: raise Exception(teardown_output) - cinema_update_status[cinema_ip]['teardown']['result'] = 'success' - cinema_update_status[cinema_ip]['teardown']['msg'] = '执行升级脚本:执行成功' + update_status['teardown']['result'] = 'success' + update_status['teardown']['msg'] = '执行升级脚本:执行成功' + redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) except Exception as e: print('teardown', e) - cinema_update_status[cinema_ip]['teardown']['result'] = 'fail' - cinema_update_status[cinema_ip]['teardown']['msg'] = str(e) + update_status['teardown']['result'] = 'fail' + update_status['teardown']['msg'] = str(e) + # redis_conn.delete(redis_key) return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': str(e)}) # 修改设置 print('执行config(teardown后)') try: - cinema_update_status[cinema_ip]['config']['result'] = 'running' + update_status['config']['result'] = 'running' config_list = list(set(cmd_list) & set(cmd_dict['config'])) update_config = UpdateConfigUtil(cinema_ip, config_list, False) config_after_output = update_config.exec_config() - cinema_update_status[cinema_ip]['config']['result'] = 'success' - cinema_update_status[cinema_ip]['config']['msg'] = config_before_output + '
' + config_after_output + update_status['config']['result'] = 'success' + update_status['config']['msg'] = config_before_output + '
' + config_after_output + redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) except Exception as e: print('config', e) - cinema_update_status[cinema_ip]['config']['result'] = 'fail' - cinema_update_status[cinema_ip]['config']['msg'] = config_before_output + '
' + str(e) + update_status['config']['result'] = 'fail' + update_status['config']['msg'] = config_before_output + '
' + str(e) + # redis_conn.delete(redis_key) return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': str(e)}) - d = redis_conn.get(f'cinema_update_status_{cinema_ip}') - print("redis", d) + # 传输客户端 client_list = list(set(cmd_list) & set(cmd_dict['client'])) if len(client_list) > 0: @@ -243,15 +264,18 @@ def update_cine(request): try: client_release = ClientUtil() client_release.client_process(cinema_ip, short_release) - cinema_update_status[cinema_ip]['client']['result'] = 'success' - cinema_update_status[cinema_ip]['client']['msg'] = '客户端上传成功' + update_status['client']['result'] = 'success' + update_status['client']['msg'] = '客户端上传成功' + redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) except Exception as e: print('client', e) - cinema_update_status[cinema_ip]['client']['result'] = 'fail' - cinema_update_status[cinema_ip]['client']['msg'] = str(e) + update_status['client']['result'] = 'fail' + update_status['client']['msg'] = str(e) + # redis_conn.delete(redis_key) return JsonResponse({'result': 'fail', 'ip': cinema_ip, 'msg': str(e)}) - print(cinema_update_status[cinema_ip]) + print('update_status', update_status) + print('redis_get', redis_conn.get(redis_key)) return JsonResponse({'result': 'success', 'ip': cinema_ip, 'msg': ''}) @@ -261,11 +285,6 @@ def write_git_version_to_db(request): git_util.set_release_to_db() return JsonResponse({'result': 'success'}) - -def get_cinema_update_status(): - print('return', cinema_update_status) - return cinema_update_status - # # # def write_cine_sql(request):