def disconnect(self, close_code): try: async_to_sync(self.channel_layer.group_discard)(self.group, self.channel_name) if close_code != 3001: self.ssh.close() except Exception: print(traceback.format_exc()) finally: try: if self.ssh.cmd: tmp = list(self.ssh.res_asciinema) self.ssh.res_asciinema = [] res(self.ssh.res_file, tmp) except Exception: print(traceback.format_exc()) if self.ssh.cmd: 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.ssh.cmd, self.ssh.res_file, self.client, self.user_agent, self.start_time, ) TerminalSession.objects.filter(name=self.channel_name, group=self.group).delete()
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 disconnect(self, close_code): time.sleep(0.5) if not self.closed: self.closed = True if 'webguacamole终端文件上传下载' in self.session[ settings.INIT_PERMISSION]['titles']: try: upload_file_path = os.path.join(settings.GUACD_ROOT, self.group) shutil.rmtree(upload_file_path, ignore_errors=True) except Exception: pass try: async_to_sync(self.channel_layer.group_send)( self.group, { # 关闭 viewer "type": "close.viewer", "text": "", }) async_to_sync(self.channel_layer.group_discard)( self.group, self.channel_name) if close_code != 3001: self.guacamoleclient.close() except Exception: pass finally: if self.guacamoleclient.res: try: tmp = list(self.guacamoleclient.res) self.guacamoleclient.res = [] res(self.guacamoleclient.res_file, tmp, False) except Exception: pass try: 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.file_cmd, self.guacamoleclient.res_file, self.client, self.user_agent, self.start_time, ) except Exception: pass TerminalSession.objects.filter(name=self.channel_name, group=self.group).delete()
def session_ended(self): time.sleep(0.5) # 防止多次停止重复保存数据 if not self.sftp_closed: self.sftp_closed = True try: if self.cmd: tmp = self.cmd self.cmd = '' terminal_log( self.proxy_ssh.http_user, self.proxy_ssh.hostname, self.proxy_ssh.ssh_args[0], 'sftp', self.proxy_ssh.ssh_args[1], self.proxy_ssh.ssh_args[2], tmp, # self.res_file, 'nothing', self.client_addr, # 客户端 ip self._client, self.proxy_ssh.log_start_time, ) except: logger.error(traceback.format_exc()) try: TerminalSession.objects.filter(name='{}_{}_{}_session'.format( self.proxy_ssh.http_user, self.proxy_ssh.password, 'sftp')).delete() except: logger.error(traceback.format_exc()) cache.delete('{}_{}_sftp_session'.format(self.proxy_ssh.http_user, self.proxy_ssh.password)) try: self.proxy_ssh.chan_cli.transport.close() except: logger.error(traceback.format_exc()) try: logger.info('后端主机SFTP断开: %s@%s' % (self.transport.get_username(), self.transport.getpeername()[0])) super(SFTPInterface, self).session_ended() self.client.close() self.transport.close() except Exception: logger.error(traceback.format_exc())
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: print(traceback.format_exc()) finally: try: if self.telnet.cmd: tmp = list(self.telnet.res_asciinema) self.telnet.res_asciinema = [] res(self.telnet.res_file, tmp) except Exception: print(traceback.format_exc()) 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: 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.client, self.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 1: c = f.read(chunk_size) if c: yield c else: break os.remove(file_name) 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 file_iterator(file_name, chunk_size=8192): with open(file_name, 'rb') as f: while 1: c = f.read(chunk_size) if c: yield c else: break os.remove(file_name) cmd_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))) terminal_log( username, remote_host.hostname, remote_host.ip, 'sftp', remote_host.port, remote_host.remote_user.username, cmd_time + '\t' + '下载文件 {}'.format(download_file), 'nothing', request.META.get('REMOTE_ADDR', None), # 客户端 ip request.META.get('HTTP_USER_AGENT', None), start_time, )
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 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: self.guacamoleclient.close() except Exception: pass finally: if self.guacamoleclient.res: try: tmp = list(self.guacamoleclient.res) self.guacamoleclient.res = [] res(self.guacamoleclient.res_file, tmp, False) except Exception: pass try: 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.client, self.user_agent, self.start_time, ) except Exception: pass TerminalSession.objects.filter(name=self.channel_name, group=self.group).delete()
def session_upload(request, pk): username = request.session.get('username') if request.session['issuperuser'] and request.session['username'] == 'admin': hosts = RemoteUserBindHost.objects.filter(pk=pk, enabled=True) else: hosts = RemoteUserBindHost.objects.filter( Q(user__username=username) | Q(group__user__username=username), pk=pk, enabled=True ).distinct() if not hosts: error_message = '不存在的主机!' return JsonResponse({"code": 400, "error": error_message}) try: remote_host = hosts[0] # 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, decrypt(remote_host.remote_user.password) ) uploaded, remote_path = sftp.upload_file(file_name, upload_file_path) os.remove('{}/{}'.format(upload_file_path, file_name)) 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 close(self, terminal_type='ssh'): time.sleep(0.5) # 防止多次停止重复保存数据 if terminal_type is 'N': # 重复登陆时可能会调用close,这时不能删除这些 key,否则会把当前正常会话也关闭掉 self.closed = True try: # logger.error("密码无效 {} - {}".format(self.http_user, self.password)) self.chan_cli.transport.close() except Exception: logger.error(traceback.format_exc()) return if not self.closed: logger.info("后端主机 (%s@%s) 会话结束" % (self.ssh_args[2], self.ssh_args[0])) self.closed = True # 关闭ssh终端,必须分开 try 关闭,否则当强制关闭一方时,另一方连接可能被挂起 try: self.chan_cli.transport.close() except Exception: logger.error(traceback.format_exc()) try: self.chan_ser.transport.close() except Exception: logger.error(traceback.format_exc()) try: if self.cmd: terminal_log( self.http_user, self.hostname, self.ssh_args[0], 'ssh', self.ssh_args[1], self.ssh_args[2], self.cmd, self.res_file, self.client_addr, # 客户端 ip self.client, self.log_start_time, ) except Exception: logger.error(traceback.format_exc()) try: if self.cmd: tmp = list(self.res_asciinema) self.res_asciinema = [] res(self.res_file, tmp) except Exception: logger.error(traceback.format_exc()) try: TerminalSession.objects.filter( name='{}_{}_{}_session'.format(self.http_user, self.password, terminal_type) ).delete() except Exception: logger.error(traceback.format_exc()) try: # 发送数据给查看会话的 websocket 链接 message = dict() message['status'] = 1 message['message'] = '\n\r连接已断开\r\n' channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)(self.group, { "type": "chat.message", "text": message, }) except Exception: logger.error(traceback.format_exc()) cache.delete('{}_{}_{}_session'.format(self.http_user, self.password, terminal_type)) cache.delete('{}_{}_{}_session_lock'.format(self.http_user, self.password, terminal_type))
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()