def disconnect(self, close_code): try: async_to_sync(self.channel_layer.group_discard)(self.group, self.channel_name) if close_code == 3001: pass else: self.telnet.close() except Exception: pass finally: try: if self.telnet.cmd: tmp = list(self.telnet.res_asciinema) self.telnet.res_asciinema = [] # windows无法正常支持celery任务 if platform.system().lower() == 'linux': celery_save_res_asciinema.delay(settings.MEDIA_ROOT + '/' + self.telnet.res_file, tmp) else: with open(settings.MEDIA_ROOT + '/' + self.telnet.res_file, 'a+') as f: for line in tmp: f.write('{}\n'.format(line)) except Exception: pass user_agent = None for i in self.scope['headers']: if i[0].decode('utf-8') == 'user-agent': user_agent = i[1].decode('utf-8') break if self.telnet.cmd: if platform.system().lower() == 'linux': celery_save_terminal_log.delay( self.session.get('username'), self.remote_host.hostname, self.remote_host.ip, self.remote_host.get_protocol_display(), self.remote_host.port, self.remote_host.remote_user.username, self.telnet.cmd, self.telnet.res_file, self.scope['client'][0], user_agent, self.start_time, ) else: terminal_log( self.session.get('username'), self.remote_host.hostname, self.remote_host.ip, self.remote_host.get_protocol_display(), self.remote_host.port, self.remote_host.remote_user.username, self.telnet.cmd, self.telnet.res_file, self.scope['client'][0], user_agent, self.start_time, ) TerminalSession.objects.filter(name=self.channel_name, group=self.group).delete()
def file_iterator(file_name, chunk_size=8192): with open(file_name, 'rb') as f: while True: c = f.read(chunk_size) if c: yield c else: break os.remove(file_name) if platform.system().lower() == 'linux': celery_save_terminal_log.delay( username, remote_host.hostname, remote_host.ip, 'sftp', remote_host.port, remote_host.remote_user.username, '下载 {}'.format(download_file), 'nothing', request.META.get('REMOTE_ADDR', None), # 客户端 ip request.META.get('HTTP_USER_AGENT', None), start_time, ) else: terminal_log( username, remote_host.hostname, remote_host.ip, 'sftp', remote_host.port, remote_host.remote_user.username, '下载 {}'.format(download_file), 'nothing', request.META.get('REMOTE_ADDR', None), # 客户端 ip request.META.get('HTTP_USER_AGENT', None), start_time, )
def session_upload(request, pk): username = request.session.get('username') if not request.session['issuperuser']: hosts = RemoteUserBindHost.objects.filter( Q(pk=pk), Q(user__username=username) | Q(group__user__username=username), ).distinct() if not hosts: error_message = '无权限主机!' return JsonResponse({"code": 400, "error": error_message}) try: remote_host = get_object_or_404(RemoteUserBindHost, pk=pk) # upload_file = request.FILES.get('upload_file') upload_file = request.FILES.get('fileBlob') file_name = request.POST.get('fileName') # 使用md5后的文件名保存分段,防止合并时因为文件名的原因出错 file_name_md5 = hashlib.md5( file_name.encode(encoding='UTF-8')).hexdigest() file_chunk_count = request.POST.get('chunkCount') file_chunk_index = request.POST.get('chunkIndex') file_size = request.POST.get('fileSize') upload_file_path = os.path.join(settings.MEDIA_ROOT, username, 'upload', remote_host.ip) if not os.path.exists(upload_file_path): os.makedirs(upload_file_path, exist_ok=True) local_file = '{}/{}'.format( upload_file_path, '{}_{}_{}'.format(file_name_md5, file_chunk_count, int(file_chunk_index) + 1)) with open(local_file, 'wb') as f: for chunk in upload_file.chunks(): f.write(chunk) complete = file_combine(int(file_size), int(file_chunk_count), upload_file_path, file_name, file_name_md5) uploaded = False remote_path = None if complete: start_time = timezone.now() sftp = SFTP(remote_host.ip, remote_host.port, remote_host.remote_user.username, remote_host.remote_user.password) uploaded, remote_path = sftp.upload_file(file_name, upload_file_path) os.remove('{}/{}'.format(upload_file_path, file_name)) if platform.system().lower() == 'linux': celery_save_terminal_log.delay( username, remote_host.hostname, remote_host.ip, 'sftp', remote_host.port, remote_host.remote_user.username, '上传 {}/{}'.format(remote_path, file_name), 'nothing', request.META.get('REMOTE_ADDR', None), # 客户端 ip request.META.get('HTTP_USER_AGENT', None), start_time, ) else: terminal_log( username, remote_host.hostname, remote_host.ip, 'sftp', remote_host.port, remote_host.remote_user.username, '上传 {}/{}'.format(remote_path, file_name), 'nothing', request.META.get('REMOTE_ADDR', None), # 客户端 ip request.META.get('HTTP_USER_AGENT', None), start_time, ) mess = { "code": 200, "chunkIndex": file_chunk_index, "filename": file_name, "complete": complete, "uploaded": uploaded, "remote_path": remote_path } return JsonResponse(mess) # fileinput 分片上传 except Exception: error_message = '上传错误!' return JsonResponse({"code": 401, "error": error_message})
def disconnect(self, close_code): time.sleep(0.5) if not self.closed: self.closed = True try: async_to_sync(self.channel_layer.group_discard)( self.group, self.channel_name) if close_code == 3001: pass else: self.guacamoleclient.close() except Exception: pass finally: if self.guacamoleclient.res: try: tmp = list(self.guacamoleclient.res) self.guacamoleclient.res = [] if platform.system().lower() == 'linux': celery_save_res_asciinema.delay( settings.MEDIA_ROOT + '/' + self.guacamoleclient.res_file, tmp, False) else: with open( settings.MEDIA_ROOT + '/' + self.guacamoleclient.res_file, 'a+') as f: for line in tmp: f.write('{}'.format(line)) except Exception: pass try: if platform.system().lower() == 'linux': celery_save_terminal_log.delay( self.session.get('username'), self.remote_host.hostname, self.remote_host.ip, self.remote_host.get_protocol_display(), self.remote_host.port, self.remote_host.remote_user.username, '', self.guacamoleclient.res_file, self.scope['client'][0], self.user_agent, self.start_time, ) else: terminal_log( self.session.get('username'), self.remote_host.hostname, self.remote_host.ip, self.remote_host.get_protocol_display(), self.remote_host.port, self.remote_host.remote_user.username, '', self.guacamoleclient.res_file, self.scope['client'][0], self.user_agent, self.start_time, ) except Exception: pass TerminalSession.objects.filter(name=self.channel_name, group=self.group).delete()