예제 #1
0
    def receive(self, text=None, bytes=None, **kwargs):
        try:
            if text:
                data = json.loads(text)
                if data[0] == 'ip':
                    ip = data[1]
                    self.ssh.set_missing_host_key_policy(
                        paramiko.AutoAddPolicy())
                    try:
                        data = ServerInfor.objects.get(ip=ip)
                        port = data.credential.port
                        method = data.credential.method
                        username = data.credential.username
                        if method == 'password':
                            password = data.credential.password
                        else:
                            key = data.credential.key
                    except ObjectDoesNotExist:
                        self.message.reply_channel.send(
                            {
                                "text":
                                json.dumps([
                                    'stdout',
                                    '\033[1;3;31mConnect to server! Server ip doesn\'t exist!\033[0m'
                                ])
                            },
                            immediately=True)
                        self.message.reply_channel.send({"accept": False})
                    try:
                        if method == 'password':
                            self.ssh.connect(ip,
                                             port=port,
                                             username=username,
                                             password=password,
                                             timeout=3)
                        else:
                            self.ssh.connect(ip,
                                             port=port,
                                             username=username,
                                             key_filename=key,
                                             timeout=3)
                    except socket.timeout:
                        self.message.reply_channel.send(
                            {
                                "text":
                                json.dumps([
                                    'stdout',
                                    '\033[1;3;31mConnect to server time out\033[0m'
                                ])
                            },
                            immediately=True)
                        self.message.reply_channel.send({"accept": False})
                        return
                    except Exception:
                        self.message.reply_channel.send(
                            {
                                "text":
                                json.dumps([
                                    'stdout',
                                    '\033[1;3;31mCan not connect to server\033[0m'
                                ])
                            },
                            immediately=True)
                        self.message.reply_channel.send({"accept": False})
                        return

                    chan = self.ssh.invoke_shell(
                        width=90,
                        height=40,
                    )
                    multiple_chan[self.message.reply_channel.name] = chan
                    interactive_shell(chan, self.message.reply_channel.name)

                elif data[0] in ['stdin', 'stdout']:
                    if multiple_chan.has_key(self.message.reply_channel.name):
                        multiple_chan[self.message.reply_channel.name].send(
                            json.loads(text)[1])
                    else:
                        self.message.reply_channel.send(
                            {
                                "text":
                                json.dumps([
                                    'stdout',
                                    '\033[1;3;31mSsh session is terminate or closed!\033[0m'
                                ])
                            },
                            immediately=True)
                else:
                    self.message.reply_channel.send(
                        {
                            "text":
                            json.dumps([
                                'stdout',
                                '\033[1;3;31mUnknow command found!\033[0m'
                            ])
                        },
                        immediately=True)
            elif bytes:
                if multiple_chan.has_key(self.message.reply_channel.name):
                    multiple_chan[self.message.reply_channel.name].send(
                        json.loads(bytes)[1])
        except socket.error:
            if multiple_chan.has_key(self.message.reply_channel.name):
                multiple_chan[self.message.reply_channel.name].close()
        except Exception, e:
            import traceback
            print traceback.print_exc()
