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()
Beispiel #2
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,
         )
Beispiel #3
0
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})
Beispiel #4
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()