Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
    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()
Exemplo n.º 4
0
    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())
Exemplo n.º 5
0
    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()
Exemplo n.º 6
0
 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,
     )
Exemplo n.º 7
0
 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,
     )
Exemplo n.º 8
0
 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,
         )
Exemplo n.º 9
0
    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()
Exemplo n.º 10
0
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})
Exemplo n.º 11
0
    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))
Exemplo n.º 12
0
    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()