예제 #2
0
    def receive(self, text=None, bytes=None, **kwargs):
        try:
            if text:
                data = json.loads(text)
                begin_time = time.time()
                if data[0] == 'ip':
                    ip = data[1]
                    width = data[2]
                    height = data[3]
                    self.ssh.set_missing_host_key_policy(
                        paramiko.AutoAddPolicy())
                    try:
                        data = ServerInfor.objects.get(ip=ip)
                        port = data.credential.port
                        method = data.credential.method
                        username = data.credential.username
                        audit_log = SshLog.objects.create(
                            user=User.objects.get(username=self.message.user),
                            server=data,
                            channel=self.message.reply_channel.name,
                            width=width,
                            height=height)
                        audit_log.save()
                        if method == 'password':
                            password = data.credential.password
                        else:
                            key = data.credential.key
                    except ObjectDoesNotExist:
                        self.message.reply_channel.send(
                            {
                                "text":
                                json.dumps([
                                    'stdout',
                                    '\033[1;3;31mConnect to server! Server ip doesn\'t exist!\033[0m'
                                ])
                            },
                            immediately=True)
                        self.message.reply_channel.send({"accept": False})
                    try:
                        if method == 'password':
                            self.ssh.connect(ip,
                                             port=port,
                                             username=username,
                                             password=password,
                                             timeout=3)
                        else:
                            self.ssh.connect(ip,
                                             port=port,
                                             username=username,
                                             key_filename=key,
                                             timeout=3)
                    except socket.timeout:
                        self.message.reply_channel.send(
                            {
                                "text":
                                json.dumps([
                                    'stdout',
                                    '\033[1;3;31mConnect to server time out\033[0m'
                                ])
                            },
                            immediately=True)
                        self.message.reply_channel.send({"accept": False})
                        return
                    except Exception:
                        self.message.reply_channel.send(
                            {
                                "text":
                                json.dumps([
                                    'stdout',
                                    '\033[1;3;31mCan not connect to server\033[0m'
                                ])
                            },
                            immediately=True)
                        self.message.reply_channel.send({"accept": False})
                        return

                    chan = self.ssh.invoke_shell(
                        width=width,
                        height=height,
                    )

                    #open a new threading to handle ssh to avoid global variable bug
                    t1 = SshTerminalThread(self.message, chan)
                    t1.setDaemon = True
                    t1.start()

                    directory_date_time = now()
                    log_name = os.path.join(
                        '{0}-{1}-{2}'.format(directory_date_time.year,
                                             directory_date_time.month,
                                             directory_date_time.day),
                        '{0}.json'.format(audit_log.log))
                    interactive_shell(chan,
                                      self.message.reply_channel.name,
                                      log_name=log_name,
                                      width=width,
                                      height=height)

                elif data[0] in ['stdin', 'stdout']:
                    self.queue().publish(self.message.reply_channel.name,
                                         json.loads(text)[1])
                elif data[0] == u'set_size':
                    self.queue().publish(self.message.reply_channel.name, text)
                else:
                    self.message.reply_channel.send(
                        {
                            "text":
                            json.dumps([
                                'stdout',
                                '\033[1;3;31mUnknow command found!\033[0m'
                            ])
                        },
                        immediately=True)
            elif bytes:
                self.queue().publish(self.message.reply_channel.name,
                                     json.loads(bytes)[1])
        except socket.error:
            audit_log = SshLog.objects.get(
                user=User.objects.get(username=self.message.user),
                channel=self.message.reply_channel.name)
            audit_log.is_finished = True
            audit_log.end_time = now()
            audit_log.save()
            self.closessh()
            self.close()
        except Exception, e:
            import traceback
            print traceback.print_exc()
            self.closessh()
            self.close()
예제 #3
0
 def receive(self,text=None, bytes=None, **kwargs):   
     try:
         if text:
             data = json.loads(text)
             begin_time = time.time()
             if data[0] == 'ip':
                 ip = data[1]
                 self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                 try:
                     data = ServerInfor.objects.get(ip=ip)
                     port = data.credential.port
                     method = data.credential.method
                     username = data.credential.username
                     audit_log = SshLog.objects.create(user=User.objects.get(username=self.message.user),server=data,channel=self.message.reply_channel.name)
                     audit_log.save()
                     if method == 'password':
                         password = data.credential.password
                     else:
                         key = data.credential.key
                 except ObjectDoesNotExist:
                     self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mConnect to server! Server ip doesn\'t exist!\033[0m'])},immediately=True)
                     self.message.reply_channel.send({"accept":False})                        
                 try:
                     if method == 'password':
                         self.ssh.connect(ip, port=port, username=username, password=password, timeout=3)
                     else:
                         self.ssh.connect(ip, port=port, username=username, key_filename=key, timeout=3)
                 except socket.timeout:
                     self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mConnect to server time out\033[0m'])},immediately=True)
                     self.message.reply_channel.send({"accept":False})
                     return
                 except Exception:
                     self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mCan not connect to server\033[0m'])},immediately=True)
                     self.message.reply_channel.send({"accept":False})
                     return
                 
                 chan = self.ssh.invoke_shell(width=90, height=40,)
                 multiple_chan[self.message.reply_channel.name] = chan
                 directory_date_time = now()
                 log_name = os.path.join('{0}-{1}-{2}'.format(directory_date_time.year,directory_date_time.month,directory_date_time.day),'{0}.json'.format(audit_log.log))
                 interactive_shell(chan,self.message.reply_channel.name,log_name=log_name)
                 
             elif data[0] in ['stdin','stdout']:
                 if multiple_chan.has_key(self.message.reply_channel.name):
                     multiple_chan[self.message.reply_channel.name].send(json.loads(text)[1])                    
                 else:
                     self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mSsh session is terminate or closed!\033[0m'])},immediately=True)
             elif data[0] == u'set_size':
                 if multiple_chan.has_key(self.message.reply_channel.name):
                     multiple_chan[self.message.reply_channel.name].resize_pty(width=data[3], height=data[4])
             else:
                 self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mUnknow command found!\033[0m'])},immediately=True)
         elif bytes:
             if multiple_chan.has_key(self.message.reply_channel.name):
                 multiple_chan[self.message.reply_channel.name].send(json.loads(bytes)[1])
     except socket.error:
         if multiple_chan.has_key(self.message.reply_channel.name):
             multiple_chan[self.message.reply_channel.name].close()
             audit_log=SshLog.objects.get(user=User.objects.get(username=self.message.user),channel=self.message.reply_channel.name)
             audit_log.is_finished = True
             audit_log.end_time = now()
             audit_log.save()                
     except Exception,e:
         import traceback
         print traceback.print_exc()