Esempio 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:
             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()
Esempio n. 2
0
 def websocket_to_django(self):
     try:
         while True:
             time.sleep(0.001)
             data = self.guacamoleclient.receive()
             if not data:
                 return
             if self.websocker.send_flag == 0:
                 self.websocker.send(data)
             elif self.websocker.send_flag == 1:
                 async_to_sync(self.websocker.channel_layer.group_send)(
                     self.websocker.group, {
                         "type": "group.message",
                         "text": data,
                     })
             self.res.append(data)
             # 指定条结果或者指定秒数就保存一次
             if len(self.res) > 1000 or int(time.time() -
                                            self.last_save_time) > 50:
                 tmp = list(self.res)
                 self.res = []
                 self.last_save_time = time.time()
                 # windows无法正常支持celery任务
                 if platform.system().lower() == 'linux':
                     celery_save_res_asciinema.delay(
                         settings.MEDIA_ROOT + '/' + self.res_file, tmp,
                         False)
                 else:
                     with open(settings.MEDIA_ROOT + '/' + self.res_file,
                               'a+') as f:
                         for line in tmp:
                             f.write('{}'.format(line))
     except Exception:
         print(traceback.format_exc())
         if self.websocker.send_flag == 0:
             self.websocker.send('0.;')
         elif self.websocker.send_flag == 1:
             async_to_sync(self.websocker.channel_layer.group_send)(
                 self.websocker.group, {
                     "type": "group.message",
                     "text": '0.;',
                 })
     finally:
         self.close()
Esempio n. 3
0
    def websocket_to_django(self):
        try:
            while True:
                # read_very_eager 方法读取时会是无限循环,性能比较低
                # data = self.tn.read_very_eager().decode('utf-8')
                # if not len(data):
                #     continue

                # expect 使用正则匹配所有返回内容,还可以实现超时无返回内容断开连接
                x, y, data = self.tn.expect([br'[\s\S]+'], timeout=terminal_exipry_time)
                data = data.decode('utf-8')
                if not len(data):
                    raise socket.timeout

                self.message['status'] = 0
                self.message['message'] = data
                self.res += data
                message = json.dumps(self.message)
                if self.websocker.send_flag == 0:
                    self.websocker.send(message)
                elif self.websocker.send_flag == 1:
                    async_to_sync(self.websocker.channel_layer.group_send)(self.websocker.group, {
                        "type": "chat.message",
                        "text": message,
                    })
                
                delay = round(time.time() - self.start_time, 6)
                self.res_asciinema.append(json.dumps([delay, 'o', data]))
                # 250条结果或者指定秒数就保存一次,这个任务可以优化为使用 celery
                if len(self.res_asciinema) > 250 or int(time.time() - self.last_save_time) > 30:
                    tmp = list(self.res_asciinema)
                    self.res_asciinema = []
                    self.last_save_time = time.time()
                    # windows无法正常支持celery任务
                    if platform.system().lower() == 'linux':
                        celery_save_res_asciinema.delay(settings.MEDIA_ROOT + '/' + self.res_file, tmp)
                    else:
                        with open(settings.MEDIA_ROOT + '/' + self.res_file, 'a+') as f:
                            for line in tmp:
                                f.write('{}\n'.format(line))

                if self.tab_mode:
                    tmp = data.split(' ')
                    # tab 只返回一个命令时匹配
                    # print(tmp)
                    if len(tmp) == 2 and tmp[1] == '' and tmp[0] != '':
                        self.cmd_tmp = self.cmd_tmp + tmp[0].encode().replace(b'\x07', b'').decode()
                    elif len(tmp) == 1 and tmp[0].encode() != b'\x07':  # \x07 蜂鸣声
                        self.cmd_tmp = self.cmd_tmp + tmp[0].encode().replace(b'\x07', b'').decode()
                    self.tab_mode = False
                if self.history_mode:   # 不完善,只支持向上翻一个历史命令
                    # print(data)
                    if data.strip() != '':
                        self.cmd_tmp = data
                    self.history_mode = False
        except socket.timeout:
            self.message['status'] = 1
            self.message['message'] = '由于长时间没有操作或者没有数据返回,连接已断开!'
            message = json.dumps(self.message)
            if self.websocker.send_flag == 0:
                self.websocker.send(message)
            elif self.websocker.send_flag == 1:
                async_to_sync(self.websocker.channel_layer.group_send)(self.websocker.group, {
                    "type": "chat.message",
                    "text": message,
                })
            self.close(send_message=False)
        except Exception:
            print(traceback.format_exc())
            self.close()
Esempio n. 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()